This is a bit confusing, I think. We use -Wignored-pragmas for pragmas that clang doesn't parse, and also for ignored #pragma intrinsics.
-Wunknown-pragmas isn't used that much, but there is e.g. "pragma STDC FENV_ACCESS ON is not supported, ignoring pragma". Note that the text says it's unsupported and ignored, not that it's unknown. In terms of warning name, -Wignored-pragmas, seems a better fit, so maybe we should leave it as is. On Wed, Mar 21, 2018 at 9:56 PM, Hans Wennborg <h...@chromium.org> wrote: > Not sure either, but I think the ignored warning is used for pragmas > that clang fails to parse, so maybe unsupported is better. > > On Wed, Mar 21, 2018 at 9:33 PM, Nico Weber <tha...@chromium.org> wrote: >> Ah! Hm, maybe that's the better group for this anyway? Not sure. >> >> On Wed, Mar 21, 2018, 9:03 PM Hans Wennborg <h...@chromium.org> wrote: >>> >>> Aw, rats. I put it under -Wignored-pragmas rather than >>> -Wunsupported-pragmas, because I was looking at #pragma intrinsic. >>> >>> I'll take a look at this again tomorrow. >>> >>> On Wed, Mar 21, 2018 at 5:18 PM, Nico Weber via cfe-commits >>> <cfe-commits@lists.llvm.org> wrote: >>> > From the bot changes, it seems that -Wunknown-pragma doesn't disable >>> > this >>> > new warning. Shouldn't it do that? >>> > >>> > On Tue, Mar 20, 2018, 9:55 AM Hans Wennborg via cfe-commits >>> > <cfe-commits@lists.llvm.org> wrote: >>> >> >>> >> Author: hans >>> >> Date: Tue Mar 20 01:53:11 2018 >>> >> New Revision: 327959 >>> >> >>> >> URL: http://llvm.org/viewvc/llvm-project?rev=327959&view=rev >>> >> Log: >>> >> [ms] Parse #pragma optimize and ignore it behind its own flag >>> >> >>> >> This allows users to turn off warnings about this pragma specifically, >>> >> while still receiving warnings about other ignored pragmas. >>> >> >>> >> Differential Revision: https://reviews.llvm.org/D44630 >>> >> >>> >> Modified: >>> >> cfe/trunk/include/clang/Basic/DiagnosticGroups.td >>> >> cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td >>> >> cfe/trunk/include/clang/Parse/Parser.h >>> >> cfe/trunk/lib/Parse/ParsePragma.cpp >>> >> cfe/trunk/test/Preprocessor/pragma_microsoft.c >>> >> >>> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticGroups.td >>> >> URL: >>> >> >>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticGroups.td?rev=327959&r1=327958&r2=327959&view=diff >>> >> >>> >> >>> >> ============================================================================== >>> >> --- cfe/trunk/include/clang/Basic/DiagnosticGroups.td (original) >>> >> +++ cfe/trunk/include/clang/Basic/DiagnosticGroups.td Tue Mar 20 >>> >> 01:53:11 >>> >> 2018 >>> >> @@ -515,8 +515,13 @@ def UninitializedStaticSelfInit : DiagGr >>> >> def Uninitialized : DiagGroup<"uninitialized", >>> >> [UninitializedSometimes, >>> >> >>> >> UninitializedStaticSelfInit]>; >>> >> def IgnoredPragmaIntrinsic : DiagGroup<"ignored-pragma-intrinsic">; >>> >> +// #pragma optimize is often used to avoid to work around MSVC codegen >>> >> bugs or >>> >> +// to disable inlining. It's not completely clear what alternative to >>> >> suggest >>> >> +// (#pragma clang optimize, noinline) so suggest nothing for now. >>> >> +def IgnoredPragmaOptimize : DiagGroup<"ignored-pragma-optimize">; >>> >> def UnknownPragmas : DiagGroup<"unknown-pragmas">; >>> >> -def IgnoredPragmas : DiagGroup<"ignored-pragmas", >>> >> [IgnoredPragmaIntrinsic]>; >>> >> +def IgnoredPragmas : DiagGroup<"ignored-pragmas", >>> >> + [IgnoredPragmaIntrinsic, IgnoredPragmaOptimize]>; >>> >> def PragmaClangAttribute : DiagGroup<"pragma-clang-attribute">; >>> >> def PragmaPackSuspiciousInclude : >>> >> DiagGroup<"pragma-pack-suspicious-include">; >>> >> def PragmaPack : DiagGroup<"pragma-pack", >>> >> [PragmaPackSuspiciousInclude]>; >>> >> >>> >> Modified: cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td >>> >> URL: >>> >> >>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td?rev=327959&r1=327958&r2=327959&view=diff >>> >> >>> >> >>> >> ============================================================================== >>> >> --- cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td (original) >>> >> +++ cfe/trunk/include/clang/Basic/DiagnosticParseKinds.td Tue Mar 20 >>> >> 01:53:11 2018 >>> >> @@ -895,6 +895,12 @@ def warn_pragma_expected_rparen : Warnin >>> >> "missing ')' after '#pragma %0' - ignoring">, >>> >> InGroup<IgnoredPragmas>; >>> >> def warn_pragma_expected_identifier : Warning< >>> >> "expected identifier in '#pragma %0' - ignored">, >>> >> InGroup<IgnoredPragmas>; >>> >> +def warn_pragma_expected_string : Warning< >>> >> + "expected string literal in '#pragma %0' - ignoring">, >>> >> InGroup<IgnoredPragmas>; >>> >> +def warn_pragma_missing_argument : Warning< >>> >> + "missing argument to '#pragma %0'%select{|; expected %2}1">, >>> >> InGroup<IgnoredPragmas>; >>> >> +def warn_pragma_invalid_argument : Warning< >>> >> + "unexpected argument '%0' to '#pragma %1'%select{|; expected %3}2">, >>> >> InGroup<IgnoredPragmas>; >>> >> >>> >> // '#pragma clang section' related errors >>> >> def err_pragma_expected_clang_section_name : Error< >>> >> @@ -923,6 +929,8 @@ def warn_pragma_ms_struct : Warning< >>> >> def warn_pragma_extra_tokens_at_eol : Warning< >>> >> "extra tokens at end of '#pragma %0' - ignored">, >>> >> InGroup<IgnoredPragmas>; >>> >> +def warn_pragma_expected_comma : Warning< >>> >> + "expected ',' in '#pragma %0'">, InGroup<IgnoredPragmas>; >>> >> def warn_pragma_expected_punc : Warning< >>> >> "expected ')' or ',' in '#pragma %0'">, InGroup<IgnoredPragmas>; >>> >> def warn_pragma_expected_non_wide_string : Warning< >>> >> @@ -960,6 +968,10 @@ def warn_pragma_pack_malformed : Warning >>> >> def warn_pragma_intrinsic_builtin : Warning< >>> >> "%0 is not a recognized builtin%select{|; consider including >>> >> <intrin.h> >>> >> to access non-builtin intrinsics}1">, >>> >> InGroup<IgnoredPragmaIntrinsic>; >>> >> +// - #pragma optimize >>> >> +def warn_pragma_optimize : Warning< >>> >> + "'#pragma optimize' is not supported">, >>> >> + InGroup<IgnoredPragmaOptimize>; >>> >> // - #pragma unused >>> >> def warn_pragma_unused_expected_var : Warning< >>> >> "expected '#pragma unused' argument to be a variable name">, >>> >> >>> >> Modified: cfe/trunk/include/clang/Parse/Parser.h >>> >> URL: >>> >> >>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Parser.h?rev=327959&r1=327958&r2=327959&view=diff >>> >> >>> >> >>> >> ============================================================================== >>> >> --- cfe/trunk/include/clang/Parse/Parser.h (original) >>> >> +++ cfe/trunk/include/clang/Parse/Parser.h Tue Mar 20 01:53:11 2018 >>> >> @@ -179,6 +179,7 @@ class Parser : public CodeCompletionHand >>> >> std::unique_ptr<PragmaHandler> MSSection; >>> >> std::unique_ptr<PragmaHandler> MSRuntimeChecks; >>> >> std::unique_ptr<PragmaHandler> MSIntrinsic; >>> >> + std::unique_ptr<PragmaHandler> MSOptimize; >>> >> std::unique_ptr<PragmaHandler> CUDAForceHostDeviceHandler; >>> >> std::unique_ptr<PragmaHandler> OptimizeHandler; >>> >> std::unique_ptr<PragmaHandler> LoopHintHandler; >>> >> >>> >> Modified: cfe/trunk/lib/Parse/ParsePragma.cpp >>> >> URL: >>> >> >>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Parse/ParsePragma.cpp?rev=327959&r1=327958&r2=327959&view=diff >>> >> >>> >> >>> >> ============================================================================== >>> >> --- cfe/trunk/lib/Parse/ParsePragma.cpp (original) >>> >> +++ cfe/trunk/lib/Parse/ParsePragma.cpp Tue Mar 20 01:53:11 2018 >>> >> @@ -220,6 +220,12 @@ struct PragmaMSIntrinsicHandler : public >>> >> Token &FirstToken) override; >>> >> }; >>> >> >>> >> +struct PragmaMSOptimizeHandler : public PragmaHandler { >>> >> + PragmaMSOptimizeHandler() : PragmaHandler("optimize") {} >>> >> + void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer, >>> >> + Token &FirstToken) override; >>> >> +}; >>> >> + >>> >> struct PragmaForceCUDAHostDeviceHandler : public PragmaHandler { >>> >> PragmaForceCUDAHostDeviceHandler(Sema &Actions) >>> >> : PragmaHandler("force_cuda_host_device"), Actions(Actions) {} >>> >> @@ -324,6 +330,8 @@ void Parser::initializePragmaHandlers() >>> >> PP.AddPragmaHandler(MSRuntimeChecks.get()); >>> >> MSIntrinsic.reset(new PragmaMSIntrinsicHandler()); >>> >> PP.AddPragmaHandler(MSIntrinsic.get()); >>> >> + MSOptimize.reset(new PragmaMSOptimizeHandler()); >>> >> + PP.AddPragmaHandler(MSOptimize.get()); >>> >> } >>> >> >>> >> if (getLangOpts().CUDA) { >>> >> @@ -410,6 +418,8 @@ void Parser::resetPragmaHandlers() { >>> >> MSRuntimeChecks.reset(); >>> >> PP.RemovePragmaHandler(MSIntrinsic.get()); >>> >> MSIntrinsic.reset(); >>> >> + PP.RemovePragmaHandler(MSOptimize.get()); >>> >> + MSOptimize.reset(); >>> >> } >>> >> >>> >> if (getLangOpts().CUDA) { >>> >> @@ -2949,6 +2959,61 @@ void PragmaMSIntrinsicHandler::HandlePra >>> >> PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) >>> >> << "intrinsic"; >>> >> } >>> >> + >>> >> +// #pragma optimize("gsty", on|off) >>> >> +void PragmaMSOptimizeHandler::HandlePragma(Preprocessor &PP, >>> >> + PragmaIntroducerKind >>> >> Introducer, >>> >> + Token &Tok) { >>> >> + SourceLocation StartLoc = Tok.getLocation(); >>> >> + PP.Lex(Tok); >>> >> + >>> >> + if (Tok.isNot(tok::l_paren)) { >>> >> + PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_lparen) << >>> >> "optimize"; >>> >> + return; >>> >> + } >>> >> + PP.Lex(Tok); >>> >> + >>> >> + if (Tok.isNot(tok::string_literal)) { >>> >> + PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_string) << >>> >> "optimize"; >>> >> + return; >>> >> + } >>> >> + // We could syntax check the string but it's probably not worth the >>> >> effort. >>> >> + PP.Lex(Tok); >>> >> + >>> >> + if (Tok.isNot(tok::comma)) { >>> >> + PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_comma) << >>> >> "optimize"; >>> >> + return; >>> >> + } >>> >> + PP.Lex(Tok); >>> >> + >>> >> + if (Tok.is(tok::eod) || Tok.is(tok::r_paren)) { >>> >> + PP.Diag(Tok.getLocation(), diag::warn_pragma_missing_argument) >>> >> + << "optimize" << /*Expected=*/true << "'on' or 'off'"; >>> >> + return; >>> >> + } >>> >> + IdentifierInfo *II = Tok.getIdentifierInfo(); >>> >> + if (!II || (!II->isStr("on") && !II->isStr("off"))) { >>> >> + PP.Diag(Tok.getLocation(), diag::warn_pragma_invalid_argument) >>> >> + << PP.getSpelling(Tok) << "optimize" << /*Expected=*/true >>> >> + << "'on' or 'off'"; >>> >> + return; >>> >> + } >>> >> + PP.Lex(Tok); >>> >> + >>> >> + if (Tok.isNot(tok::r_paren)) { >>> >> + PP.Diag(Tok.getLocation(), diag::warn_pragma_expected_rparen) << >>> >> "optimize"; >>> >> + return; >>> >> + } >>> >> + PP.Lex(Tok); >>> >> + >>> >> + if (Tok.isNot(tok::eod)) { >>> >> + PP.Diag(Tok.getLocation(), diag::warn_pragma_extra_tokens_at_eol) >>> >> + << "optimize"; >>> >> + return; >>> >> + } >>> >> + PP.Diag(StartLoc, diag::warn_pragma_optimize); >>> >> +} >>> >> + >>> >> void PragmaForceCUDAHostDeviceHandler::HandlePragma( >>> >> Preprocessor &PP, PragmaIntroducerKind Introducer, Token &Tok) { >>> >> Token FirstTok = Tok; >>> >> >>> >> Modified: cfe/trunk/test/Preprocessor/pragma_microsoft.c >>> >> URL: >>> >> >>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/pragma_microsoft.c?rev=327959&r1=327958&r2=327959&view=diff >>> >> >>> >> >>> >> ============================================================================== >>> >> --- cfe/trunk/test/Preprocessor/pragma_microsoft.c (original) >>> >> +++ cfe/trunk/test/Preprocessor/pragma_microsoft.c Tue Mar 20 01:53:11 >>> >> 2018 >>> >> @@ -190,3 +190,11 @@ void g() {} >>> >> #pragma intrinsic(asdf) // no-warning >>> >> #pragma clang diagnostic pop >>> >> #pragma intrinsic(asdf) // expected-warning {{'asdf' is not a >>> >> recognized >>> >> builtin; consider including <intrin.h>}} >>> >> + >>> >> +#pragma optimize // expected-warning{{missing '(' after >>> >> '#pragma >>> >> optimize'}} >>> >> +#pragma optimize( // expected-warning{{expected string literal >>> >> in >>> >> '#pragma optimize'}} >>> >> +#pragma optimize(a // expected-warning{{expected string literal >>> >> in >>> >> '#pragma optimize'}} >>> >> +#pragma optimize("g" // expected-warning{{expected ',' in >>> >> '#pragma >>> >> optimize'}} >>> >> +#pragma optimize("g", // expected-warning{{missing argument to >>> >> '#pragma optimize'; expected 'on' or 'off'}} >>> >> +#pragma optimize("g",xyz // expected-warning{{unexpected argument >>> >> 'xyz' >>> >> to '#pragma optimize'; expected 'on' or 'off'}} >>> >> +#pragma optimize("g",on) // expected-warning{{#pragma optimize' is >>> >> not >>> >> supported}} >>> >> >>> >> >>> >> _______________________________________________ >>> >> cfe-commits mailing list >>> >> cfe-commits@lists.llvm.org >>> >> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> > >>> > >>> > _______________________________________________ >>> > cfe-commits mailing list >>> > cfe-commits@lists.llvm.org >>> > http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >>> > _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits