Author: Timm Bäder
Date: 2024-06-10T08:49:49+02:00
New Revision: a47e40bce086c506b672cbd8fbb2abdc6619c0a6

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

LOG: [clang][Interp] Disallow ptr-to-int casts on dummy pointers

Added: 
    

Modified: 
    clang/lib/AST/Interp/Interp.h
    clang/test/AST/Interp/builtin-align-cxx.cpp
    clang/test/AST/Interp/const-eval.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/AST/Interp/Interp.h b/clang/lib/AST/Interp/Interp.h
index f63711da90c7e..4bb9e7f0d22ea 100644
--- a/clang/lib/AST/Interp/Interp.h
+++ b/clang/lib/AST/Interp/Interp.h
@@ -1937,6 +1937,9 @@ template <PrimType Name, class T = typename 
PrimConv<Name>::T>
 bool CastPointerIntegral(InterpState &S, CodePtr OpPC) {
   const Pointer &Ptr = S.Stk.pop<Pointer>();
 
+  if (Ptr.isDummy())
+    return false;
+
   const SourceInfo &E = S.Current->getSource(OpPC);
   S.CCEDiag(E, diag::note_constexpr_invalid_cast)
       << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);
@@ -1949,6 +1952,9 @@ static inline bool CastPointerIntegralAP(InterpState &S, 
CodePtr OpPC,
                                          uint32_t BitWidth) {
   const Pointer &Ptr = S.Stk.pop<Pointer>();
 
+  if (Ptr.isDummy())
+    return false;
+
   const SourceInfo &E = S.Current->getSource(OpPC);
   S.CCEDiag(E, diag::note_constexpr_invalid_cast)
       << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);
@@ -1962,6 +1968,9 @@ static inline bool CastPointerIntegralAPS(InterpState &S, 
CodePtr OpPC,
                                           uint32_t BitWidth) {
   const Pointer &Ptr = S.Stk.pop<Pointer>();
 
+  if (Ptr.isDummy())
+    return false;
+
   const SourceInfo &E = S.Current->getSource(OpPC);
   S.CCEDiag(E, diag::note_constexpr_invalid_cast)
       << 2 << S.getLangOpts().CPlusPlus << S.Current->getRange(OpPC);

diff  --git a/clang/test/AST/Interp/builtin-align-cxx.cpp 
b/clang/test/AST/Interp/builtin-align-cxx.cpp
index c4103953df026..a1edf307d6c47 100644
--- a/clang/test/AST/Interp/builtin-align-cxx.cpp
+++ b/clang/test/AST/Interp/builtin-align-cxx.cpp
@@ -202,8 +202,7 @@ static_assert(__builtin_align_down(&align32array[7], 4) == 
&align32array[4], "")
 static_assert(__builtin_align_down(&align32array[8], 4) == &align32array[8], 
"");
 
 // Achieving the same thing using casts to uintptr_t is not allowed:
-static_assert((char *)((__UINTPTR_TYPE__)&align32array[7] & ~3) == 
&align32array[4], ""); // both-error{{not an integral constant expression}} \
-                                                                               
           // expected-note {{cast that performs the conversions of a 
reinterpret_cast is not allowed in a constant expression}}
+static_assert((char *)((__UINTPTR_TYPE__)&align32array[7] & ~3) == 
&align32array[4], ""); // both-error{{not an integral constant expression}}
 
 static_assert(__builtin_align_down(&align32array[1], 4) == &align32array[0], 
"");
 static_assert(__builtin_align_down(&align32array[1], 64) == &align32array[0], 
""); // both-error{{not an integral constant expression}}

diff  --git a/clang/test/AST/Interp/const-eval.c 
b/clang/test/AST/Interp/const-eval.c
index 72c0833a0f630..eab14c08ec809 100644
--- a/clang/test/AST/Interp/const-eval.c
+++ b/clang/test/AST/Interp/const-eval.c
@@ -140,15 +140,8 @@ EVAL_EXPR(47, &x < &x + 1 ? 1 : -1)
 EVAL_EXPR(48, &x != &x - 1 ? 1 : -1)
 EVAL_EXPR(49, &x < &x - 100 ? 1 : -1) // ref-error {{not an integer constant 
expression}}
 
-/// FIXME: Rejecting this is correct, BUT when converting the innermost pointer
-/// to an integer, we do not preserve the information where it came from. So 
when we later
-/// create a pointer from it, it also doesn't have that information, which 
means
-/// hasSameBase() for those two pointers will return false. And in those 
cases, we emit
-/// the diagnostic:
-///   comparison between '&Test50' and '&(631578)' has unspecified value
 extern struct Test50S Test50;
-EVAL_EXPR(50, &Test50 < (struct Test50S*)((unsigned long)&Test50 + 10)) // 
both-error {{not an integer constant expression}} \
-                                                                        // 
expected-note {{comparison between}}
+EVAL_EXPR(50, &Test50 < (struct Test50S*)((unsigned long)&Test50 + 10)) // 
both-error {{not an integer constant expression}}
 
 EVAL_EXPR(51, 0 != (float)1e99)
 


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to