3 // RUN: split-file %s %t
7 // RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-name=c \
8 // RUN: -fmodule-map-file=c.cppmap -xc++ c.cppmap -emit-module -o c.pcm
9 // RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-name=a \
10 // RUN: -fmodule-map-file=a.cppmap -fmodule-map-file=c.cppmap -xc++ a.cppmap \
11 // RUN: -emit-module -o a.pcm
12 // RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-name=b \
13 // RUN: -fmodule-map-file=b.cppmap -fmodule-map-file=c.cppmap -xc++ b.cppmap \
14 // RUN: -emit-module -o b.pcm
15 // RUN: %clang_cc1 -fmodules -fno-implicit-modules -fmodule-name=test \
16 // RUN: -fmodule-map-file=test.cppmap -fmodule-map-file=a.cppmap \
17 // RUN: -fmodule-map-file=b.cppmap -fmodule-file=a.pcm -fmodule-file=b.pcm -xc++ \
18 // RUN: test.cc -S -emit-llvm -o - | FileCheck test.cc
72 typename
std::enable_if
<::p::P
<T
>::value
>::type
>
93 template <class _Tp
, _Tp __v
>
94 struct integral_constant
{
95 static constexpr const _Tp value
= __v
;
96 typedef _Tp value_type
;
97 typedef integral_constant type
;
98 constexpr operator value_type() const noexcept
{ return value
; }
99 constexpr value_type
operator()() const noexcept
{ return value
; }
102 template <class _Tp
, _Tp __v
>
103 constexpr const _Tp integral_constant
<_Tp
, __v
>::value
;
105 typedef integral_constant
<bool, true> true_type
;
106 typedef integral_constant
<bool, false> false_type
;
108 template <bool, class _Tp
= void>
111 struct enable_if
<true, _Tp
> {
117 template <typename T
>
118 struct P
: ::std::false_type
{};
132 struct P
<E
> : std::true_type
{};
133 } // namespace proto2
135 inline void f(::util::EnumErrorSpace
<E
>) {}
147 template <typename T
>
148 class ErrorSpaceImpl
;
152 template <bool* addr
>
154 constexpr OdrUse() : b(*addr
) {}
157 template <typename T
>
159 static bool register_token
;
160 static constexpr OdrUse
<®ister_token
> kRegisterTokenUse
{};
164 template <typename T
>
165 static const ErrorSpace
* GetBase() {
169 static bool Register(const ErrorSpace
* (*space
)()) { return true; }
172 template <typename T
>
173 bool ErrorSpace::Registerer
<T
>::register_token
=
174 Register(&ErrorSpace::GetBase
<T
>);
176 template <typename T
>
177 class ErrorSpaceImpl
: public ErrorSpace
{
179 static constexpr Registerer
<ErrorSpaceImpl
> kRegisterer
{};
182 template <typename T
, typename
= typename
std::enable_if
<p::P
<T
>::value
>::type
>
183 class EnumErrorSpace
: public ErrorSpaceImpl
<EnumErrorSpace
<T
>> {};
192 int main(int, char**) {}