forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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<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;
 | |
| }
 | |
| 
 | |
| // <rdar://problem/9979458>
 | |
| 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>; // expected-warning{{explicit template instantiation 'TemplVirt<float>' will emit a vtable in every translation unit}}
 | |
| 
 | |
| 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;
 | |
| }
 |