[clang] ae73706 - [clang][Interp] Fix references to objects
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Thu Jun 13 06:31:34 PDT 2024
Author: Timm Bäder
Date: 2024-06-13T15:31:24+02:00
New Revision: ae73706075bb2ea4bbc87c4b33f3b681555f8dfb
URL: https://github.com/llvm/llvm-project/commit/ae73706075bb2ea4bbc87c4b33f3b681555f8dfb
DIFF: https://github.com/llvm/llvm-project/commit/ae73706075bb2ea4bbc87c4b33f3b681555f8dfb.diff
LOG: [clang][Interp] Fix references to objects
The previous commit tried to handle this in a way that's too general.
Move the !Initializing case down to the array type.
Added:
Modified:
clang/lib/AST/Interp/ByteCodeExprGen.cpp
clang/test/SemaCXX/cxx0x-initializer-references.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 60b1e089e74a6..b8e32452371a4 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -1107,23 +1107,6 @@ bool ByteCodeExprGen<Emitter>::visitInitList(ArrayRef<const Expr *> Inits,
return this->delegate(Inits[0]);
}
- // Prepare composite return value.
- if (!Initializing) {
- if (GlobalDecl) {
- std::optional<unsigned> GlobalIndex = P.createGlobal(E);
- if (!GlobalIndex)
- return false;
- if (!this->emitGetPtrGlobal(*GlobalIndex, E))
- return false;
- } else {
- std::optional<unsigned> LocalIndex = allocateLocal(E);
- if (!LocalIndex)
- return false;
- if (!this->emitGetPtrGlobal(*LocalIndex, E))
- return false;
- }
- }
-
QualType T = E->getType();
if (T->isRecordType()) {
const Record *R = getRecord(E->getType());
@@ -1224,6 +1207,23 @@ bool ByteCodeExprGen<Emitter>::visitInitList(ArrayRef<const Expr *> Inits,
}
if (T->isArrayType()) {
+ // Prepare composite return value.
+ if (!Initializing) {
+ if (GlobalDecl) {
+ std::optional<unsigned> GlobalIndex = P.createGlobal(E);
+ if (!GlobalIndex)
+ return false;
+ if (!this->emitGetPtrGlobal(*GlobalIndex, E))
+ return false;
+ } else {
+ std::optional<unsigned> LocalIndex = allocateLocal(E);
+ if (!LocalIndex)
+ return false;
+ if (!this->emitGetPtrLocal(*LocalIndex, E))
+ return false;
+ }
+ }
+
unsigned ElementIndex = 0;
for (const Expr *Init : Inits) {
if (!this->visitArrayElemInit(ElementIndex, Init))
diff --git a/clang/test/SemaCXX/cxx0x-initializer-references.cpp b/clang/test/SemaCXX/cxx0x-initializer-references.cpp
index 0f816a39f2ba0..f0018966e7e71 100644
--- a/clang/test/SemaCXX/cxx0x-initializer-references.cpp
+++ b/clang/test/SemaCXX/cxx0x-initializer-references.cpp
@@ -1,4 +1,5 @@
// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s -fexperimental-new-constant-interpreter
struct one { char c; };
struct two { char c[2]; };
More information about the cfe-commits
mailing list