blob: c752cd9176c7726dbfdd031ad93d5a657f4d25cb [file] [edit]
// RUN: rm -rf %t
// RUN: split-file %s %t
//
// RUN: %clang_cc1 -std=c++2d -triple %itanium_abi_triple -emit-module-interface %t/a.cppm -o %t/a.pcm
// RUN: %clang_cc1 -std=c++2d -triple %itanium_abi_triple -fmodule-file=a=%t/a.pcm -emit-llvm -o - %t/b.cpp | FileCheck %s
// RUN: %clang_cc1 -std=c++2d -triple %itanium_abi_triple -fmodule-file=a=%t/a.pcm -fsyntax-only -verify %t/c.cpp
//--- a.cppm
export module a;
template <class T> struct Wrapper {
using type = T;
T value;
};
template <class T> struct Other {};
export template <unsigned I, template <class> class... TT>
using Indexed = TT...[I]<int>;
export template <template <class> class... TT>
struct Holder {
using first = TT...[0]<int>;
typename TT...[0]<int>::type value;
};
export template <class T> concept Always = true;
export template <class T> concept Never = false;
export template <class T> constexpr int Var = 1;
export template <class T> constexpr int Var2 = 2;
export template <unsigned I, template <class> concept... CC>
constexpr bool ConceptId = CC...[I]<int>;
export template <unsigned I, template <class> auto... VV>
constexpr int VariableTemplateId = VV...[I]<int>;
export template <template <class> concept... CC>
struct Constrained {
template <CC...[0] T>
static constexpr int f() { return 3; }
static constexpr int g(CC...[0] auto) { return 4; }
};
export Indexed<0, Wrapper, Other> a = {42};
//--- b.cpp
import a;
int b() {
return a.value;
}
// CHECK: @_ZW1a1a = external global %struct.Wrapper
// CHECK: define {{.*}}i32 @_Z1bv()
//--- c.cpp
// expected-no-diagnostics
import a;
template <class T> struct Local {
using type = T;
};
template <class T> struct Unused {};
static_assert(__is_same(Indexed<1, Local, Unused>, Unused<int>));
static_assert(__is_same(Holder<Local>::first, Local<int>));
static_assert(__is_same(decltype(Holder<Local>::value), int));
static_assert(ConceptId<0, Always, Never>);
static_assert(!ConceptId<1, Always, Never>);
static_assert(VariableTemplateId<1, Var, Var2> == 2);
static_assert(Constrained<Always>::f<int>() == 3);
static_assert(Constrained<Always>::g(0) == 4);