=?utf-8?q?Balázs_Kéri?= <balazs.k...@ericsson.com> Message-ID: In-Reply-To: <llvm.org/llvm/llvm-project/pull/78...@github.com>
================ @@ -6397,116 +6400,132 @@ ExpectedDecl ASTNodeImporter::VisitVarTemplateSpecializationDecl( // Try to find an existing specialization with these template arguments. void *InsertPos = nullptr; - VarTemplateSpecializationDecl *D2 = VarTemplate->findSpecialization( - TemplateArgs, InsertPos); - if (D2) { - // We already have a variable template specialization with these template - // arguments. - - // FIXME: Check for specialization vs. instantiation errors. - - if (VarDecl *FoundDef = D2->getDefinition()) { - if (!D->isThisDeclarationADefinition() || - IsStructuralMatch(D, FoundDef)) { - // The record types structurally match, or the "from" translation - // unit only had a forward declaration anyway; call it the same - // variable. - return Importer.MapImported(D, FoundDef); + VarTemplateSpecializationDecl *FoundSpecialization = + VarTemplate->findSpecialization(TemplateArgs, InsertPos); + if (FoundSpecialization) { + if (IsStructuralMatch(D, FoundSpecialization)) { + VarDecl *FoundDef = FoundSpecialization->getDefinition(); + if (D->getDeclContext()->isRecord()) { + // In a record, it is allowed only to have one optional declaration and + // one definition of the (static or constexpr) variable template. + assert( + FoundSpecialization->getDeclContext()->isRecord() && + "Member variable template specialization imported as non-member, " + "inconsistent imported AST?"); + if (FoundDef) + return Importer.MapImported(D, FoundDef); + if (!D->isThisDeclarationADefinition()) + return Importer.MapImported(D, FoundSpecialization); + } else { + // If definition is imported and there is already one, map to it. + // Otherwise create a new variable and link it to the existing. + if (FoundDef && D->isThisDeclarationADefinition()) + return Importer.MapImported(D, FoundDef); } + } else { + return make_error<ASTImportError>(ASTImportError::NameConflict); } - } else { - TemplateArgumentListInfo ToTAInfo; - if (const ASTTemplateArgumentListInfo *Args = D->getTemplateArgsInfo()) { - if (Error Err = ImportTemplateArgumentListInfo(*Args, ToTAInfo)) - return std::move(Err); - } + } - using PartVarSpecDecl = VarTemplatePartialSpecializationDecl; - // Create a new specialization. - if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) { - // Import TemplateArgumentListInfo - TemplateArgumentListInfo ArgInfos; - const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten(); - // NOTE: FromTAArgsAsWritten and template parameter list are non-null. - if (Error Err = ImportTemplateArgumentListInfo( - *FromTAArgsAsWritten, ArgInfos)) - return std::move(Err); + VarTemplateSpecializationDecl *D2 = nullptr; - auto ToTPListOrErr = import(FromPartial->getTemplateParameters()); - if (!ToTPListOrErr) - return ToTPListOrErr.takeError(); + TemplateArgumentListInfo ToTAInfo; + if (const ASTTemplateArgumentListInfo *Args = D->getTemplateArgsInfo()) { + if (Error Err = ImportTemplateArgumentListInfo(*Args, ToTAInfo)) + return std::move(Err); + } - PartVarSpecDecl *ToPartial; - if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC, - *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, - VarTemplate, QualType(), nullptr, - D->getStorageClass(), TemplateArgs, ArgInfos)) - return ToPartial; + using PartVarSpecDecl = VarTemplatePartialSpecializationDecl; + // Create a new specialization. + if (auto *FromPartial = dyn_cast<PartVarSpecDecl>(D)) { + // Import TemplateArgumentListInfo + TemplateArgumentListInfo ArgInfos; + const auto *FromTAArgsAsWritten = FromPartial->getTemplateArgsAsWritten(); + // NOTE: FromTAArgsAsWritten and template parameter list are non-null. + if (Error Err = + ImportTemplateArgumentListInfo(*FromTAArgsAsWritten, ArgInfos)) + return std::move(Err); - if (Expected<PartVarSpecDecl *> ToInstOrErr = import( - FromPartial->getInstantiatedFromMember())) - ToPartial->setInstantiatedFromMember(*ToInstOrErr); - else - return ToInstOrErr.takeError(); - - if (FromPartial->isMemberSpecialization()) - ToPartial->setMemberSpecialization(); - - D2 = ToPartial; - - // FIXME: Use this update if VarTemplatePartialSpecializationDecl is fixed - // to adopt template parameters. - // updateLookupTableForTemplateParameters(**ToTPListOrErr); - } else { // Full specialization - if (GetImportedOrCreateDecl(D2, D, Importer.getToContext(), DC, - *BeginLocOrErr, *IdLocOrErr, VarTemplate, - QualType(), nullptr, D->getStorageClass(), - TemplateArgs)) - return D2; - } + auto ToTPListOrErr = import(FromPartial->getTemplateParameters()); + if (!ToTPListOrErr) + return ToTPListOrErr.takeError(); - QualType T; - if (Error Err = importInto(T, D->getType())) - return std::move(Err); - D2->setType(T); + PartVarSpecDecl *ToPartial; + if (GetImportedOrCreateDecl(ToPartial, D, Importer.getToContext(), DC, + *BeginLocOrErr, *IdLocOrErr, *ToTPListOrErr, + VarTemplate, QualType(), nullptr, ---------------- shafik wrote: `nullptr` -> `/*TInfo=*/nullptr` I think `TInfo` is the right field here. https://github.com/llvm/llvm-project/pull/78284 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits