// RUN: %clang_cc1 %s -fsyntax-only -verify -triple %itanium_abi_triple -Wweak-vtables -Wweak-template-vtables // // Check that this warning is disabled on MS ABI targets which don't have key // functions. // RUN: %clang_cc1 %s -fsyntax-only -triple %ms_abi_triple -Werror -Wweak-vtables -Wweak-template-vtables struct A { // expected-warning {{'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}} virtual void f() { } }; template struct B { virtual void f() { } }; namespace { struct C { virtual void f() { } }; } void f() { struct A { virtual void f() { } }; A a; } // Use the vtables void uses_abc() { A a; B b; C c; } // class Parent { public: Parent() {} virtual ~Parent(); virtual void * getFoo() const = 0; }; class Derived : public Parent { public: Derived(); void * getFoo() const; }; class VeryDerived : public Derived { // expected-warning{{'VeryDerived' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}} public: void * getFoo() const { return 0; } }; Parent::~Parent() {} void uses_derived() { Derived d; VeryDerived vd; } template struct TemplVirt { virtual void f(); }; template class TemplVirt; // expected-warning{{explicit template instantiation 'TemplVirt' will emit a vtable in every translation unit}} template<> struct TemplVirt { virtual void f(); }; template<> struct TemplVirt { // expected-warning{{'TemplVirt' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}} virtual void f() {} }; void uses_templ() { TemplVirt f; TemplVirt b; TemplVirt l; }