// RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s // RUN: not %clang_cc1 -std=gnu++11 -ast-dump %s | FileCheck %s namespace attribute_aligned { template struct X { char c[1] __attribute__((__aligned__((N)))); // expected-error {{alignment is not a power of 2}} }; template struct check { int check_failed[X ? 1 : -1]; // expected-error {{array with a negative size}} }; template struct check_alignment { typedef check)> t; // expected-note {{in instantiation}} }; check_alignment<1>::t c1; check_alignment<2>::t c2; check_alignment<3>::t c3; // expected-note 2 {{in instantiation}} check_alignment<4>::t c4; template class my_aligned_storage { __attribute__((aligned(Align))) char storage[Size]; }; template class C { public: C() { static_assert(sizeof(t) == sizeof(T), "my_aligned_storage size wrong"); static_assert(alignof(t) == alignof(T), "my_aligned_storage align wrong"); // expected-warning{{'alignof' applied to an expression is a GNU extension}} } private: my_aligned_storage t; }; C cd; } namespace PR9049 { extern const void *CFRetain(const void *ref); template __attribute__((cf_returns_retained)) inline T WBCFRetain(T aValue) { return aValue ? (T)CFRetain(aValue) : (T)0; } extern void CFRelease(const void *ref); template inline void WBCFRelease(__attribute__((cf_consumed)) T aValue) { if(aValue) CFRelease(aValue); } } // CHECK: FunctionTemplateDecl {{.*}} HasAnnotations // CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO" // CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR" // CHECK: FunctionDecl {{.*}} HasAnnotations // CHECK: TemplateArgument type 'int' // CHECK: AnnotateAttr {{.*}} "ANNOTATE_FOO" // CHECK: AnnotateAttr {{.*}} "ANNOTATE_BAR" template [[clang::annotate("ANNOTATE_FOO"), clang::annotate("ANNOTATE_BAR")]] void HasAnnotations(); void UseAnnotations() { HasAnnotations(); } namespace preferred_name { int x [[clang::preferred_name("frank")]]; // expected-error {{expected a type}} int y [[clang::preferred_name(int)]]; // expected-warning {{'preferred_name' attribute only applies to class templates}} struct [[clang::preferred_name(int)]] A; // expected-warning {{'preferred_name' attribute only applies to class templates}} template struct [[clang::preferred_name(int)]] B; // expected-error {{argument 'int' to 'preferred_name' attribute is not a typedef for a specialization of 'B'}} template struct C; using X = C; // expected-note {{'X' declared here}} typedef C Y; using Z = const C; // expected-note {{'Z' declared here}} template struct [[clang::preferred_name(C)]] C; // expected-error {{argument 'C' to 'preferred_name' attribute is not a typedef for a specialization of 'C'}} template struct [[clang::preferred_name(X), clang::preferred_name(Y)]] C; template struct [[clang::preferred_name(const X)]] C; // expected-error {{argument 'const preferred_name::X'}} template struct [[clang::preferred_name(Z)]] C; // expected-error {{argument 'preferred_name::Z' (aka 'const C')}} template struct C {}; // CHECK: ClassTemplateDecl {{.*}} *cf1; C *cf2; void f(C a, C b, C c) { auto p = a; auto q = b; auto r = c; p.f(); // expected-error {{no member named 'f' in 'preferred_name::X'}} q.f(); // expected-error {{no member named 'f' in 'preferred_name::Y'}} r.f(); // expected-error {{no member named 'f' in 'preferred_name::C'}} } template struct D; using DInt = D; template struct __attribute__((__preferred_name__(DInt))) D {}; template struct D; int use_dint = D().get(); // expected-error {{no member named 'get' in 'preferred_name::DInt'}} template struct MemberTemplate { template struct Iter; using iterator = Iter; using const_iterator = Iter; template struct [[clang::preferred_name(iterator), clang::preferred_name(const_iterator)]] Iter {}; }; auto it = MemberTemplate::Iter(); int n = it; // expected-error {{no viable conversion from 'preferred_name::MemberTemplate::const_iterator' to 'int'}} template struct Foo; template using Bar = Foo<1, 2, T...>; template struct [[clang::preferred_name(::preferred_name::Bar)]] Foo {}; Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar'}} } ::preferred_name::Foo<1, 2, int, float>::nosuch x; // expected-error {{no type named 'nosuch' in 'preferred_name::Bar'}}