lebedev.ri updated this revision to Diff 136503. lebedev.ri edited the summary of this revision. lebedev.ri added a comment.
Reworked stuff via new `CXX98CompatExtraSemi` diag group. As expected, passing `-Wno-c++98-compat-pedantic` disables the extra-semi diag, which exactly the opposite from what i'm trying to do here... But now that the diag is moved to the new diag group, it can be re-enabled, which is at least something. But this looks kinda ugly. Is this how it should be? Repository: rC Clang https://reviews.llvm.org/D43162 Files: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticParseKinds.td test/Parser/cxx-extra-semi.cpp test/SemaCXX/extra-semi.cpp Index: test/SemaCXX/extra-semi.cpp =================================================================== --- /dev/null +++ test/SemaCXX/extra-semi.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -verify -std=c++98 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++03 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++11 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++17 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++2a -Wextra-semi %s +// RUN: %clang_cc1 -verify -Weverything -Wno-c++98-compat %s +// RUN: %clang_cc1 -verify -Weverything -Wno-c++98-compat-pedantic -Wc++98-compat-extra-semi %s + +// Last RUN line checks that c++98-compat-extra-semi can still be re-enabled. + +void F(); + +void F(){} +; // expected-warning {{extra ';' outside of a function is}} + +namespace ns { +class C { + void F() const; +}; +} +; // expected-warning {{extra ';' outside of a function is}} + +void ns::C::F() const {} +; // expected-warning {{extra ';' outside of a function is}} Index: test/Parser/cxx-extra-semi.cpp =================================================================== --- test/Parser/cxx-extra-semi.cpp +++ test/Parser/cxx-extra-semi.cpp @@ -38,4 +38,7 @@ #if __cplusplus < 201103L // expected-warning@-3{{extra ';' outside of a function is a C++11 extension}} // expected-warning@-3{{extra ';' outside of a function is a C++11 extension}} +#elif !defined(PEDANTIC) +// expected-warning@-6{{extra ';' outside of a function is incompatible with C++98}} +// expected-warning@-6{{extra ';' outside of a function is incompatible with C++98}} #endif Index: include/clang/Basic/DiagnosticParseKinds.td =================================================================== --- include/clang/Basic/DiagnosticParseKinds.td +++ include/clang/Basic/DiagnosticParseKinds.td @@ -39,7 +39,7 @@ InGroup<DiagGroup<"empty-translation-unit">>; def warn_cxx98_compat_top_level_semi : Warning< "extra ';' outside of a function is incompatible with C++98">, - InGroup<CXX98CompatPedantic>, DefaultIgnore; + InGroup<CXX98CompatExtraSemi>, DefaultIgnore; def ext_extra_semi : Extension< "extra ';' %select{" "outside of a function|" Index: include/clang/Basic/DiagnosticGroups.td =================================================================== --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -151,8 +151,10 @@ def GNUEmptyInitializer : DiagGroup<"gnu-empty-initializer">; def GNUEmptyStruct : DiagGroup<"gnu-empty-struct">; def ExtraTokens : DiagGroup<"extra-tokens">; +def CXX98CompatExtraSemi : DiagGroup<"c++98-compat-extra-semi">; def CXX11ExtraSemi : DiagGroup<"c++11-extra-semi">; -def ExtraSemi : DiagGroup<"extra-semi", [CXX11ExtraSemi]>; +def ExtraSemi : DiagGroup<"extra-semi", [CXX98CompatExtraSemi, + CXX11ExtraSemi]>; def GNUFlexibleArrayInitializer : DiagGroup<"gnu-flexible-array-initializer">; def GNUFlexibleArrayUnionMember : DiagGroup<"gnu-flexible-array-union-member">; @@ -196,6 +198,7 @@ def CXX98CompatPedantic : DiagGroup<"c++98-compat-pedantic", [CXX98Compat, CXX98CompatBindToTemporaryCopy, + CXX98CompatExtraSemi, CXXPre14CompatPedantic, CXXPre17CompatPedantic, CXXPre2aCompatPedantic]>;
Index: test/SemaCXX/extra-semi.cpp =================================================================== --- /dev/null +++ test/SemaCXX/extra-semi.cpp @@ -0,0 +1,24 @@ +// RUN: %clang_cc1 -verify -std=c++98 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++03 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++11 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++17 -Wextra-semi %s +// RUN: %clang_cc1 -verify -std=c++2a -Wextra-semi %s +// RUN: %clang_cc1 -verify -Weverything -Wno-c++98-compat %s +// RUN: %clang_cc1 -verify -Weverything -Wno-c++98-compat-pedantic -Wc++98-compat-extra-semi %s + +// Last RUN line checks that c++98-compat-extra-semi can still be re-enabled. + +void F(); + +void F(){} +; // expected-warning {{extra ';' outside of a function is}} + +namespace ns { +class C { + void F() const; +}; +} +; // expected-warning {{extra ';' outside of a function is}} + +void ns::C::F() const {} +; // expected-warning {{extra ';' outside of a function is}} Index: test/Parser/cxx-extra-semi.cpp =================================================================== --- test/Parser/cxx-extra-semi.cpp +++ test/Parser/cxx-extra-semi.cpp @@ -38,4 +38,7 @@ #if __cplusplus < 201103L // expected-warning@-3{{extra ';' outside of a function is a C++11 extension}} // expected-warning@-3{{extra ';' outside of a function is a C++11 extension}} +#elif !defined(PEDANTIC) +// expected-warning@-6{{extra ';' outside of a function is incompatible with C++98}} +// expected-warning@-6{{extra ';' outside of a function is incompatible with C++98}} #endif Index: include/clang/Basic/DiagnosticParseKinds.td =================================================================== --- include/clang/Basic/DiagnosticParseKinds.td +++ include/clang/Basic/DiagnosticParseKinds.td @@ -39,7 +39,7 @@ InGroup<DiagGroup<"empty-translation-unit">>; def warn_cxx98_compat_top_level_semi : Warning< "extra ';' outside of a function is incompatible with C++98">, - InGroup<CXX98CompatPedantic>, DefaultIgnore; + InGroup<CXX98CompatExtraSemi>, DefaultIgnore; def ext_extra_semi : Extension< "extra ';' %select{" "outside of a function|" Index: include/clang/Basic/DiagnosticGroups.td =================================================================== --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -151,8 +151,10 @@ def GNUEmptyInitializer : DiagGroup<"gnu-empty-initializer">; def GNUEmptyStruct : DiagGroup<"gnu-empty-struct">; def ExtraTokens : DiagGroup<"extra-tokens">; +def CXX98CompatExtraSemi : DiagGroup<"c++98-compat-extra-semi">; def CXX11ExtraSemi : DiagGroup<"c++11-extra-semi">; -def ExtraSemi : DiagGroup<"extra-semi", [CXX11ExtraSemi]>; +def ExtraSemi : DiagGroup<"extra-semi", [CXX98CompatExtraSemi, + CXX11ExtraSemi]>; def GNUFlexibleArrayInitializer : DiagGroup<"gnu-flexible-array-initializer">; def GNUFlexibleArrayUnionMember : DiagGroup<"gnu-flexible-array-union-member">; @@ -196,6 +198,7 @@ def CXX98CompatPedantic : DiagGroup<"c++98-compat-pedantic", [CXX98Compat, CXX98CompatBindToTemporaryCopy, + CXX98CompatExtraSemi, CXXPre14CompatPedantic, CXXPre17CompatPedantic, CXXPre2aCompatPedantic]>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits