[clang] [clang] Implement `__is_pointer_interconvertible_base_of()` (PR #88473)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Apr 11 23:03:02 PDT 2024
================
@@ -6082,6 +6082,22 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, const TypeSourceI
Self.Diag(Rhs->getTypeLoc().getBeginLoc(), diag::err_vla_unsupported)
<< 1 << tok::kw___is_layout_compatible;
return Self.IsLayoutCompatible(LhsT, RhsT);
+ }
+ case BTT_IsPointerInterconvertibleBaseOf: {
+ if (!LhsT->isUnionType() && !RhsT->isUnionType() &&
+ !Self.getASTContext().hasSameUnqualifiedType(LhsT, RhsT)) {
+ Self.RequireCompleteType(Rhs->getTypeLoc().getBeginLoc(), RhsT,
+ diag::err_incomplete_type);
+ }
+
+ if (LhsT->isVariableArrayType())
+ Self.Diag(Lhs->getTypeLoc().getBeginLoc(), diag::err_vla_unsupported)
+ << 1 << tok::kw___is_pointer_interconvertible_base_of;
+ if (RhsT->isVariableArrayType())
+ Self.Diag(Rhs->getTypeLoc().getBeginLoc(), diag::err_vla_unsupported)
+ << 1 << tok::kw___is_pointer_interconvertible_base_of;
----------------
Sirraide wrote:
Do we need these checks? Is there a reason we can’t just ‘fall through’ here if the types are VLAs?
I saw there was some discussion about this on the `__is_layout_compatible()` pr(s), but in this case this is about base classes, and since a VLA isn’t a class type to begin with, just returning `false` would make sense imo.
https://github.com/llvm/llvm-project/pull/88473
More information about the cfe-commits
mailing list