[clang] f65b35d - [OpenACC] Stop trying to analyze invalid Var-Decls.
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 21 10:31:26 PDT 2025
Author: erichkeane
Date: 2025-05-21T10:31:21-07:00
New Revision: f65b35d89f21b19935da6e1e2e062780b88e64df
URL: https://github.com/llvm/llvm-project/commit/f65b35d89f21b19935da6e1e2e062780b88e64df
DIFF: https://github.com/llvm/llvm-project/commit/f65b35d89f21b19935da6e1e2e062780b88e64df.diff
LOG: [OpenACC] Stop trying to analyze invalid Var-Decls.
The code to analyze VarDecls for the purpose of ensuring a magic-static
isn't present in a 'routine' was getting confused/crashed because we
create something that looks like a magic-static during error-recovery,
but it is still an invalid decl.
This patch causes us to just 'give up' in the case where the vardecl is
already invalid.
Fixes: #140920
Added:
clang/test/SemaOpenACC/gh140920.cpp
Modified:
clang/lib/Sema/SemaOpenACC.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaOpenACC.cpp b/clang/lib/Sema/SemaOpenACC.cpp
index f8ed8a8db29ae..e63d75c934f21 100644
--- a/clang/lib/Sema/SemaOpenACC.cpp
+++ b/clang/lib/Sema/SemaOpenACC.cpp
@@ -1756,7 +1756,7 @@ ExprResult SemaOpenACC::ActOnRoutineName(Expr *RoutineName) {
return ExprError();
}
void SemaOpenACC::ActOnVariableDeclarator(VarDecl *VD) {
- if (!VD->isStaticLocal() || !getLangOpts().OpenACC)
+ if (!getLangOpts().OpenACC || VD->isInvalidDecl() || !VD->isStaticLocal())
return;
// This cast should be safe, since a static-local can only happen in a
diff --git a/clang/test/SemaOpenACC/gh140920.cpp b/clang/test/SemaOpenACC/gh140920.cpp
new file mode 100644
index 0000000000000..84ff415ac2675
--- /dev/null
+++ b/clang/test/SemaOpenACC/gh140920.cpp
@@ -0,0 +1,19 @@
+// RUN: %clang_cc1 %s -fopenacc -verify
+
+// Ensure that we are properly handling 'vardecl' when they are created during
+// error recovery. The errors themselves aren't really relevant/necessary to the
+// bug fix.
+struct Thing{ };
+struct pair {
+ // expected-error at +2{{no member named 'T1'}}
+ // expected-error at +1{{expected a qualified name after 'typename'}}
+ template <typename enable_if<Thing::template T1<int>() &&
+ !Thing::template T1<int>(),
+ // expected-error at +4{{non-friend class member 'type' cannot have a qualified name}}
+ // expected-error at +3{{type specifier is required}}
+ // expected-error at +2{{non-static data member 'type' cannot be declared as a template}}
+ // expected-error at +1{{no member named 'type' in the global namespace}}
+ bool>::type = false>
+ // expected-error at +1{{expected '(' for function-style cast or type construction}}
+ void func(void);
+};
More information about the cfe-commits
mailing list