1*cddc9993SBruno Ricci // Test without serialization:
24b5b0c00SAaron Ballman // RUN: %clang_cc1 -triple x86_64-linux-gnu -fsyntax-only -ast-dump %s | FileCheck %s
3*cddc9993SBruno Ricci //
4*cddc9993SBruno Ricci // Test with serialization:
5*cddc9993SBruno Ricci // RUN: %clang_cc1 -triple x86_64-linux-gnu -emit-pch -o %t %s
6*cddc9993SBruno Ricci // RUN: %clang_cc1 -x c++ -triple x86_64-linux-gnu -include-pch %t -ast-dump-all /dev/null \
7*cddc9993SBruno Ricci // RUN: | sed -e "s/ <undeserialized declarations>//" -e "s/ imported//" \
8*cddc9993SBruno Ricci // RUN: | FileCheck %s
94b5b0c00SAaron Ballman
104b5b0c00SAaron Ballman // We are checking that implicit casts don't get marked with 'part_of_explicit_cast',
114b5b0c00SAaron Ballman // while in explicit casts, the implicitly-inserted implicit casts are marked with 'part_of_explicit_cast'
124b5b0c00SAaron Ballman
implicitcast_0(unsigned int x)134b5b0c00SAaron Ballman unsigned char implicitcast_0(unsigned int x) {
144b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} implicitcast_0 'unsigned char (unsigned int)'{{$}}
154b5b0c00SAaron Ballman // CHECK: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <IntegralCast>{{$}}
164b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned int' <LValueToRValue>{{$}}
174b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'unsigned int' lvalue ParmVar {{.*}} 'x' 'unsigned int'{{$}}
184b5b0c00SAaron Ballman return x;
194b5b0c00SAaron Ballman }
204b5b0c00SAaron Ballman
implicitcast_1(unsigned int x)214b5b0c00SAaron Ballman signed char implicitcast_1(unsigned int x) {
224b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} implicitcast_1 'signed char (unsigned int)'{{$}}
234b5b0c00SAaron Ballman // CHECK: ImplicitCastExpr {{.*}} <col:{{.*}}> 'signed char' <IntegralCast>{{$}}
244b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned int' <LValueToRValue>{{$}}
254b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'unsigned int' lvalue ParmVar {{.*}} 'x' 'unsigned int'{{$}}
264b5b0c00SAaron Ballman return x;
274b5b0c00SAaron Ballman }
284b5b0c00SAaron Ballman
implicitcast_2(signed int x)294b5b0c00SAaron Ballman unsigned char implicitcast_2(signed int x) {
304b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} implicitcast_2 'unsigned char (int)'{{$}}
314b5b0c00SAaron Ballman // CHECK: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <IntegralCast>{{$}}
324b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'int' <LValueToRValue>{{$}}
334b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'int' lvalue ParmVar {{.*}} 'x' 'int'{{$}}
344b5b0c00SAaron Ballman return x;
354b5b0c00SAaron Ballman }
364b5b0c00SAaron Ballman
implicitcast_3(signed int x)374b5b0c00SAaron Ballman signed char implicitcast_3(signed int x) {
384b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} implicitcast_3 'signed char (int)'{{$}}
394b5b0c00SAaron Ballman // CHECK: ImplicitCastExpr {{.*}} <col:{{.*}}> 'signed char' <IntegralCast>{{$}}
404b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'int' <LValueToRValue>{{$}}
414b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'int' lvalue ParmVar {{.*}} 'x' 'int'{{$}}
424b5b0c00SAaron Ballman return x;
434b5b0c00SAaron Ballman }
444b5b0c00SAaron Ballman
454b5b0c00SAaron Ballman //----------------------------------------------------------------------------//
464b5b0c00SAaron Ballman
cstylecast_0(unsigned int x)474b5b0c00SAaron Ballman unsigned char cstylecast_0(unsigned int x) {
484b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cstylecast_0 'unsigned char (unsigned int)'{{$}}
494b5b0c00SAaron Ballman // CHECK: CStyleCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <NoOp>{{$}}
504b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <IntegralCast> part_of_explicit_cast{{$}}
514b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned int' <LValueToRValue> part_of_explicit_cast{{$}}
524b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'unsigned int' lvalue ParmVar {{.*}} 'x' 'unsigned int'{{$}}
534b5b0c00SAaron Ballman return (unsigned char)x;
544b5b0c00SAaron Ballman }
554b5b0c00SAaron Ballman
cstylecast_1(unsigned int x)564b5b0c00SAaron Ballman signed char cstylecast_1(unsigned int x) {
574b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cstylecast_1 'signed char (unsigned int)'{{$}}
584b5b0c00SAaron Ballman // CHECK: CStyleCastExpr {{.*}} <col:{{.*}}> 'signed char' <NoOp>{{$}}
594b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'signed char' <IntegralCast> part_of_explicit_cast{{$}}
604b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned int' <LValueToRValue> part_of_explicit_cast{{$}}
614b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'unsigned int' lvalue ParmVar {{.*}} 'x' 'unsigned int'{{$}}
624b5b0c00SAaron Ballman return (signed char)x;
634b5b0c00SAaron Ballman }
644b5b0c00SAaron Ballman
cstylecast_2(signed int x)654b5b0c00SAaron Ballman unsigned char cstylecast_2(signed int x) {
664b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cstylecast_2 'unsigned char (int)'{{$}}
674b5b0c00SAaron Ballman // CHECK: CStyleCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <NoOp>{{$}}
684b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <IntegralCast> part_of_explicit_cast{{$}}
694b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'int' <LValueToRValue> part_of_explicit_cast{{$}}
704b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'int' lvalue ParmVar {{.*}} 'x' 'int'{{$}}
714b5b0c00SAaron Ballman return (unsigned char)x;
724b5b0c00SAaron Ballman }
734b5b0c00SAaron Ballman
cstylecast_3(signed int x)744b5b0c00SAaron Ballman signed char cstylecast_3(signed int x) {
754b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cstylecast_3 'signed char (int)'{{$}}
764b5b0c00SAaron Ballman // CHECK: CStyleCastExpr {{.*}} <col:{{.*}}> 'signed char' <NoOp>{{$}}
774b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'signed char' <IntegralCast> part_of_explicit_cast{{$}}
784b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'int' <LValueToRValue> part_of_explicit_cast{{$}}
794b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'int' lvalue ParmVar {{.*}} 'x' 'int'{{$}}
804b5b0c00SAaron Ballman return (signed char)x;
814b5b0c00SAaron Ballman }
824b5b0c00SAaron Ballman
834b5b0c00SAaron Ballman //----------------------------------------------------------------------------//
844b5b0c00SAaron Ballman
cxxstaticcast_0(unsigned int x)854b5b0c00SAaron Ballman unsigned char cxxstaticcast_0(unsigned int x) {
864b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxstaticcast_0 'unsigned char (unsigned int)'{{$}}
874b5b0c00SAaron Ballman // CHECK: CXXStaticCastExpr {{.*}} <col:{{.*}}> 'unsigned char' static_cast<unsigned char> <NoOp>{{$}}
884b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <IntegralCast> part_of_explicit_cast{{$}}
894b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned int' <LValueToRValue> part_of_explicit_cast{{$}}
904b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'unsigned int' lvalue ParmVar {{.*}} 'x' 'unsigned int'{{$}}
914b5b0c00SAaron Ballman return static_cast<unsigned char>(x);
924b5b0c00SAaron Ballman }
934b5b0c00SAaron Ballman
cxxstaticcast_1(unsigned int x)944b5b0c00SAaron Ballman signed char cxxstaticcast_1(unsigned int x) {
954b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxstaticcast_1 'signed char (unsigned int)'{{$}}
964b5b0c00SAaron Ballman // CHECK: CXXStaticCastExpr {{.*}} <col:{{.*}}> 'signed char' static_cast<signed char> <NoOp>{{$}}
974b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'signed char' <IntegralCast> part_of_explicit_cast{{$}}
984b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned int' <LValueToRValue> part_of_explicit_cast{{$}}
994b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'unsigned int' lvalue ParmVar {{.*}} 'x' 'unsigned int'{{$}}
1004b5b0c00SAaron Ballman return static_cast<signed char>(x);
1014b5b0c00SAaron Ballman }
1024b5b0c00SAaron Ballman
cxxstaticcast_2(signed int x)1034b5b0c00SAaron Ballman unsigned char cxxstaticcast_2(signed int x) {
1044b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxstaticcast_2 'unsigned char (int)'{{$}}
1054b5b0c00SAaron Ballman // CHECK: CXXStaticCastExpr {{.*}} <col:{{.*}}> 'unsigned char' static_cast<unsigned char> <NoOp>{{$}}
1064b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'unsigned char' <IntegralCast> part_of_explicit_cast{{$}}
1074b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'int' <LValueToRValue> part_of_explicit_cast{{$}}
1084b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'int' lvalue ParmVar {{.*}} 'x' 'int'{{$}}
1094b5b0c00SAaron Ballman return static_cast<unsigned char>(x);
1104b5b0c00SAaron Ballman }
1114b5b0c00SAaron Ballman
cxxstaticcast_3(signed int x)1124b5b0c00SAaron Ballman signed char cxxstaticcast_3(signed int x) {
1134b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxstaticcast_3 'signed char (int)'{{$}}
1144b5b0c00SAaron Ballman // CHECK: CXXStaticCastExpr {{.*}} <col:{{.*}}> 'signed char' static_cast<signed char> <NoOp>{{$}}
1154b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'signed char' <IntegralCast> part_of_explicit_cast{{$}}
1164b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'int' <LValueToRValue> part_of_explicit_cast{{$}}
1174b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'int' lvalue ParmVar {{.*}} 'x' 'int'{{$}}
1184b5b0c00SAaron Ballman return static_cast<signed char>(x);
1194b5b0c00SAaron Ballman }
1204b5b0c00SAaron Ballman
1214b5b0c00SAaron Ballman //----------------------------------------------------------------------------//
1224b5b0c00SAaron Ballman
1234b5b0c00SAaron Ballman using UnsignedChar = unsigned char;
1244b5b0c00SAaron Ballman using SignedChar = signed char;
1254b5b0c00SAaron Ballman using UnsignedInt = unsigned int;
1264b5b0c00SAaron Ballman using SignedInt = signed int;
1274b5b0c00SAaron Ballman
cxxfunctionalcast_0(UnsignedInt x)1284b5b0c00SAaron Ballman UnsignedChar cxxfunctionalcast_0(UnsignedInt x) {
1294b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxfunctionalcast_0 'UnsignedChar (UnsignedInt)'{{$}}
1304b5b0c00SAaron Ballman // CHECK: CXXFunctionalCastExpr {{.*}} <col:{{.*}}> 'UnsignedChar':'unsigned char' functional cast to UnsignedChar <NoOp>{{$}}
1314b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'UnsignedChar':'unsigned char' <IntegralCast> part_of_explicit_cast{{$}}
1324b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'UnsignedInt':'unsigned int' <LValueToRValue> part_of_explicit_cast{{$}}
1334b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'UnsignedInt':'unsigned int' lvalue ParmVar {{.*}} 'x' 'UnsignedInt':'unsigned int'{{$}}
1344b5b0c00SAaron Ballman return UnsignedChar(x);
1354b5b0c00SAaron Ballman }
1364b5b0c00SAaron Ballman
cxxfunctionalcast_1(UnsignedInt x)1374b5b0c00SAaron Ballman SignedChar cxxfunctionalcast_1(UnsignedInt x) {
1384b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxfunctionalcast_1 'SignedChar (UnsignedInt)'{{$}}
1394b5b0c00SAaron Ballman // CHECK: CXXFunctionalCastExpr {{.*}} <col:{{.*}}> 'SignedChar':'signed char' functional cast to SignedChar <NoOp>{{$}}
1404b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'SignedChar':'signed char' <IntegralCast> part_of_explicit_cast{{$}}
1414b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'UnsignedInt':'unsigned int' <LValueToRValue> part_of_explicit_cast{{$}}
1424b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'UnsignedInt':'unsigned int' lvalue ParmVar {{.*}} 'x' 'UnsignedInt':'unsigned int'{{$}}
1434b5b0c00SAaron Ballman return SignedChar(x);
1444b5b0c00SAaron Ballman }
1454b5b0c00SAaron Ballman
cxxfunctionalcast_2(SignedInt x)1464b5b0c00SAaron Ballman UnsignedChar cxxfunctionalcast_2(SignedInt x) {
1474b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxfunctionalcast_2 'UnsignedChar (SignedInt)'{{$}}
1484b5b0c00SAaron Ballman // CHECK: CXXFunctionalCastExpr {{.*}} <col:{{.*}}> 'UnsignedChar':'unsigned char' functional cast to UnsignedChar <NoOp>{{$}}
1494b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'UnsignedChar':'unsigned char' <IntegralCast> part_of_explicit_cast{{$}}
1504b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'SignedInt':'int' <LValueToRValue> part_of_explicit_cast{{$}}
1514b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'SignedInt':'int' lvalue ParmVar {{.*}} 'x' 'SignedInt':'int'{{$}}
1524b5b0c00SAaron Ballman return UnsignedChar(x);
1534b5b0c00SAaron Ballman }
1544b5b0c00SAaron Ballman
cxxfunctionalcast_3(SignedInt x)1554b5b0c00SAaron Ballman SignedChar cxxfunctionalcast_3(SignedInt x) {
1564b5b0c00SAaron Ballman // CHECK: FunctionDecl {{.*}} <{{.*}}, line:{{.*}}> line:{{.*}} cxxfunctionalcast_3 'SignedChar (SignedInt)'{{$}}
1574b5b0c00SAaron Ballman // CHECK: CXXFunctionalCastExpr {{.*}} <col:{{.*}}> 'SignedChar':'signed char' functional cast to SignedChar <NoOp>{{$}}
1584b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'SignedChar':'signed char' <IntegralCast> part_of_explicit_cast{{$}}
1594b5b0c00SAaron Ballman // CHECK-NEXT: ImplicitCastExpr {{.*}} <col:{{.*}}> 'SignedInt':'int' <LValueToRValue> part_of_explicit_cast{{$}}
1604b5b0c00SAaron Ballman // CHECK-NEXT: DeclRefExpr {{.*}} <col:{{.*}}> 'SignedInt':'int' lvalue ParmVar {{.*}} 'x' 'SignedInt':'int'{{$}}
1614b5b0c00SAaron Ballman return SignedChar(x);
1624b5b0c00SAaron Ballman }
163