[clang] 64c9a1e - [clang][Interp] Also revisit references to const types

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 12 21:55:19 PDT 2024


Author: Timm Bäder
Date: 2024-06-13T06:55:07+02:00
New Revision: 64c9a1e1266ec7bc4c4896b2df116fa12dbacf15

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

LOG: [clang][Interp] Also revisit references to const types

Neither isConstant() not isConstQualified() return true for these.

Added: 
    

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

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index 81a5296012b9a..77a1c64d40189 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -3948,9 +3948,17 @@ bool ByteCodeExprGen<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) {
   // we haven't seen yet.
   if (Ctx.getLangOpts().CPlusPlus) {
     if (const auto *VD = dyn_cast<VarDecl>(D)) {
+      const auto typeShouldBeVisited = [&](QualType T) -> bool {
+        if (T.isConstant(Ctx.getASTContext()))
+          return true;
+        if (const auto *RT = T->getAs<ReferenceType>())
+          return RT->getPointeeType().isConstQualified();
+        return false;
+      };
+
       // Visit local const variables like normal.
       if ((VD->isLocalVarDecl() || VD->isStaticDataMember()) &&
-          VD->getType().isConstant(Ctx.getASTContext())) {
+          typeShouldBeVisited(VD->getType())) {
         if (!this->visitVarDecl(VD))
           return false;
         // Retry.

diff  --git a/clang/test/AST/Interp/cxx11.cpp b/clang/test/AST/Interp/cxx11.cpp
index f06a5dd173cba..82b2727bbadbb 100644
--- a/clang/test/AST/Interp/cxx11.cpp
+++ b/clang/test/AST/Interp/cxx11.cpp
@@ -46,3 +46,19 @@ constexpr int preInc(int x) { // both-error {{never produces a constant expressi
 constexpr int postInc(int x) { // both-error {{never produces a constant expression}}
   return x++;                  // both-note {{subexpression}}
 }
+
+
+namespace ReferenceToConst {
+  template<int n> struct S; // both-note 1{{here}}
+  struct LiteralType {
+    constexpr LiteralType(int n) : n(n) {}
+    int n;
+  };
+  template<int n> struct T {
+    T() {
+      static const int ki = 42;
+      const int &i2 = ki;
+      typename S<i2>::T check5; // both-error {{undefined template}}
+    }
+  };
+}


        


More information about the cfe-commits mailing list