[clang] [SystemZ][asan] Handle error of pragma in struct so memory clean up happens (PR #178243)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 27 08:10:43 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Sean Perry (perry-ca)
<details>
<summary>Changes</summary>
I missed the other failing case for pragmas in declarations with the fix in #<!-- -->177979. Anytime the pragma is tokenized, the parser needs to call HandlePragmaExport() so the allocated token is consumed completely by EnterTokenStream().
---
Full diff: https://github.com/llvm/llvm-project/pull/178243.diff
3 Files Affected:
- (modified) clang/lib/Parse/ParseDecl.cpp (+4)
- (modified) clang/lib/Parse/ParseDeclCXX.cpp (+5)
- (modified) clang/test/Sema/pragma-export-failing.cpp (+1-1)
``````````diff
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
index f8c49646fcf3f..df9e3878bffc0 100644
--- a/clang/lib/Parse/ParseDecl.cpp
+++ b/clang/lib/Parse/ParseDecl.cpp
@@ -4534,6 +4534,10 @@ void Parser::ParseDeclarationSpecifiers(
HandlePragmaMSPointersToMembers();
continue;
+ case tok::annot_pragma_export:
+ HandlePragmaExport();
+ continue;
+
#define TRANSFORM_TYPE_TRAIT_DEF(_, Trait) case tok::kw___##Trait:
#include "clang/Basic/TransformTypeTraits.def"
// HACK: libstdc++ already uses '__remove_cv' as an alias template so we
diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
index da7b07ee26d3f..fd53e6573051c 100644
--- a/clang/lib/Parse/ParseDeclCXX.cpp
+++ b/clang/lib/Parse/ParseDeclCXX.cpp
@@ -1471,6 +1471,8 @@ bool Parser::isValidAfterTypeSpecifier(bool CouldBeBitfield) {
case tok::annot_pragma_ms_vtordisp:
// struct foo {...} _Pragma(pointers_to_members(...));
case tok::annot_pragma_ms_pointers_to_members:
+ // struct foo {...} _Pragma(export(...));
+ case tok::annot_pragma_export:
return true;
case tok::colon:
return CouldBeBitfield || // enum E { ... } : 2;
@@ -3397,6 +3399,9 @@ Parser::DeclGroupPtrTy Parser::ParseCXXClassMemberDeclarationWithPragmas(
case tok::annot_pragma_ms_vtordisp:
HandlePragmaMSVtorDisp();
return nullptr;
+ case tok::annot_pragma_export:
+ HandlePragmaExport();
+ return nullptr;
case tok::annot_pragma_dump:
HandlePragmaDump();
return nullptr;
diff --git a/clang/test/Sema/pragma-export-failing.cpp b/clang/test/Sema/pragma-export-failing.cpp
index da0d9ca4531de..6461b4532b5d5 100644
--- a/clang/test/Sema/pragma-export-failing.cpp
+++ b/clang/test/Sema/pragma-export-failing.cpp
@@ -26,7 +26,7 @@ void f11(int);
template<auto func>
struct S {
-#pragma export(func) // expected-error{{this pragma cannot appear in struct declaration}}
+#pragma export(func) // expected-error{{'#pragma export' can only appear at file scope}}
};
extern "C" void funcToExport();
``````````
</details>
https://github.com/llvm/llvm-project/pull/178243
More information about the cfe-commits
mailing list