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

Reply via email to