[clang] e488fe5 - [clang][Interp] Fix non-initializing MemberExprs

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Mon Feb 19 02:58:10 PST 2024


Author: Timm Bäder
Date: 2024-02-19T11:57:01+01:00
New Revision: e488fe5a97ba8da9be31926c219932db92298f21

URL: https://github.com/llvm/llvm-project/commit/e488fe5a97ba8da9be31926c219932db92298f21
DIFF: https://github.com/llvm/llvm-project/commit/e488fe5a97ba8da9be31926c219932db92298f21.diff

LOG: [clang][Interp] Fix non-initializing MemberExprs

We need to create a value for them, do that via visit()

Added: 
    clang/test/AST/Interp/cxx03.cpp

Modified: 
    clang/lib/AST/Interp/ByteCodeExprGen.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index e9a58289f6fc07..e36a7a0c0a7175 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -1157,8 +1157,13 @@ bool ByteCodeExprGen<Emitter>::VisitMemberExpr(const MemberExpr *E) {
   if (DiscardResult)
     return this->discard(Base);
 
-  if (!this->delegate(Base))
-    return false;
+  if (Initializing) {
+    if (!this->delegate(Base))
+      return false;
+  } else {
+    if (!this->visit(Base))
+      return false;
+  }
 
   // Base above gives us a pointer on the stack.
   // TODO: Implement non-FieldDecl members.

diff  --git a/clang/test/AST/Interp/cxx03.cpp b/clang/test/AST/Interp/cxx03.cpp
new file mode 100644
index 00000000000000..d30cbb2fd7a201
--- /dev/null
+++ b/clang/test/AST/Interp/cxx03.cpp
@@ -0,0 +1,12 @@
+// RUN: %clang_cc1 -std=c++03 -verify=expected,both %s -fexperimental-new-constant-interpreter
+// RUN: %clang_cc1 -std=c++03 -verify=ref,both %s
+
+namespace NonInitializingMemberExpr {
+  struct NonLit {
+    NonLit() : value(0) {}
+    int value;
+  };
+  __attribute__((require_constant_initialization)) const int &nl_subobj_ref = NonLit().value; // both-error {{variable does not have a constant initializer}} \
+                                                                                              // both-note {{required by}} \
+                                                                                              // both-note {{subexpression not valid}}
+}


        


More information about the cfe-commits mailing list