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