Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions clang/lib/Parse/ParseStmt.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -526,10 +526,14 @@ StmtResult Parser::ParseStatementOrDeclarationAfterAttributes(
return ParsePragmaLoopHint(Stmts, StmtCtx, TrailingElseLoc, CXX11Attrs);

case tok::annot_pragma_dump:
ProhibitAttributes(CXX11Attrs);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TIL

Does kw_try and kw___leave also need this?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, both of those successfully produce a statement out of this, so they won't assert. So any attributes you try to apply will either be valid, or fail because they don't apply to a statement.

The difference in these two is that they don't result in either an error OR a valid statement.

ProhibitAttributes(GNUAttrs);
HandlePragmaDump();
return StmtEmpty();

case tok::annot_pragma_attribute:
ProhibitAttributes(CXX11Attrs);
ProhibitAttributes(GNUAttrs);
HandlePragmaAttribute();
return StmtEmpty();
}
Expand Down
33 changes: 33 additions & 0 deletions clang/test/Parser/gh137861.cpp
Original file line number Diff line number Diff line change
@@ -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
}
Loading