Skip to content

Commit 86137ed

Browse files
committed
add extension warning and tests
1 parent 464dd6d commit 86137ed

File tree

4 files changed

+49
-2
lines changed

4 files changed

+49
-2
lines changed

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1057,6 +1057,15 @@ def ext_ms_abstract_keyword : ExtWarn<
10571057
"'abstract' keyword is a Microsoft extension">,
10581058
InGroup<MicrosoftAbstract>;
10591059

1060+
def ext_relocatable_keyword : ExtWarn<
1061+
"'%select{trivially_relocatable|replaceable}0_if_eligible' "
1062+
"keyword is a C++2c extension">,
1063+
InGroup<CXX26>;
1064+
def warn_relocatable_keyword : Warning<
1065+
"'%select{trivially_relocatable|replaceable}0_if_eligible' "
1066+
"keyword is incompatible with standards before C++2c">,
1067+
DefaultIgnore, InGroup<CXXPre26Compat>;
1068+
10601069
def err_access_specifier_interface : Error<
10611070
"interface types cannot specify '%select{private|protected}0' access">;
10621071

clang/lib/Parse/ParseDeclCXX.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2711,6 +2711,12 @@ void Parser::ParseOptionalCXX2CTriviallyRelocatableSpecifier(
27112711
TriviallyRelocatableSpecifier &TRS) {
27122712
assert(isCXX2CTriviallyRelocatableKeyword() &&
27132713
"expected a trivially_relocatable specifier");
2714+
2715+
Diag(Tok.getLocation(), getLangOpts().CPlusPlus26
2716+
? diag::warn_relocatable_keyword
2717+
: diag::ext_relocatable_keyword)
2718+
<< /*relocatable*/ 0;
2719+
27142720
TRS = Actions.ActOnTriviallyRelocatableSpecifier(ConsumeToken());
27152721
}
27162722

@@ -2731,6 +2737,12 @@ bool Parser::isCXX2CReplaceableKeyword() const {
27312737
void Parser::ParseOptionalCXX2CReplaceableSpecifier(ReplaceableSpecifier &MRS) {
27322738
assert(isCXX2CReplaceableKeyword() &&
27332739
"expected a replaceable_if_eligible specifier");
2740+
2741+
Diag(Tok.getLocation(), getLangOpts().CPlusPlus26
2742+
? diag::warn_relocatable_keyword
2743+
: diag::ext_relocatable_keyword)
2744+
<< /*replaceable*/ 1;
2745+
27342746
MRS = Actions.ActOnReplaceableSpecifier(ConsumeToken());
27352747
}
27362748

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,34 @@
1-
// RUN: %clang_cc1 -std=c++2b -verify -fsyntax-only %s
1+
// RUN: %clang_cc1 -std=c++2c -verify=expected -fsyntax-only %s
2+
// RUN: %clang_cc1 -std=c++11 -verify=expected,cxx11 -fsyntax-only %s
3+
24

35

46
class A trivially_relocatable_if_eligible {};
7+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
58
class E final trivially_relocatable_if_eligible {};
9+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
610
class G trivially_relocatable_if_eligible final{};
11+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
712
class I trivially_relocatable_if_eligible trivially_relocatable_if_eligible final {}; // expected-error {{class already marked 'trivially_relocatable_if_eligible'}}
13+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
814
class trivially_relocatable_if_eligible trivially_relocatable_if_eligible {};
15+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
16+
17+
class J replaceable_if_eligible{};
18+
// cxx11-warning@-1 {{'replaceable_if_eligible' keyword is a C++2c extension}}
19+
class K replaceable_if_eligible replaceable_if_eligible {}; // expected-error {{class already marked 'replaceable_if_eligible'}}
20+
// cxx11-warning@-1 {{'replaceable_if_eligible' keyword is a C++2c extension}}
21+
class replaceable_if_eligible replaceable_if_eligible {};
22+
// cxx11-warning@-1 {{'replaceable_if_eligible' keyword is a C++2c extension}}
23+
class L replaceable_if_eligible trivially_relocatable_if_eligible final {};
24+
// cxx11-warning@-1 {{'replaceable_if_eligible' keyword is a C++2c extension}}
25+
// cxx11-warning@-2 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
26+
class M replaceable_if_eligible final trivially_relocatable_if_eligible {};
27+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
28+
// cxx11-warning@-2 {{'replaceable_if_eligible' keyword is a C++2c extension}}
29+
class N final trivially_relocatable_if_eligible replaceable_if_eligible {};
30+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
31+
// cxx11-warning@-2 {{'replaceable_if_eligible' keyword is a C++2c extension}}
32+
class O trivially_relocatable_if_eligible replaceable_if_eligible final {};
33+
// cxx11-warning@-1 {{'trivially_relocatable_if_eligible' keyword is a C++2c extension}}
34+
// cxx11-warning@-2 {{'replaceable_if_eligible' keyword is a C++2c extension}}

clang/www/cxx_status.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ <h2 id="cxx26">C++2c implementation status</h2>
280280
<tr>
281281
<td>Trivial Relocatability</pre></td>
282282
<td><a href="https://wg21.link/P2786">P2786R13</a></td>
283-
<td class="none" align="center">No</td>
283+
<td class="unreleased" align="center">Clang 21</td>
284284
</tr>
285285
<tr>
286286
<td><pre>#embed</pre></td>

0 commit comments

Comments
 (0)