[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