@@ -5533,10 +5533,11 @@ class HLSLExternalSource : public ExternalSemaSource {
55335533 m_sema->RequireCompleteType(argSrcLoc, argType,
55345534 diag::err_typecheck_decl_incomplete_type);
55355535
5536- if (ContainsLongVector(argType)) {
5536+ unsigned DiagTypeIdx = 0;
5537+ if (hlsl::ContainsLongVecOrHitObject(argType, DiagTypeIdx)) {
55375538 const unsigned ConstantBuffersOrTextureBuffersIdx = 0;
5538- m_sema->Diag(argSrcLoc, diag::err_hlsl_unsupported_long_vector )
5539- << ConstantBuffersOrTextureBuffersIdx;
5539+ m_sema->Diag(argSrcLoc, diag::err_hlsl_unsupported_type )
5540+ << DiagTypeIdx << ConstantBuffersOrTextureBuffersIdx;
55405541 return true;
55415542 }
55425543 }
@@ -5641,11 +5642,11 @@ class HLSLExternalSource : public ExternalSemaSource {
56415642 CXXRecordDecl *Decl = arg.getAsType()->getAsCXXRecordDecl();
56425643 if (Decl && !Decl->isCompleteDefinition())
56435644 return true;
5644- if (ContainsLongVector(arg.getAsType())) {
5645+ unsigned DiagTypeIdx = 0;
5646+ if (ContainsLongVecOrHitObject(arg.getAsType(), DiagTypeIdx)) {
56455647 const unsigned TessellationPatchesIDx = 1;
5646- m_sema->Diag(argLoc.getLocation(),
5647- diag::err_hlsl_unsupported_long_vector)
5648- << TessellationPatchesIDx;
5648+ m_sema->Diag(argLoc.getLocation(), diag::err_hlsl_unsupported_type)
5649+ << DiagTypeIdx << TessellationPatchesIDx;
56495650 return true;
56505651 }
56515652 } else if (Template->getTemplatedDecl()->hasAttr<HLSLStreamOutputAttr>()) {
@@ -5660,11 +5661,11 @@ class HLSLExternalSource : public ExternalSemaSource {
56605661 CXXRecordDecl *Decl = arg.getAsType()->getAsCXXRecordDecl();
56615662 if (Decl && !Decl->isCompleteDefinition())
56625663 return true;
5663- if (ContainsLongVector(arg.getAsType())) {
5664+ unsigned DiagTypeIdx = 0;
5665+ if (ContainsLongVecOrHitObject(arg.getAsType(), DiagTypeIdx)) {
56645666 const unsigned GeometryStreamsIdx = 2;
5665- m_sema->Diag(argLoc.getLocation(),
5666- diag::err_hlsl_unsupported_long_vector)
5667- << GeometryStreamsIdx;
5667+ m_sema->Diag(argLoc.getLocation(), diag::err_hlsl_unsupported_type)
5668+ << DiagTypeIdx << GeometryStreamsIdx;
56685669 return true;
56695670 }
56705671 }
@@ -10779,8 +10780,11 @@ bool DiagnoseIntersectionAttributes(Sema &S, SourceLocation Loc, QualType Ty) {
1077910780 }
1078010781
1078110782 if (ContainsLongVector(Ty)) {
10783+ // No need to check for HitObject, checked with attributes diagnosis.
10784+ const unsigned LongVectorIdx = 0;
1078210785 const unsigned AttributesIdx = 11;
10783- S.Diag(Loc, diag::err_hlsl_unsupported_long_vector) << AttributesIdx;
10786+ S.Diag(Loc, diag::err_hlsl_unsupported_type)
10787+ << LongVectorIdx << AttributesIdx;
1078410788 return false;
1078510789 }
1078610790 return true;
@@ -12119,9 +12123,10 @@ bool hlsl::DiagnoseNodeStructArgument(Sema *self, TemplateArgumentLoc ArgLoc,
1211912123 switch (shapeKind) {
1212012124 case AR_TOBJ_VECTOR:
1212112125 if (GetHLSLVecSize(ArgTy) > DXIL::kDefaultMaxVectorLength) {
12126+ const unsigned LongVectorIdx = 0;
1212212127 const unsigned NodeRecordsIdx = 3;
12123- self->Diag(ArgLoc.getLocation(), diag::err_hlsl_unsupported_long_vector )
12124- << NodeRecordsIdx;
12128+ self->Diag(ArgLoc.getLocation(), diag::err_hlsl_unsupported_type )
12129+ << LongVectorIdx << NodeRecordsIdx;
1212512130 Empty = false;
1212612131 return false;
1212712132 }
@@ -12591,6 +12596,24 @@ bool hlsl::ShouldSkipNRVO(clang::Sema &sema, clang::QualType returnType,
1259112596 return false;
1259212597}
1259312598
12599+ bool hlsl::ContainsHitObject(QualType QT) {
12600+ if (QT.isNull() || QT->isDependentType())
12601+ return false;
12602+
12603+ while (const ArrayType *Arr = QT->getAsArrayTypeUnsafe())
12604+ QT = Arr->getElementType();
12605+
12606+ if (IsHLSLHitObjectType(QT))
12607+ return true;
12608+
12609+ if (CXXRecordDecl *Decl = QT->getAsCXXRecordDecl()) {
12610+ if (!Decl->isCompleteDefinition())
12611+ return false;
12612+ return Decl->hasHLSLHitObject();
12613+ }
12614+ return false;
12615+ }
12616+
1259412617bool hlsl::ContainsLongVector(QualType QT) {
1259512618 if (QT.isNull() || QT->isDependentType())
1259612619 return false;
@@ -12606,6 +12629,19 @@ bool hlsl::ContainsLongVector(QualType QT) {
1260612629 return false;
1260712630}
1260812631
12632+ bool hlsl::ContainsLongVecOrHitObject(clang::QualType QT,
12633+ unsigned &DiagTypeIdx) {
12634+ if (ContainsHitObject(QT)) {
12635+ DiagTypeIdx = 1;
12636+ return true;
12637+ }
12638+ if (ContainsLongVector(QT)) {
12639+ DiagTypeIdx = 0;
12640+ return true;
12641+ }
12642+ return false;
12643+ }
12644+
1260912645bool hlsl::IsConversionToLessOrEqualElements(
1261012646 clang::Sema *self, const clang::ExprResult &sourceExpr,
1261112647 const clang::QualType &targetType, bool explicitConversion) {
@@ -15277,18 +15313,27 @@ bool Sema::DiagnoseHLSLDecl(Declarator &D, DeclContext *DC, Expr *BitWidth,
1527715313 }
1527815314
1527915315 // Disallow long vecs from $Global cbuffers.
15280- if (isGlobal && !isStatic && !isGroupShared && !IS_BASIC_OBJECT(basicKind)) {
15316+ const unsigned CbuffersOrTbuffersIdx = 4;
15317+ if (isGlobal && !isStatic) {
1528115318 // Suppress actual emitting of errors for incompletable types here
1528215319 // They are redundant to those produced in ActOnUninitializedDecl.
1528315320 struct SilentDiagnoser : public TypeDiagnoser {
1528415321 SilentDiagnoser() : TypeDiagnoser(true) {}
1528515322 virtual void diagnose(Sema &S, SourceLocation Loc, QualType T) {}
1528615323 } SD;
1528715324 RequireCompleteType(D.getLocStart(), qt, SD);
15288- if (ContainsLongVector(qt)) {
15289- unsigned CbuffersOrTbuffersIdx = 4;
15290- Diag(D.getLocStart(), diag::err_hlsl_unsupported_long_vector)
15291- << CbuffersOrTbuffersIdx;
15325+ unsigned DiagTypeIdx = 0;
15326+ bool HasError = false;
15327+ if (!isGroupShared && !IS_BASIC_OBJECT(basicKind) && ContainsLongVector(qt))
15328+ HasError = true;
15329+ else if (ContainsHitObject(qt)) {
15330+ const unsigned HitObjectTypeIdx = 1;
15331+ DiagTypeIdx = HitObjectTypeIdx;
15332+ HasError = true;
15333+ }
15334+ if (HasError) {
15335+ Diag(D.getLocStart(), diag::err_hlsl_unsupported_type)
15336+ << DiagTypeIdx << CbuffersOrTbuffersIdx;
1529215337 result = false;
1529315338 }
1529415339 }
@@ -16195,10 +16240,11 @@ static bool isRelatedDeclMarkedNointerpolation(Expr *E) {
1619516240
1619616241// Verify that user-defined intrinsic struct args contain no long vectors
1619716242static bool CheckUDTIntrinsicArg(Sema *S, Expr *Arg) {
16198- if (ContainsLongVector(Arg->getType())) {
16243+ unsigned DiagTypeIdx = 0;
16244+ if (ContainsLongVecOrHitObject(Arg->getType(), DiagTypeIdx)) {
1619916245 const unsigned UserDefinedStructParameterIdx = 5;
16200- S->Diag(Arg->getExprLoc(), diag::err_hlsl_unsupported_long_vector )
16201- << UserDefinedStructParameterIdx;
16246+ S->Diag(Arg->getExprLoc(), diag::err_hlsl_unsupported_type )
16247+ << DiagTypeIdx << UserDefinedStructParameterIdx;
1620216248 return true;
1620316249 }
1620416250 return false;
@@ -16938,17 +16984,19 @@ void DiagnoseEntry(Sema &S, FunctionDecl *FD) {
1693816984 // Would be nice to check for resources here as they crash the compiler now.
1693916985 // See issue #7186.
1694016986 for (const auto *param : FD->params()) {
16941- if (ContainsLongVector(param->getType())) {
16987+ unsigned DiagTypeIdx = 0;
16988+ if (ContainsLongVecOrHitObject(param->getType(), DiagTypeIdx)) {
1694216989 const unsigned EntryFunctionParametersIdx = 6;
16943- S.Diag(param->getLocation(), diag::err_hlsl_unsupported_long_vector )
16944- << EntryFunctionParametersIdx;
16990+ S.Diag(param->getLocation(), diag::err_hlsl_unsupported_type )
16991+ << DiagTypeIdx << EntryFunctionParametersIdx;
1694516992 }
1694616993 }
1694716994
16948- if (ContainsLongVector(FD->getReturnType())) {
16995+ unsigned DiagTypeIdx = 0;
16996+ if (ContainsLongVecOrHitObject(FD->getReturnType(), DiagTypeIdx)) {
1694916997 const unsigned EntryFunctionReturnIdx = 7;
16950- S.Diag(FD->getLocation(), diag::err_hlsl_unsupported_long_vector )
16951- << EntryFunctionReturnIdx;
16998+ S.Diag(FD->getLocation(), diag::err_hlsl_unsupported_type )
16999+ << DiagTypeIdx << EntryFunctionReturnIdx;
1695217000 }
1695317001
1695417002 DXIL::ShaderKind Stage =
0 commit comments