| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \ |
| // RUN: -DRESOURCE=StructuredBuffer %s | FileCheck -DRESOURCE=StructuredBuffer \ |
| // RUN: -check-prefix=EMPTY %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \ |
| // RUN: -DRESOURCE=StructuredBuffer %s | FileCheck -DRESOURCE=StructuredBuffer \ |
| // RUN: -check-prefixes=CHECK,CHECK-SRV,CHECK-SUBSCRIPT,CHECK-LOAD %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \ |
| // RUN: -DRESOURCE=RWStructuredBuffer %s | FileCheck -DRESOURCE=RWStructuredBuffer \ |
| // RUN: -check-prefix=EMPTY %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \ |
| // RUN: -DRESOURCE=RWStructuredBuffer %s | FileCheck -DRESOURCE=RWStructuredBuffer \ |
| // RUN: -check-prefixes=CHECK,CHECK-UAV,CHECK-SUBSCRIPT,CHECK-SUBSCRIPT-UAV,CHECK-COUNTER,CHECK-LOAD %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \ |
| // RUN: -DRESOURCE=AppendStructuredBuffer %s | FileCheck -DRESOURCE=AppendStructuredBuffer \ |
| // RUN: -check-prefix=EMPTY %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \ |
| // RUN: -DRESOURCE=AppendStructuredBuffer %s | FileCheck -DRESOURCE=AppendStructuredBuffer \ |
| // RUN: -check-prefixes=CHECK,CHECK-UAV,CHECK-NOSUBSCRIPT,CHECK-APPEND %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \ |
| // RUN: -DRESOURCE=ConsumeStructuredBuffer %s | FileCheck -DRESOURCE=ConsumeStructuredBuffer \ |
| // RUN: -check-prefix=EMPTY %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \ |
| // RUN: -DRESOURCE=ConsumeStructuredBuffer %s | FileCheck -DRESOURCE=ConsumeStructuredBuffer \ |
| // RUN: -check-prefixes=CHECK,CHECK-UAV,CHECK-NOSUBSCRIPT,CHECK-CONSUME %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump -DEMPTY \ |
| // RUN: -DRESOURCE=RasterizerOrderedStructuredBuffer %s | FileCheck -DRESOURCE=RasterizerOrderedStructuredBuffer \ |
| // RUN: -check-prefix=EMPTY %s |
| // |
| // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -ast-dump \ |
| // RUN: -DRESOURCE=RasterizerOrderedStructuredBuffer %s | FileCheck -DRESOURCE=RasterizerOrderedStructuredBuffer \ |
| // RUN: -check-prefixes=CHECK,CHECK-UAV,CHECK-ROV,CHECK-SUBSCRIPT,CHECK-SUBSCRIPT-UAV,CHECK-LOAD %s |
| |
| // This test tests two different AST generations for each structured buffer. |
| // The "EMPTY" test mode verifies the AST generated by forward declaration |
| // of the HLSL types which happens on initializing the HLSL external AST with |
| // an AST Context. |
| |
| // The non-empty mode has a use that requires the resource type be complete, |
| // which results in the AST being populated by the external AST source. That |
| // case covers the full implementation of the template declaration and the |
| // instantiated specialization. |
| |
| // EMPTY: ClassTemplateDecl {{.*}} implicit [[RESOURCE]] |
| // EMPTY-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 element_type |
| // EMPTY-NEXT: ConceptSpecializationExpr {{.*}} 'bool' Concept {{.*}} '__is_structured_resource_element_compatible' |
| // EMPTY-NEXT: ImplicitConceptSpecializationDecl |
| // EMPTY-NEXT: TemplateArgument type 'type-parameter-0-0' |
| // EMPTY-NEXT: TemplateTypeParmType {{.*}} 'type-parameter-0-0' dependent depth 0 index 0 |
| // EMPTY-NEXT: TemplateTypeParm {{.*}} depth 0 index 0 |
| // EMPTY-NEXT: TemplateArgument type 'element_type':'type-parameter-0-0' |
| // EMPTY-NEXT: TemplateTypeParmType {{.*}} 'element_type' dependent depth 0 index 0 |
| // EMPTY-NEXT: TemplateTypeParm {{.*}} 'element_type' |
| // EMPTY-NEXT: CXXRecordDecl {{.*}} implicit <undeserialized declarations> class [[RESOURCE]] |
| // EMPTY-NEXT: FinalAttr {{.*}} Implicit final |
| |
| // There should be no more occurrences of [[RESOURCE]] |
| // EMPTY-NOT: {{[^[:alnum:]]}}[[RESOURCE]] |
| |
| #ifndef EMPTY |
| |
| RESOURCE<float> Buffer; |
| |
| #endif |
| |
| // CHECK: ClassTemplateDecl {{.*}} implicit [[RESOURCE]] |
| // CHECK-NEXT: TemplateTypeParmDecl {{.*}} typename depth 0 index 0 element_type |
| // CHECK-NEXT: ConceptSpecializationExpr {{.*}} 'bool' Concept {{.*}} '__is_structured_resource_element_compatible' |
| // CHECK-NEXT: ImplicitConceptSpecializationDecl {{.*}} |
| // CHECK-NEXT: TemplateArgument type 'type-parameter-0-0' |
| // CHECK-NEXT: TemplateTypeParmType {{.*}} 'type-parameter-0-0' dependent depth 0 index 0 |
| // CHECK-NEXT: TemplateTypeParm {{.*}} depth 0 index 0 |
| // CHECK-NEXT: TemplateArgument type 'element_type':'type-parameter-0-0' |
| // CHECK-NEXT: TemplateTypeParmType {{.*}} 'element_type' dependent depth 0 index 0 |
| // CHECK-NEXT: TemplateTypeParm {{.*}} 'element_type' |
| // CHECK-NEXT: CXXRecordDecl {{.*}} implicit class [[RESOURCE]] definition |
| |
| // CHECK: FinalAttr {{.*}} Implicit final |
| // CHECK-NEXT: FieldDecl {{.*}} implicit __handle '__hlsl_resource_t |
| // CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]] |
| // CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] |
| |
| // Default constructor |
| |
| // CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]]<element_type> 'void ()' inline |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: BinaryOperator {{.*}} '=' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: CallExpr {{.*}} '__hlsl_resource_t |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_uninitializedhandle' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: AlwaysInlineAttr |
| |
| // Copy constructor |
| |
| // CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]]<element_type> 'void (const hlsl::[[RESOURCE]]<element_type> &)' inline |
| // CHECK-NEXT: ParmVarDecl {{.*}} other 'const hlsl::[[RESOURCE]]<element_type> &' |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: BinaryOperator {{.*}} '=' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'const hlsl::[[RESOURCE]]<element_type>' ParmVar {{.*}} 'other' 'const hlsl::[[RESOURCE]]<element_type> &' |
| // CHECK-NEXT: AlwaysInlineAttr |
| |
| // operator= |
| |
| // CHECK: CXXMethodDecl {{.*}} operator= 'hlsl::[[RESOURCE]]<element_type> &(const hlsl::[[RESOURCE]]<element_type> &)' |
| // CHECK-NEXT: ParmVarDecl {{.*}} other 'const hlsl::[[RESOURCE]]<element_type> &' |
| // CHECK-NEXT: CompoundStmt |
| // CHECK-NEXT: BinaryOperator {{.*}} '=' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'const hlsl::[[RESOURCE]]<element_type>' ParmVar {{.*}} 'other' 'const hlsl::[[RESOURCE]]<element_type> &' |
| // CHECK-NEXT: ReturnStmt |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: AlwaysInlineAttr |
| |
| // Constructor from binding |
| |
| // CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]]<element_type> 'void (unsigned int, unsigned int, int, unsigned int, const char *)' inline |
| // CHECK-NEXT: ParmVarDecl {{.*}} registerNo 'unsigned int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' |
| // CHECK-NEXT: CompoundStmt {{.*}} |
| // CHECK-NEXT: BinaryOperator {{.*}} '=' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: CallExpr {{.*}} '__hlsl_resource_t |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_handlefrombinding' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'registerNo' 'unsigned int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'spaceNo' 'unsigned int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' |
| // CHECK-NEXT: AlwaysInlineAttr |
| |
| // Constructor from implicit binding |
| |
| // CHECK: CXXConstructorDecl {{.*}} [[RESOURCE]]<element_type> 'void (unsigned int, int, unsigned int, unsigned int, const char *)' inline |
| // CHECK-NEXT: ParmVarDecl {{.*}} spaceNo 'unsigned int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} range 'int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} index 'unsigned int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} orderId 'unsigned int' |
| // CHECK-NEXT: ParmVarDecl {{.*}} name 'const char *' |
| // CHECK-NEXT: CompoundStmt {{.*}} |
| // CHECK-NEXT: BinaryOperator {{.*}} '=' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: CallExpr {{.*}} '__hlsl_resource_t |
| // CHECK-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_handlefromimplicitbinding' |
| // CHECK-NEXT: MemberExpr {{.*}} lvalue .__handle |
| // CHECK-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'orderId' 'unsigned int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'spaceNo' 'unsigned int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'int' ParmVar {{.*}} 'range' 'int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'index' 'unsigned int' |
| // CHECK-NEXT: DeclRefExpr {{.*}} 'const char *' ParmVar {{.*}} 'name' 'const char *' |
| // CHECK-NEXT: AlwaysInlineAttr |
| |
| // Subscript operators |
| |
| // CHECK-SUBSCRIPT: CXXMethodDecl {{.*}} operator[] 'const hlsl_device element_type &(unsigned int) const' |
| // CHECK-SUBSCRIPT-NEXT: ParmVarDecl {{.*}} Index 'unsigned int' |
| // CHECK-SUBSCRIPT-NEXT: CompoundStmt |
| // CHECK-SUBSCRIPT-NEXT: ReturnStmt |
| // CHECK-SUBSCRIPT-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow |
| // CHECK-SUBSCRIPT-NEXT: CallExpr {{.*}} 'hlsl_device element_type *' |
| // CHECK-SUBSCRIPT-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-SUBSCRIPT-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' |
| // CHECK-SUBSCRIPT-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-SUBSCRIPT-SAME{LITERAL}: [[hlsl::resource_class( |
| // CHECK-SUBSCRIPT-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-SUBSCRIPT-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] |
| // CHECK-SUBSCRIPT-SAME: ' lvalue .__handle {{.*}} |
| // CHECK-SUBSCRIPT-NEXT: CXXThisExpr {{.*}} 'const hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-SUBSCRIPT-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int' |
| // CHECK-SUBSCRIPT-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline |
| |
| // CHECK-SUBSCRIPT-UAV-NEXT: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &(unsigned int)' |
| // CHECK-SUBSCRIPT-UAV-NEXT: ParmVarDecl {{.*}} Index 'unsigned int' |
| // CHECK-SUBSCRIPT-UAV-NEXT: CompoundStmt |
| // CHECK-SUBSCRIPT-UAV-NEXT: ReturnStmt |
| // CHECK-SUBSCRIPT-UAV-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow |
| // CHECK-SUBSCRIPT-UAV-NEXT: CallExpr {{.*}} 'hlsl_device element_type *' |
| // CHECK-SUBSCRIPT-UAV-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-SUBSCRIPT-UAV-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' |
| // CHECK-SUBSCRIPT-UAV-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-SUBSCRIPT-UAV-SAME{LITERAL}: [[hlsl::resource_class( |
| // CHECK-SUBSCRIPT-UAV-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-SUBSCRIPT-UAV-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] |
| // CHECK-SUBSCRIPT-UAV-SAME: ' lvalue .__handle {{.*}} |
| // CHECK-SUBSCRIPT-UAV-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-SUBSCRIPT-UAV-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int' |
| // CHECK-SUBSCRIPT-UAV-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline |
| |
| // CHECK-NOSUBSCRIPT-NOT: CXXMethodDecl {{.*}} operator[] 'const hlsl_device element_type &(unsigned int) const' |
| // CHECK-NOSUBSCRIPT-NOT: CXXMethodDecl {{.*}} operator[] 'hlsl_device element_type &(unsigned int)' |
| |
| // Load method |
| |
| // CHECK-LOAD: CXXMethodDecl {{.*}} Load 'element_type (unsigned int)' |
| // CHECK-LOAD-NEXT: ParmVarDecl {{.*}} Index 'unsigned int' |
| // CHECK-LOAD-NEXT: CompoundStmt |
| // CHECK-LOAD-NEXT: ReturnStmt |
| // CHECK-LOAD-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow |
| // CHECK-LOAD-NEXT: CallExpr {{.*}} 'hlsl_device element_type *' |
| // CHECK-LOAD-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-LOAD-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' |
| // CHECK-LOAD-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-LOAD-SAME{LITERAL}: [[hlsl::resource_class( |
| // CHECK-LOAD-SAME{LITERAL}: [[hlsl::contained_type(element_type)]] |
| // CHECK-LOAD-SAME: ' lvalue .__handle {{.*}} |
| // CHECK-LOAD-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-LOAD-NEXT: DeclRefExpr {{.*}} 'unsigned int' ParmVar {{.*}} 'Index' 'unsigned int' |
| // CHECK-LOAD-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline |
| |
| // IncrementCounter method |
| |
| // CHECK-COUNTER: CXXMethodDecl {{.*}} IncrementCounter 'unsigned int ()' |
| // CHECK-COUNTER-NEXT: CompoundStmt |
| // CHECK-COUNTER-NEXT: ReturnStmt |
| // CHECK-COUNTER-NEXT: CallExpr {{.*}} 'unsigned int' |
| // CHECK-COUNTER-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-COUNTER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_buffer_update_counter' 'unsigned int (...) noexcept' |
| // CHECK-COUNTER-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-COUNTER-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-COUNTER-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-COUNTER-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle |
| // CHECK-COUNTER-NEXT: CXXThisExpr {{.*}} 'hlsl::RWStructuredBuffer<element_type>' lvalue implicit this |
| // CHECK-COUNTER-NEXT: IntegerLiteral {{.*}} 'int' 1 |
| // CHECK-COUNTER-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline |
| |
| // DecrementCounter method |
| |
| // CHECK-COUNTER-NEXT: CXXMethodDecl {{.*}} DecrementCounter 'unsigned int ()' |
| // CHECK-COUNTER-NEXT: CompoundStmt |
| // CHECK-COUNTER-NEXT: ReturnStmt |
| // CHECK-COUNTER-NEXT: CallExpr {{.*}} 'unsigned int' |
| // CHECK-COUNTER-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-COUNTER-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_buffer_update_counter' 'unsigned int (...) noexcept' |
| // CHECK-COUNTER-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-COUNTER-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-COUNTER-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-COUNTER-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle |
| // CHECK-COUNTER-NEXT: CXXThisExpr {{.*}} 'hlsl::RWStructuredBuffer<element_type>' lvalue implicit this |
| // CHECK-COUNTER-NEXT: IntegerLiteral {{.*}} 'int' -1 |
| // CHECK-COUNTER-NEXT: AlwaysInlineAttr {{.*}} Implicit always_inline |
| |
| // Append method |
| |
| // CHECK-APPEND: CXXMethodDecl {{.*}} Append 'void (element_type)' |
| // CHECK-APPEND-NEXT: ParmVarDecl {{.*}} value 'element_type' |
| // CHECK-APPEND-NEXT: CompoundStmt |
| // CHECK-APPEND-NEXT: BinaryOperator {{.*}} 'hlsl_device element_type' '=' |
| // CHECK-APPEND-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow |
| // CHECK-APPEND-NEXT: CallExpr {{.*}} 'hlsl_device element_type *' |
| // CHECK-APPEND-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-APPEND-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' |
| // CHECK-APPEND-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-APPEND-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-APPEND-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-APPEND-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle |
| // CHECK-APPEND-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-APPEND-NEXT: CallExpr {{.*}} 'unsigned int' |
| // CHECK-APPEND-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-APPEND-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_buffer_update_counter' 'unsigned int (...) noexcept' |
| // CHECK-APPEND-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-APPEND-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-APPEND-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-APPEND-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle |
| // CHECK-APPEND-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-APPEND-NEXT: IntegerLiteral {{.*}} 'int' 1 |
| // CHECK-APPEND-NEXT: DeclRefExpr {{.*}} 'element_type' ParmVar {{.*}} 'value' 'element_type' |
| |
| // Consume method |
| |
| // CHECK-CONSUME: CXXMethodDecl {{.*}} Consume 'element_type ()' |
| // CHECK-CONSUME-NEXT: CompoundStmt |
| // CHECK-CONSUME-NEXT: ReturnStmt |
| // CHECK-CONSUME-NEXT: UnaryOperator {{.*}} 'hlsl_device element_type' prefix '*' cannot overflow |
| // CHECK-CONSUME-NEXT: CallExpr {{.*}} 'hlsl_device element_type *' |
| // CHECK-CONSUME-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-CONSUME-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_resource_getpointer' 'void (...) noexcept' |
| // CHECK-CONSUME-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-CONSUME-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-CONSUME-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-CONSUME-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle |
| // CHECK-CONSUME-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-CONSUME-NEXT: CallExpr {{.*}} 'unsigned int' |
| // CHECK-CONSUME-NEXT: ImplicitCastExpr {{.*}} <BuiltinFnToFnPtr> |
| // CHECK-CONSUME-NEXT: DeclRefExpr {{.*}} '<builtin fn type>' Function {{.*}} '__builtin_hlsl_buffer_update_counter' 'unsigned int (...) noexcept' |
| // CHECK-CONSUME-NEXT: MemberExpr {{.*}} '__hlsl_resource_t |
| // CHECK-CONSUME-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-CONSUME-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-CONSUME-SAME{LITERAL}: [[hlsl::contained_type(element_type)]]' lvalue .__handle |
| // CHECK-CONSUME-NEXT: CXXThisExpr {{.*}} 'hlsl::[[RESOURCE]]<element_type>' lvalue implicit this |
| // CHECK-CONSUME-NEXT: IntegerLiteral {{.*}} 'int' -1 |
| |
| // CHECK: ClassTemplateSpecializationDecl {{.*}} class [[RESOURCE]] definition |
| // CHECK: TemplateArgument type 'float' |
| // CHECK-NEXT: BuiltinType {{.*}} 'float' |
| // CHECK-NEXT: FinalAttr {{.*}} Implicit final |
| // CHECK-NEXT: FieldDecl {{.*}} implicit referenced __handle '__hlsl_resource_t |
| // CHECK-SRV-SAME{LITERAL}: [[hlsl::resource_class(SRV)]] |
| // CHECK-UAV-SAME{LITERAL}: [[hlsl::resource_class(UAV)]] |
| // CHECK-ROV-SAME{LITERAL}: [[hlsl::is_rov]] |
| // CHECK-SAME{LITERAL}: [[hlsl::raw_buffer]] |
| // CHECK-SAME{LITERAL}: [[hlsl::contained_type(float)]] |