From 43b5b485a203f190ee4d5d3cab19c44ca865d316 Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Mon, 30 Nov 2020 15:43:48 -0800 Subject: [PATCH] Fix GCC 5.3 compile error in ASTImporter code Try to simplify this code a different way: use less Expected, more outparams. --- clang/lib/AST/ASTImporter.cpp | 62 +++++++++++++++++++------------------------ 1 file changed, 27 insertions(+), 35 deletions(-) diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 1b01431..7a1415b 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -202,6 +202,9 @@ namespace clang { return *MaybeVal; } + ExplicitSpecifier importExplicitSpecifier(Error &Err, + ExplicitSpecifier ESpec); + // Wrapper for an overload set. template struct CallOverloadedCreateFun { template decltype(auto) operator()(Args &&... args) { @@ -3153,6 +3156,14 @@ bool ASTNodeImporter::hasAutoReturnTypeDeclaredInside(FunctionDecl *D) { return false; } +ExplicitSpecifier +ASTNodeImporter::importExplicitSpecifier(Error &Err, ExplicitSpecifier ESpec) { + Expr *ExplicitExpr = ESpec.getExpr(); + if (ExplicitExpr) + ExplicitExpr = importChecked(Err, ESpec.getExpr()); + return ExplicitSpecifier(ExplicitExpr, ESpec.getKind()); +} + ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { SmallVector Redecls = getCanonicalForwardRedeclChain(D); @@ -3329,34 +3340,17 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { return ToPOrErr.takeError(); } - // Common code to import an explicit specifier of different kind of functions. - auto ImportExplicitExpr = [this, &Err](auto *Fun) -> ExpectedExpr { - Expr *ExplicitExpr = nullptr; - if (Fun->getExplicitSpecifier().getExpr()) { - ExplicitExpr = importChecked(Err, Fun->getExplicitSpecifier().getExpr()); - if (Err) - return std::move(Err); - } - return ExplicitExpr; - }; - // Create the imported function. FunctionDecl *ToFunction = nullptr; if (auto *FromConstructor = dyn_cast(D)) { - Expr *ExplicitExpr = nullptr; - if (FromConstructor->getExplicitSpecifier().getExpr()) { - auto Imp = import(FromConstructor->getExplicitSpecifier().getExpr()); - if (!Imp) - return Imp.takeError(); - ExplicitExpr = *Imp; - } + ExplicitSpecifier ESpec = + importExplicitSpecifier(Err, FromConstructor->getExplicitSpecifier()); + if (Err) + return std::move(Err); if (GetImportedOrCreateDecl( ToFunction, D, Importer.getToContext(), cast(DC), - ToInnerLocStart, NameInfo, T, TInfo, - ExplicitSpecifier( - ExplicitExpr, - FromConstructor->getExplicitSpecifier().getKind()), - D->isInlineSpecified(), D->isImplicit(), D->getConstexprKind(), + ToInnerLocStart, NameInfo, T, TInfo, ESpec, D->isInlineSpecified(), + D->isImplicit(), D->getConstexprKind(), InheritedConstructor(), // FIXME: Properly import inherited // constructor info TrailingRequiresClause)) @@ -3381,14 +3375,13 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { ToDtor->setOperatorDelete(ToOperatorDelete, ToThisArg); } else if (CXXConversionDecl *FromConversion = dyn_cast(D)) { - ExpectedExpr ExplicitExpr = ImportExplicitExpr(FromConversion); - if (!ExplicitExpr) - return ExplicitExpr.takeError(); + ExplicitSpecifier ESpec = + importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier()); + if (Err) + return std::move(Err); if (GetImportedOrCreateDecl( ToFunction, D, Importer.getToContext(), cast(DC), - ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(), - ExplicitSpecifier(*ExplicitExpr, - FromConversion->getExplicitSpecifier().getKind()), + ToInnerLocStart, NameInfo, T, TInfo, D->isInlineSpecified(), ESpec, D->getConstexprKind(), SourceLocation(), TrailingRequiresClause)) return ToFunction; } else if (auto *Method = dyn_cast(D)) { @@ -3399,13 +3392,12 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { SourceLocation(), TrailingRequiresClause)) return ToFunction; } else if (auto *Guide = dyn_cast(D)) { - ExpectedExpr ExplicitExpr = ImportExplicitExpr(Guide); - if (!ExplicitExpr) - return ExplicitExpr.takeError(); + ExplicitSpecifier ESpec = + importExplicitSpecifier(Err, Guide->getExplicitSpecifier()); + if (Err) + return std::move(Err); if (GetImportedOrCreateDecl( - ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, - ExplicitSpecifier(*ExplicitExpr, - Guide->getExplicitSpecifier().getKind()), + ToFunction, D, Importer.getToContext(), DC, ToInnerLocStart, ESpec, NameInfo, T, TInfo, ToEndLoc)) return ToFunction; cast(ToFunction) -- 2.7.4