Author: lebedevri Date: Wed Mar 14 12:31:34 2018 New Revision: 327558 URL: http://llvm.org/viewvc/llvm-project?rev=327558&view=rev Log: [Parser] (C++) Make -Wextra-semi slightly more useful
Summary: Let's suppose the `-Weverything` is passed. Given code like ``` void F() {} ; ``` If the code is compiled with `-std=c++03`, it would diagnose that extra sema: ``` <source>:2:1: warning: extra ';' outside of a function is a C++11 extension [-Wc++11-extra-semi] ; ^~ ``` If the code is compiled with `-std=c++11`, it also would diagnose that extra sema: ``` <source>:2:1: warning: extra ';' outside of a function is incompatible with C++98 [-Wc++98-compat-pedantic] ; ^~ ``` But, let's suppose the C++11 or higher is used, and the used does not care about `-Wc++98-compat-pedantic`, so he disables that diagnostic. And that silences the complaint about extra `;` too. And there is no way to re-enable that particular diagnostic, passing `-Wextra-semi` does nothing... Now, there is also a related `no newline at end of file` diagnostic, which is also emitted by `-Wc++98-compat-pedantic` ``` <source>:2:2: warning: C++98 requires newline at end of file [-Wc++98-compat-pedantic] ; ^ ``` But unlike the previous case, if `-Wno-c++98-compat-pedantic` is passed, that diagnostic stays displayed: ``` <source>:2:2: warning: no newline at end of file [-Wnewline-eof] ; ^ ``` This diff refactors the code so `-Wc++98-compat-extra-semi` can be re-enabled, after the `-Wc++98-compat-pedantic` was disabled. This seems ugly, but there does not seem to be any saner way. Testing: `$ ninja check-clang` Reviewers: rsmith, rtrieu, aaron.ballman Reviewed By: aaron.ballman Subscribers: jordan_rose, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D43162 Added: cfe/trunk/test/SemaCXX/extra-semi.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td cfe/trunk/test/Parser/cxx-extra-semi.cpp Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=327558&r1=327557&r2=327558&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Wed Mar 14 12:31:34 2018 @@ -151,8 +151,10 @@ def Exceptions : DiagGroup<"exceptions"> 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 CXX98Compat : DiagGroup<"c++98-compa def CXX98CompatPedantic : DiagGroup<"c++98-compat-pedantic", [CXX98Compat, CXX98CompatBindToTemporaryCopy, + CXX98CompatExtraSemi, CXXPre14CompatPedantic, CXXPre17CompatPedantic, CXXPre2aCompatPedantic]>; Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=327558&r1=327557&r2=327558&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Wed Mar 14 12:31:34 2018 @@ -39,7 +39,7 @@ def ext_empty_translation_unit : Extensi 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|" Modified: cfe/trunk/test/Parser/cxx-extra-semi.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/cxx-extra-semi.cpp?rev=327558&r1=327557&r2=327558&view=diff ============================================================================== --- cfe/trunk/test/Parser/cxx-extra-semi.cpp (original) +++ cfe/trunk/test/Parser/cxx-extra-semi.cpp Wed Mar 14 12:31:34 2018 @@ -38,4 +38,7 @@ union B { #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 Added: cfe/trunk/test/SemaCXX/extra-semi.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/extra-semi.cpp?rev=327558&view=auto ============================================================================== --- cfe/trunk/test/SemaCXX/extra-semi.cpp (added) +++ cfe/trunk/test/SemaCXX/extra-semi.cpp Wed Mar 14 12:31:34 2018 @@ -0,0 +1,29 @@ +// 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(){} +; +#if __cplusplus < 201103L +// expected-warning@-2{{extra ';' outside of a function is a C++11 extension}} +#else +// expected-warning@-4{{extra ';' outside of a function is incompatible with C++98}} +#endif + +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}} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits