From 222e2a7620e6520ffaf4fc4e69d79c18da31542e Mon Sep 17 00:00:00 2001 From: "Zancanaro; Carlo" Date: Mon, 24 Sep 2012 09:58:17 +1000 Subject: Add the clang library to the repo (with some of my changes, too). --- clang/test/SemaTemplate/instantiate-static-var.cpp | 116 +++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 clang/test/SemaTemplate/instantiate-static-var.cpp (limited to 'clang/test/SemaTemplate/instantiate-static-var.cpp') diff --git a/clang/test/SemaTemplate/instantiate-static-var.cpp b/clang/test/SemaTemplate/instantiate-static-var.cpp new file mode 100644 index 0000000..f309f29 --- /dev/null +++ b/clang/test/SemaTemplate/instantiate-static-var.cpp @@ -0,0 +1,116 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +template +class X { +public: + static const T value = 10 / Divisor; // expected-error{{in-class initializer for static data member is not a constant expression}} +}; + +int array1[X::value == 5? 1 : -1]; +X xi0; // expected-note{{in instantiation of template class 'X' requested here}} + + +template +class Y { + static const T value = 0; // expected-warning{{in-class initializer for static data member of type 'const float' is a GNU extension}} +}; + +Y fy; // expected-note{{in instantiation of template class 'Y' requested here}} + + +// out-of-line static member variables + +template +struct Z { + static T value; +}; + +template +T Z::value; // expected-error{{no matching constructor}} + +struct DefCon {}; + +struct NoDefCon { + NoDefCon(const NoDefCon&); // expected-note{{candidate constructor}} +}; + +void test() { + DefCon &DC = Z::value; + NoDefCon &NDC = Z::value; // expected-note{{instantiation}} +} + +// PR5609 +struct X1 { + ~X1(); // The errors won't be triggered without this dtor. +}; + +template +struct Y1 { + static char Helper(T); + static const int value = sizeof(Helper(T())); +}; + +struct X2 { + virtual ~X2(); +}; + +namespace std { + class type_info { }; +} + +template +struct Y2 { + static T &Helper(); + static const int value = sizeof(typeid(Helper())); +}; + +template +struct Z1 {}; + +void Test() { + Z1::value> x; + int y[Y1::value]; + Z1::value> x2; + int y2[Y2::value]; +} + +// PR5672 +template +struct X3 {}; + +class Y3 { + public: + ~Y3(); // The error isn't triggered without this dtor. + + void Foo(X3<1>); +}; + +template +struct SizeOf { + static const int value = sizeof(T); +}; + +void MyTest3() { + Y3().Foo(X3::value>()); +} + +namespace PR6449 { + template + struct X0 { + static const bool var = false; + }; + + template + const bool X0::var; + + template + struct X1 : public X0 { + static const bool var = false; + }; + + template + const bool X1::var; + + template class X0; + template class X1; + +} -- cgit v1.2.3