abstract.cpp revision 8211effbd3abc5948a5d6924c87e72323016a376
18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project// RUN: clang -fsyntax-only -verify %s -std=c++0x 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifndef __GXX_EXPERIMENTAL_CXX0X__ 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define __CONCAT(__X, __Y) __CONCAT1(__X, __Y) 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define __CONCAT1(__X, __Y) __X ## __Y 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define static_assert(__b, __m) \ 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project typedef int __CONCAT(__sa, __LINE__)[__b ? 1 : -1] 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass C { 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void f() = 0; // expected-note {{pure virtual function 'f'}} 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic_assert(__is_abstract(C), "C has a pure virtual function"); 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass D : C { 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic_assert(__is_abstract(D), "D inherits from an abstract class"); 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass E : D { 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void f(); 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic_assert(!__is_abstract(E), "E inherits from an abstract class but implements f"); 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectC *d = new C; // expected-error {{allocation of an object of abstract type 'C'}} 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectC c; // expected-error {{variable type 'C' is an abstract class}} 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid t1(C c); // expected-error {{parameter type 'C' is an abstract class}} 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid t2(C); // expected-error {{parameter type 'C' is an abstract class}} 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct S { 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project C c; // expected-error {{field type 'C' is an abstract class}} 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 38ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turnervoid t3(const C&); 39ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner 40ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turnervoid f() { 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project C(); // expected-error {{allocation of an object of abstract type 'C'}} 42ce0f4b02160ee72d7d2428867fe757bc37c68c98David 'Digit' Turner t3(C()); // expected-error {{allocation of an object of abstract type 'C'}} 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectC e[2]; // expected-error {{variable type 'C' is an abstract class}} 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid t4(C c[2]); // expected-error {{parameter type 'C' is an abstract class}} 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid t5(void (*)(C)); // expected-error {{parameter type 'C' is an abstract class}} 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef void (*Func)(C); // expected-error {{parameter type 'C' is an abstract class}} 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid t6(Func); 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectclass F { 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project F a() { } // expected-error {{return type 'F' is an abstract class}} 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project class D { 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void f(F c); // expected-error {{parameter type 'F' is an abstract class}} 598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project }; 608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project union U { 625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner void u(F c); // expected-error {{parameter type 'F' is an abstract class}} 635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner }; 645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project virtual void f() = 0; // expected-note {{pure virtual function 'f'}} 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project