Author: Timm Bäder Date: 2024-06-21T09:34:18+02:00 New Revision: ae41232191ec73b5ee96e5f21df99a42ca25d626
URL: https://github.com/llvm/llvm-project/commit/ae41232191ec73b5ee96e5f21df99a42ca25d626 DIFF: https://github.com/llvm/llvm-project/commit/ae41232191ec73b5ee96e5f21df99a42ca25d626.diff LOG: [clang][Interp] Fix Descriptor::getElemQualType() for complex/vectors We handle them like arrays but still need to differentiate between array/vector/complex types when dealing with QualTypes. Added: Modified: clang/lib/AST/Interp/Descriptor.cpp clang/test/AST/Interp/vectors.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/Interp/Descriptor.cpp b/clang/lib/AST/Interp/Descriptor.cpp index d20ab1340c890..fcb778f7aeab0 100644 --- a/clang/lib/AST/Interp/Descriptor.cpp +++ b/clang/lib/AST/Interp/Descriptor.cpp @@ -359,8 +359,14 @@ QualType Descriptor::getType() const { QualType Descriptor::getElemQualType() const { assert(isArray()); - const auto *AT = cast<ArrayType>(getType()); - return AT->getElementType(); + QualType T = getType(); + if (const auto *AT = T->getAsArrayTypeUnsafe()) + return AT->getElementType(); + if (const auto *CT = T->getAs<ComplexType>()) + return CT->getElementType(); + if (const auto *CT = T->getAs<VectorType>()) + return CT->getElementType(); + llvm_unreachable("Array that's not an array/complex/vector type?"); } SourceLocation Descriptor::getLocation() const { diff --git a/clang/test/AST/Interp/vectors.cpp b/clang/test/AST/Interp/vectors.cpp index 61c400b57b3f8..6991a348b07a9 100644 --- a/clang/test/AST/Interp/vectors.cpp +++ b/clang/test/AST/Interp/vectors.cpp @@ -81,3 +81,13 @@ namespace VectorElementExpr { static_assert(twoElts.x == 22, ""); // ref-error {{not an integral constant expression}} static_assert(twoElts.y == 33, ""); // ref-error {{not an integral constant expression}} } + +namespace Temporaries { + typedef __attribute__((vector_size(16))) int vi4a; + typedef __attribute__((ext_vector_type(4))) int vi4b; + struct S { + vi4a v; + vi4b w; + }; + int &&s = S().w[1]; +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
