diff options
Diffstat (limited to 'clang/test')
-rw-r--r-- | clang/test/SemaCXX/attr-cxx0x.cpp | 17 | ||||
-rw-r--r-- | clang/test/SemaTemplate/alignas.cpp | 23 |
2 files changed, 34 insertions, 6 deletions
diff --git a/clang/test/SemaCXX/attr-cxx0x.cpp b/clang/test/SemaCXX/attr-cxx0x.cpp index d1787f186bc..002800e749e 100644 --- a/clang/test/SemaCXX/attr-cxx0x.cpp +++ b/clang/test/SemaCXX/attr-cxx0x.cpp @@ -21,9 +21,14 @@ void f(alignas(1) char c) { // expected-error {{'alignas' attribute cannot be ap template <unsigned A> struct alignas(A) align_class_template {}; -// FIXME: these should not error -template <typename... T> alignas(T...) struct align_class_temp_pack_type {}; // expected-error{{pack expansions in alignment specifiers are not supported yet}} -template <unsigned... A> alignas(A...) struct align_class_temp_pack_expr {}; // expected-error{{pack expansions in alignment specifiers are not supported yet}} +template <typename... T> struct alignas(T...) align_class_temp_pack_type {}; +template <unsigned... A> struct alignas(A...) align_class_temp_pack_expr {}; +struct alignas(int...) alignas_expansion_no_packs {}; // expected-error {{pack expansion does not contain any unexpanded parameter packs}} +template <typename... A> struct outer { + template <typename... B> struct alignas(alignof(A) * alignof(B)...) inner {}; + // expected-error@-1 {{pack expansion contains parameter packs 'A' and 'B' that have different lengths (1 vs. 2)}} +}; +outer<int>::inner<short, double> mismatched_packs; // expected-note {{in instantiation of}} typedef char align_typedef alignas(8); // expected-error {{'alignas' attribute only applies to variables, data members and tag types}} template<typename T> using align_alias_template = align_typedef alignas(8); // expected-error {{'alignas' attribute cannot be applied to types}} @@ -35,6 +40,6 @@ static_assert(alignof(align_member) == 8, "quuux's alignment is wrong"); static_assert(sizeof(align_member) == 8, "quuux's size is wrong"); static_assert(alignof(align_class_template<8>) == 8, "template's alignment is wrong"); static_assert(alignof(align_class_template<16>) == 16, "template's alignment is wrong"); -// FIXME: enable these tests -// static_assert(alignof(align_class_temp_pack_type<short, int, long>) == alignof(long), "template's alignment is wrong"); -// static_assert(alignof(align_class_temp_pack_expr<8, 16, 32>) == 32, "template's alignment is wrong"); +static_assert(alignof(align_class_temp_pack_type<short, int, long>) == alignof(long), "template's alignment is wrong"); +static_assert(alignof(align_class_temp_pack_expr<8, 16, 32>) == 32, "template's alignment is wrong"); +static_assert(alignof(outer<int,char>::inner<double,short>) == alignof(int) * alignof(double), "template's alignment is wrong"); diff --git a/clang/test/SemaTemplate/alignas.cpp b/clang/test/SemaTemplate/alignas.cpp new file mode 100644 index 00000000000..8a1f96e5bde --- /dev/null +++ b/clang/test/SemaTemplate/alignas.cpp @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -std=c++11 -verify %s + +// expected-no-diagnostics +using size_t = decltype(sizeof(0)); + +template<typename T, typename U> +constexpr T max(T t, U u) { return t > u ? t : u; } + +template<typename T, typename ...Ts> +constexpr auto max(T t, Ts ...ts) -> decltype(max(t, max(ts...))) { + return max(t, max(ts...)); +} + +template<typename...T> struct my_union { + alignas(T...) char buffer[max(sizeof(T)...)]; +}; + +struct alignas(8) A { char c; }; +struct alignas(4) B { short s; }; +struct C { char a[16]; }; + +static_assert(sizeof(my_union<A, B, C>) == 16, ""); +static_assert(alignof(my_union<A, B, C>) == 8, ""); |