1799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis// RUN: %clang_cc1 -fsyntax-only -Woverloaded-virtual -verify %s
2799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
3799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct B1 {
4799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  virtual void foo(int); // expected-note {{declared here}}
5799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  virtual void foo(); // expected-note {{declared here}}
6799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
7799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
8799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct S1 : public B1 {
9799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  void foo(float); // expected-warning {{hides overloaded virtual functions}}
10799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
11799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
12799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct S2 : public B1 {
13799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  void foo(); // expected-note {{declared here}}
14799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
15799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
16799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct B2 {
17799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  virtual void foo(void*); // expected-note {{declared here}}
18799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
19799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
20799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct MS1 : public S2, public B2 {
21799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis   virtual void foo(int); // expected-warning {{hides overloaded virtual functions}}
22799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
23799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
24799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct B3 {
25799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  virtual void foo(int);
26799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  virtual void foo();
27799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
28799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
29799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct S3 : public B3 {
30799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  using B3::foo;
31799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  void foo(float);
32799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
33799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
34799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct B4 {
35799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  virtual void foo();
36799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
37799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis
38799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidisstruct S4 : public B4 {
39799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  void foo(float);
40799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis  void foo();
41799ef666685d6c97d64d1970a6f68bf7923360c2Argyrios Kyrtzidis};
4274b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis
4374b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidisnamespace PR9182 {
4474b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidisstruct Base {
4574b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis  virtual void foo(int);
4674b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis};
4774b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis
4874b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidisvoid Base::foo(int) { }
4974b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis
5074b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidisstruct Derived : public Base {
5174b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis  virtual void foo(int);
5274b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis  void foo(int, int);
5374b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis};
5474b47f9173ccd2c22686b8fbf9d69852d6f46ac6Argyrios Kyrtzidis}
550266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidis
560266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidisnamespace PR9396 {
570266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidisclass A {
580266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidispublic:
590266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidis  virtual void f(int) {}
600266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidis};
610266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidis
620266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidisclass B : public A {
630266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidispublic:
640266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidis  static void f() {}
650266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidis};
660266aa37802a486e65f9259014bb60848fc4be23Argyrios Kyrtzidis}
6776398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie
6876398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikienamespace ThreeLayer {
6976398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikiestruct A {
7076398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie  virtual void f();
7176398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie};
7276398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie
7376398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikiestruct B: A {
7476398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie  void f();
7576398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie  void f(int);
7676398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie};
7776398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie
7876398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikiestruct C: B {
7976398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie  void f(int);
8076398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie  using A::f;
8176398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie};
8276398e5ad39ae719dcc650c7cddeb25379c02c34David Blaikie}
835f750680d421328225e597d6429a298027dc6360David Blaikie
845f750680d421328225e597d6429a298027dc6360David Blaikienamespace UnbalancedVirtual {
855f750680d421328225e597d6429a298027dc6360David Blaikiestruct Base {
865f750680d421328225e597d6429a298027dc6360David Blaikie  virtual void func();
875f750680d421328225e597d6429a298027dc6360David Blaikie};
885f750680d421328225e597d6429a298027dc6360David Blaikie
895f750680d421328225e597d6429a298027dc6360David Blaikiestruct Derived1: virtual Base {
905f750680d421328225e597d6429a298027dc6360David Blaikie  virtual void func();
915f750680d421328225e597d6429a298027dc6360David Blaikie};
925f750680d421328225e597d6429a298027dc6360David Blaikie
935f750680d421328225e597d6429a298027dc6360David Blaikiestruct Derived2: virtual Base {
945f750680d421328225e597d6429a298027dc6360David Blaikie};
955f750680d421328225e597d6429a298027dc6360David Blaikie
965f750680d421328225e597d6429a298027dc6360David Blaikiestruct MostDerived: Derived1, Derived2 {
975f750680d421328225e597d6429a298027dc6360David Blaikie  void func(int);
985f750680d421328225e597d6429a298027dc6360David Blaikie  void func();
995f750680d421328225e597d6429a298027dc6360David Blaikie};
1005f750680d421328225e597d6429a298027dc6360David Blaikie}
1015f750680d421328225e597d6429a298027dc6360David Blaikie
1025f750680d421328225e597d6429a298027dc6360David Blaikienamespace UnbalancedVirtual2 {
1035f750680d421328225e597d6429a298027dc6360David Blaikiestruct Base {
1045f750680d421328225e597d6429a298027dc6360David Blaikie  virtual void func();
1055f750680d421328225e597d6429a298027dc6360David Blaikie};
1065f750680d421328225e597d6429a298027dc6360David Blaikie
1075f750680d421328225e597d6429a298027dc6360David Blaikiestruct Derived1: virtual Base {
1085f750680d421328225e597d6429a298027dc6360David Blaikie  virtual void func();
1095f750680d421328225e597d6429a298027dc6360David Blaikie};
1105f750680d421328225e597d6429a298027dc6360David Blaikie
1115f750680d421328225e597d6429a298027dc6360David Blaikiestruct Derived2: virtual Base {
1125f750680d421328225e597d6429a298027dc6360David Blaikie};
1135f750680d421328225e597d6429a298027dc6360David Blaikie
1145f750680d421328225e597d6429a298027dc6360David Blaikiestruct Derived3: Derived1 {
1155f750680d421328225e597d6429a298027dc6360David Blaikie  virtual void func();
1165f750680d421328225e597d6429a298027dc6360David Blaikie};
1175f750680d421328225e597d6429a298027dc6360David Blaikie
1185f750680d421328225e597d6429a298027dc6360David Blaikiestruct MostDerived: Derived3, Derived2 {
1195f750680d421328225e597d6429a298027dc6360David Blaikie  void func(int);
1205f750680d421328225e597d6429a298027dc6360David Blaikie  void func();
1215f750680d421328225e597d6429a298027dc6360David Blaikie};
1225f750680d421328225e597d6429a298027dc6360David Blaikie}
123f608aff66c5412ab583258f989417b4974ba507aRichard Trieu
124f608aff66c5412ab583258f989417b4974ba507aRichard Trieunamespace {
125f608aff66c5412ab583258f989417b4974ba507aRichard Trieu  class A {
126f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    virtual int foo(bool) const;
127f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    // expected-note@-1{{type mismatch at 1st parameter ('bool' vs 'int')}}
128f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    virtual int foo(int, int) const;
129f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    // expected-note@-1{{different number of parameters (2 vs 1)}}
130f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    virtual int foo(int*) const;
131f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    // expected-note@-1{{type mismatch at 1st parameter ('int *' vs 'int')}}
132f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    virtual int foo(int) volatile;
133f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    // expected-note@-1{{different qualifiers (volatile vs const)}}
134f608aff66c5412ab583258f989417b4974ba507aRichard Trieu  };
135f608aff66c5412ab583258f989417b4974ba507aRichard Trieu
136f608aff66c5412ab583258f989417b4974ba507aRichard Trieu  class B : public A {
137f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    virtual int foo(int) const;
138f608aff66c5412ab583258f989417b4974ba507aRichard Trieu    // expected-warning@-1{{hides overloaded virtual functions}}
139f608aff66c5412ab583258f989417b4974ba507aRichard Trieu  };
140f608aff66c5412ab583258f989417b4974ba507aRichard Trieu}
141