[clang] 86187ed - [clang][Interp] Fix init chain in local initializers
Timm Bäder via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 3 23:41:19 PDT 2024
Author: Timm Bäder
Date: 2024-07-04T08:41:09+02:00
New Revision: 86187ed2998e43be62176c2c4a7b204cc52f6ce6
URL: https://github.com/llvm/llvm-project/commit/86187ed2998e43be62176c2c4a7b204cc52f6ce6
DIFF: https://github.com/llvm/llvm-project/commit/86187ed2998e43be62176c2c4a7b204cc52f6ce6.diff
LOG: [clang][Interp] Fix init chain in local initializers
Added:
Modified:
clang/lib/AST/Interp/Compiler.cpp
clang/test/AST/Interp/records.cpp
Removed:
################################################################################
diff --git a/clang/lib/AST/Interp/Compiler.cpp b/clang/lib/AST/Interp/Compiler.cpp
index 775cabf7f8c59..2af4c38c5ac3d 100644
--- a/clang/lib/AST/Interp/Compiler.cpp
+++ b/clang/lib/AST/Interp/Compiler.cpp
@@ -3577,6 +3577,7 @@ VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD, bool Topleve
return !Init || (checkDecl() && initGlobal(*GlobalIndex));
} else {
VariableScope<Emitter> LocalScope(this, VD);
+ InitLinkScope<Emitter> ILS(this, InitLink::Decl(VD));
if (VarT) {
unsigned Offset = this->allocateLocalPrimitive(
@@ -3911,7 +3912,8 @@ bool Compiler<Emitter>::VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *E) {
SourceLocScope<Emitter> SLS(this, E);
bool Old = InitStackActive;
- InitStackActive = !isa<FunctionDecl>(E->getUsedContext());
+ InitStackActive =
+ !(E->getUsedContext()->getDeclKind() == Decl::CXXConstructor);
bool Result = this->delegate(E->getExpr());
InitStackActive = Old;
return Result;
diff --git a/clang/test/AST/Interp/records.cpp b/clang/test/AST/Interp/records.cpp
index 9f341f5bc6d1d..1554e54275598 100644
--- a/clang/test/AST/Interp/records.cpp
+++ b/clang/test/AST/Interp/records.cpp
@@ -1482,3 +1482,15 @@ namespace FloatAPValue {
ClassTemplateArgRefTemplate<ClassTemplateArgObj.Arg> ClassTemplateArgRefObj;
}
#endif
+
+namespace LocalWithThisPtrInit {
+ struct S {
+ int i;
+ int *p = &i;
+ };
+ constexpr int foo() {
+ S s{2};
+ return *s.p;
+ }
+ static_assert(foo() == 2, "");
+}
More information about the cfe-commits
mailing list