[clang] [SystemZ][asan] Handle error of pragma in struct so memory clean up happens (PR #178243)
Sean Perry via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 27 08:10:06 PST 2026
https://github.com/perry-ca created https://github.com/llvm/llvm-project/pull/178243
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().
>From da279631fb948eb1baee48c89e0778b8f9a7b7fa Mon Sep 17 00:00:00 2001
From: Sean Perry <perry at ca.ibm.com>
Date: Tue, 27 Jan 2026 09:57:37 -0500
Subject: [PATCH] handle error of pragma in struct so memory clean up happens
---
clang/lib/Parse/ParseDecl.cpp | 4 ++++
clang/lib/Parse/ParseDeclCXX.cpp | 5 +++++
clang/test/Sema/pragma-export-failing.cpp | 2 +-
3 files changed, 10 insertions(+), 1 deletion(-)
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();
More information about the cfe-commits
mailing list