summaryrefslogtreecommitdiff
path: root/test/CXX/drs/dr13xx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/CXX/drs/dr13xx.cpp')
-rw-r--r--test/CXX/drs/dr13xx.cpp99
1 files changed, 99 insertions, 0 deletions
diff --git a/test/CXX/drs/dr13xx.cpp b/test/CXX/drs/dr13xx.cpp
index f35ead7b5e94..56ff1237480f 100644
--- a/test/CXX/drs/dr13xx.cpp
+++ b/test/CXX/drs/dr13xx.cpp
@@ -3,6 +3,96 @@
// RUN: %clang_cc1 -std=c++14 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
// RUN: %clang_cc1 -std=c++1z %s -verify -fexceptions -fcxx-exceptions -pedantic-errors
+__extension__ typedef __SIZE_TYPE__ size_t;
+
+namespace std {
+ template<typename T> struct initializer_list {
+ const T *ptr;
+ size_t n;
+ initializer_list(const T*, size_t);
+ };
+}
+
+namespace dr1310 { // dr1310: 5
+ struct S {} * sp = new S::S; // expected-error {{qualified reference to 'S' is a constructor name}}
+ void f() {
+ S::S(a); // expected-error {{qualified reference to 'S' is a constructor name}}
+ }
+ struct T { int n; typedef int U; typedef T V; };
+ int k = T().T::T::n;
+ T::V v;
+
+ struct U { int U; };
+ int u = U().U::U;
+ struct U::U w;
+
+ struct V : T::T {
+ // FIXME: This is technically ill-formed, but we consider that to be a defect.
+ V() : T::T() {}
+ };
+ template<typename T> struct VT : T::T {
+ VT() : T::T() {}
+ };
+ template struct VT<T>;
+
+ template<template<typename> class> class TT {};
+ template<typename> class TTy {};
+
+ template<typename T> struct WBase {};
+ template<typename T> struct W : WBase<T> { typedef int X; int n; };
+
+ void w_test() {
+ W<int>::W w1a; // expected-error {{qualified reference to 'W' is a constructor name}}
+ W<int>::W::X w1ax;
+ W<int>::W<int> w1b; // expected-error {{qualified reference to 'W' is a constructor name}}
+ W<int>::W<int>::X w1bx;
+ typename W<int>::W w2a; // expected-error {{qualified reference to 'W' is a constructor name}} expected-error 0-1{{outside of a template}}
+ typename W<int>::W::X w2ax; // expected-error 0-1{{outside of a template}}
+ typename W<int>::W<int> w2b; // expected-error {{qualified reference to 'W' is a constructor name}} expected-error 0-1{{outside of a template}}
+ typename W<int>::W<int>::X w2bx; // expected-error 0-1{{outside of a template}}
+ W<int>::template W<int> w3; // expected-error {{qualified reference to 'W' is a constructor name}} expected-error 0-1{{outside of a template}}
+ W<int>::template W<int>::X w3x; // expected-error 0-1{{outside of a template}}
+ typename W<int>::template W<int> w4; // expected-error {{qualified reference to 'W' is a constructor name}} expected-error 0-2{{outside of a template}}
+ typename W<int>::template W<int>::X w4x; // expected-error 0-2{{outside of a template}}
+
+ TT<W<int>::W> tt1; // expected-error {{qualified reference to 'W' is a constructor name}}
+ TTy<W<int>::W> tt1a; // expected-error {{qualified reference to 'W' is a constructor name}}
+ TT<W<int>::template W> tt2; // expected-error {{qualified reference to 'W' is a constructor name}} expected-error 0-1{{outside of a template}}
+ TT<W<int>::WBase> tt3;
+ TTy<W<int>::WBase> tt3a;
+ TT<W<int>::template WBase> tt4; // expected-error 0-1{{outside of a template}}
+
+ W<int> w;
+ (void)w.W::W::n;
+ (void)w.W<int>::W::n;
+ (void)w.W<int>::W<int>::n;
+ (void)w.W<int>::template W<int>::n; // expected-error 0-1{{outside of a template}}
+ }
+
+ template<typename W>
+ void wt_test() {
+ typename W::W w2a; // expected-error {{qualified reference to 'W' is a constructor name}}
+ typename W::template W<int> w4; // expected-error {{qualified reference to 'W' is a constructor name}}
+ TTy<typename W::W> tt2; // expected-error {{qualified reference to 'W' is a constructor name}}
+ TT<W::template W> tt3; // expected-error {{qualified reference to 'W' is a constructor name}}
+ }
+ template<typename W>
+ void wt_test_good() {
+ typename W::W::X w2ax;
+ typename W::template W<int>::X w4x;
+ TTy<typename W::WBase> tt4;
+ TT<W::template WBase> tt5;
+
+ W w;
+ (void)w.W::W::n;
+ (void)w.W::template W<int>::n;
+ (void)w.template W<int>::W::n;
+ (void)w.template W<int>::template W<int>::n;
+ }
+ template void wt_test<W<int> >(); // expected-note {{instantiation of}}
+ template void wt_test_good<W<int> >();
+}
+
namespace dr1315 { // dr1315: partial
template <int I, int J> struct A {};
template <int I> // expected-note {{non-deducible template parameter 'I'}}
@@ -159,6 +249,15 @@ namespace dr1346 { // dr1346: 3.5
#endif
}
+namespace dr1347 { // dr1347: yes
+ auto x = 5, *y = &x; // expected-error 0-1{{extension}}
+ auto z = y, *q = y; // expected-error {{'auto' deduced as 'int *' in declaration of 'z' and deduced as 'int' in declaration of 'q'}} expected-error 0-1{{extension}}
+#if __cplusplus >= 201103L
+ auto a = 5, b = {1, 2}; // expected-error {{'auto' deduced as 'int' in declaration of 'a' and deduced as 'std::initializer_list<int>' in declaration of 'b'}}
+ auto (*fp)(int) -> int, i = 0; // expected-error {{declaration with trailing return type must be the only declaration in its group}}
+#endif
+}
+
namespace dr1359 { // dr1359: 3.5
#if __cplusplus >= 201103L
union A { constexpr A() = default; };