llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Timm Baeder (tbaederr)

<details>
<summary>Changes</summary>

We create opaque pointers for a few types of "opaque" expressions, where we 
need to just pass the pointer along to the end of the evaluation and such 
pointer casts are fine on those.

---
Full diff: https://github.com/llvm/llvm-project/pull/223982.diff


3 Files Affected:

- (modified) clang/lib/AST/ByteCode/Interp.cpp (+2-2) 
- (modified) clang/lib/AST/ByteCode/Pointer.h (+1) 
- (modified) clang/test/CodeGen/cfstring2.c (+1) 


``````````diff
diff --git a/clang/lib/AST/ByteCode/Interp.cpp 
b/clang/lib/AST/ByteCode/Interp.cpp
index b02305e9ee753..5b0422d9ae9bd 100644
--- a/clang/lib/AST/ByteCode/Interp.cpp
+++ b/clang/lib/AST/ByteCode/Interp.cpp
@@ -1980,9 +1980,9 @@ bool PtrPtrCast(InterpState &S, CodePtr OpPC, bool 
SrcIsVoidPtr,
   // Retain the casted type for opaque pointers.
   if (Ptr.isOpaquePointer()) {
     Pointer P = S.Stk.pop<Pointer>();
-    auto OP = P.asOpaquePointer();
+    const OpaquePointer &OP = P.asOpaquePointer();
 
-    if (!validType(TargetType->getPointeeType()))
+    if (OP.hasDeclBase() && !validType(TargetType->getPointeeType()))
       return Invalid(S, OpPC);
 
     S.Stk.push<Pointer>(OP.withFieldType(TargetType), P.getByteOffset());
diff --git a/clang/lib/AST/ByteCode/Pointer.h b/clang/lib/AST/ByteCode/Pointer.h
index 6e63decec0ebf..d19374acf00c4 100644
--- a/clang/lib/AST/ByteCode/Pointer.h
+++ b/clang/lib/AST/ByteCode/Pointer.h
@@ -437,6 +437,7 @@ struct OpaquePointer {
   unsigned PathLength = 0;
 
   ArrayRef<PointerPathEntry> path() const { return ArrayRef(Path, PathLength); 
}
+  bool hasDeclBase() const { return Base.isDecl(); }
   const VarDecl *getBaseDecl() const { return Base.asVarDecl(); }
   const Expr *getBaseExpr() const { return Base.asExpr(); }
 
diff --git a/clang/test/CodeGen/cfstring2.c b/clang/test/CodeGen/cfstring2.c
index 7ff57e14407f7..edc05aed16e15 100644
--- a/clang/test/CodeGen/cfstring2.c
+++ b/clang/test/CodeGen/cfstring2.c
@@ -1,5 +1,6 @@
 // UNSUPPORTED: target={{.*}}-zos{{.*}}, target={{.*}}-aix{{.*}}
 // RUN: %clang_cc1 -emit-llvm %s -o %t
+// RUN: %clang_cc1 -emit-llvm %s -o %t -fexperimental-new-constant-interpreter
 
 typedef const struct __CFString * CFStringRef;
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/223982
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to