[Clang] disallow use of attributes before extern template declarations (#136328)

Fixes #79893 


--- 

This PR addresses the issue of _attributes_ being incorrectly allowed on
`extern template` declarations

```cpp
[[deprecated]] extern template struct S<int>;
```
This commit is contained in:
Oleksandr T. 2025-04-21 18:12:07 +03:00 committed by GitHub
parent 1cb82ff9cd
commit 08b0c2517e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 13 additions and 0 deletions

View File

@ -301,6 +301,9 @@ related warnings within the method body.
particularly relevant for AMDGPU targets, where they map to corresponding IR
metadata.
- Clang now disallows the use of attributes applied before an
``extern template`` declaration (#GH79893).
Improvements to Clang's diagnostics
-----------------------------------

View File

@ -1049,6 +1049,8 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs,
case tok::kw_extern:
if (getLangOpts().CPlusPlus && NextToken().is(tok::kw_template)) {
ProhibitAttributes(Attrs);
ProhibitAttributes(DeclSpecAttrs);
// Extern templates
SourceLocation ExternLoc = ConsumeToken();
SourceLocation TemplateLoc = ConsumeToken();

View File

@ -0,0 +1,8 @@
// RUN: %clang_cc1 -std=c++17 -fms-extensions -verify %s
template <class>
struct S {};
[[deprecated]] extern template struct S<int>; // expected-error {{an attribute list cannot appear here}}
__attribute__((deprecated)) extern template struct S<int>; // expected-error {{an attribute list cannot appear here}}
__declspec(deprecated) extern template struct S<int>; // expected-error {{expected unqualified-id}}