brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 78f86ed Raw
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