// RUN: %clang_cc1 -fsyntax-only -verify %s template<int z> int test9(int *a) { a = (int *) __builtin_assume_aligned(a, z + 1); // expected-error {{requested alignment is not a power of 2}} return a[0]; } void test9i(int *a) { test9<42>(a); // expected-note {{in instantiation of function template specialization 'test9<42>' requested here}} } template<typename T> int test10(int *a, T z) { a = (int *) __builtin_assume_aligned(a, z + 1); // expected-error {{must be a constant integer}} return a[0]; } int test10i(int *a) { return test10(a, 42); // expected-note {{in instantiation of function template specialization 'test10<int>' requested here}} } template <int q> void *atest() __attribute__((assume_aligned(q))); // expected-error {{requested alignment is not a power of 2}} template <int q, int o> void *atest2() __attribute__((assume_aligned(q, o))); // expected-error {{requested alignment is not a power of 2}} void test20() { atest<31>(); // expected-note {{in instantiation of function template specialization 'atest<31>' requested here}} atest<32>(); atest2<31, 5>(); // expected-note {{in instantiation of function template specialization 'atest2<31, 5>' requested here}} atest2<32, 4>(); } // expected-error@+1 {{invalid application of 'sizeof' to a function type}} template<typename T> __attribute__((assume_aligned(sizeof(int(T()))))) T *f(); void test21() { void *p = f<void>(); // expected-note {{in instantiation of function template specialization 'f<void>' requested here}} } // expected-error@+1 {{functional-style cast from 'void' to 'int' is not allowed}} template<typename T> __attribute__((assume_aligned(sizeof((int(T())))))) T *g(); void test23() { void *p = g<void>(); // expected-note {{in instantiation of function template specialization 'g<void>' requested here}} } template <typename T, int o> T *atest3() __attribute__((assume_aligned(31, o))); // expected-error {{requested alignment is not a power of 2}} template <typename T, int o> T *atest4() __attribute__((assume_aligned(32, o))); void test22() { atest3<int, 5>(); atest4<int, 5>(); } // expected-warning@+1 {{'assume_aligned' attribute only applies to functions and methods}} class __attribute__((assume_aligned(32))) x { int y; }; // expected-warning@+1 {{'assume_aligned' attribute only applies to return values that are pointers or references}} x foo() __attribute__((assume_aligned(32))); struct s1 { static const int x = 32; }; struct s2 { static const int x = 64; }; struct s3 { static const int x = 63; }; template <typename X> void *atest5() __attribute__((assume_aligned(X::x))); // expected-error {{requested alignment is not a power of 2}} void test24() { atest5<s1>(); atest5<s2>(); atest5<s3>(); // expected-note {{in instantiation of function template specialization 'atest5<s3>' requested here}} }