llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Timm Baeder (tbaederr)

<details>
<summary>Changes</summary>

We can't reject them as they happen because that needs to work for other tests. 
So reject them when computing the layout offset.

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


3 Files Affected:

- (modified) clang/lib/AST/ByteCode/Interp.h (+1-1) 
- (modified) clang/lib/AST/ByteCode/Pointer.cpp (+8-6) 
- (modified) clang/test/AST/ByteCode/invalid.cpp (+9) 


``````````diff
diff --git a/clang/lib/AST/ByteCode/Interp.h b/clang/lib/AST/ByteCode/Interp.h
index ea115b6fef7e3..73f2d415cf56e 100644
--- a/clang/lib/AST/ByteCode/Interp.h
+++ b/clang/lib/AST/ByteCode/Interp.h
@@ -1343,7 +1343,7 @@ inline bool CmpHelperEQ<Pointer>(InterpState &S, CodePtr 
OpPC, CompareFn Fn) {
     std::optional<size_t> A = 
LHS.computeOffsetForComparison(S.getASTContext());
     std::optional<size_t> B = 
RHS.computeOffsetForComparison(S.getASTContext());
     if (!A || !B)
-      return Invalid(S, OpPC);
+      return false;
 
     S.Stk.push<BoolT>(BoolT::from(Fn(Compare(*A, *B))));
     return true;
diff --git a/clang/lib/AST/ByteCode/Pointer.cpp 
b/clang/lib/AST/ByteCode/Pointer.cpp
index 6ea2cae2a02ca..839a0929d1852 100644
--- a/clang/lib/AST/ByteCode/Pointer.cpp
+++ b/clang/lib/AST/ByteCode/Pointer.cpp
@@ -1415,19 +1415,21 @@ OpaquePointer::computeLayoutOffset(const ASTContext 
&ASTCtx) const {
   for (const PointerPathEntry &Entry : path()) {
     switch (Entry.Kind) {
     case PointerPathEntry::Base: {
-      const RecordDecl *RD = CurType->getAsRecordDecl();
+      const CXXRecordDecl *RD = CurType->getAsCXXRecordDecl();
       if (!ASTContext::hasLayout(RD))
         return std::nullopt;
 
+      const CXXRecordDecl *BaseDecl = Entry.RD.getPointer();
+      if (!RD->isDerivedFrom(BaseDecl))
+        return std::nullopt;
+
       const ASTRecordLayout &Layout = ASTCtx.getASTRecordLayout(RD);
       if (Entry.RD.getInt())
-        Offset +=
-            Layout.getVBaseClassOffset(Entry.RD.getPointer()).getQuantity();
+        Offset += Layout.getVBaseClassOffset(BaseDecl).getQuantity();
       else
-        Offset +=
-            Layout.getBaseClassOffset(Entry.RD.getPointer()).getQuantity();
+        Offset += Layout.getBaseClassOffset(BaseDecl).getQuantity();
 
-      CurType = ASTCtx.getCanonicalTagType(Entry.RD.getPointer());
+      CurType = ASTCtx.getCanonicalTagType(BaseDecl);
     } break;
 
     case PointerPathEntry::Field: {
diff --git a/clang/test/AST/ByteCode/invalid.cpp 
b/clang/test/AST/ByteCode/invalid.cpp
index a160c29169bc5..784fd95baf1dd 100644
--- a/clang/test/AST/ByteCode/invalid.cpp
+++ b/clang/test/AST/ByteCode/invalid.cpp
@@ -338,3 +338,12 @@ namespace PointerIntoInvalidRecord {
   } u;
   template int *foo<&u.baz>; // both-error {{non-type template argument is not 
a constant expression}}
 }
+
+namespace OpaquePtrPtrCast {
+  struct X {};
+  struct Y : X {};
+
+  constexpr struct Z {} z;
+  static_assert((X *)(Y *)&z != (X *)(Y *)&z, ""); // both-error {{not an 
integral constant expression}} \
+                                                   // both-note {{cast that 
performs the conversions of a reinterpret_cast is not allowed in a constant 
expression}}
+}

``````````

</details>


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

Reply via email to