--- /dev/null
+// RUN: %clang_cc1 %s -emit-llvm-only -triple=i386-pc-win32 -verify -DTEST1
+// RUN: %clang_cc1 %s -emit-llvm-only -triple=i386-pc-win32 -verify -DTEST2
+
+#ifdef TEST1
+struct A {
+ virtual A *foo(); // in vftable slot #0.
+ virtual A *bar(); // in vftable slot #1.
+};
+
+struct B : virtual A {
+ // appended to the A subobject's vftable in slot #2.
+ virtual B *foo(); // expected-note{{covariant thunk required by 'foo'}}
+};
+
+struct C : virtual A {
+ // appended to the A subobject's vftable in slot #2.
+ virtual C *bar(); // expected-note{{covariant thunk required by 'bar'}}
+};
+
+struct D : B, C { D(); }; // expected-error{{ambiguous vftable component}}
+D::D() {}
+#endif
+
+#ifdef TEST2
+struct A {
+ virtual A *foo(); // in vftable slot #0
+};
+
+struct B : virtual A {
+ // appended to the A subobject's vftable in slot #1.
+ virtual B *foo(); // expected-note{{covariant thunk required by 'foo'}}
+};
+
+struct C : virtual A {
+ // appended to the A subobject's vftable in slot #1.
+ virtual C *foo(); // expected-note{{covariant thunk required by 'foo'}}
+};
+
+struct D : B, C { // expected-error{{ambiguous vftable component}}
+ virtual D *foo();
+ D();
+};
+D::D() {}
+#endif