diff options
author | Dinar Temirbulatov <Dinar.Temirbulatov@arm.com> | 2024-04-19 13:59:13 +0000 |
---|---|---|
committer | Dinar Temirbulatov <Dinar.Temirbulatov@arm.com> | 2024-04-19 14:02:02 +0000 |
commit | 9a07d7ea9b37a5b537fc8099cc5744f44da29abc (patch) | |
tree | 0ea2d812e7a41f624ec7d179674edce17e7ebb2c | |
parent | a5757c5b65f1894de16f549212b1c37793312703 (diff) | |
download | llvm-9a07d7ea9b37a5b537fc8099cc5744f44da29abc.zip llvm-9a07d7ea9b37a5b537fc8099cc5744f44da29abc.tar.gz llvm-9a07d7ea9b37a5b537fc8099cc5744f44da29abc.tar.bz2 |
[Sema] Check if types are resolved before querying function description.
-rw-r--r-- | clang/lib/Sema/SemaChecking.cpp | 14 | ||||
-rw-r--r-- | clang/test/SemaCXX/aarch64-sve-resolve-type.cpp | 23 |
2 files changed, 32 insertions, 5 deletions
diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp index 6778bc6..73e76e0 100644 --- a/clang/lib/Sema/SemaChecking.cpp +++ b/clang/lib/Sema/SemaChecking.cpp @@ -3507,11 +3507,15 @@ bool Sema::ParseSVEImmChecks( static ArmStreamingType getArmStreamingFnType(const FunctionDecl *FD) { if (FD->hasAttr<ArmLocallyStreamingAttr>()) return ArmStreaming; - if (const auto *T = FD->getType()->getAs<FunctionProtoType>()) { - if (T->getAArch64SMEAttributes() & FunctionType::SME_PStateSMEnabledMask) - return ArmStreaming; - if (T->getAArch64SMEAttributes() & FunctionType::SME_PStateSMCompatibleMask) - return ArmStreamingCompatible; + if (const Type *Ty = FD->getType().getTypePtrOrNull()) { + if (const auto *FPT = Ty->getAs<FunctionProtoType>()) { + if (FPT->getAArch64SMEAttributes() & + FunctionType::SME_PStateSMEnabledMask) + return ArmStreaming; + if (FPT->getAArch64SMEAttributes() & + FunctionType::SME_PStateSMCompatibleMask) + return ArmStreamingCompatible; + } } return ArmNonStreaming; } diff --git a/clang/test/SemaCXX/aarch64-sve-resolve-type.cpp b/clang/test/SemaCXX/aarch64-sve-resolve-type.cpp new file mode 100644 index 0000000..7a56384 --- /dev/null +++ b/clang/test/SemaCXX/aarch64-sve-resolve-type.cpp @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -triple aarch64-none-linux-gnu -target-feature +sve -fsyntax-only %s + +// REQUIRES: aarch64-registered-target || arm-registered-target + +// expected-no-diagnostics + +struct a {}; +__SVFloat32_t b(a); +template <class c> using e = decltype(b(c())); +e<a> f(a); +template <class c> using h = decltype(f(c())); +template <class g> struct i { + static void j() { + a d; + g()(d); + } +}; +struct k { + template <class c> void operator()(c) { + [](h<c>) {}; + } + void l() { i<k>::j; } +}; |