Kaynağa Gözat

Resolve typedefs before param annotation (#1602)

Vishal Sharma 7 yıl önce
ebeveyn
işleme
3978a00271

+ 5 - 1
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -1589,7 +1589,11 @@ void CGMSHLSLRuntime::AddHLSLFunctionInfo(Function *F, const FunctionDecl *FD) {
 
     const ParmVarDecl *parmDecl = FD->getParamDecl(ParmIdx);
 
-    ConstructFieldAttributedAnnotation(paramAnnotation, parmDecl->getType(),
+    QualType fieldTy = parmDecl->getType();
+    // if parameter type is a typedef, try to desugar it first.
+    if (isa<TypedefType>(fieldTy.getTypePtr()))
+      fieldTy = fieldTy.getDesugaredType(FD->getASTContext());
+    ConstructFieldAttributedAnnotation(paramAnnotation, fieldTy,
                                        bDefaultRowMajor);
     if (parmDecl->hasAttr<HLSLPreciseAttr>())
       paramAnnotation.SetPrecise();

+ 12 - 0
tools/clang/test/CodeGenHLSL/quick-test/function-param-typedef-test.hlsl

@@ -0,0 +1,12 @@
+// RUN: %dxc /Tps_6_0 /Emain > %s | FileCheck %s
+// CHECK: define void @main()
+// CHECK: entry
+
+typedef float3 TESTVECTORTYPEDEF[3];
+typedef int TESTSCALARTYPEDEF[3];
+
+float3 main(in TESTVECTORTYPEDEF a : A,
+               in TESTSCALARTYPEDEF b : B) : SV_Target
+{
+  return a[0] + float3(b);
+}