brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · b99bbf0 Raw
121 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify -std=c++2a %s2 3namespace basic {4struct ForwardDeclaration; // expected-note{{forward declaration of 'basic::ForwardDeclaration'}}5                           // expected-note@-1{{forward declaration of 'basic::ForwardDeclaration'}}6struct NonPolymorphic {};7struct Polymorphic {8  virtual ~Polymorphic();9};10 11template <typename T>12struct Foo {13  virtual ~Foo();14};15 16template <>17struct Foo<int> {18};19 20template <typename T>21struct Bar {22  using SubType = typename T::SubType;23  SubType *ty() const;24};25 26struct Thing1 {27  using SubType = Thing1;28};29 30struct Thing2 {31  using SubType = Thing2;32  virtual ~Thing2();33};34 35struct Thing3 {36  using SubType = int;37};38 39struct Thing4 {40  using SubType = Polymorphic;41};42 43struct Thing5 {44  using SubType = NonPolymorphic;45};46 47struct Thing6 {48  using SubType = ForwardDeclaration;49};50 51template <typename T>52const void *getThing(const Bar<T> *b = nullptr) {53  return __builtin_get_vtable_pointer(b->ty()); // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'SubType *' (aka 'int *') was provided}}54                                                // expected-error@-1{{__builtin_get_vtable_pointer requires an argument of polymorphic class pointer type, but 'Thing1' has no virtual methods}}55                                                // expected-error@-2{{__builtin_get_vtable_pointer requires an argument of polymorphic class pointer type, but 'NonPolymorphic' has no virtual methods}}56                                                // expected-error@-3{{__builtin_get_vtable_pointer requires an argument with a complete type, but 'SubType' (aka 'ForwardDeclaration') is incomplete}}57}58template <typename>59struct IncompleteTemplate; // expected-note{{template is declared here}}60template <typename>61struct MonomorphicTemplate {62};63template <typename>64struct PolymorphicTemplate {65  virtual ~PolymorphicTemplate();66};67 68void test_function(int);    // expected-note{{possible target for call}}69void test_function(double); // expected-note{{possible target for call}}70 71void getVTablePointer() {72  ForwardDeclaration *fd = nullptr;73  NonPolymorphic np;74  Polymorphic p;75  NonPolymorphic np_array[1];76  Polymorphic p_array[1];77  __builtin_get_vtable_pointer(0);             // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'int' was provided}}78  __builtin_get_vtable_pointer(nullptr);       // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'std::nullptr_t' was provided}}79  __builtin_get_vtable_pointer(0.5);           // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'double' was provided}}80  __builtin_get_vtable_pointer(fd);            // expected-error{{__builtin_get_vtable_pointer requires an argument with a complete type, but 'ForwardDeclaration' is incomplete}}81  __builtin_get_vtable_pointer(np);            // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'NonPolymorphic' was provided}}82  __builtin_get_vtable_pointer(&np);           // expected-error{{__builtin_get_vtable_pointer requires an argument of polymorphic class pointer type, but 'NonPolymorphic' has no virtual methods}}83  __builtin_get_vtable_pointer(p);             // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'Polymorphic' was provided}}84  __builtin_get_vtable_pointer(&p);            // expected-warning{{ignoring return value of function declared with const attribute}}85  __builtin_get_vtable_pointer(p_array);       // expected-warning{{ignoring return value of function declared with const attribute}}86  __builtin_get_vtable_pointer(&p_array);      // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'Polymorphic (*)[1]' was provided}}87  __builtin_get_vtable_pointer(np_array);      // expected-error{{__builtin_get_vtable_pointer requires an argument of polymorphic class pointer type, but 'NonPolymorphic' has no virtual methods}}88  __builtin_get_vtable_pointer(&np_array);     // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'NonPolymorphic (*)[1]' was provided}}89  __builtin_get_vtable_pointer(test_function); // expected-error{{reference to overloaded function could not be resolved; did you mean to call it?}}90  Foo<double> Food;91  Foo<int> Fooi;92  __builtin_get_vtable_pointer(Food); // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'Foo<double>' was provided}}93  (void)__builtin_get_vtable_pointer(&Food);94  __builtin_get_vtable_pointer(Fooi);  // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'Foo<int>' was provided}}95  __builtin_get_vtable_pointer(&Fooi); // expected-error{{__builtin_get_vtable_pointer requires an argument of polymorphic class pointer type, but 'Foo<int>' has no virtual methods}}96 97  IncompleteTemplate<bool> *incomplete = nullptr;98  (void)__builtin_get_vtable_pointer(incomplete); // expected-error{{implicit instantiation of undefined template 'basic::IncompleteTemplate<bool>'}}99  PolymorphicTemplate<bool> *ptb = nullptr;100  MonomorphicTemplate<bool> *mtb = nullptr;101  PolymorphicTemplate<int> pti;102  MonomorphicTemplate<int> mti;103  PolymorphicTemplate<float> ptf;104  MonomorphicTemplate<float> mtf;105  (void)__builtin_get_vtable_pointer(ptb);106  __builtin_get_vtable_pointer(mtb); // expected-error{{__builtin_get_vtable_pointer requires an argument of polymorphic class pointer type, but 'MonomorphicTemplate<bool>' has no virtual methods}}107  __builtin_get_vtable_pointer(pti); // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'PolymorphicTemplate<int>' was provided}}108  __builtin_get_vtable_pointer(mti); // expected-error{{__builtin_get_vtable_pointer requires an argument of class pointer type, but 'MonomorphicTemplate<int>' was provided}}109  (void)__builtin_get_vtable_pointer(&ptf);110  __builtin_get_vtable_pointer(&mtf); // expected-error{{__builtin_get_vtable_pointer requires an argument of polymorphic class pointer type, but 'MonomorphicTemplate<float>' has no virtual methods}}111 112  getThing<Thing1>(); // expected-note{{in instantiation of function template specialization 'basic::getThing<basic::Thing1>' requested here}}113  getThing<Thing2>();114  getThing<Thing3>(); // expected-note{{in instantiation of function template specialization 'basic::getThing<basic::Thing3>' requested here}}115  getThing<Thing4>();116  getThing<Thing5>(); // expected-note{{in instantiation of function template specialization 'basic::getThing<basic::Thing5>' requested here}}117  getThing<Thing6>(); // expected-note{{in instantiation of function template specialization 'basic::getThing<basic::Thing6>' requested here}}118}119 120} // namespace basic121