1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
251bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian
38dde14e7f43a4b29e592b3e8e576eb467ddb6c6eDouglas Gregorstruct A {};
451bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian
551bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanianstruct BASE {
651bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian  operator A(); // expected-note {{candidate function}}
751bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian};
851bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian
951bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanianstruct BASE1 {
1051bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian operator A();  // expected-note {{candidate function}}
1151bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian};
1251bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian
1351bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanianclass B : public BASE , public BASE1
1451bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian{
1551bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian  public:
1651bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian  B();
1751bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian} b;
1851bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian
1951bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanianextern B f();
2051bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian
2158f9e13e87e57236fee4b914eea9be6f92a1c345Chris Lattnerconst int& ri = (void)0; // expected-error {{reference to type 'const int' could not bind to an rvalue of type 'void'}}
22893f955321cdf49dd0ceaf4ff821632e9b265000Fariborz Jahanian
2351bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanianint main() {
240c42bb653dc40b1caae010618831e320af824b18Chris Lattner        const A& rca = f(); // expected-error {{reference initialization of type 'const A &' with initializer of type 'B' is ambiguous}}
257c2342dd4c9947806842e5aca3d2bb2e542853c9John McCall        A& ra = f(); // expected-error {{non-const lvalue reference to type 'A' cannot bind to a temporary of type 'B'}}
2651bebc83e74001ed0412d82aadae9eb247fee2d4Fariborz Jahanian}
272c79281ef66cb5001f0ebadf6b317250c21a1c01Douglas Gregor
28e180ed2f014d49587bc49f09313cabf38080d6faDouglas Gregorstruct PR6139 { A (&x)[1]; };
296242a45ca50586ed3f363d4ac7422e07092e4d96Richard SmithPR6139 x = {{A()}}; // expected-error{{non-const lvalue reference to type 'A [1]' cannot bind to an initializer list temporary}}
306242a45ca50586ed3f363d4ac7422e07092e4d96Richard Smith
316242a45ca50586ed3f363d4ac7422e07092e4d96Richard Smithstruct PR6139b { A (&x)[1]; };
326242a45ca50586ed3f363d4ac7422e07092e4d96Richard SmithPR6139b y = {A()}; // expected-error{{non-const lvalue reference to type 'A [1]' cannot bind to a temporary of type 'A'}}
333c3af140263c3761665aa2c0aac4266115f5caf1Richard Smith
343c3af140263c3761665aa2c0aac4266115f5caf1Richard Smithnamespace PR16502 {
353c3af140263c3761665aa2c0aac4266115f5caf1Richard Smith  struct A { int &&temporary; int x, y; };
363c3af140263c3761665aa2c0aac4266115f5caf1Richard Smith  int f();
373c3af140263c3761665aa2c0aac4266115f5caf1Richard Smith  const A &c = { 10, ++c.temporary };
383c3af140263c3761665aa2c0aac4266115f5caf1Richard Smith}
39