@@ -300,12 +300,6 @@ struct PragmaMSRuntimeChecksHandler : public EmptyPragmaHandler {
300300 PragmaMSRuntimeChecksHandler () : EmptyPragmaHandler(" runtime_checks" ) {}
301301};
302302
303- struct PragmaMSIntrinsicHandler : public PragmaHandler {
304- PragmaMSIntrinsicHandler () : PragmaHandler(" intrinsic" ) {}
305- void HandlePragma (Preprocessor &PP, PragmaIntroducer Introducer,
306- Token &FirstToken) override ;
307- };
308-
309303// "\#pragma fenv_access (on)".
310304struct PragmaMSFenvAccessHandler : public PragmaHandler {
311305 PragmaMSFenvAccessHandler () : PragmaHandler(" fenv_access" ) {}
@@ -517,7 +511,7 @@ void Parser::initializePragmaHandlers() {
517511 PP.AddPragmaHandler (MSOptimize.get ());
518512 MSRuntimeChecks = std::make_unique<PragmaMSRuntimeChecksHandler>();
519513 PP.AddPragmaHandler (MSRuntimeChecks.get ());
520- MSIntrinsic = std::make_unique<PragmaMSIntrinsicHandler>( );
514+ MSIntrinsic = std::make_unique<PragmaMSPragma>( " intrinsic " );
521515 PP.AddPragmaHandler (MSIntrinsic.get ());
522516 MSFenvAccess = std::make_unique<PragmaMSFenvAccessHandler>();
523517 PP.AddPragmaHandler (MSFenvAccess.get ());
@@ -1046,7 +1040,8 @@ void Parser::HandlePragmaMSPragma() {
10461040 .Case (" strict_gs_check" , &Parser::HandlePragmaMSStrictGuardStackCheck)
10471041 .Case (" function" , &Parser::HandlePragmaMSFunction)
10481042 .Case (" alloc_text" , &Parser::HandlePragmaMSAllocText)
1049- .Case (" optimize" , &Parser::HandlePragmaMSOptimize);
1043+ .Case (" optimize" , &Parser::HandlePragmaMSOptimize)
1044+ .Case (" intrinsic" , &Parser::HandlePragmaMSIntrinsic);
10501045
10511046 if (!(this ->*Handler)(PragmaName, PragmaLocation)) {
10521047 // Pragma handling failed, and has been diagnosed. Slurp up the tokens
@@ -3762,56 +3757,6 @@ void PragmaUnrollHintHandler::HandlePragma(Preprocessor &PP,
37623757 /* DisableMacroExpansion=*/ false , /* IsReinject=*/ false );
37633758}
37643759
3765- // / Handle the Microsoft \#pragma intrinsic extension.
3766- // /
3767- // / The syntax is:
3768- // / \code
3769- // / #pragma intrinsic(memset)
3770- // / #pragma intrinsic(strlen, memcpy)
3771- // / \endcode
3772- // /
3773- // / Pragma intrisic tells the compiler to use a builtin version of the
3774- // / function. Clang does it anyway, so the pragma doesn't really do anything.
3775- // / Anyway, we emit a warning if the function specified in \#pragma intrinsic
3776- // / isn't an intrinsic in clang and suggest to include intrin.h.
3777- void PragmaMSIntrinsicHandler::HandlePragma (Preprocessor &PP,
3778- PragmaIntroducer Introducer,
3779- Token &Tok) {
3780- PP.Lex (Tok);
3781-
3782- if (Tok.isNot (tok::l_paren)) {
3783- PP.Diag (Tok.getLocation (), diag::warn_pragma_expected_lparen)
3784- << " intrinsic" ;
3785- return ;
3786- }
3787- PP.Lex (Tok);
3788-
3789- bool SuggestIntrinH = !PP.isMacroDefined (" __INTRIN_H" );
3790-
3791- while (Tok.is (tok::identifier)) {
3792- IdentifierInfo *II = Tok.getIdentifierInfo ();
3793- if (!II->getBuiltinID ())
3794- PP.Diag (Tok.getLocation (), diag::warn_pragma_intrinsic_builtin)
3795- << II << SuggestIntrinH;
3796-
3797- PP.Lex (Tok);
3798- if (Tok.isNot (tok::comma))
3799- break ;
3800- PP.Lex (Tok);
3801- }
3802-
3803- if (Tok.isNot (tok::r_paren)) {
3804- PP.Diag (Tok.getLocation (), diag::warn_pragma_expected_rparen)
3805- << " intrinsic" ;
3806- return ;
3807- }
3808- PP.Lex (Tok);
3809-
3810- if (Tok.isNot (tok::eod))
3811- PP.Diag (Tok.getLocation (), diag::warn_pragma_extra_tokens_at_eol)
3812- << " intrinsic" ;
3813- }
3814-
38153760bool Parser::HandlePragmaMSFunction (StringRef PragmaName,
38163761 SourceLocation PragmaLocation) {
38173762 Token FirstTok = Tok;
@@ -3907,6 +3852,56 @@ bool Parser::HandlePragmaMSOptimize(StringRef PragmaName,
39073852 return true ;
39083853}
39093854
3855+ // / Handle the Microsoft \#pragma intrinsic extension.
3856+ // /
3857+ // / The syntax is:
3858+ // / \code
3859+ // / #pragma intrinsic(memset)
3860+ // / #pragma intrinsic(strlen, memcpy)
3861+ // / \endcode
3862+ // /
3863+ // / Pragma intrisic tells the compiler to use a builtin version of the
3864+ // / function. Clang does it anyway, so the pragma doesn't really do anything.
3865+ // / Anyway, we emit a warning if the function specified in \#pragma intrinsic
3866+ // / isn't an intrinsic in clang and suggest to include intrin.h, as well as
3867+ // / declare the builtin if it has not been declared.
3868+ bool Parser::HandlePragmaMSIntrinsic (StringRef PragmaName,
3869+ SourceLocation PragmaLocation) {
3870+ if (ExpectAndConsume (tok::l_paren, diag::warn_pragma_expected_lparen,
3871+ PragmaName))
3872+ return false ;
3873+
3874+ bool SuggestIntrinH = !PP.isMacroDefined (" __INTRIN_H" );
3875+
3876+ while (Tok.is (tok::identifier)) {
3877+ IdentifierInfo *II = Tok.getIdentifierInfo ();
3878+ if (!II->getBuiltinID ())
3879+ PP.Diag (Tok.getLocation (), diag::warn_pragma_intrinsic_builtin)
3880+ << II << SuggestIntrinH;
3881+ // If the builtin hasn't already been declared, declare it now.
3882+ DeclarationNameInfo NameInfo (II, Tok.getLocation ());
3883+ LookupResult Previous (Actions, NameInfo, Sema::LookupOrdinaryName,
3884+ RedeclarationKind::NotForRedeclaration);
3885+ Actions.LookupName (Previous, Actions.getCurScope (),
3886+ /* CreateBuiltins*/ false );
3887+ if (Previous.empty ())
3888+ Actions.LazilyCreateBuiltin (II, II->getBuiltinID (), Actions.getCurScope (),
3889+ /* ForRedeclaration*/ true , Tok.getLocation ());
3890+ PP.Lex (Tok);
3891+ if (Tok.isNot (tok::comma))
3892+ break ;
3893+ PP.Lex (Tok);
3894+ }
3895+ if (ExpectAndConsume (tok::r_paren, diag::warn_pragma_expected_rparen,
3896+ PragmaName))
3897+ return false ;
3898+
3899+ if (ExpectAndConsume (tok::eof, diag::warn_pragma_extra_tokens_at_eol,
3900+ PragmaName))
3901+ return false ;
3902+ return true ;
3903+ }
3904+
39103905void PragmaForceCUDAHostDeviceHandler::HandlePragma (
39113906 Preprocessor &PP, PragmaIntroducer Introducer, Token &Tok) {
39123907 Token FirstTok = Tok;
0 commit comments