Author: Reid Kleckner Date: 2020-11-30T16:29:29-08:00 New Revision: 43b5b485a203f190ee4d5d3cab19c44ca865d316
URL: https://github.com/llvm/llvm-project/commit/43b5b485a203f190ee4d5d3cab19c44ca865d316 DIFF: https://github.com/llvm/llvm-project/commit/43b5b485a203f190ee4d5d3cab19c44ca865d316.diff LOG: Fix GCC 5.3 compile error in ASTImporter code Try to simplify this code a different way: use less Expected, more outparams. Added: Modified: clang/lib/AST/ASTImporter.cpp Removed: ################################################################################ diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 1b014314996b..7a1415b658b8 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 <typename ToDeclT> struct CallOverloadedCreateFun { template <typename... Args> 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<Decl *, 2> Redecls = getCanonicalForwardRedeclChain(D); @@ -3329,34 +3340,17 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { return ToPOrErr.takeError(); } - // Common code to import an explicit specifier of diff erent 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<CXXConstructorDecl>(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<CXXConstructorDecl>( ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(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<CXXConversionDecl>(D)) { - ExpectedExpr ExplicitExpr = ImportExplicitExpr(FromConversion); - if (!ExplicitExpr) - return ExplicitExpr.takeError(); + ExplicitSpecifier ESpec = + importExplicitSpecifier(Err, FromConversion->getExplicitSpecifier()); + if (Err) + return std::move(Err); if (GetImportedOrCreateDecl<CXXConversionDecl>( ToFunction, D, Importer.getToContext(), cast<CXXRecordDecl>(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<CXXMethodDecl>(D)) { @@ -3399,13 +3392,12 @@ ExpectedDecl ASTNodeImporter::VisitFunctionDecl(FunctionDecl *D) { SourceLocation(), TrailingRequiresClause)) return ToFunction; } else if (auto *Guide = dyn_cast<CXXDeductionGuideDecl>(D)) { - ExpectedExpr ExplicitExpr = ImportExplicitExpr(Guide); - if (!ExplicitExpr) - return ExplicitExpr.takeError(); + ExplicitSpecifier ESpec = + importExplicitSpecifier(Err, Guide->getExplicitSpecifier()); + if (Err) + return std::move(Err); if (GetImportedOrCreateDecl<CXXDeductionGuideDecl>( - 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<CXXDeductionGuideDecl>(ToFunction) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits