// RUN: rm -f %t.pch // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -emit-pch -finclude-default-header -o %t.pch %s // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -finclude-default-header -include-pch %t.pch %s -ast-dump | FileCheck --check-prefix=AST %s // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -finclude-default-header -include-pch %t.pch %s -ast-print | FileCheck %s #ifndef TEST_HLSL #define TEST_HLSL RWBuffer Buf; // CHECK: void trunc_Param(inout int &__restrict X) { // AST: FunctionDecl {{.*}} used trunc_Param 'void (inout int)' // AST-NEXT: ParmVarDecl {{.*}} X 'int &__restrict' // AST-NEXT: HLSLParamModifierAttr {{.*}} inout void trunc_Param(inout int X) {} // CHECK: void zero(out int &__restrict Z) { // CHECK-NEXT: Z = 0; // AST: FunctionDecl {{.*}} zero 'void (out int)' // AST-NEXT: ParmVarDecl {{.*}} used Z 'int &__restrict' // AST-NEXT: HLSLParamModifierAttr {{.*}} out void zero(out int Z) { Z = 0; } // AST-LABEL: FunctionDecl {{.*}} imported used fn 'void (uint)' // AST: CallExpr {{.*}} 'void' // AST-NEXT: ImplicitCastExpr {{.*}} 'void (*)(inout int)' // AST-NEXT: DeclRefExpr {{.*}} 'void (inout int)' lvalue Function // AST-NEXT: HLSLOutArgExpr {{.*}} 'int' lvalue inout // AST-NEXT: OpaqueValueExpr [[LVOpV:0x[0-9a-fA-F]+]] {{.*}} 'hlsl_device float' lvalue // AST-NEXT: CXXOperatorCallExpr {{.*}} 'hlsl_device float' lvalue '[]' // AST-NEXT: ImplicitCastExpr {{.*}} 'hlsl_device float &(*)(unsigned int) const' // AST-NEXT: DeclRefExpr {{.*}} 'hlsl_device float &(unsigned int) const' lvalue CXXMethod {{.*}} 'operator[]' 'hlsl_device float &(unsigned int) const' // AST-NEXT: ImplicitCastExpr {{.*}} 'const hlsl::RWBuffer' lvalue // AST-NEXT: DeclRefExpr {{.*}} 'RWBuffer':'hlsl::RWBuffer' lvalue Var {{.*}} 'Buf' 'RWBuffer':'hlsl::RWBuffer' // AST-NEXT: ImplicitCastExpr {{.*}} 'uint':'unsigned int' // AST-NEXT: DeclRefExpr {{.*}} 'uint':'unsigned int' lvalue ParmVar {{.*}} 'GI' 'uint':'unsigned int' // AST-NEXT: OpaqueValueExpr [[TmpOpV:0x[0-9a-fA-F]+]] {{.*}} 'int' lvalue // AST-NEXT: ImplicitCastExpr {{.*}} 'int' // AST-NEXT: ImplicitCastExpr {{.*}} 'float' // AST-NEXT: OpaqueValueExpr [[LVOpV]] 'hlsl_device float' lvalue // AST: BinaryOperator {{.*}} 'hlsl_device float' lvalue '=' // AST-NEXT: OpaqueValueExpr [[LVOpV]] {{.*}} 'hlsl_device float' lvalue // AST: ImplicitCastExpr {{.*}} 'float' // AST-NEXT: ImplicitCastExpr {{.*}} 'int' // AST-NEXT: OpaqueValueExpr [[TmpOpV]] {{.*}} 'int' lvalue // CHECK: void fn(uint GI) { // CHECK: trunc_Param(Buf[GI]); void fn(uint GI) { trunc_Param(Buf[GI]); } #else // AST-LABEL: FunctionDecl {{.*}} main 'void (uint)' // AST: CallExpr {{.*}} 'void' // AST-NEXT: ImplicitCastExpr {{.*}} 'void (*)(out int)' // AST-NEXT: DeclRefExpr {{.*}} 'void (out int)' lvalue Function {{.*}} 'zero' 'void (out int)' // AST-NEXT: HLSLOutArgExpr {{.*}} 'int' lvalue out // AST: OpaqueValueExpr [[LVOpV:0x[0-9a-fA-F]+]] {{.*}} 'int' lvalue // AST-NEXT: DeclRefExpr {{.*}} 'int' lvalue Var {{.*}} 'I' 'int' // AST-NEXT: OpaqueValueExpr [[TmpOpV:0x[0-9a-fA-F]+]] {{.*}} 'int' lvalue // AST-NEXT: ImplicitCastExpr {{.*}} 'int' // AST-NEXT: OpaqueValueExpr [[LVOpV]] 'int' lvalue // AST: BinaryOperator {{.*}} 'int' lvalue '=' // AST-NEXT: OpaqueValueExpr [[LVOpV]] {{.*}} 'int' lvalue // AST: ImplicitCastExpr {{.*}} 'int' // AST-NEXT: OpaqueValueExpr [[TmpOpV]] {{.*}} 'int' lvalue [numthreads(8,1,1)] void main(uint GI : SV_GroupIndex) { int I; zero(I); fn(GI); } #endif // TEST_HLSL