1 // RUN: %clang_cc1 -Wno-unused -fsyntax-only %s -verify
2
3 struct A {
4 void operator*();
5 void operator+();
6 void operator-();
7 void operator!();
8 void operator~();
9 void operator&();
10 void operator++();
11 void operator--();
12 };
13
14 struct B { };
15
16 template<typename T, typename U>
dependent(T t,T * pt,T U::* mpt,T (& ft)(),T (& at)[4])17 void dependent(T t, T* pt, T U::* mpt, T(&ft)(), T(&at)[4]) {
18 *t;
19 +t;
20 -t;
21 !t;
22 ~t;
23 &t;
24 ++t;
25 --t;
26
27 *pt;
28 +pt;
29 -pt; // expected-error {{invalid argument type 'T *' to unary expression}}
30 !pt;
31 ~pt; // expected-error {{invalid argument type 'T *' to unary expression}}
32 &pt;
33 ++pt;
34 --pt;
35
36 *mpt; // expected-error {{indirection requires pointer operand ('T U::*' invalid)}}
37 +mpt; // expected-error {{invalid argument type 'T U::*' to unary expression}}
38 -mpt; // expected-error {{invalid argument type 'T U::*' to unary expression}}
39 !mpt;
40 ~mpt; // expected-error {{invalid argument type 'T U::*' to unary expression}}
41 &mpt;
42 ++mpt; // expected-error {{cannot increment value of type 'T U::*'}}
43 --mpt; // expected-error {{cannot decrement value of type 'T U::*'}}
44
45 *ft;
46 +ft;
47 -ft; // expected-error {{invalid argument type 'T (*)()' to unary expression}}
48 !ft;
49 ~ft; // expected-error {{invalid argument type 'T (*)()' to unary expression}}
50 &ft;
51 ++ft; // expected-error {{cannot increment value of type 'T ()'}}
52 --ft; // expected-error {{cannot decrement value of type 'T ()'}}
53
54 *at;
55 +at;
56 -at; // expected-error {{invalid argument type 'T *' to unary expression}}
57 !at;
58 ~at; // expected-error {{invalid argument type 'T *' to unary expression}}
59 &at;
60 ++at; // expected-error {{cannot increment value of type 'T[4]'}}
61 --at; // expected-error {{cannot decrement value of type 'T[4]'}}
62 }
63
64 // Make sure we only emit diagnostics once.
65 template void dependent(A t, A* pt, A B::* mpt, A(&ft)(), A(&at)[4]);
66