[clang] 92fe391 - [clang][Interp] Reject non-pointer typed dummies

Timm Bäder via cfe-commits cfe-commits at lists.llvm.org
Sat Jul 13 22:51:04 PDT 2024


Author: Timm Bäder
Date: 2024-07-14T07:32:42+02:00
New Revision: 92fe3911c3e0f5e76cf60c8b3203002e6e6aa047

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

LOG: [clang][Interp] Reject non-pointer typed dummies

This happens a lot for NonTypeTemplateParm decls.

Added: 
    

Modified: 
    clang/lib/AST/Interp/Compiler.cpp
    clang/test/AST/Interp/literals.cpp

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Compiler.cpp b/clang/lib/AST/Interp/Compiler.cpp
index 209fb54ecdcb..0b2a38d02b4a 100644
--- a/clang/lib/AST/Interp/Compiler.cpp
+++ b/clang/lib/AST/Interp/Compiler.cpp
@@ -5094,9 +5094,10 @@ bool Compiler<Emitter>::visitDeclRef(const ValueDecl *D, const Expr *E) {
     if (E->getType()->isVoidType())
       return true;
     // Convert the dummy pointer to another pointer type if we have to.
-    if (PrimType PT = classifyPrim(E); PT != PT_Ptr && isPtrType(PT)) {
-      if (!this->emitDecayPtr(PT_Ptr, PT, E))
-        return false;
+    if (PrimType PT = classifyPrim(E); PT != PT_Ptr) {
+      if (isPtrType(PT))
+        return this->emitDecayPtr(PT_Ptr, PT, E);
+      return false;
     }
     return true;
   }

diff  --git a/clang/test/AST/Interp/literals.cpp b/clang/test/AST/Interp/literals.cpp
index 630d9b53cca2..1f2755e710e3 100644
--- a/clang/test/AST/Interp/literals.cpp
+++ b/clang/test/AST/Interp/literals.cpp
@@ -1276,3 +1276,17 @@ namespace ComparisonAgainstOnePastEnd {
 
   static_assert(&a + 1 == &b + 1, ""); // both-error {{static assertion failed}}
 };
+
+namespace NTTP {
+  template <typename _Tp, unsigned _Nm>
+    constexpr unsigned
+    size(const _Tp (&)[_Nm]) noexcept
+    { return _Nm; }
+
+  template <char C>
+  static int write_padding() {
+    static const char Chars[] = {C};
+
+    return size(Chars);
+  }
+}


        


More information about the cfe-commits mailing list