@@ -180,6 +180,14 @@ void Parser::HandlePragmaOpenCLExtension() {
180
180
}
181
181
}
182
182
183
+ void Parser::HandlePragmaMSPointersToMembers () {
184
+ assert (Tok.is (tok::annot_pragma_ms_pointers_to_members));
185
+ Sema::PragmaMSPointersToMembersKind RepresentationMethod =
186
+ static_cast <Sema::PragmaMSPointersToMembersKind>(
187
+ reinterpret_cast <uintptr_t >(Tok.getAnnotationValue ()));
188
+ SourceLocation PragmaLoc = ConsumeToken (); // The annotation token.
189
+ Actions.ActOnPragmaMSPointersToMembers (RepresentationMethod, PragmaLoc);
190
+ }
183
191
184
192
185
193
// #pragma GCC visibility comes in two variants:
@@ -799,6 +807,99 @@ PragmaOpenMPHandler::HandlePragma(Preprocessor &PP,
799
807
/* DisableMacroExpansion=*/ true , /* OwnsTokens=*/ true );
800
808
}
801
809
810
+ // / \brief Handle '#pragma pointers_to_members'
811
+ // The grammar for this pragma is as follows:
812
+ //
813
+ // <inheritance model> ::= ('single' | 'multiple' | 'virtual') '_inheritance'
814
+ //
815
+ // #pragma pointers_to_members '(' 'best_case' ')'
816
+ // #pragma pointers_to_members '(' 'full_generality' [',' inheritance-model] ')'
817
+ // #pragma pointers_to_members '(' inheritance-model ')'
818
+ void PragmaMSPointersToMembers::HandlePragma (Preprocessor &PP,
819
+ PragmaIntroducerKind Introducer,
820
+ Token &Tok) {
821
+ SourceLocation PointersToMembersLoc = Tok.getLocation ();
822
+ PP.Lex (Tok);
823
+ if (Tok.isNot (tok::l_paren)) {
824
+ PP.Diag (PointersToMembersLoc, diag::warn_pragma_expected_lparen)
825
+ << " pointers_to_members" ;
826
+ return ;
827
+ }
828
+ PP.Lex (Tok);
829
+ const IdentifierInfo *Arg = Tok.getIdentifierInfo ();
830
+ if (!Arg) {
831
+ PP.Diag (Tok.getLocation (), diag::warn_pragma_expected_identifier)
832
+ << " pointers_to_members" ;
833
+ return ;
834
+ }
835
+ PP.Lex (Tok);
836
+
837
+ Sema::PragmaMSPointersToMembersKind RepresentationMethod;
838
+ if (Arg->isStr (" best_case" )) {
839
+ RepresentationMethod = Sema::PPTMK_BestCase;
840
+ } else {
841
+ if (Arg->isStr (" full_generality" )) {
842
+ if (Tok.is (tok::comma)) {
843
+ PP.Lex (Tok);
844
+
845
+ Arg = Tok.getIdentifierInfo ();
846
+ if (!Arg) {
847
+ PP.Diag (Tok.getLocation (),
848
+ diag::err_pragma_pointers_to_members_unknown_kind)
849
+ << Tok.getKind () << /* OnlyInheritanceModels*/ 0 ;
850
+ return ;
851
+ }
852
+ PP.Lex (Tok);
853
+ } else if (Tok.is (tok::r_paren)) {
854
+ // #pragma pointers_to_members(full_generality) implicitly specifies
855
+ // virtual_inheritance.
856
+ Arg = 0 ;
857
+ RepresentationMethod = Sema::PPTMK_FullGeneralityVirtualInheritance;
858
+ } else {
859
+ PP.Diag (Tok.getLocation (), diag::err_expected_punc)
860
+ << " full_generality" ;
861
+ return ;
862
+ }
863
+ }
864
+
865
+ if (Arg) {
866
+ if (Arg->isStr (" single_inheritance" )) {
867
+ RepresentationMethod = Sema::PPTMK_FullGeneralitySingleInheritance;
868
+ } else if (Arg->isStr (" multiple_inheritance" )) {
869
+ RepresentationMethod = Sema::PPTMK_FullGeneralityMultipleInheritance;
870
+ } else if (Arg->isStr (" virtual_inheritance" )) {
871
+ RepresentationMethod = Sema::PPTMK_FullGeneralityVirtualInheritance;
872
+ } else {
873
+ PP.Diag (Tok.getLocation (),
874
+ diag::err_pragma_pointers_to_members_unknown_kind)
875
+ << Arg << /* HasPointerDeclaration*/ 1 ;
876
+ return ;
877
+ }
878
+ }
879
+ }
880
+
881
+ if (Tok.isNot (tok::r_paren)) {
882
+ PP.Diag (Tok.getLocation (), diag::err_expected_rparen_after)
883
+ << (Arg ? Arg->getName () : " full_generality" );
884
+ return ;
885
+ }
886
+
887
+ PP.Lex (Tok);
888
+ if (Tok.isNot (tok::eod)) {
889
+ PP.Diag (Tok.getLocation (), diag::warn_pragma_extra_tokens_at_eol)
890
+ << " pointers_to_members" ;
891
+ return ;
892
+ }
893
+
894
+ Token AnnotTok;
895
+ AnnotTok.startToken ();
896
+ AnnotTok.setKind (tok::annot_pragma_ms_pointers_to_members);
897
+ AnnotTok.setLocation (PointersToMembersLoc);
898
+ AnnotTok.setAnnotationValue (
899
+ reinterpret_cast <void *>(static_cast <uintptr_t >(RepresentationMethod)));
900
+ PP.EnterToken (AnnotTok);
901
+ }
902
+
802
903
// / \brief Handle the Microsoft \#pragma detect_mismatch extension.
803
904
// /
804
905
// / The syntax is:
0 commit comments