|  | // RUN: %clang_cc1 %s -fsyntax-only -verify -triple %itanium_abi_triple -Wweak-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 is deprecated but we still parse it. | 
|  | // RUN: %clang_cc1 %s -fsyntax-only -Werror -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<typename T> 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<int> 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<typename T> struct TemplVirt { | 
|  | virtual void f(); | 
|  | }; | 
|  |  | 
|  | template class TemplVirt<float>; | 
|  |  | 
|  | template<> struct TemplVirt<bool> { | 
|  | virtual void f(); | 
|  | }; | 
|  |  | 
|  | template<> struct TemplVirt<long> { // expected-warning{{'TemplVirt<long>' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit}} | 
|  | virtual void f() {} | 
|  | }; | 
|  |  | 
|  | void uses_templ() { | 
|  | TemplVirt<float> f; | 
|  | TemplVirt<bool> b; | 
|  | TemplVirt<long> l; | 
|  | } |