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@+2{{no member named 'T1'}} + // expected-error@+1{{expected a qualified name after 'typename'}} + template <typename enable_if<Thing::template T1<int>() && + !Thing::template T1<int>(), + // expected-error@+4{{non-friend class member 'type' cannot have a qualified name}} + // expected-error@+3{{type specifier is required}} + // expected-error@+2{{non-static data member 'type' cannot be declared as a template}} + // expected-error@+1{{no member named 'type' in the global namespace}} + bool>::type = false> + // expected-error@+1{{expected '(' for function-style cast or type construction}} + void func(void); +}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits