1b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith// RUN: %clang_cc1 -std=c++11 %s -verify
2b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith
3b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith// expected-no-diagnostics
4b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith
5b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smithnamespace PR15757 {
6b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  struct S {
7b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  };
8b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith
9b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  template<typename X, typename Y> struct T {
10b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith    template<typename A> T(X x, A &&a) {}
11b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith
12b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith    template<typename A> explicit T(A &&a)
13b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith        noexcept(noexcept(T(X(), static_cast<A &&>(a))))
14b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith      : T(X(), static_cast<A &&>(a)) {}
15b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  };
16b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith
17b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  template<typename X, typename Y> struct U : T<X, Y> {
18b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith    using T<X, Y>::T;
19b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  };
20b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith
21b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  U<S, char> foo(char ch) { return U<S, char>(ch); }
22b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith
23b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  int main() {
24b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith    U<S, int> a(42);
25b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith    U<S, char> b('4');
26b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith    return 0;
27b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith  }
28b5eb3f5bf383807103dc1377a124fd96ee21d02aRichard Smith}
296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace WrongIdent {
316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct A {};
326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct B : A {};
336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  struct C : B {
346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    using B::A;
356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  };
366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
37