aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDinar Temirbulatov <Dinar.Temirbulatov@arm.com>2024-04-19 13:59:13 +0000
committerDinar Temirbulatov <Dinar.Temirbulatov@arm.com>2024-04-19 14:02:02 +0000
commit9a07d7ea9b37a5b537fc8099cc5744f44da29abc (patch)
tree0ea2d812e7a41f624ec7d179674edce17e7ebb2c
parenta5757c5b65f1894de16f549212b1c37793312703 (diff)
downloadllvm-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.cpp14
-rw-r--r--clang/test/SemaCXX/aarch64-sve-resolve-type.cpp23
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; }
+};