107b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith// RUN: %clang_cc1 -std=c++11 -verify %s
207b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith
307b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithstruct A {
407b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith  constexpr A(const int&) : rval(false) {}
507b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith  constexpr A(const int&&) : rval(true) {}
607b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith  bool rval;
707b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith};
807b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithstruct B : A {
907b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith  using A::A;
1007b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith};
1107b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith
1207b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithconstexpr int k = 0;
1307b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithconstexpr A a0{0};
1407b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithconstexpr A a1{k};
1507b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithconstexpr B b0{0};
1607b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith// This performs static_cast<(const int&)&&>(k), so calls the A(const int&)
1707b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith// constructor.
1807b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithconstexpr B b1{k};
1907b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smith
2007b0fdcee8d64222b274779d02851cc53d18e0dbRichard Smithstatic_assert(a0.rval && !a1.rval && b0.rval && !b1.rval, "");
214841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smith
224841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smithstruct C {
234841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smith  template<typename T> constexpr C(T t) : v(t) {}
244841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smith  int v;
254841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smith};
264841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smithstruct D : C {
274841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smith  using C::C;
284841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smith};
294841ca5f83bf970f910ac7d154cdd71d2a3cf481Richard Smithstatic_assert(D(123).v == 123, "");
30cd37a0b6bbd8d46af116c72537e2129e4a077e5eEli Friedman
31cd37a0b6bbd8d46af116c72537e2129e4a077e5eEli Friedman// FIXME: This diagnostic sucks.
32cd37a0b6bbd8d46af116c72537e2129e4a077e5eEli Friedmantemplate<typename T> constexpr D::D(T t) : C(t) {} // expected-error {{definition of implicitly declared function}}
33