140 lines · cpp
1// RUN: %clang_cc1 -std=c++17 -Wno-unused -ast-dump %s -ast-dump-filter Test | FileCheck %s2 3namespace Test {4 template<typename T, typename U>5 void Unary(T t, T* pt, T U::* mpt, T(&ft)(), T(&at)[4]) {6 // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '*' cannot overflow7 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'8 *t;9 10 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '+' cannot overflow11 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'12 +t;13 14 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '-' cannot overflow15 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'16 -t;17 18 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '!' cannot overflow19 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'20 !t;21 22 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '~' cannot overflow23 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'24 ~t;25 26 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow27 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'28 &t;29 30 // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '++' cannot overflow31 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'32 ++t;33 34 // CHECK: UnaryOperator {{.*}} '<dependent type>' lvalue prefix '--' cannot overflow35 // CHECK-NEXT: DeclRefExpr {{.*}} 'T' lvalue ParmVar {{.*}} 't' 'T'36 --t;37 38 // CHECK: UnaryOperator {{.*}} 'T' lvalue prefix '*' cannot overflow39 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <LValueToRValue>40 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'41 *pt;42 43 // CHECK: UnaryOperator {{.*}} 'T *' prefix '+' cannot overflow44 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <LValueToRValue>45 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'46 +pt;47 48 // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow49 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <PointerToBoolean>50 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <LValueToRValue>51 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'52 !pt;53 54 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow55 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'56 &pt;57 58 // CHECK: UnaryOperator {{.*}} 'T *' lvalue prefix '++' cannot overflow59 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'60 ++pt;61 62 // CHECK: UnaryOperator {{.*}} 'T *' lvalue prefix '--' cannot overflow63 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'64 --pt;65 66 // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow67 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <MemberPointerToBoolean>68 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T U::*' <LValueToRValue>69 // CHECK-NEXT: DeclRefExpr {{.*}} 'T U::*' lvalue ParmVar {{.*}} 'mpt' 'T U::*'70 !mpt;71 72 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow73 // CHECK-NEXT: DeclRefExpr {{.*}} 'T U::*' lvalue ParmVar {{.*}} 'mpt' 'T U::*'74 &mpt;75 76 // CHECK: UnaryOperator {{.*}} 'T ()' lvalue prefix '*' cannot overflow77 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T (*)()' <FunctionToPointerDecay>78 // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()'79 *ft;80 81 // CHECK: UnaryOperator {{.*}} 'T (*)()' prefix '+' cannot overflow82 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T (*)()' <FunctionToPointerDecay>83 // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()'84 +ft;85 86 // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow87 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <PointerToBoolean>88 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T (*)()' <FunctionToPointerDecay>89 // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()'90 !ft;91 92 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow93 // CHECK-NEXT: DeclRefExpr {{.*}} 'T ()' lvalue ParmVar {{.*}} 'ft' 'T (&)()'94 &ft;95 96 // CHECK: UnaryOperator {{.*}} 'T' lvalue prefix '*' cannot overflow97 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <ArrayToPointerDecay>98 // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]'99 *at;100 101 // CHECK: UnaryOperator {{.*}} 'T *' prefix '+' cannot overflow102 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <ArrayToPointerDecay>103 // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]'104 +at;105 106 // CHECK: UnaryOperator {{.*}} 'bool' prefix '!' cannot overflow107 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'bool' <PointerToBoolean>108 // CHECK-NEXT: ImplicitCastExpr {{.*}} 'T *' <ArrayToPointerDecay>109 // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]'110 !at;111 112 // CHECK: UnaryOperator {{.*}} '<dependent type>' prefix '&' cannot overflow113 // CHECK-NEXT: DeclRefExpr {{.*}} 'T[4]' lvalue ParmVar {{.*}} 'at' 'T (&)[4]'114 &at;115 }116 117 template<typename T, typename U>118 void Binary(T* pt, U* pu) {119 // CHECK: BinaryOperator {{.*}} '<dependent type>' '+'120 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'121 // CHECK-NEXT: IntegerLiteral {{.*}} 'int' 3122 pt + 3;123 124 // CHECK: BinaryOperator {{.*}} '<dependent type>' '-'125 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'126 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'127 pt - pt;128 129 // CHECK: BinaryOperator {{.*}} '<dependent type>' '-'130 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'131 // CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *'132 pt - pu;133 134 // CHECK: BinaryOperator {{.*}} '<dependent type>' '=='135 // CHECK-NEXT: DeclRefExpr {{.*}} 'T *' lvalue ParmVar {{.*}} 'pt' 'T *'136 // CHECK-NEXT: DeclRefExpr {{.*}} 'U *' lvalue ParmVar {{.*}} 'pu' 'U *'137 pt == pu;138 }139} // namespace Test140