diff options
| author | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-09-02 21:29:16 +0000 |
|---|---|---|
| committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2014-09-02 21:29:16 +0000 |
| commit | a10a16264fa909220f1396309e07428fe545bf6b (patch) | |
| tree | ba1ab58a10dc49ef667449f47f3a41e4c64b0ec0 /clang | |
| parent | 10e25f4a0c83f23bddf4829203d017acad5cfc1d (diff) | |
| download | bcm5719-llvm-a10a16264fa909220f1396309e07428fe545bf6b.tar.gz bcm5719-llvm-a10a16264fa909220f1396309e07428fe545bf6b.zip | |
Tests for DR550-572.
llvm-svn: 216953
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/test/CXX/drs/dr3xx.cpp | 2 | ||||
| -rw-r--r-- | clang/test/CXX/drs/dr5xx.cpp | 188 | ||||
| -rw-r--r-- | clang/www/cxx_dr_status.html | 34 |
3 files changed, 206 insertions, 18 deletions
diff --git a/clang/test/CXX/drs/dr3xx.cpp b/clang/test/CXX/drs/dr3xx.cpp index 87a7bdf7b30..b5f6dd7bfc3 100644 --- a/clang/test/CXX/drs/dr3xx.cpp +++ b/clang/test/CXX/drs/dr3xx.cpp @@ -366,7 +366,7 @@ namespace dr331 { // dr331: yes } const a, b(a); // expected-error {{no matching constructor}} } -namespace dr332 { // dr332: dup 557 +namespace dr332 { // dr332: dup 577 void f(volatile void); // expected-error {{'void' as parameter must not have type qualifiers}} void g(const void); // expected-error {{'void' as parameter must not have type qualifiers}} void h(int n, volatile void); // expected-error {{'void' must be the first and only parameter}} diff --git a/clang/test/CXX/drs/dr5xx.cpp b/clang/test/CXX/drs/dr5xx.cpp index a349006b958..ac6c9df808b 100644 --- a/clang/test/CXX/drs/dr5xx.cpp +++ b/clang/test/CXX/drs/dr5xx.cpp @@ -2,6 +2,11 @@ // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors // RUN: %clang_cc1 -std=c++1y %s -verify -fexceptions -fcxx-exceptions -pedantic-errors +// FIXME: This is included to avoid a diagnostic with no source location +// pointing at the implicit operator new. We can't match such a diagnostic +// with -verify. +void *operator new(__SIZE_TYPE__); // expected-warning 0-1{{missing exception spec}} expected-note{{candidate}} + namespace dr500 { // dr500: dup 372 class D; class A { @@ -528,3 +533,186 @@ namespace dr548 { // dr548: dup 482 template struct dr548::S<int>; template void dr548::f<int>(); } + +namespace dr551 { // dr551: yes c++11 + // FIXME: This obviously should apply in C++98 mode too. + template<typename T> void f() {} + template inline void f<int>(); +#if __cplusplus >= 201103L + // expected-error@-2 {{cannot be 'inline'}} +#endif + + template<typename T> inline void g() {} + template inline void g<int>(); +#if __cplusplus >= 201103L + // expected-error@-2 {{cannot be 'inline'}} +#endif + + template<typename T> struct X { + void f() {} + }; + template inline void X<int>::f(); +#if __cplusplus >= 201103L + // expected-error@-2 {{cannot be 'inline'}} +#endif +} + +namespace dr552 { // dr552: yes + template<typename T, typename T::U> struct X {}; + struct Y { typedef int U; }; + X<Y, 0> x; +} + +struct dr553_class { + friend void *operator new(__SIZE_TYPE__, dr553_class); +}; +namespace dr553 { + dr553_class c; + // Contrary to the apparent intention of the DR, operator new is not actually + // looked up with a lookup mechanism that performs ADL; the standard says it + // "is looked up in global scope", where it is not visible. + void *p = new (c) int; // expected-error {{no matching function}} + + struct namespace_scope { + friend void *operator new(__SIZE_TYPE__, namespace_scope); // expected-error {{cannot be declared inside a namespace}} + }; +} + +// dr556: na + +namespace dr557 { // dr557: yes + template<typename T> struct S { + friend void f(S<T> *); + friend void g(S<S<T> > *); + }; + void x(S<int> *p, S<S<int> > *q) { + f(p); + g(q); + } +} + +namespace dr558 { // dr558: yes + wchar_t a = L'\uD7FF'; + wchar_t b = L'\xD7FF'; + wchar_t c = L'\uD800'; // expected-error {{invalid universal character}} + wchar_t d = L'\xD800'; + wchar_t e = L'\uDFFF'; // expected-error {{invalid universal character}} + wchar_t f = L'\xDFFF'; + wchar_t g = L'\uE000'; + wchar_t h = L'\xE000'; +} + +template<typename> struct dr559 { typedef int T; dr559::T u; }; // dr559: yes + +namespace dr561 { // dr561: yes + template<typename T> void f(int); + template<typename T> void g(T t) { + f<T>(t); + } + namespace { + struct S {}; + template<typename T> static void f(S); + } + void h(S s) { + g(s); + } +} + +namespace dr564 { // dr564: yes + extern "C++" void f(int); + void f(int); // ok + extern "C++" { extern int n; } + int n; // ok +} + +namespace dr565 { // dr565: yes + namespace N { + template<typename T> int f(T); // expected-note {{target}} + } + using N::f; // expected-note {{using}} + template<typename T> int f(T*); + template<typename T> void f(T); + template<typename T, int = 0> int f(T); // expected-error 0-1{{extension}} + template<typename T> int f(T, int = 0); + template<typename T> int f(T); // expected-error {{conflicts with}} +} + +namespace dr566 { // dr566: yes +#if __cplusplus >= 201103L + int check[int(-3.99) == -3 ? 1 : -1]; +#endif +} + +// dr567: na + +namespace dr568 { // dr568: yes c++11 + // FIXME: This is a DR issue against C++98, so should probably apply there + // too. + struct x { int y; }; + class trivial : x { + x y; + public: + int n; + }; + int check_trivial[__is_trivial(trivial) ? 1 : -1]; + + struct std_layout { + std_layout(); + std_layout(const std_layout &); + ~std_layout(); + private: + int n; + }; + int check_std_layout[__is_standard_layout(std_layout) ? 1 : -1]; + + struct aggregate { + int x; + int y; + trivial t; + std_layout sl; + }; + aggregate aggr = {}; + + void f(...); + void g(trivial t) { f(t); } +#if __cplusplus < 201103L + // expected-error@-2 {{non-POD}} +#endif + + void jump() { + goto x; +#if __cplusplus < 201103L + // expected-error@-2 {{protected scope}} + // expected-note@+2 {{non-POD}} +#endif + trivial t; + x: ; + } +} + +namespace dr569 { // dr569: yes c++11 + // FIXME: This is a DR issue against C++98, so should probably apply there + // too. + ;;;;; +#if __cplusplus < 201103L + // expected-error@-2 {{C++11 extension}} +#endif +} + +namespace dr570 { // dr570: dup 633 + int n; + int &r = n; // expected-note {{previous}} + int &r = n; // expected-error {{redefinition}} +} + +namespace dr571 { // dr571 unknown + // FIXME: Add a codegen test. + typedef int &ir; + int n; + const ir r = n; // expected-warning {{has no effect}} FIXME: Test if this has internal linkage. +} + +namespace dr572 { // dr572: yes + enum E { a = 1, b = 2 }; + int check[a + b == 3 ? 1 : -1]; +} diff --git a/clang/www/cxx_dr_status.html b/clang/www/cxx_dr_status.html index dba3275df92..14ce95ac323 100644 --- a/clang/www/cxx_dr_status.html +++ b/clang/www/cxx_dr_status.html @@ -1967,7 +1967,7 @@ of class templates</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#321">321</a></td> <td>dup</td> <td>Associated classes and namespaces for argument-dependent lookup</td> - <td class="none" align="center">Duplicate of <a href="#557">557</a></td> + <td class="full" align="center">Duplicate of <a href="#557">557</a></td> </tr> <tr id="322"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#322">322</a></td> @@ -2033,7 +2033,7 @@ of class templates</td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#332">332</a></td> <td>CD3</td> <td>cv-qualified <TT>void</TT> parameter types</td> - <td class="none" align="center">Duplicate of <a href="#557">557</a></td> + <td class="none" align="center">Duplicate of <a href="#577">577</a></td> </tr> <tr id="333"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#333">333</a></td> @@ -3349,13 +3349,13 @@ and <I>POD class</I></td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#551">551</a></td> <td>CD1</td> <td>When is <TT>inline</TT> permitted in an explicit instantiation?</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes (C++11 onwards)</td> </tr> <tr id="552"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#552">552</a></td> <td>NAD</td> <td>Use of <TT>typename</TT> in the type in a non-type <I>parameter-declaration</I></td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="553"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#553">553</a></td> @@ -3379,25 +3379,25 @@ and <I>POD class</I></td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#556">556</a></td> <td>CD2</td> <td>Conflicting requirements for acceptable aliasing</td> - <td class="none" align="center">Unknown</td> + <td class="na" align="center">N/A</td> </tr> <tr id="557"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#557">557</a></td> <td>CD1</td> <td>Does argument-dependent lookup cause template instantiation?</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="558"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#558">558</a></td> <td>CD1</td> <td>Excluded characters in universal character names</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="559"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#559">559</a></td> <td>CD1</td> <td>Editing error in issue 382 resolution</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr class="open" id="560"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#560">560</a></td> @@ -3409,7 +3409,7 @@ and <I>POD class</I></td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#561">561</a></td> <td>CD2</td> <td>Internal linkage functions in dependent name lookup</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr class="open" id="562"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#562">562</a></td> @@ -3427,43 +3427,43 @@ and <I>POD class</I></td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#564">564</a></td> <td>CD2</td> <td>Agreement of language linkage or <I>linkage-specification</I>s?</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="565"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#565">565</a></td> <td>CD3</td> <td>Conflict rules for <I>using-declaration</I>s naming function templates</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="566"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#566">566</a></td> <td>NAD</td> <td>Conversion of negative floating point values to integer type</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="567"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#567">567</a></td> <td>NAD</td> <td>Can <TT>size_t</TT> and <TT>ptrdiff_t</TT> be larger than <TT>long</TT>?</td> - <td class="none" align="center">Unknown</td> + <td class="na" align="center">N/A</td> </tr> <tr id="568"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#568">568</a></td> <td>CD1</td> <td>Definition of POD is too strict</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes (C++11 onwards)</td> </tr> <tr id="569"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#569">569</a></td> <td>CD2</td> <td>Spurious semicolons at namespace scope should be allowed</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes (C++11 onwards)</td> </tr> <tr id="570"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#570">570</a></td> <td>CD2</td> <td>Are references subject to the ODR?</td> - <td class="none" align="center">Unknown</td> + <td class="none" align="center">Duplicate of <a href="#633">633</a></td> </tr> <tr id="571"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#571">571</a></td> @@ -3475,7 +3475,7 @@ and <I>POD class</I></td> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#572">572</a></td> <td>C++11</td> <td>Standard conversions for non-built-in types</td> - <td class="none" align="center">Unknown</td> + <td class="full" align="center">Yes</td> </tr> <tr id="573"> <td><a href="http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#573">573</a></td> |

