forked from OSchip/llvm-project
59 lines
1.3 KiB
C++
59 lines
1.3 KiB
C++
// RUN: %clang_cc1 -std=c++11 %s -verify
|
|
|
|
// expected-no-diagnostics
|
|
|
|
namespace PR15757 {
|
|
struct S {
|
|
};
|
|
|
|
template<typename X, typename Y> struct T {
|
|
template<typename A> T(X x, A &&a) {}
|
|
|
|
template<typename A> explicit T(A &&a)
|
|
noexcept(noexcept(T(X(), static_cast<A &&>(a))))
|
|
: T(X(), static_cast<A &&>(a)) {}
|
|
};
|
|
|
|
template<typename X, typename Y> struct U : T<X, Y> {
|
|
using T<X, Y>::T;
|
|
};
|
|
|
|
U<S, char> foo(char ch) { return U<S, char>(ch); }
|
|
|
|
int main() {
|
|
U<S, int> a(42);
|
|
U<S, char> b('4');
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
namespace WrongIdent {
|
|
struct A {};
|
|
struct B : A {};
|
|
struct C : B {
|
|
using B::A;
|
|
};
|
|
}
|
|
|
|
namespace DefaultCtorConflict {
|
|
struct A { A(int = 0); };
|
|
struct B : A {
|
|
using A::A;
|
|
} b; // ok, not ambiguous, inherited constructor suppresses implicit default constructor
|
|
struct C {
|
|
B b;
|
|
} c;
|
|
}
|
|
|
|
namespace InvalidConstruction {
|
|
struct A { A(int); };
|
|
struct B { B() = delete; };
|
|
struct C : A, B { using A::A; };
|
|
// Initialization here is performed as if by a defaulted default constructor,
|
|
// which would be ill-formed (in the immediate context) in this case because
|
|
// it would be defined as deleted.
|
|
template<typename T> void f(decltype(T(0))*);
|
|
template<typename T> int &f(...);
|
|
int &r = f<C>(0);
|
|
}
|