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