• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // RUN: %clang_cc1 -std=c++11 -verify %s
2 
3 struct B1 { // expected-note 2{{candidate}}
4   B1(int); // expected-note {{candidate}}
5 };
6 
7 struct B2 { // expected-note 2{{candidate}}
8   B2(int); // expected-note {{candidate}}
9 };
10 
11 struct D1 : B1, B2 { // expected-note 2{{candidate}}
12   using B1::B1; // expected-note 3{{inherited here}}
13   using B2::B2; // expected-note 3{{inherited here}}
14 };
15 D1 d1(0); // expected-error {{ambiguous}}
16 
17 struct D2 : B1, B2 {
18   using B1::B1;
19   using B2::B2;
20   D2(int);
21 };
22 D2 d2(0); // ok
23 
24 
25 // The emergent behavior of implicit special members is a bit odd when
26 // inheriting from multiple base classes.
27 namespace default_ctor {
28   struct C;
29   struct D;
30 
31   struct A { // expected-note 4{{candidate}}
32     A(); // expected-note {{candidate}}
33 
34     A(C &&); // expected-note {{candidate}}
35     C &operator=(C&&); // expected-note {{candidate}}
36 
37     A(D &&); // expected-note {{candidate}}
38     D &operator=(D&&); // expected-note {{candidate}}
39   };
40 
41   struct B { // expected-note 4{{candidate}}
42     B(); // expected-note {{candidate}}
43 
44     B(C &&); // expected-note {{candidate}}
45     C &operator=(C&&); // expected-note {{candidate}}
46 
47     B(D &&); // expected-note {{candidate}}
48     D &operator=(D&&); // expected-note {{candidate}}
49   };
50 
51   struct C : A, B {
52     using A::A;
53     using A::operator=;
54     using B::B;
55     using B::operator=;
56   };
57   struct D : A, B {
58     using A::A; // expected-note 5{{inherited here}}
59     using A::operator=;
60     using B::B; // expected-note 5{{inherited here}}
61     using B::operator=;
62 
63     D(int);
64     D(const D&); // expected-note {{candidate}}
65     D &operator=(const D&); // expected-note {{candidate}}
66   };
67 
68   C c;
f(C c)69   void f(C c) {
70     C c2(static_cast<C&&>(c));
71     c = static_cast<C&&>(c);
72   }
73 
74   // D does not declare D(), D(D&&), nor operator=(D&&), so the base class
75   // versions are inherited.
76   D d; // expected-error {{ambiguous}}
f(D d)77   void f(D d) {
78     D d2(static_cast<D&&>(d)); // expected-error {{ambiguous}}
79     d = static_cast<D&&>(d); // expected-error {{ambiguous}}
80   }
81 }
82