================
@@ -1463,6 +1468,68 @@ bool Sema::CheckTypeTraitArity(unsigned Arity,
SourceLocation Loc, size_t N) {
return true;
}
+static ComparisonCategoryResult EvaluateTypeOrder(Sema &S, QualType LHS,
+ QualType RHS) {
+ if (S.Context.hasSameType(LHS, RHS))
+ return ComparisonCategoryResult::Equal;
+
+ std::unique_ptr<MangleContext> MC(S.Context.createMangleContext());
+ SmallString<64> LhsName, RhsName;
+ {
+ llvm::raw_svector_ostream LhsOut(LhsName), RhsOut(RhsName);
+ MC->mangleCanonicalTypeName(LHS, LhsOut);
+ MC->mangleCanonicalTypeName(RHS, RhsOut);
+ }
+
+ int Result = LhsName.compare(RhsName);
+ if (Result == 0)
+ return ComparisonCategoryResult::Equal;
+ return Result > 0 ? ComparisonCategoryResult::Greater
+ : ComparisonCategoryResult::Less;
+}
+
+ExprResult Sema::ActOnBuiltinTypeOrder(SourceLocation KWLoc, ParsedType LhsTy,
+ ParsedType RhsTy,
+ SourceLocation RParenLoc) {
+ SmallVector<TypeSourceInfo *, 2> Args;
+ for (auto ArgT : {LhsTy, RhsTy}) {
+ TypeSourceInfo *TInfo;
+ QualType T = GetTypeFromParser(ArgT, &TInfo);
+ if (!TInfo)
+ TInfo = Context.getTrivialTypeSourceInfo(T, KWLoc);
+
+ Args.push_back(TInfo);
+ }
+ return BuildBuiltinTypeOrderExpr(KWLoc, Args[0], Args[1], RParenLoc);
+}
+
+ExprResult Sema::BuildBuiltinTypeOrderExpr(SourceLocation KWLoc,
+ TypeSourceInfo *LhsT,
+ TypeSourceInfo *RhsT,
+ SourceLocation RParenLoc) {
+ QualType StrongOrdering =
+ CheckComparisonCategoryType(ComparisonCategoryType::StrongOrdering,
KWLoc,
+ ComparisonCategoryUsage::BuiltinTypeOrder);
+ if (StrongOrdering.isNull())
+ return ExprError();
+
+ QualType LHS = LhsT->getType();
+ QualType RHS = RhsT->getType();
+ if (LHS->isDependentType() || RHS->isDependentType())
+ return new (Context)
+ BuiltinTypeOrderExpr(StrongOrdering, KWLoc, LhsT, RhsT, RParenLoc);
+
+ ComparisonCategoryResult Result = EvaluateTypeOrder(*this, LHS, RHS);
+ VarDecl *ResultVD = Context.CompCategories.getInfoForType(StrongOrdering)
+ .getValueInfo(Result)
+ ->VD;
+ Expr *ResultExpr =
+ BuildDeclRefExpr(ResultVD, ResultVD->getType(), VK_LValue, KWLoc);
+ return PerformCopyInitialization(
----------------
Tsche wrote:
with the new implementation approach this should be taken care of :)
https://github.com/llvm/llvm-project/pull/216462
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits