Fix crash when an attribute is applied to pragma attribute/pragma dump (#137880)

These two don't result in a statement, so the attempt to apply the
attributes to them was crashing. This patch correctly prohibits the use
of attributes on these clauses.

Fixes: #137861
This commit is contained in:
Erich Keane 2025-04-30 07:31:42 -07:00 committed by GitHub
parent e8ae779471
commit 84a5435db6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 40 additions and 0 deletions

View File

@ -511,6 +511,9 @@ Bug Fixes in This Version
evaluation. The crashes were happening during diagnostics emission due to
unimplemented statement printer. (#GH132641)
- Fixed visibility calculation for template functions. (#GH103477)
- Fixed a bug where an attribute before a ``pragma clang attribute`` or
``pragma clang __debug`` would cause an assertion. Instead, this now diagnoses
the invalid attribute location appropriately. (#GH137861)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -526,10 +526,14 @@ Retry:
return ParsePragmaLoopHint(Stmts, StmtCtx, TrailingElseLoc, CXX11Attrs);
case tok::annot_pragma_dump:
ProhibitAttributes(CXX11Attrs);
ProhibitAttributes(GNUAttrs);
HandlePragmaDump();
return StmtEmpty();
case tok::annot_pragma_attribute:
ProhibitAttributes(CXX11Attrs);
ProhibitAttributes(GNUAttrs);
HandlePragmaAttribute();
return StmtEmpty();
}

View File

@ -0,0 +1,33 @@
// RUN: %clang_cc1 %s -verify
void foo() {
// expected-error@+1{{an attribute list cannot appear here}}
__attribute__((aligned(64)))
#pragma clang attribute push(__attribute__((uninitialized)), apply_to = any(variable(is_local)))
{
int f;
}
#pragma clang attribute pop
}
void foo2() {
// expected-error@+1{{an attribute list cannot appear here}}
__attribute__((aligned(64)))
#pragma clang __debug dump foo
}
void foo3() {
// expected-error@+1{{an attribute list cannot appear here}}
[[nodiscard]]
#pragma clang attribute push(__attribute__((uninitialized)), apply_to = any(variable(is_local)))
{
int f;
}
#pragma clang attribute pop
}
void foo4() {
// expected-error@+1{{an attribute list cannot appear here}}
[[nodiscard]]
#pragma clang __debug dump foo
}