-
Notifications
You must be signed in to change notification settings - Fork 14.9k
[clang] fix parsing of late parsed attributes with delayed template parsing #163483
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[clang] fix parsing of late parsed attributes with delayed template parsing #163483
Conversation
@llvm/pr-subscribers-clang Author: Matheus Izvekov (mizvekov) ChangesBesides ignoring the attribute, this would also cause a memory leak. Full diff: https://github.com/llvm/llvm-project/pull/163483.diff 3 Files Affected:
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index db2b0f6fd5027..e4a66fad29c83 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -424,7 +424,8 @@ Bug Fixes to Attribute Support
(#GH141504) and on types returned from indirect calls (#GH142453).
- Fixes some late parsed attributes, when applied to function definitions, not being parsed
in function try blocks, and some situations where parsing of the function body
- is skipped, such as error recovery and code completion. (#GH153551)
+ is skipped, such as error recovery, code completion, and msvc-compatible delayed
+ template parsing. (#GH153551)
- Using ``[[gnu::cleanup(some_func)]]`` where some_func is annotated with
``[[gnu::error("some error")]]`` now correctly triggers an error. (#GH146520)
- Fix a crash when the function name is empty in the `swift_name` attribute. (#GH157075)
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index bbff627d46600..95e6d497221dd 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -1285,6 +1285,9 @@ Decl *Parser::ParseFunctionDefinition(ParsingDeclarator &D,
D.complete(DP);
D.getMutableDeclSpec().abort();
+ if (LateParsedAttrs)
+ ParseLexedAttributeList(*LateParsedAttrs, DP, /*EnterScope=*/false, /*OnDefinition=*/true);
+
if (SkipFunctionBodies && (!DP || Actions.canSkipFunctionBody(DP)) &&
trySkippingFunctionBody()) {
BodyScope.Exit();
diff --git a/clang/test/Parser/DelayedTemplateParsing.cpp b/clang/test/Parser/DelayedTemplateParsing.cpp
index bcd286ae04492..ba0d71ba2f0a0 100644
--- a/clang/test/Parser/DelayedTemplateParsing.cpp
+++ b/clang/test/Parser/DelayedTemplateParsing.cpp
@@ -43,10 +43,10 @@ void undeclared()
}
-template <class T> void foo5() {} //expected-note {{previous definition is here}}
+template <class T> void foo5() {} //expected-note {{previous definition is here}}
template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}}
-
+
namespace PR11931 {
@@ -195,3 +195,12 @@ template <typename> struct PR38460_2 {
}
};
template struct PR38460_2<int>;
+
+namespace LateParsedAttrs {
+ template <class>
+ void f() __attribute__((__diagnose_if__(true, "foo", "error"))) {}
+ // expected-note@-1 {{from 'diagnose_if' attribute on 'f<int>'}}
+ void g() {
+ f<int>(); // expected-error {{foo}}
+ }
+} // namespace LateParsedAttrs
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
a4e0439
to
2372be2
Compare
…arsing Besides ignoring the attribute, this would also cause a memory leak.
2372be2
to
43ac945
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM!
This simply ignores 'delayed template parsing' when functions have late parsed attributes, since these are not MSVC compatible anyway.
Besides ignoring the attribute, this would also cause a memory leak.