// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -disable-llvm-passes -finclude-default-header -o - %s | FileCheck %s // CHECK: ClassTemplateDecl {{.*}} ConstantBuffer // CHECK: TemplateTypeParmDecl {{.*}} element_type // CHECK: CXXRecordDecl {{.*}} ConstantBuffer definition // CHECK: FinalAttr {{.*}} Implicit final // CHECK-NEXT: FieldDecl {{.*}} implicit __handle '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK: CXXConstructorDecl {{.*}} ConstantBuffer 'void ()' inline // CHECK-NEXT: CompoundStmt // CHECK-NEXT: BinaryOperator {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' '=' // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::ConstantBuffer' lvalue implicit this // CHECK-NEXT: CStyleCastExpr {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' // CHECK-NEXT: CallExpr {{.*}} '' // CHECK: CXXConstructorDecl {{.*}} ConstantBuffer 'void (const hlsl::ConstantBuffer &)' inline // CHECK-NEXT: ParmVarDecl {{.*}} other 'const hlsl::ConstantBuffer &' // CHECK-NEXT: CompoundStmt // CHECK-NEXT: BinaryOperator {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' '=' // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::ConstantBuffer' lvalue implicit this // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle // CHECK-NEXT: DeclRefExpr {{.*}} 'const hlsl::ConstantBuffer' lvalue ParmVar {{.*}} 'other' 'const hlsl::ConstantBuffer &' // CHECK: CXXMethodDecl {{.*}} operator= 'hlsl::ConstantBuffer &(const hlsl::ConstantBuffer &)' inline // CHECK-NEXT: ParmVarDecl {{.*}} other 'const hlsl::ConstantBuffer &' // CHECK-NEXT: CompoundStmt // CHECK-NEXT: BinaryOperator {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' '=' // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::ConstantBuffer' lvalue implicit this // CHECK-NEXT: MemberExpr {{.*}} '__hlsl_resource_t // CHECK-SAME{LITERAL}: [[hlsl::resource_class(CBuffer)]] // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] // CHECK-SAME: ' lvalue .__handle // CHECK-NEXT: DeclRefExpr {{.*}} 'const hlsl::ConstantBuffer' lvalue ParmVar {{.*}} 'other' 'const hlsl::ConstantBuffer &' // CHECK-NEXT: ReturnStmt // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::ConstantBuffer' lvalue implicit this struct S { float a; }; ConstantBuffer cb; struct Nested { S s; float b; }; ConstantBuffer cb_nested; void takes_s(S s) {} void takes_cb(ConstantBuffer c) {} void takes_inout_cb(inout ConstantBuffer c) {} float main() { // CHECK: FunctionDecl {{.*}} main // CHECK: MemberExpr {{.*}} 'const hlsl_constant float' lvalue .a // CHECK-NEXT: CXXMemberCallExpr {{.*}} 'const hlsl_constant S' lvalue // CHECK-NEXT: MemberExpr {{.*}} '' .operator const hlsl_constant S & // CHECK-NEXT: ImplicitCastExpr {{.*}} 'const hlsl::ConstantBuffer' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} 'ConstantBuffer':'hlsl::ConstantBuffer' lvalue Var {{.*}} 'cb' 'ConstantBuffer':'hlsl::ConstantBuffer' float f1 = cb.a; // CHECK: MemberExpr {{.*}} 'const hlsl_constant float' lvalue .b // CHECK-NEXT: CXXMemberCallExpr {{.*}} 'const hlsl_constant Nested' lvalue // CHECK-NEXT: MemberExpr {{.*}} '' .operator const hlsl_constant Nested & // CHECK-NEXT: ImplicitCastExpr {{.*}} 'const hlsl::ConstantBuffer' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} 'ConstantBuffer':'hlsl::ConstantBuffer' lvalue Var {{.*}} 'cb_nested' 'ConstantBuffer':'hlsl::ConstantBuffer' float f2 = cb_nested.b; // CHECK: MemberExpr {{.*}} 'const hlsl_constant float' lvalue .a // CHECK-NEXT: MemberExpr {{.*}} 'const hlsl_constant S' lvalue .s // CHECK-NEXT: CXXMemberCallExpr {{.*}} 'const hlsl_constant Nested' lvalue // CHECK-NEXT: MemberExpr {{.*}} '' .operator const hlsl_constant Nested & // CHECK-NEXT: ImplicitCastExpr {{.*}} 'const hlsl::ConstantBuffer' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} 'ConstantBuffer':'hlsl::ConstantBuffer' lvalue Var {{.*}} 'cb_nested' 'ConstantBuffer':'hlsl::ConstantBuffer' float f3 = cb_nested.s.a; // CHECK: CallExpr {{.*}} 'void' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void (*)(ConstantBuffer)' // CHECK-NEXT: DeclRefExpr {{.*}} 'void (ConstantBuffer)' lvalue Function {{.*}} 'takes_cb' 'void (ConstantBuffer)' // CHECK-NEXT: CXXConstructExpr {{.*}} 'ConstantBuffer':'hlsl::ConstantBuffer' 'void (const hlsl::ConstantBuffer &)' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'const hlsl::ConstantBuffer' lvalue // CHECK-NEXT: DeclRefExpr {{.*}} 'ConstantBuffer':'hlsl::ConstantBuffer' lvalue Var {{.*}} 'cb' 'ConstantBuffer':'hlsl::ConstantBuffer' takes_cb(cb); // CHECK: CallExpr {{.*}} 'void' // CHECK-NEXT: ImplicitCastExpr {{.*}} 'void (*)(inout ConstantBuffer)' // CHECK-NEXT: DeclRefExpr {{.*}} 'void (inout ConstantBuffer)' lvalue Function {{.*}} 'takes_inout_cb' 'void (inout ConstantBuffer)' // CHECK-NEXT: HLSLOutArgExpr {{.*}} 'ConstantBuffer':'hlsl::ConstantBuffer' lvalue inout takes_inout_cb(cb); return f1 + f2 + f3; }