16774b1f1SAnders Carlsson // RUN: %clang_cc1 -fcxx-exceptions -fexceptions -fsyntax-only -verify %s 26de584c2SDouglas Gregor 36de584c2SDouglas Gregor // The object declared in an exception-declaration or, if the 46de584c2SDouglas Gregor // exception-declaration does not specify a name, a temporary (12.2) 56de584c2SDouglas Gregor // is copy-initialized (8.5) from the exception object. 66de584c2SDouglas Gregor // 76de584c2SDouglas Gregor template<typename T> 86de584c2SDouglas Gregor class X { 96de584c2SDouglas Gregor T* ptr; 106de584c2SDouglas Gregor 116de584c2SDouglas Gregor public: X(const X<T> &)126de584c2SDouglas Gregor X(const X<T> &) { 136de584c2SDouglas Gregor int *ip = 0; 14*fa755d3eSAnastasia Stulova ptr = ip; // expected-error{{incompatible pointer types assigning to 'float *' from 'int *'}} 156de584c2SDouglas Gregor } 166de584c2SDouglas Gregor ~X()176de584c2SDouglas Gregor ~X() { 186de584c2SDouglas Gregor float *fp = 0; 19*fa755d3eSAnastasia Stulova ptr = fp; // expected-error{{incompatible pointer types assigning to 'int *' from 'float *'}} 206de584c2SDouglas Gregor } 216de584c2SDouglas Gregor }; 226de584c2SDouglas Gregor f()236de584c2SDouglas Gregorvoid f() { 246de584c2SDouglas Gregor try { 256de584c2SDouglas Gregor } catch (X<float>) { // expected-note{{instantiation}} 266de584c2SDouglas Gregor // copy constructor 276de584c2SDouglas Gregor } catch (X<int> xi) { // expected-note{{instantiation}} 286de584c2SDouglas Gregor // destructor 296de584c2SDouglas Gregor } 306de584c2SDouglas Gregor } 316de584c2SDouglas Gregor 326de584c2SDouglas Gregor struct Abstract { 336de584c2SDouglas Gregor virtual void f() = 0; // expected-note{{pure virtual}} 346de584c2SDouglas Gregor }; 356de584c2SDouglas Gregor g()366de584c2SDouglas Gregorvoid g() { 376de584c2SDouglas Gregor try { 386de584c2SDouglas Gregor } catch (Abstract) { // expected-error{{variable type 'Abstract' is an abstract class}} 396de584c2SDouglas Gregor } 406de584c2SDouglas Gregor } 41