xref: /llvm-project/clang/test/CXX/expr/expr.unary/expr.unary.general/p1.cpp (revision 1595988ee6f9732e7ea79928af8a470ad5ef7dbe)
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