2013-05-03 07:25:32 +08:00
|
|
|
// RUN: %clang_cc1 -std=gnu++11 -fsyntax-only -verify %s
|
2010-05-19 07:01:22 +08:00
|
|
|
|
2010-06-25 11:22:07 +08:00
|
|
|
namespace attribute_aligned {
|
|
|
|
template<int N>
|
|
|
|
struct X {
|
|
|
|
char c[1] __attribute__((__aligned__((N)))); // expected-error {{alignment is not a power of 2}}
|
|
|
|
};
|
2010-05-19 07:01:22 +08:00
|
|
|
|
2010-06-25 11:22:07 +08:00
|
|
|
template <bool X> struct check {
|
2011-01-04 12:44:35 +08:00
|
|
|
int check_failed[X ? 1 : -1]; // expected-error {{array with a negative size}}
|
2010-06-25 11:22:07 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
template <int N> struct check_alignment {
|
|
|
|
typedef check<N == sizeof(X<N>)> 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;
|
2013-05-03 07:25:32 +08:00
|
|
|
|
|
|
|
template<unsigned Size, unsigned Align>
|
|
|
|
class my_aligned_storage
|
|
|
|
{
|
2014-01-14 05:30:03 +08:00
|
|
|
__attribute__((aligned(Align))) char storage[Size];
|
2013-05-03 07:25:32 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
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<sizeof(T), alignof(T)> t;
|
|
|
|
};
|
|
|
|
|
|
|
|
C<double> cd;
|
2010-06-25 11:22:07 +08:00
|
|
|
}
|
2011-10-10 06:26:49 +08:00
|
|
|
|
|
|
|
namespace PR9049 {
|
|
|
|
extern const void *CFRetain(const void *ref);
|
|
|
|
|
|
|
|
template<typename T> __attribute__((cf_returns_retained))
|
|
|
|
inline T WBCFRetain(T aValue) { return aValue ? (T)CFRetain(aValue) : (T)0; }
|
|
|
|
|
|
|
|
|
|
|
|
extern void CFRelease(const void *ref);
|
|
|
|
|
|
|
|
template<typename T>
|
|
|
|
inline void WBCFRelease(__attribute__((cf_consumed)) T aValue) { if(aValue) CFRelease(aValue); }
|
|
|
|
}
|