cjdb created this revision. cjdb added reviewers: erichkeane, dblaikie. Herald added a project: All. cjdb requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Since all the type traits up until now have had Boolean vaules, we've always been able to assume that the expressions are `bool`. This is about to change (D151952 <https://reviews.llvm.org/D151952> introduces a trait that returns `size_t`), so we need to restructure the code so it doesn't become unwieldy. This is achieved by giving traits a designated "return" type. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D152034 Files: clang/lib/Sema/SemaExprCXX.cpp Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -5378,9 +5378,14 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, QualType LhsT, QualType RhsT, SourceLocation KeyLoc); -static bool evaluateTypeTrait(Sema &S, TypeTrait Kind, SourceLocation KWLoc, - ArrayRef<TypeSourceInfo *> Args, - SourceLocation RParenLoc) { +static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait Kind, + SourceLocation KWLoc, + ArrayRef<TypeSourceInfo *> Args, + SourceLocation RParenLoc, + bool IsDependent) { + if (IsDependent) + return false; + if (Kind <= UTT_Last) return EvaluateUnaryTypeTrait(S, Kind, KWLoc, Args[0]->getType()); @@ -5548,12 +5553,19 @@ return true; } +enum class TypeTraitReturnType { + Bool, +}; + +static TypeTraitReturnType GetReturnType(TypeTrait Kind) { + return TypeTraitReturnType::Bool; +} + ExprResult Sema::BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef<TypeSourceInfo *> Args, SourceLocation RParenLoc) { if (!CheckTypeTraitArity(getTypeTraitArity(Kind), KWLoc, Args.size())) return ExprError(); - QualType ResultType = Context.getLogicalOperationType(); if (Kind <= UTT_Last && !CheckUnaryTypeTraitTypeCompleteness( *this, Kind, KWLoc, Args[0]->getType())) @@ -5569,12 +5581,17 @@ } } - bool Result = false; - if (!Dependent) - Result = evaluateTypeTrait(*this, Kind, KWLoc, Args, RParenLoc); - - return TypeTraitExpr::Create(Context, ResultType, KWLoc, Kind, Args, - RParenLoc, Result); + switch (GetReturnType(Kind)) { + case TypeTraitReturnType::Bool: { + bool Result = EvaluateBooleanTypeTrait(*this, Kind, KWLoc, Args, RParenLoc, + Dependent); + return TypeTraitExpr::Create(Context, Context.getLogicalOperationType(), + KWLoc, Kind, Args, RParenLoc, Result); + } + default: + llvm_unreachable("reached the end of BuildTypeTrait because the type " + "trait's type is unaccounted for"); + } } ExprResult Sema::ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
Index: clang/lib/Sema/SemaExprCXX.cpp =================================================================== --- clang/lib/Sema/SemaExprCXX.cpp +++ clang/lib/Sema/SemaExprCXX.cpp @@ -5378,9 +5378,14 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT, QualType LhsT, QualType RhsT, SourceLocation KeyLoc); -static bool evaluateTypeTrait(Sema &S, TypeTrait Kind, SourceLocation KWLoc, - ArrayRef<TypeSourceInfo *> Args, - SourceLocation RParenLoc) { +static bool EvaluateBooleanTypeTrait(Sema &S, TypeTrait Kind, + SourceLocation KWLoc, + ArrayRef<TypeSourceInfo *> Args, + SourceLocation RParenLoc, + bool IsDependent) { + if (IsDependent) + return false; + if (Kind <= UTT_Last) return EvaluateUnaryTypeTrait(S, Kind, KWLoc, Args[0]->getType()); @@ -5548,12 +5553,19 @@ return true; } +enum class TypeTraitReturnType { + Bool, +}; + +static TypeTraitReturnType GetReturnType(TypeTrait Kind) { + return TypeTraitReturnType::Bool; +} + ExprResult Sema::BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc, ArrayRef<TypeSourceInfo *> Args, SourceLocation RParenLoc) { if (!CheckTypeTraitArity(getTypeTraitArity(Kind), KWLoc, Args.size())) return ExprError(); - QualType ResultType = Context.getLogicalOperationType(); if (Kind <= UTT_Last && !CheckUnaryTypeTraitTypeCompleteness( *this, Kind, KWLoc, Args[0]->getType())) @@ -5569,12 +5581,17 @@ } } - bool Result = false; - if (!Dependent) - Result = evaluateTypeTrait(*this, Kind, KWLoc, Args, RParenLoc); - - return TypeTraitExpr::Create(Context, ResultType, KWLoc, Kind, Args, - RParenLoc, Result); + switch (GetReturnType(Kind)) { + case TypeTraitReturnType::Bool: { + bool Result = EvaluateBooleanTypeTrait(*this, Kind, KWLoc, Args, RParenLoc, + Dependent); + return TypeTraitExpr::Create(Context, Context.getLogicalOperationType(), + KWLoc, Kind, Args, RParenLoc, Result); + } + default: + llvm_unreachable("reached the end of BuildTypeTrait because the type " + "trait's type is unaccounted for"); + } } ExprResult Sema::ActOnTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits