1f769df5eSSebastian Redl // RUN: clang-cc -fsyntax-only -verify -std=c++0x %s
2f769df5eSSebastian Redl 
3f769df5eSSebastian Redl int i = delete; // expected-error {{only functions can have deleted definitions}}
4f769df5eSSebastian Redl 
5f769df5eSSebastian Redl void fn() = delete; // expected-note {{candidate function has been explicitly deleted}}
6f769df5eSSebastian Redl 
7f769df5eSSebastian Redl void fn2(); // expected-note {{previous declaration is here}}
8f769df5eSSebastian Redl void fn2() = delete; // expected-error {{deleted definition must be first declaration}}
9f769df5eSSebastian Redl 
10f769df5eSSebastian Redl void fn3() = delete;
11f769df5eSSebastian Redl void fn3() {
12f769df5eSSebastian Redl   // FIXME: This definition should be invalid.
13f769df5eSSebastian Redl }
14f769df5eSSebastian Redl 
15f769df5eSSebastian Redl void ov(int) {} // expected-note {{candidate function}}
16f769df5eSSebastian Redl void ov(double) = delete; // expected-note {{candidate function has been explicitly deleted}}
17f769df5eSSebastian Redl 
18*42e92c4bSSebastian Redl struct WithDel {
19*42e92c4bSSebastian Redl   WithDel() = delete; // expected-note {{candidate function has been explicitly deleted}}
20*42e92c4bSSebastian Redl   void fn() = delete; // expected-note {{function has been explicitly marked deleted here}}
21*42e92c4bSSebastian Redl   operator int() = delete;
22*42e92c4bSSebastian Redl   void operator +(int) = delete;
23*42e92c4bSSebastian Redl };
24*42e92c4bSSebastian Redl 
25f769df5eSSebastian Redl void test() {
26f769df5eSSebastian Redl   fn(); // expected-error {{call to deleted function 'fn'}}
27f769df5eSSebastian Redl   ov(1);
28f769df5eSSebastian Redl   ov(1.0); // expected-error {{call to deleted function 'ov'}}
29*42e92c4bSSebastian Redl 
30*42e92c4bSSebastian Redl   WithDel dd; // expected-error {{call to deleted constructor of 'dd'}}
31*42e92c4bSSebastian Redl   WithDel *d = 0;
32*42e92c4bSSebastian Redl   d->fn(); // expected-error {{attempt to use a deleted function}}
33*42e92c4bSSebastian Redl   int i = *d; // expected-error {{incompatible type initializing}}
34f769df5eSSebastian Redl }
35