| // RUN: %clang_cc1 -std=c++98 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| // RUN: %clang_cc1 -std=c++11 %s -verify -fexceptions -fcxx-exceptions -pedantic-errors |
| // 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 |
| |
| #if __cplusplus < 201103L |
| // expected-no-diagnostics |
| #endif |
| |
| namespace dr1715 { // dr1715: 3.9 |
| #if __cplusplus >= 201103L |
| struct B { |
| template<class T> B(T, typename T::Q); |
| }; |
| |
| class S { |
| using Q = int; |
| template<class T> friend B::B(T, typename T::Q); |
| }; |
| |
| struct D : B { |
| using B::B; |
| }; |
| struct E : B { // expected-note 2{{candidate}} |
| template<class T> E(T t, typename T::Q q) : B(t, q) {} // expected-note {{'Q' is a private member}} |
| }; |
| |
| B b(S(), 1); |
| D d(S(), 2); |
| E e(S(), 3); // expected-error {{no match}} |
| #endif |
| } |
| |
| namespace dr1736 { // dr1736: 3.9 |
| #if __cplusplus >= 201103L |
| struct S { |
| template <class T> S(T t) { |
| struct L : S { |
| using S::S; |
| }; |
| typename T::type value; // expected-error {{no member}} |
| L l(value); // expected-note {{instantiation of}} |
| } |
| }; |
| struct Q { typedef int type; } q; |
| S s(q); // expected-note {{instantiation of}} |
| #endif |
| } |
| |
| namespace dr1756 { // dr1756: 3.7 |
| #if __cplusplus >= 201103L |
| // Direct-list-initialization of a non-class object |
| |
| int a{0}; |
| |
| struct X { operator int(); } x; |
| int b{x}; |
| #endif |
| } |
| |
| namespace dr1758 { // dr1758: 3.7 |
| #if __cplusplus >= 201103L |
| // Explicit conversion in copy/move list initialization |
| |
| struct X { X(); }; |
| struct Y { explicit operator X(); } y; |
| X x{y}; |
| |
| struct A { |
| A() {} |
| A(const A &) {} |
| }; |
| struct B { |
| operator A() { return A(); } |
| } b; |
| A a{b}; |
| #endif |
| } |