Skip to content

Commit 3b9e203

Browse files
authored
[Clang] Add __builtin_common_reference (#121199)
1 parent fa6d611 commit 3b9e203

File tree

9 files changed

+647
-122
lines changed

9 files changed

+647
-122
lines changed

clang/docs/LanguageExtensions.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,6 +1833,23 @@ Builtin type aliases
18331833

18341834
Clang provides a few builtin aliases to improve the throughput of certain metaprogramming facilities.
18351835

1836+
__builtin_common_reference
1837+
--------------------------
1838+
1839+
.. code-block:: c++
1840+
1841+
template <template <class, class, template <class> class, template <class> class> class BasicCommonReferenceT,
1842+
template <class... Args> CommonTypeT,
1843+
template <class> HasTypeMember,
1844+
class HasNoTypeMember,
1845+
class... Ts>
1846+
using __builtin_common_reference = ...;
1847+
1848+
This alias is used for implementing ``std::common_reference``. If ``std::common_reference`` should contain a ``type``
1849+
member, it is an alias to ``HasTypeMember<TheCommonReference>``. Otherwse it is an alias to ``HasNoTypeMember``. The
1850+
``CommonTypeT`` is usually ``std::common_type_t``. ``BasicCommonReferenceT`` is usually an alias template to
1851+
``basic_common_reference<T, U, TX, UX>::type``.
1852+
18361853
__builtin_common_type
18371854
---------------------
18381855

clang/include/clang/Basic/BuiltinTemplates.td

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ class TemplateArg<string name> {
1010
string Name = name;
1111
}
1212

13-
class Template<list<TemplateArg> args, string name> : TemplateArg<name> {
13+
class Template<list<TemplateArg> args, string name = ""> : TemplateArg<name> {
1414
list<TemplateArg> Args = args;
1515
}
1616

17-
class Class<string name, bit is_variadic = 0> : TemplateArg<name> {
17+
class Class<string name = "", bit is_variadic = 0> : TemplateArg<name> {
1818
bit IsVariadic = is_variadic;
1919
}
2020

@@ -56,6 +56,32 @@ def __builtin_common_type : CPlusPlusBuiltinTemplate<
5656
Class<"HasNoTypeMember">,
5757
Class<"Ts", /*is_variadic=*/1>]>;
5858

59+
// template <template <class,"
60+
// class,"
61+
// template <class> class,"
62+
// template <class> class> class BasicCommonReferenceT,"
63+
// template <class... Args> class CommonTypeT,"
64+
// template <class> class HasTypeMember,"
65+
// class HasNoTypeMember,"
66+
// class... Ts>"
67+
def __builtin_common_reference : CPlusPlusBuiltinTemplate<
68+
[Template<[Class<>,
69+
Class<>,
70+
Template<[Class<>]>,
71+
Template<[Class<>]>], "BasicCommonReferenceT">,
72+
Template<[Class<"Args", /*is_variadic=*/1>], "CommonTypeT">,
73+
Template<[Class<>], "HasTypeMember">,
74+
Class<"HasNoTypeMember">,
75+
Class<"Ts", /*is_variadic=*/1>]>;
76+
77+
foreach Ref = ["", "lvalue", "rvalue"] in {
78+
foreach Const = ["", "const"] in {
79+
foreach Volatile = ["", "volatile"] in {
80+
def __clang_internal_xref_#Ref#Const#Volatile : CPlusPlusBuiltinTemplate<[Class<>]>;
81+
}
82+
}
83+
}
84+
5985
// template <uint32_t Opcode,
6086
// uint32_t Size,
6187
// uint32_t Alignment,

clang/include/clang/Sema/Sema.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15322,6 +15322,17 @@ class Sema final : public SemaBase {
1532215322
QualType BuiltinDecay(QualType BaseType, SourceLocation Loc);
1532315323
QualType BuiltinAddReference(QualType BaseType, UTTKind UKind,
1532415324
SourceLocation Loc);
15325+
15326+
QualType BuiltinAddRValueReference(QualType BaseType, SourceLocation Loc) {
15327+
return BuiltinAddReference(BaseType, UnaryTransformType::AddRvalueReference,
15328+
Loc);
15329+
}
15330+
15331+
QualType BuiltinAddLValueReference(QualType BaseType, SourceLocation Loc) {
15332+
return BuiltinAddReference(BaseType, UnaryTransformType::AddLvalueReference,
15333+
Loc);
15334+
}
15335+
1532515336
QualType BuiltinRemoveExtent(QualType BaseType, UTTKind UKind,
1532615337
SourceLocation Loc);
1532715338
QualType BuiltinRemoveReference(QualType BaseType, UTTKind UKind,
@@ -15336,6 +15347,9 @@ class Sema final : public SemaBase {
1533615347
QualType BuiltinChangeSignedness(QualType BaseType, UTTKind UKind,
1533715348
SourceLocation Loc);
1533815349

15350+
bool BuiltinIsConvertible(QualType From, QualType To, SourceLocation Loc,
15351+
bool CheckNothrow = false);
15352+
1533915353
bool BuiltinIsBaseOf(SourceLocation RhsTLoc, QualType LhsT, QualType RhsT);
1534015354

1534115355
/// Ensure that the type T is a literal type.

0 commit comments

Comments
 (0)