@@ -7787,7 +7787,10 @@ SourceLocation ASTReader::getSourceLocationForDeclID(GlobalDeclID ID) {
77877787 return Loc;
77887788}
77897789
7790- static Decl *getPredefinedDecl (ASTContext &Context, PredefinedDeclIDs ID) {
7790+ Decl *ASTReader::getPredefinedDecl (PredefinedDeclIDs ID) {
7791+ assert (ContextObj && " reading predefined decl without AST context" );
7792+ ASTContext &Context = *ContextObj;
7793+ Decl *NewLoaded = nullptr ;
77917794 switch (ID) {
77927795 case PREDEF_DECL_NULL_ID:
77937796 return nullptr ;
@@ -7796,54 +7799,106 @@ static Decl *getPredefinedDecl(ASTContext &Context, PredefinedDeclIDs ID) {
77967799 return Context.getTranslationUnitDecl ();
77977800
77987801 case PREDEF_DECL_OBJC_ID_ID:
7799- return Context.getObjCIdDecl ();
7802+ if (Context.ObjCIdDecl )
7803+ return Context.ObjCIdDecl ;
7804+ NewLoaded = Context.getObjCIdDecl ();
7805+ break ;
78007806
78017807 case PREDEF_DECL_OBJC_SEL_ID:
7802- return Context.getObjCSelDecl ();
7808+ if (Context.ObjCSelDecl )
7809+ return Context.ObjCSelDecl ;
7810+ NewLoaded = Context.getObjCSelDecl ();
7811+ break ;
78037812
78047813 case PREDEF_DECL_OBJC_CLASS_ID:
7805- return Context.getObjCClassDecl ();
7814+ if (Context.ObjCClassDecl )
7815+ return Context.ObjCClassDecl ;
7816+ NewLoaded = Context.getObjCClassDecl ();
7817+ break ;
78067818
78077819 case PREDEF_DECL_OBJC_PROTOCOL_ID:
7808- return Context.getObjCProtocolDecl ();
7820+ if (Context.ObjCProtocolClassDecl )
7821+ return Context.ObjCProtocolClassDecl ;
7822+ NewLoaded = Context.getObjCProtocolDecl ();
7823+ break ;
78097824
78107825 case PREDEF_DECL_INT_128_ID:
7811- return Context.getInt128Decl ();
7826+ if (Context.Int128Decl )
7827+ return Context.Int128Decl ;
7828+ NewLoaded = Context.getInt128Decl ();
7829+ break ;
78127830
78137831 case PREDEF_DECL_UNSIGNED_INT_128_ID:
7814- return Context.getUInt128Decl ();
7832+ if (Context.UInt128Decl )
7833+ return Context.UInt128Decl ;
7834+ NewLoaded = Context.getUInt128Decl ();
7835+ break ;
78157836
78167837 case PREDEF_DECL_OBJC_INSTANCETYPE_ID:
7817- return Context.getObjCInstanceTypeDecl ();
7838+ if (Context.ObjCInstanceTypeDecl )
7839+ return Context.ObjCInstanceTypeDecl ;
7840+ NewLoaded = Context.getObjCInstanceTypeDecl ();
7841+ break ;
78187842
78197843 case PREDEF_DECL_BUILTIN_VA_LIST_ID:
7820- return Context.getBuiltinVaListDecl ();
7844+ if (Context.BuiltinVaListDecl )
7845+ return Context.BuiltinVaListDecl ;
7846+ NewLoaded = Context.getBuiltinVaListDecl ();
7847+ break ;
78217848
78227849 case PREDEF_DECL_VA_LIST_TAG:
7823- return Context.getVaListTagDecl ();
7850+ if (Context.VaListTagDecl )
7851+ return Context.VaListTagDecl ;
7852+ NewLoaded = Context.getVaListTagDecl ();
7853+ break ;
78247854
78257855 case PREDEF_DECL_BUILTIN_MS_VA_LIST_ID:
7826- return Context.getBuiltinMSVaListDecl ();
7856+ if (Context.BuiltinMSVaListDecl )
7857+ return Context.BuiltinMSVaListDecl ;
7858+ NewLoaded = Context.getBuiltinMSVaListDecl ();
7859+ break ;
78277860
78287861 case PREDEF_DECL_BUILTIN_MS_GUID_ID:
7862+ // ASTContext::getMSGuidTagDecl won't create MSGuidTagDecl conditionally.
78297863 return Context.getMSGuidTagDecl ();
78307864
78317865 case PREDEF_DECL_EXTERN_C_CONTEXT_ID:
7832- return Context.getExternCContextDecl ();
7866+ if (Context.ExternCContext )
7867+ return Context.ExternCContext ;
7868+ NewLoaded = Context.getExternCContextDecl ();
7869+ break ;
78337870
78347871 case PREDEF_DECL_MAKE_INTEGER_SEQ_ID:
7835- return Context.getMakeIntegerSeqDecl ();
7872+ if (Context.MakeIntegerSeqDecl )
7873+ return Context.MakeIntegerSeqDecl ;
7874+ NewLoaded = Context.getMakeIntegerSeqDecl ();
7875+ break ;
78367876
78377877 case PREDEF_DECL_CF_CONSTANT_STRING_ID:
7838- return Context.getCFConstantStringDecl ();
7878+ if (Context.CFConstantStringTypeDecl )
7879+ return Context.CFConstantStringTypeDecl ;
7880+ NewLoaded = Context.getCFConstantStringDecl ();
7881+ break ;
78397882
78407883 case PREDEF_DECL_CF_CONSTANT_STRING_TAG_ID:
7841- return Context.getCFConstantStringTagDecl ();
7884+ if (Context.CFConstantStringTagDecl )
7885+ return Context.CFConstantStringTagDecl ;
7886+ NewLoaded = Context.getCFConstantStringTagDecl ();
7887+ break ;
78427888
78437889 case PREDEF_DECL_TYPE_PACK_ELEMENT_ID:
7844- return Context.getTypePackElementDecl ();
7890+ if (Context.TypePackElementDecl )
7891+ return Context.TypePackElementDecl ;
7892+ NewLoaded = Context.getTypePackElementDecl ();
7893+ break ;
78457894 }
7846- llvm_unreachable (" PredefinedDeclIDs unknown enum value" );
7895+
7896+ assert (NewLoaded && " Failed to load predefined decl?" );
7897+
7898+ if (DeserializationListener)
7899+ DeserializationListener->PredefinedDeclBuilt (ID, NewLoaded);
7900+
7901+ return NewLoaded;
78477902}
78487903
78497904unsigned ASTReader::translateGlobalDeclIDToIndex (GlobalDeclID GlobalID) const {
@@ -7860,7 +7915,7 @@ Decl *ASTReader::GetExistingDecl(GlobalDeclID ID) {
78607915 assert (ContextObj && " reading decl with no AST context" );
78617916
78627917 if (ID < NUM_PREDEF_DECL_IDS) {
7863- Decl *D = getPredefinedDecl (*ContextObj, (PredefinedDeclIDs)ID);
7918+ Decl *D = getPredefinedDecl ((PredefinedDeclIDs)ID);
78647919 if (D) {
78657920 // Track that we have merged the declaration with ID \p ID into the
78667921 // pre-existing predefined declaration \p D.
0 commit comments