[libcxx-commits] [clang] [libcxx] [Clang] Add __common_type builtin (PR #99473)
Richard Smith via libcxx-commits
libcxx-commits at lists.llvm.org
Thu Jul 25 14:55:10 PDT 2024
================
@@ -3058,6 +3058,133 @@ void Sema::NoteAllFoundTemplates(TemplateName Name) {
}
}
+static QualType commonTypeImpl(Sema &S, TemplateName BaseTemplate,
+ SourceLocation TemplateLoc,
+ ArrayRef<TemplateArgument> Ts) {
+ auto lookUpCommonType = [&](TemplateArgument T1,
+ TemplateArgument T2) -> QualType {
+ // Don't bother looking for other specializations if both types are
+ // builtins - users aren't allowed to specialize for them
+ if (T1.getAsType()->isBuiltinType() && T2.getAsType()->isBuiltinType())
+ return commonTypeImpl(S, BaseTemplate, TemplateLoc, {T1, T2});
+
+ TemplateArgumentListInfo Args;
+ Args.addArgument(TemplateArgumentLoc(
+ T1, S.Context.getTrivialTypeSourceInfo(T1.getAsType())));
+ Args.addArgument(TemplateArgumentLoc(
+ T2, S.Context.getTrivialTypeSourceInfo(T2.getAsType())));
+ QualType BaseTemplateInst =
+ S.CheckTemplateIdType(BaseTemplate, TemplateLoc, Args);
+ if (S.RequireCompleteType(TemplateLoc, BaseTemplateInst,
+ diag::err_incomplete_type))
+ return QualType();
+ return S.getTypeMember(BaseTemplateInst, "type");
----------------
zygoloid wrote:
It's a bit incongruous that we hardcode `type` here but don't hardcode any other names. Could we change the first parameter so that the library passes in `std::common_type_t` instead of `std::common_type`? (Or does alias template instantiation add noticeable performance overhead compared to this approach?)
https://github.com/llvm/llvm-project/pull/99473
More information about the libcxx-commits
mailing list