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 Gregor void 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 Gregor void g() {
376de584c2SDouglas Gregor   try {
386de584c2SDouglas Gregor   } catch (Abstract) { // expected-error{{variable type 'Abstract' is an abstract class}}
396de584c2SDouglas Gregor   }
406de584c2SDouglas Gregor }
41