Skip to content

Commit 8209d53

Browse files
authored
Fix static member call instantiation (#7377)
The first parameter of the HLSL_INTRINSIC record is actually a dummy entry for the function name. When builtin member function templates are instantiated, the 'this' ptr is added as the first ParamVarDecl, which has the same index as the first argument in the HLSL_INTRINSIC record. This shifts the parameter names by one for static member functions, as those do not have a 'this' pointer, as in: ``` | | | `-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> used MakeMiss 'dx::HitObject (unsigned int, unsigned int, RayDesc)' static | | | |-TemplateArgument type 'dx::HitObject' | | | |-TemplateArgument type 'unsigned int' | | | |-TemplateArgument type 'unsigned int' | | | |-TemplateArgument type 'RayDesc' | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MakeMiss 'unsigned int' | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayFlags 'unsigned int' | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'RayDesc' ``` The fix is the take the first actual parameter name of the HLSL_INTRINSIC if a static member function template is declared. Closes #7374
1 parent b4d773f commit 8209d53

File tree

4 files changed

+20
-14
lines changed

4 files changed

+20
-14
lines changed

tools/clang/lib/Sema/SemaHLSL.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5945,6 +5945,8 @@ class HLSLExternalSource : public ExternalSemaSource {
59455945
"otherwise caller didn't initialize - there should be at least a "
59465946
"void return type");
59475947

5948+
const bool IsStatic = IsStaticMember(intrinsic);
5949+
59485950
// Create the template arguments.
59495951
SmallVector<TemplateArgument, g_MaxIntrinsicParamCount + 1> templateArgs;
59505952
for (size_t i = 0; i < parameterTypeCount; i++) {
@@ -6010,15 +6012,19 @@ class HLSLExternalSource : public ExternalSemaSource {
60106012

60116013
SmallVector<ParmVarDecl *, g_MaxIntrinsicParamCount> Params;
60126014
for (unsigned int i = 1; i < parameterTypeCount; i++) {
6015+
// The first parameter in the HLSL intrinsic record is just the intrinsic
6016+
// name and aliases with the 'this' pointer for non-static members. Skip
6017+
// this first parameter for static functions.
6018+
unsigned ParamIdx = IsStatic ? i : i - 1;
60136019
IdentifierInfo *id =
6014-
&m_context->Idents.get(StringRef(intrinsic->pArgs[i - 1].pName));
6020+
&m_context->Idents.get(StringRef(intrinsic->pArgs[ParamIdx].pName));
60156021
ParmVarDecl *paramDecl = ParmVarDecl::Create(
60166022
*m_context, nullptr, NoLoc, NoLoc, id, parameterTypes[i], nullptr,
60176023
StorageClass::SC_None, nullptr, paramMods[i - 1]);
60186024
Params.push_back(paramDecl);
60196025
}
60206026

6021-
StorageClass SC = IsStaticMember(intrinsic) ? SC_Static : SC_Extern;
6027+
StorageClass SC = IsStatic ? SC_Static : SC_Extern;
60226028
QualType T = TInfo->getType();
60236029
DeclarationNameInfo NameInfo(FunctionTemplate->getDeclName(), NoLoc);
60246030
CXXMethodDecl *method = CXXMethodDecl::Create(

tools/clang/test/CodeGenDXIL/hlsl/objects/HitObject/hitobject_make.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
2626
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
2727
// AST-NEXT: | | | |-TemplateArgument type 'RayDesc'
28-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MakeMiss 'unsigned int'
2928
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayFlags 'unsigned int'
30-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'RayDesc'
29+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'unsigned int'
30+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Ray 'RayDesc'
3131
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 387
3232
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
3333

tools/clang/test/CodeGenDXIL/hlsl/objects/HitObject/hitobject_traceinvoke.hlsl

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
// AST-NEXT: | | | |-TemplateArgument type 'void'
1414
// AST-NEXT: | | | |-TemplateArgument type 'dx::HitObject':'dx::HitObject'
1515
// AST-NEXT: | | | |-TemplateArgument type 'Payload'
16-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Invoke 'dx::HitObject':'dx::HitObject'
17-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> ho 'Payload &&__restrict'
16+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> ho 'dx::HitObject':'dx::HitObject'
17+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Payload 'Payload &&__restrict'
1818
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 382
1919
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
2020

@@ -47,14 +47,14 @@
4747
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
4848
// AST-NEXT: | | | |-TemplateArgument type 'RayDesc'
4949
// AST-NEXT: | | | |-TemplateArgument type 'Payload'
50-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> TraceRay 'RaytracingAccelerationStructure'
51-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> AccelerationStructure 'unsigned int'
50+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> AccelerationStructure 'RaytracingAccelerationStructure'
5251
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayFlags 'unsigned int'
5352
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> InstanceInclusionMask 'unsigned int'
5453
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> RayContributionToHitGroupIndex 'unsigned int'
5554
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MultiplierForGeometryContributionToHitGroupIndex 'unsigned int'
56-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'RayDesc'
57-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Ray 'Payload &&__restrict'
55+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> MissShaderIndex 'unsigned int'
56+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Ray 'RayDesc'
57+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Payload 'Payload &&__restrict'
5858
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 389
5959
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
6060

tools/clang/test/SemaHLSL/hlsl/objects/HitObject/hitobject_fromrayquery.hlsl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// AST-NEXT: | | | `-CXXMethodDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> used FromRayQuery 'dx::HitObject (RayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH>)' static
1010
// AST-NEXT: | | | |-TemplateArgument type 'dx::HitObject'
1111
// AST-NEXT: | | | |-TemplateArgument type 'RayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH>':'RayQuery<5, 0>'
12-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> FromRayQuery 'RayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH>':'RayQuery<5, 0>'
12+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> rq 'RayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH>':'RayQuery<5, 0>'
1313
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 363
1414
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
1515

@@ -27,9 +27,9 @@
2727
// AST-NEXT: | | | |-TemplateArgument type 'RayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH>':'RayQuery<5, 0>'
2828
// AST-NEXT: | | | |-TemplateArgument type 'unsigned int'
2929
// AST-NEXT: | | | |-TemplateArgument type 'CustomAttrs'
30-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> FromRayQuery 'RayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH>':'RayQuery<5, 0>'
31-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> rq 'unsigned int'
32-
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> HitKind 'CustomAttrs'
30+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> rq 'RayQuery<RAY_FLAG_FORCE_OPAQUE | RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH>':'RayQuery<5, 0>'
31+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> HitKind 'unsigned int'
32+
// AST-NEXT: | | | |-ParmVarDecl {{[^ ]+}} <<invalid sloc>> <invalid sloc> Attributes 'CustomAttrs'
3333
// AST-NEXT: | | | |-HLSLIntrinsicAttr {{[^ ]+}} <<invalid sloc>> Implicit "op" "" 363
3434
// AST-NEXT: | | | `-AvailabilityAttr {{[^ ]+}} <<invalid sloc>> Implicit 6.9 0 0 ""
3535

0 commit comments

Comments
 (0)