https://github.com/kazutakahirata created https://github.com/llvm/llvm-project/pull/144982
ArrayRef has a constructor that accepts std::nullopt. This constructor dates back to the days when we still had llvm::Optional. Since the use of std::nullopt outside the context of std::optional is kind of abuse and not intuitive to new comers, I would like to move away from the constructor and eventually remove it. This patch takes care of the clang side of the migration. >From e4e64ca614a08b2c642e8089e489c405610e96eb Mon Sep 17 00:00:00 2001 From: Kazu Hirata <k...@google.com> Date: Thu, 19 Jun 2025 21:34:13 -0700 Subject: [PATCH] [clang] Migrate away from ArrayRef(std::nullopt) (NFC) ArrayRef has a constructor that accepts std::nullopt. This constructor dates back to the days when we still had llvm::Optional. Since the use of std::nullopt outside the context of std::optional is kind of abuse and not intuitive to new comers, I would like to move away from the constructor and eventually remove it. This patch takes care of the clang side of the migration. --- clang/include/clang/AST/TypeProperties.td | 2 +- clang/lib/AST/ASTContext.cpp | 4 ++-- clang/lib/AST/ASTDiagnostic.cpp | 4 ++-- clang/lib/AST/ASTImporter.cpp | 2 +- clang/lib/AST/DeclTemplate.cpp | 2 +- clang/lib/AST/QualTypeNames.cpp | 5 ++--- clang/lib/Basic/Targets/Xtensa.h | 2 +- clang/lib/CodeGen/CGBuiltin.cpp | 2 +- clang/lib/Driver/ToolChains/Clang.cpp | 4 ++-- clang/lib/Sema/SemaConcept.cpp | 4 ++-- clang/lib/Sema/SemaExpr.cpp | 2 +- clang/lib/Sema/TreeTransform.h | 2 +- 12 files changed, 17 insertions(+), 18 deletions(-) diff --git a/clang/include/clang/AST/TypeProperties.td b/clang/include/clang/AST/TypeProperties.td index 6e44bce893e79..d7dbf1b43df26 100644 --- a/clang/include/clang/AST/TypeProperties.td +++ b/clang/include/clang/AST/TypeProperties.td @@ -753,7 +753,7 @@ let Class = TemplateSpecializationType in { } def : Creator<[{ - return ctx.getTemplateSpecializationType(templateName, args, std::nullopt, UnderlyingType); + return ctx.getTemplateSpecializationType(templateName, args, {}, UnderlyingType); }]>; } diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 189e67e4eed0d..74be2871f270c 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -14283,7 +14283,7 @@ static QualType getCommonNonSugarTypeNode(ASTContext &Ctx, const Type *X, ::getCommonTemplateNameChecked(Ctx, TX->getTemplateName(), TY->getTemplateName(), /*IgnoreDeduced=*/true), - As, /*CanonicalArgs=*/std::nullopt, X->getCanonicalTypeInternal()); + As, /*CanonicalArgs=*/{}, X->getCanonicalTypeInternal()); } case Type::Decltype: { const auto *DX = cast<DecltypeType>(X); @@ -14529,7 +14529,7 @@ static QualType getCommonSugarTypeNode(ASTContext &Ctx, const Type *X, TY->template_arguments())) return QualType(); return Ctx.getTemplateSpecializationType(CTN, As, - /*CanonicalArgs=*/std::nullopt, + /*CanonicalArgs=*/{}, Ctx.getQualifiedType(Underlying)); } case Type::Typedef: { diff --git a/clang/lib/AST/ASTDiagnostic.cpp b/clang/lib/AST/ASTDiagnostic.cpp index a00d5801f054b..522abd5912dbd 100644 --- a/clang/lib/AST/ASTDiagnostic.cpp +++ b/clang/lib/AST/ASTDiagnostic.cpp @@ -130,7 +130,7 @@ QualType clang::desugarForDiagnostic(ASTContext &Context, QualType QT, if (DesugarArgument) { ShouldAKA = true; QT = Context.getTemplateSpecializationType( - TST->getTemplateName(), Args, /*CanonicalArgs=*/std::nullopt, QT); + TST->getTemplateName(), Args, /*CanonicalArgs=*/{}, QT); } break; } @@ -1143,7 +1143,7 @@ class TemplateDiff { Ty = Context.getTemplateSpecializationType( TemplateName(CTSD->getSpecializedTemplate()), - CTSD->getTemplateArgs().asArray(), /*CanonicalArgs=*/std::nullopt, + CTSD->getTemplateArgs().asArray(), /*CanonicalArgs=*/{}, Ty.getLocalUnqualifiedType().getCanonicalType()); return Ty->getAs<TemplateSpecializationType>(); diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp index 96a5e2eeaa4d7..4621ebb854d8e 100644 --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -1664,7 +1664,7 @@ ExpectedType ASTNodeImporter::VisitTemplateSpecializationType( if (!ToUnderlyingOrErr) return ToUnderlyingOrErr.takeError(); return Importer.getToContext().getTemplateSpecializationType( - *ToTemplateOrErr, ToTemplateArgs, std::nullopt, *ToUnderlyingOrErr); + *ToTemplateOrErr, ToTemplateArgs, {}, *ToUnderlyingOrErr); } ExpectedType ASTNodeImporter::VisitElaboratedType(const ElaboratedType *T) { diff --git a/clang/lib/AST/DeclTemplate.cpp b/clang/lib/AST/DeclTemplate.cpp index e1ef2188dbdbe..5035f2d33b0a1 100644 --- a/clang/lib/AST/DeclTemplate.cpp +++ b/clang/lib/AST/DeclTemplate.cpp @@ -669,7 +669,7 @@ ClassTemplateDecl::getInjectedClassNameSpecialization() { CommonPtr->InjectedClassNameType = Context.getTemplateSpecializationType(Name, /*SpecifiedArgs=*/TemplateArgs, - /*CanonicalArgs=*/std::nullopt); + /*CanonicalArgs=*/{}); return CommonPtr->InjectedClassNameType; } diff --git a/clang/lib/AST/QualTypeNames.cpp b/clang/lib/AST/QualTypeNames.cpp index 4d11a3b623314..39703d6d7b882 100644 --- a/clang/lib/AST/QualTypeNames.cpp +++ b/clang/lib/AST/QualTypeNames.cpp @@ -140,7 +140,7 @@ static const Type *getFullyQualifiedTemplateType(const ASTContext &Ctx, if (MightHaveChanged) { QualType QT = Ctx.getTemplateSpecializationType( TST->getTemplateName(), FQArgs, - /*CanonicalArgs=*/std::nullopt, TST->desugar()); + /*CanonicalArgs=*/{}, TST->desugar()); // getTemplateSpecializationType returns a fully qualified // version of the specialization itself, so no need to qualify // it. @@ -172,8 +172,7 @@ static const Type *getFullyQualifiedTemplateType(const ASTContext &Ctx, TemplateName TN(TSTDecl->getSpecializedTemplate()); QualType QT = Ctx.getTemplateSpecializationType( TN, FQArgs, - /*CanonicalArgs=*/std::nullopt, - TSTRecord->getCanonicalTypeInternal()); + /*CanonicalArgs=*/{}, TSTRecord->getCanonicalTypeInternal()); // getTemplateSpecializationType returns a fully qualified // version of the specialization itself, so no need to qualify // it. diff --git a/clang/lib/Basic/Targets/Xtensa.h b/clang/lib/Basic/Targets/Xtensa.h index 470835aacff52..f3558ac247bec 100644 --- a/clang/lib/Basic/Targets/Xtensa.h +++ b/clang/lib/Basic/Targets/Xtensa.h @@ -77,7 +77,7 @@ class LLVM_LIBRARY_VISIBILITY XtensaTargetInfo : public TargetInfo { } ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { - return std::nullopt; + return {}; } bool validateAsmConstraint(const char *&Name, diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 1f69274351676..2c011a9519860 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -2032,7 +2032,7 @@ Value *CodeGenFunction::EmitCheckedArgForAssume(const Expr *E) { std::make_pair(ArgValue, CheckOrdinal), CheckHandler, {EmitCheckSourceLocation(E->getExprLoc()), llvm::ConstantInt::get(Builder.getInt8Ty(), BCK_AssumePassedFalse)}, - std::nullopt); + {}); return ArgValue; } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index e910a2bedeeb1..2bb42a319eccf 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -8953,7 +8953,7 @@ void OffloadBundler::ConstructJob(Compilation &C, const JobAction &JA, C.addCommand(std::make_unique<Command>( JA, *this, ResponseFileSupport::None(), TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), - CmdArgs, std::nullopt, Output)); + CmdArgs, ArrayRef<InputInfo>(), Output)); } void OffloadBundler::ConstructJobMultipleOutputs( @@ -9040,7 +9040,7 @@ void OffloadBundler::ConstructJobMultipleOutputs( C.addCommand(std::make_unique<Command>( JA, *this, ResponseFileSupport::None(), TCArgs.MakeArgString(getToolChain().GetProgramPath(getShortName())), - CmdArgs, std::nullopt, Outputs)); + CmdArgs, ArrayRef<InputInfo>(), Outputs)); } void OffloadPackager::ConstructJob(Compilation &C, const JobAction &JA, diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp index a4f660c39b4b5..1594b4423e4d2 100644 --- a/clang/lib/Sema/SemaConcept.cpp +++ b/clang/lib/Sema/SemaConcept.cpp @@ -1081,10 +1081,10 @@ static bool CheckFunctionConstraintsWithoutInstantiation( // FIXME: Add TemplateArgs through the 'Innermost' parameter once // the refactoring of getTemplateInstantiationArgs() relands. MultiLevelTemplateArgumentList MLTAL; - MLTAL.addOuterTemplateArguments(Template, std::nullopt, /*Final=*/false); + MLTAL.addOuterTemplateArguments(Template, {}, /*Final=*/false); SemaRef.getTemplateInstantiationArgs( MLTAL, /*D=*/FD, FD, - /*Final=*/false, /*Innermost=*/std::nullopt, /*RelativeToPrimary=*/true, + /*Final=*/false, /*Innermost=*/{}, /*RelativeToPrimary=*/true, /*Pattern=*/nullptr, /*ForConstraintInstantiation=*/true); MLTAL.replaceInnermostTemplateArguments(Template, TemplateArgs); diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index ebc43157d4c2b..fc2819458a4ff 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -21212,7 +21212,7 @@ ExprResult Sema::CheckPlaceholderExpr(Expr *E) { } if (TST.isNull()) TST = Context.getTemplateSpecializationType( - TN, ULE->template_arguments(), /*CanonicalArgs=*/std::nullopt, + TN, ULE->template_arguments(), /*CanonicalArgs=*/{}, HasAnyDependentTA ? Context.DependentTy : Context.IntTy); QualType ET = Context.getElaboratedType(ElaboratedTypeKeyword::None, NNS, TST); diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 3e33fb73e01b4..26bee7a96de22 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -16222,7 +16222,7 @@ TreeTransform<Derived>::TransformSizeOfPackExpr(SizeOfPackExpr *E) { return getDerived().RebuildSizeOfPackExpr( E->getOperatorLoc(), E->getPack(), E->getPackLoc(), E->getRParenLoc(), /*Length=*/static_cast<unsigned>(Args.size()), - /*PartialArgs=*/std::nullopt); + /*PartialArgs=*/{}); } template <typename Derived> _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits