267 Commits

Author SHA1 Message Date
Timm Baeder
5b2eb0dcb7
[clang][bytecode][NFC] Add FullExpression scopes (#170705)
And use them instead of the extending decl. This is close to what the
current interpreter is doing.

This is NFC right now but fixes a problem I encountered while looking
into the expansion statement stuff.
2025-12-05 10:22:37 +01:00
Timm Baeder
b1620996f4
[clang][bytecode] Fix discarding ImplitiValueInitExprs (#170089)
They don't have side-effects, so this should be fine.

Fixes https://github.com/llvm/llvm-project/issues/170064
2025-12-01 11:33:33 +01:00
Timm Baeder
d44d329c0b
[clang][bytecode] Fix compound assign operators for IntAP(S) (#169303)
We didn't take `IntAP`/`IntAPS` into account when casting to and from
the computation LHS type. This broke the
`std/ranges/range.factories/range.iota.view/end.pass.cpp` test.
2025-11-24 11:48:00 +01:00
Timm Baeder
95f0fab7fa
[clang][bytecode] Fix conditional operator scoping wrt. local variables (#169030)
We used to create a scope for the true- and false expression of a
conditional operator. This was done so e.g. in this example:

```c++
  struct A { constexpr A(){}; ~A(); constexpr int get() { return 10; } }; // all-note 2{{declared here}}
  static_assert( (false ? A().get() : 1) == 1);
```

we did _not_ evaluate the true branch at all, meaning we did not
register the local variable for the temporary of type `A`, which means
we also didn't call it destructor.

However, this breaks the case where the temporary needs to outlive the
conditional operator and instead be destroyed via the surrounding
`ExprWithCleanups`:
```
constexpr bool test2(bool b) {
  unsigned long __ms = b ? (const unsigned long &)0 : __ms;
  return true;
}
static_assert(test2(true));
```
Before this patch, we diagnosed this example:
```console
./array.cpp:180:15: error: static assertion expression is not an integral constant expression
  180 | static_assert(test2(true));
      |               ^~~~~~~~~~~
./array.cpp:177:24: note: read of temporary whose lifetime has ended
  177 |   unsigned long __ms = b ? (const unsigned long &)0 : __ms;
      |                        ^
./array.cpp:180:15: note: in call to 'test2(true)'
  180 | static_assert(test2(true));
      |               ^~~~~~~~~~~
./array.cpp:177:51: note: temporary created here
  177 |   unsigned long __ms = b ? (const unsigned long &)0 : __ms;
      |                                                   ^
1 error generated.
```
because the temporary created for the true branch got immediately
destroyed.

The problem in essence is that since the conditional operator doesn't
create a scope at all, we register the local variables for both its
branches, but we later only execute one of them, which means we should
also only destroy the locals of one of the branches.

We fix this similar to clang codgen's `is_active` flag: In the case of a
conditional operator (which is so far the only case where this is
problematic, and this also helps minimize the performance impact of this
change), we make local variables as disabled-by-default and then emit a
`EnableLocal` opcode later, which marks them as enabled. The code
calling their destructors checks whether the local was enabled at all.
2025-11-24 07:34:48 +01:00
Timm Baeder
cc4dd015ad
[clang][bytecode][NFC] Remove VariableScope::emitDestruction (#169148)
destroyLocals() does the same thing.
2025-11-22 16:41:00 +01:00
marius doerner
7198279707
[clang][bytecode] Implement case ranges (#168418)
Fixes #165969

Implement GNU case ranges for constexpr bytecode interpreter.
2025-11-20 04:50:32 +01:00
Timm Baeder
886d24d03a
[clang][bytecode] Fix fallthrough to switch labels (#168484)
We need to fallthrough here in case we're not jumping to the labels.
This is only needed in expression contexts.
2025-11-18 07:46:46 +01:00
Timm Baeder
746e5d0492
[clang][bytecode] Don't outright reject dynamic casts (#167517)
Just delegate to the subexpr instead for now.
2025-11-14 13:03:51 +01:00
Timm Baeder
70eb4b0a60
[clang][bytecode] Fix diagnosing subtration of zero-size pointers (#167839)
We need to get the element type size at bytecode generation time to
check. We also need to diagnose this in the LHS == RHS case.
2025-11-13 09:58:43 +01:00
Timm Baeder
8e3188a47f
[clang][bytecode] Mark CXXDefaultInitExprs in InitLink chain (#166395)
So we know before _what_ entry in the chain we need to look for the
InitList.

Fixes https://github.com/llvm/llvm-project/issues/166171
2025-11-11 10:36:00 +01:00
Timm Baeder
a8a0ffba73
[clang][bytecode] Check source pointer for bitcast validity (#166907)
Unfortunately this is more dynamic than anticipated.

Fixes https://github.com/llvm/llvm-project/issues/165006
2025-11-10 08:17:08 +01:00
Timm Baeder
6c12623d62
[clang][bytecode] Fix a std::optional<bool> mishap (#167091)
This is about the value saved in the std::optional, not about whether
the optional has a value at all.
2025-11-08 05:31:30 +00:00
Timm Baeder
6fac21e404
[clang][bytecode] Avoid copies with elidable CXXConstructExprs (#166931)
To fix the newly added cwg6.cpp.
2025-11-08 05:30:01 +01:00
KaiWeng
d9c7c76269
Revert "Ignore trailing NullStmts in StmtExprs for GCC compatibility." (#166036)
This reverts commit b1e511bf5a4c702ace445848b30070ac2e021241.

https://github.com/llvm/llvm-project/issues/160243
Reverting because the GCC C front end is incorrect.

---------

Co-authored-by: Jim Lin <jim@andestech.com>
2025-11-07 09:30:53 -05:00
Timm Baeder
e4467fbf30
[clang][ExprConst] Handle dependent switch case statements (#166533)
By rejecting them.

Fixes https://github.com/llvm/llvm-project/issues/165555
2025-11-06 12:52:11 +01:00
Timm Baeder
14c76437ee
[clang][bytecode] Check types when loading values (#165385)
We need to allow BitCasts between pointer types to different prim types,
but that means we need to catch the problem at a later stage, i.e. when
loading the values.

Fixes https://github.com/llvm/llvm-project/issues/158527
Fixes https://github.com/llvm/llvm-project/issues/163778
2025-11-05 16:02:19 +01:00
Timm Baeder
9af49ee474
[clang][bytecode] Handle discarded AddrLabelExprs properly (#165000)
emitDummyPtr() doesn't like to be called with DiscardResult set, so
check this first.

Fixes https://github.com/llvm/llvm-project/issues/164979
2025-10-27 10:28:09 +01:00
Timm Baeder
7c441b21b7
[clang][bytecode] Catch placement-new into invalid destination (#164804)
We failed to check for null and non-block pointers.

Fixes https://github.com/llvm/llvm-project/issues/152952
2025-10-24 08:08:18 +02:00
Timm Baeder
93bb5c699f
[clang][bytecode] Fix CXXConstructExpr for multidim arrays (#164760)
This is a thing apparently.

Fixes https://github.com/llvm/llvm-project/issues/153803
2025-10-24 06:36:05 +02:00
Timm Baeder
ece83ed7df
[clang][bytecode] Fix instance pointer in IndirectFieldDecl inits (#164751)
Points to the first chain link in this case.
2025-10-23 15:22:17 +02:00
Timm Baeder
0591297c8a
[clang][bytecode] Fix initializing primitive fields via initlist (#164789)
Fixes https://github.com/llvm/llvm-project/issues/152901
2025-10-23 14:19:13 +02:00
Timm Baeder
954a719056
[clang][bytecode] Fix unsigned wraparound behavior with bitfields (#164445)
and inc/dec operations. We need to truncate the new value to the
bitfield bitwidth.
2025-10-22 11:01:33 +02:00
Timm Baeder
9e7209c061
[clang][bytecode][NFC] Clean up variable creation (#164415) 2025-10-21 17:31:05 +02:00
Timm Baeder
7b91bb2046
[clang][bytecode] Fix redeclaring global externs without initializer (#164409)
Return the same value, whether we've already allocated the variable or
not.
2025-10-21 15:14:26 +02:00
Timm Baeder
c5f9a2a2b2
[clang][bytecode] Don't emit checkNull for function pointers (#164376)
Diagnose them later when we try to call the function pointer.
2025-10-21 14:49:03 +02:00
Matheus Izvekov
b516dcc998
[clang] NFC: rename TagType::getOriginalDecl back to getDecl (#163271)
This rename was made as part of
https://github.com/llvm/llvm-project/pull/147835 in order to ease
rebasing the PR, and give a nice window for other patches to get rebased
as well.

It has been a while already, so lets go ahead and rename it back.
2025-10-15 16:11:17 -03:00
Timm Baeder
93c830597c
[clang][bytecode] Fix integral cast edge case (#161506)
We were converting the `ASInt` to as sign-less `APInt` too early and
losing the sign information.
2025-10-01 13:56:38 +02:00
Timm Baeder
c750487292
[clang][bytecode] Diagnose volatile writes (#160350) 2025-09-28 07:21:40 +02:00
Timm Baeder
492b60937b
[clang][bytecode] Remove bogus Initializing special case (#159933)
This doesn't seem to be needed anymore and causes problems.

Fixes #159787
2025-09-23 12:55:48 +02:00
Timm Baeder
242a1e2fb1
[clang][bytecode] Load value of non-lvalue ArraySubscriptExpr (#160024)
As happens in C.

Fixes #158482
2025-09-23 09:47:23 +02:00
Timm Baeder
03e16c8e42
[clang][bytecode] Move generic lambda handling to Compiler (#159733)
So the static invoker's Function still points to the static invoker
instead of the call operator of the lambda record. This is important for
a later commit.
2025-09-19 12:51:02 +02:00
Timm Baeder
29c55d0f7b
[clang][bytecode] Improve error detection in BitCastPrim op (#158575)
Reject bitcasts to pointer types unless it's to `nullptr_t` and always
reject bitcasts to member pointer types.


Fixes #156174
2025-09-16 10:02:18 +02:00
Timm Baeder
c8b5b6e0a6
[clang][ExprConst] Reject unary vector shuffles (#158589)
This is not implemented at compile time and asserts in assertion builds,
so reject it here.


Fixed the coding style in `BuiltinShuffleVector` at the same time.

Fixes #158471
2025-09-16 07:58:15 +02:00
Timm Baeder
c46cf1ea3b
[clang][bytecode][NFC] Remove BlockScope (#158656)
Unused these days.
2025-09-16 05:10:13 +02:00
Timm Baeder
03c356c554
[clang][bytecode] Pass initializer along in evaluateAsInitializer() (#158056)
We just called `getInit()`, which isn't always correct and used the
wrong initializer in the module test case.
2025-09-15 07:39:11 +02:00
Timm Baeder
859e8a6d6b
[clang][bytecode] Implement C23 named loops (#156856) 2025-09-11 09:19:17 +02:00
Timm Baeder
e2a067e7e5
[clang][bytecode][NFC] Remove an else after a return (#157999) 2025-09-11 09:02:46 +02:00
Timm Baeder
8ba0d0f72f
[clang][bytcode][NFC] Use UnsignedOrNone for global ids (#157328) 2025-09-08 08:56:46 +02:00
Timm Baeder
e9499e82ed
[clang][bytecode][NFC] Remove some unnecessary if statements (#157329)
We already checked that `IsStatic` is true above.
2025-09-07 18:55:48 +02:00
Timm Baeder
46f2b35a98
[clang][bytecode][NFC] Remove instance pointer from emitDestruction (#157040)
We only call this when we just pushed a new pointer to the stack, so try
to save the folling PopPtr op by removing the pointer inside
emitDestruction directly, e.g. by letting the Call op just remove it.
2025-09-05 10:29:43 +02:00
Timm Baeder
9e755445f1
[clang][bytecode] Create implicit variables for wider base types (#156658)
If we create an implicit local variable for a derived-to-base cast, we
still should allocate enough space for the entire derived type.

Fixes #156219
2025-09-04 15:38:14 +02:00
Timm Baeder
917b45539b
[clang][bytecode] Remove superfluous check for complex types (#156666)
`!E->getType()->isAnyComplexType()` is implied by `!canClassify()`.
2025-09-04 07:40:48 +02:00
Timm Baeder
1bbac057f6
[clang][bytecode] Fix ignoring comparisons in C (#156180)
Our comparison ops always return bool, and we do the pop before the
conversion to in in C.

Fixes #156178
2025-08-30 17:41:08 +02:00
Timm Baeder
1eb6c2bd59
[clang][bytecode] Reject vectors with non-primitive element types (#155597)
This happens for e.g. arm's float8 types.
2025-08-27 14:09:54 +02:00
Timm Baeder
16494be2e8
[clang][bytecode] Reject dependent RequiresExprs (#155230)
Fixes #152899
2025-08-27 12:04:44 +02:00
Timm Baeder
d5c5ed3723
[clang][bytecode] Handle vector assignments (#155573) 2025-08-27 11:55:37 +02:00
Matheus Izvekov
88438ba1f3
[clang] AST: fix getAs canonicalization of leaf types (#155028) 2025-08-27 06:20:14 -03:00
Matheus Izvekov
2ec71d93ad
[clang] NFC: introduce Type::getAsEnumDecl, and cast variants for all TagDecls (#155463)
And make use of those.

These changes are split from prior PR #155028, in order to decrease the
size of that PR and facilitate review.
2025-08-26 16:05:59 -03:00
Timm Baeder
1739a0e5fb
[clang][bytecode] Error if calls have fewer arguments than parameters (#155151)
Shouldn't happen, but does.

Fixes #155147
2025-08-26 06:17:39 +02:00
Vincent
fefdb494bf
[Clang] Fix Variable Length Array _Countof Crash (#154627)
Check for missing VLA size expressions (e.g. in int a[*][10]) before
evaluation to avoid crashes in _Countof and constant expression checks.

Fixes #152826
2025-08-25 21:06:49 +02:00