[clang] 798c5ba - [clang][NFC] refactors value type traits so we can have more than bools
Christopher Di Bella via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 5 11:08:03 PDT 2023
Author: Christopher Di Bella
Date: 2023-06-05T18:07:18Z
New Revision: 798c5ba770d30520a7cd6f431068ade2bda5a9f1
URL: https://github.com/llvm/llvm-project/commit/798c5ba770d30520a7cd6f431068ade2bda5a9f1
DIFF: https://github.com/llvm/llvm-project/commit/798c5ba770d30520a7cd6f431068ade2bda5a9f1.diff
LOG: [clang][NFC] refactors value type traits so we can have more than bools
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 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.
Differential Revision: https://reviews.llvm.org/D152034
Added:
Modified:
clang/lib/Sema/SemaExprCXX.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp
index 2bf5e6a473e30..30925c37dc08c 100644
--- a/clang/lib/Sema/SemaExprCXX.cpp
+++ b/clang/lib/Sema/SemaExprCXX.cpp
@@ -5378,9 +5378,14 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, TypeTrait UTT,
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 @@ bool Sema::CheckTypeTraitArity(unsigned Arity, SourceLocation Loc, size_t N) {
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 @@ ExprResult Sema::BuildTypeTrait(TypeTrait Kind, SourceLocation KWLoc,
}
}
- 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,
More information about the cfe-commits
mailing list