diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index ef160228933c..a6da103ed979 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -3692,12 +3692,6 @@ static void inheritDefaultTemplateArguments(ASTContext &Context, // the program is ill-formed; static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, Decl *Previous) { - Module *M = Previous->getOwningModule(); - - // We only care about the case in named modules. - if (!M || !M->isNamedModule()) - return; - // If it is previous implcitly introduced, it is not meaningful to // diagnose it. if (Previous->isImplicit()) @@ -3714,16 +3708,21 @@ static void checkMultipleDefinitionInNamedModules(ASTReader &Reader, Decl *D, // FIXME: Maybe this shows the implicit instantiations may have incorrect // module owner ships. But given we've finished the compilation of a module, // how can we add new entities to that module? - if (auto *VTSD = dyn_cast(Previous); - VTSD && !VTSD->isExplicitSpecialization()) + if (isa(Previous)) return; - if (auto *CTSD = dyn_cast(Previous); - CTSD && !CTSD->isExplicitSpecialization()) + if (isa(Previous)) + return; + if (auto *Func = dyn_cast(Previous); + Func && Func->getTemplateSpecializationInfo()) + return; + + Module *M = Previous->getOwningModule(); + if (!M) + return; + + // We only forbids merging decls within named modules. + if (!M->isNamedModule()) return; - if (auto *Func = dyn_cast(Previous)) - if (auto *FTSI = Func->getTemplateSpecializationInfo(); - FTSI && !FTSI->isExplicitSpecialization()) - return; // It is fine if they are in the same module. if (Reader.getContext().isInSameModule(M, D->getOwningModule()))