diff options
-rw-r--r-- | clang/test/CXX/drs/dr5xx.cpp | 316 | ||||
-rw-r--r-- | clang/www/cxx_dr_status.html | 40 |
2 files changed, 336 insertions, 20 deletions
diff --git a/clang/test/CXX/drs/dr5xx.cpp b/clang/test/CXX/drs/dr5xx.cpp index 0c0d451c4b2..7b0c7e668d3 100644 --- a/clang/test/CXX/drs/dr5xx.cpp +++ b/clang/test/CXX/drs/dr5xx.cpp @@ -195,6 +195,153 @@ namespace dr525 { // dr525: yes } } +namespace dr526 { // dr526: yes + template<int> struct S {}; + template<int N> void f1(S<N> s); + template<int N> void f2(S<(N)> s); // expected-note {{couldn't infer}} + template<int N> void f3(S<+N> s); // expected-note {{couldn't infer}} + template<int N> void g1(int (&)[N]); + template<int N> void g2(int (&)[(N)]); // expected-note {{couldn't infer}} + template<int N> void g3(int (&)[+N]); // expected-note {{couldn't infer}} + + void test(int (&a)[3], S<3> s) { + f1(s); + f2(s); // expected-error {{no matching}} + f3(s); // expected-error {{no matching}} + g1(a); + g2(a); // expected-error {{no matching}} + g3(a); // expected-error {{no matching}} + } + + template<int N> struct X { + typedef int type; + X<N>::type v1; + X<(N)>::type v2; // expected-error {{missing 'typename'}} + X<+N>::type v3; // expected-error {{missing 'typename'}} + }; +} + +namespace dr527 { // dr527: na + // This DR is meaningless. It removes a required diagnostic from the case + // where a not-externally-visible object is odr-used but not defined, which + // requires a diagnostic for a different reason. + extern struct { int x; } a; // FIXME: We should reject this, per dr389. + static struct { int x; } b; + extern "C" struct { int x; } c; + namespace { extern struct { int x; } d; } + typedef struct { int x; } *P; + struct E { static P e; }; // FIXME: We should reject this, per dr389. + namespace { struct F { static P f; }; } + + int ax = a.x, bx = b.x, cx = c.x, dx = d.x, ex = E::e->x, fx = F::f->x; +} + +namespace dr530 { // dr530: yes + template<int*> struct S { enum { N = 1 }; }; + template<void(*)()> struct T { enum { N = 1 }; }; + int n; + void f(); + int a[S<&n>::N]; + int b[T<&f>::N]; +} + +namespace dr531 { // dr531: partial + namespace good { + template<typename T> struct A { + void f(T) { T::error; } + template<typename U> void g(T, U) { T::error; } + struct B { typename T::error error; }; + template<typename U> struct C { typename T::error error; }; + static T n; + }; + template<typename T> T A<T>::n = T::error; + + template<> void A<int>::f(int) {} + template<> template<typename U> void A<int>::g(int, U) {} + template<> struct A<int>::B {}; + template<> template<typename U> struct A<int>::C {}; + template<> int A<int>::n = 0; + + void use(A<int> a) { + a.f(a.n); + a.g(0, 0); + A<int>::B b; + A<int>::C<int> c; + } + + template<> struct A<char> { + void f(char); + template<typename U> void g(char, U); + struct B; + template<typename U> struct C; + static char n; + }; + + void A<char>::f(char) {} + template<typename U> void A<char>::g(char, U) {} + struct A<char>::B {}; + template<typename U> struct A<char>::C {}; + char A<char>::n = 0; + } + + namespace bad { + template<typename T> struct A { + void f(T) { T::error; } + template<typename U> void g(T, U) { T::error; } + struct B { typename T::error error; }; + template<typename U> struct C { typename T::error error; }; // expected-note {{here}} + static T n; + }; + template<typename T> T A<T>::n = T::error; + + void A<int>::f(int) {} // expected-error {{requires 'template<>'}} + template<typename U> void A<int>::g(int, U) {} // expected-error {{should be empty}} + struct A<int>::B {}; // expected-error {{requires 'template<>'}} + template<typename U> struct A<int>::C {}; // expected-error {{should be empty}} expected-error {{different kind of symbol}} + int A<int>::n = 0; // expected-error {{requires 'template<>'}} + + template<> struct A<char> { // expected-note 2{{here}} + void f(char); + template<typename U> void g(char, U); + struct B; // expected-note {{here}} + template<typename U> struct C; + static char n; + }; + + template<> void A<char>::f(char) {} // expected-error {{no function template matches}} + // FIXME: This is ill-formed; -pedantic-errors should reject. + template<> template<typename U> void A<char>::g(char, U) {} // expected-warning {{extraneous template parameter list}} + template<> struct A<char>::B {}; // expected-error {{extraneous 'template<>'}} expected-error {{does not specialize}} + // FIXME: This is ill-formed; -pedantic-errors should reject. + template<> template<typename U> struct A<char>::C {}; // expected-warning {{extraneous template parameter list}} + template<> char A<char>::n = 0; // expected-error {{extraneous 'template<>'}} + } + + namespace nested { + template<typename T> struct A { + template<typename U> struct B; + }; + template<> template<typename U> struct A<int>::B { + void f(); + void g(); + template<typename V> void h(); + template<typename V> void i(); + }; + template<> template<typename U> void A<int>::B<U>::f() {} + template<typename U> void A<int>::B<U>::g() {} // expected-error {{should be empty}} + + template<> template<typename U> template<typename V> void A<int>::B<U>::h() {} + template<typename U> template<typename V> void A<int>::B<U>::i() {} // expected-error {{should be empty}} + + template<> template<> void A<int>::B<int>::f() {} + template<> template<> template<typename V> void A<int>::B<int>::h() {} + template<> template<> template<> void A<int>::B<int>::h<int>() {} + + template<> void A<int>::B<char>::f() {} // expected-error {{requires 'template<>'}} + template<> template<typename V> void A<int>::B<char>::h() {} // expected-error {{should be empty}} + } +} + // PR8130 namespace dr532 { // dr532: 3.5 struct A { }; @@ -210,3 +357,172 @@ namespace dr532 { // dr532: 3.5 int &ir = b * a; } } + +// dr533: na + +namespace dr534 { // dr534: yes + struct S {}; + template<typename T> void operator+(S, T); + template<typename T> void operator+<T*>(S, T*) {} // expected-error {{function template partial spec}} +} + +namespace dr535 { // dr535: yes + class X { private: X(const X&); }; + struct A { + X x; + template<typename T> A(T&); + }; + struct B : A { + X y; + B(volatile A&); + }; + + extern A a1; + A a2(a1); // ok, uses constructor template + + extern volatile B b1; + B b2(b1); // ok, uses converting constructor + + void f() { throw a1; } + +#if __cplusplus >= 201103L + struct C { + constexpr C() : n(0) {} + template<typename T> constexpr C(T&t) : n(t.n == 0 ? throw 0 : 0) {} + int n; + }; + constexpr C c() { return C(); } + // ok, copy is elided + constexpr C x = c(); +#endif +} + +// dr537: na +// dr538: na + +// dr539: yes +const dr539( // expected-error {{requires a type specifier}} + const a) { // expected-error {{unknown type name 'a'}} + const b; // expected-error {{requires a type specifier}} + new const; // expected-error {{expected a type}} + try {} catch (const n) {} // expected-error {{unknown type name 'n'}} + try {} catch (const) {} // expected-error {{expected a type}} + if (const n = 0) {} // expected-error {{requires a type specifier}} + switch (const n = 0) {} // expected-error {{requires a type specifier}} + while (const n = 0) {} // expected-error {{requires a type specifier}} + for (const n = 0; // expected-error {{requires a type specifier}} + const m = 0; ) {} // expected-error {{requires a type specifier}} + sizeof(const); // expected-error {{requires a type specifier}} + struct S { + const n; // expected-error {{requires a type specifier}} + operator const(); // expected-error {{expected a type}} + }; +#if __cplusplus >= 201103L + int arr[3]; + // FIXME: The extra braces here are to avoid the parser getting too + // badly confused when recovering here. We should fix this recovery. + { for (const n // expected-error {{unknown type name 'n'}} expected-note {{}} + : arr) ; {} } // expected-error +{{}} + (void) [](const) {}; // expected-error {{requires a type specifier}} + (void) [](const n) {}; // expected-error {{unknown type name 'n'}} + enum E : const {}; // expected-error {{expected a type}} + using T = const; // expected-error {{expected a type}} + auto f() -> const; // expected-error {{expected a type}} +#endif +} + +namespace dr540 { // dr540: yes + typedef int &a; + typedef const a &a; // expected-warning {{has no effect}} + typedef const int &b; + typedef b &b; + typedef const a &c; // expected-note {{previous}} expected-warning {{has no effect}} + typedef const b &c; // expected-error {{different}} expected-warning {{has no effect}} +} + +namespace dr541 { // dr541: yes + template<int> struct X { typedef int type; }; + template<typename T> struct S { + int f(T); + + int g(int); + T g(bool); + + int h(); + int h(T); + + void x() { + // These are type-dependent expressions, even though we could + // determine that all calls have type 'int'. + X<sizeof(f(0))>::type a; // expected-error +{{}} + X<sizeof(g(0))>::type b; // expected-error +{{}} + X<sizeof(h(0))>::type b; // expected-error +{{}} + + typename X<sizeof(f(0))>::type a; + typename X<sizeof(h(0))>::type b; + } + }; +} + +namespace dr542 { // dr542: yes +#if __cplusplus >= 201103L + struct A { A() = delete; int n; }; + A a[32] = {}; // ok, constructor not called + + struct B { + int n; + private: + B() = default; + }; + B b[32] = {}; // ok, constructor not called +#endif +} + +namespace dr543 { // dr543: yes + // In C++98+DR543, this is valid because value-initialization doesn't call a + // trivial default constructor, so we never notice that defining the + // constructor would be ill-formed. + // + // In C++11+DR543, this is ill-formed, because the default constructor is + // deleted, and value-initialization *does* call a deleted default + // constructor, even if it is trivial. + struct A { + const int n; + }; + A a = A(); +#if __cplusplus >= 201103L + // expected-error@-2 {{deleted}} + // expected-note@-5 {{would not be initialized}} +#endif +} + +namespace dr544 { // dr544: yes + int *n; + + template<class T> struct A { int n; }; + template<class T> struct B : A<T> { int get(); }; + template<> int B<int>::get() { return n; } + int k = B<int>().get(); +} + +namespace dr546 { // dr546: yes + template<typename T> struct A { void f(); }; + template struct A<int>; + template<typename T> void A<T>::f() { T::error; } +} + +namespace dr547 { // d547: yes + template<typename T> struct X; + template<typename T> struct X<T() const> {}; + template<typename T, typename C> X<T> f(T C::*) { return X<T>(); } + + struct S { void f() const; }; + X<void() const> x = f(&S::f); +} + +namespace dr548 { // dr548: dup 482 + template<typename T> struct S {}; + template<typename T> void f() {} + template struct dr548::S<int>; + template void dr548::f<int>(); +} diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index 6d27d00a0cc..dba3275df92 100644 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -675,7 +675,7 @@ <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#106">106</a></td> <td>CD1</td> <td>Creating references to references during template deduction/instantiation</td> - <td class="none" align="center">Superseded by <a href="#540">540</a></td> + <td class="full" align="center">Superseded by <a href="#540">540</a></td> </tr> <tr id="107"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#107">107</a></td> @@ -705,7 +705,7 @@ <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#111">111</a></td> <td>NAD</td> <td>Copy constructors and cv-qualifiers</td> - <td class="none" align="center">Duplicate of <a href="#535">535</a></td> + <td class="full" align="center">Duplicate of <a href="#535">535</a></td> </tr> <tr id="112"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#112">112</a></td> @@ -2003,7 +2003,7 @@ of class templates</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#327">327</a></td> <td>CD1</td> <td>Use of "structure" without definition</td> - <td class="none" align="center">Duplicate of <a href="#538">538</a></td> + <td class="na" align="center">Duplicate of <a href="#538">538</a></td> </tr> <tr id="328"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#328">328</a></td> @@ -3197,13 +3197,13 @@ of class templates</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#526">526</a></td> <td>CD1</td> <td>Confusing aspects in the specification of non-deduced contexts</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="527"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#527">527</a></td> <td>CD2</td> <td>Problems with linkage of types</td> - <td class="none" align="center">Unknown</td> + <td class="na" align="center">N/A</td> </tr> <tr class="open" id="528"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#528">528</a></td> @@ -3221,13 +3221,13 @@ of class templates</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#530">530</a></td> <td>CD1</td> <td>Nontype template arguments in constant expressions</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="531"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#531">531</a></td> <td>C++11</td> <td>Defining members of explicit specializations</td> - <td class="none" align="center">Unknown</td> + <td class="partial" align="center">Partial</td> </tr> <tr id="532"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#532">532</a></td> @@ -3239,19 +3239,19 @@ of class templates</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#533">533</a></td> <td>NAD</td> <td>Special treatment for C-style header names</td> - <td class="none" align="center">Unknown</td> + <td class="na" align="center">N/A</td> </tr> <tr id="534"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#534">534</a></td> <td>CD1</td> <td><I>template-name</I>s and <I>operator-function-id</I>s</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="535"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#535">535</a></td> <td>CD3</td> <td>Copy construction without a copy constructor</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr class="open" id="536"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#536">536</a></td> @@ -3263,7 +3263,7 @@ of class templates</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#537">537</a></td> <td>CD1</td> <td>Definition of “signature”</td> - <td class="none" align="center">Unknown</td> + <td class="na" align="center">N/A</td> </tr> <tr id="538"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#538">538</a></td> @@ -3271,43 +3271,43 @@ of class templates</td> <td>Definition and usage
of <I>structure</I>, <I>POD-struct</I>, <I>POD-union</I>,
and <I>POD class</I></td> - <td class="none" align="center">Unknown</td> + <td class="na" align="center">N/A</td> </tr> <tr id="539"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#539">539</a></td> <td>CD3</td> <td>Constraints on <I>type-specifier-seq</I></td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="540"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#540">540</a></td> <td>CD1</td> <td>Propagation of cv-qualifiers in reference-to-reference collapse</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="541"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#541">541</a></td> <td>CD2</td> <td>Dependent function types</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="542"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#542">542</a></td> <td>CD2</td> <td>Value initialization of arrays of POD-structs</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="543"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#543">543</a></td> <td>CD1</td> <td>Value initialization and default constructors</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="544"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#544">544</a></td> <td>NAD</td> <td>Base class lookup in explicit specialization</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr class="open" id="545"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#545">545</a></td> @@ -3319,7 +3319,7 @@ and <I>POD class</I></td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#546">546</a></td> <td>C++11</td> <td>Explicit instantiation of class template members</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="547"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#547">547</a></td> @@ -3331,7 +3331,7 @@ and <I>POD class</I></td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#548">548</a></td> <td>dup</td> <td><I>qualified-id</I>s in declarations</td> - <td class="none" align="center">Unknown</td> + <td class="svn" align="center">Duplicate of <a href="#482">482</a></td> </tr> <tr class="open" id="549"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#549">549</a></td> |