Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/dxc/dxcapi.internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,8 @@ struct HLSL_INTRINSIC {
// type
UINT uNumArgs; // Count of arguments in pArgs.
const HLSL_INTRINSIC_ARGUMENT *pArgs; // Pointer to first argument.
UINT MaxShaderModel; // Encoded maximum shader model, 0 = no maximum
// (Major << 4) + (Minor & 0xf)
};

///////////////////////////////////////////////////////////////////////////////
Expand Down
23 changes: 23 additions & 0 deletions tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -7682,6 +7682,29 @@ def warn_hlsl_builtin_constant_unavailable: Warning<
def warn_hlsl_builtin_type_unavailable: Warning<
"potential misuse of built-in type %0 in shader model %1; introduced"
" in shader model %2">, DefaultError, InGroup<HLSLAvailability>;
def warn_hlsl_builtin_constant_removed
: Warning<"built-in constant %0 is unavailable in shader model %1; it was "
"removed"
" in shader model %2">,
InGroup<HLSLAvailabilityConstant>;
def warn_hlsl_builtin_type_removed
: Warning<
"built-in type %0 is unavailable in shader model %1; it was removed"
" in shader model %2">,
DefaultError,
InGroup<HLSLAvailability>;
def warn_hlsl_intrinsic_removed
: Warning<
"intrinsic %0 potentially used by '%1' is unavailable; it was removed"
" in shader model %2">,
DefaultError,
InGroup<HLSLAvailability>;
def warn_hlsl_node_shader_removed
: Warning<
"node shaders and other Work Graphs functionality are not supported"
" when targeting shader model %0">,
DefaultError,
InGroup<HLSLAvailability>;
def err_hlsl_unsupported_char_literal : Error<
"unsupported style of char literal - use a single-character char-based literal">;
def err_hlsl_unsupported_clipplane_argument_expression : Error<
Expand Down
33 changes: 25 additions & 8 deletions tools/clang/lib/AST/ASTContextHLSL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,25 @@ static void AddRecordSubscriptAccess(clang::ASTContext &Ctx,
AddRecordAccessMethod(Ctx, RD, ReturnTy, false, true, true);
}

static AvailabilityAttr *
ConstructAvailabilityAttribute(clang::ASTContext &context,
VersionTuple Introduced,
VersionTuple Deprecated = VersionTuple(),
VersionTuple Obsoleted = VersionTuple()) {
AvailabilityAttr *AAttr = AvailabilityAttr::CreateImplicit(
context, &context.Idents.get(""), Introduced, Deprecated, Obsoleted,
false, "");
return AAttr;
}

// Work graph node record objects: available SM6.8, deprecated SM6.9,

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

deprecated SM6.9

Unless we do another SM6.9 point release I don't think this is a true/fair statement right? Like folks using the retail SM6.9 right now aren't getting the deprecation warning

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't have point releases for shader models, just the compiler, which is an unfortunate distinction.

// obsoleted SM6.10.
static AvailabilityAttr *
ConstructNodeRecordAvailabilityAttribute(clang::ASTContext &context) {
return ConstructAvailabilityAttribute(
context, VersionTuple(6, 8), VersionTuple(6, 9), VersionTuple(6, 10));
}

/// <summary>Adds up-front support for HLSL *NodeOutputRecords template
/// types.</summary>
void hlsl::AddHLSLNodeOutputRecordTemplate(
Expand All @@ -496,6 +515,8 @@ void hlsl::AddHLSLNodeOutputRecordTemplate(

typeDeclBuilder.getRecordDecl()->addAttr(
HLSLNodeObjectAttr::CreateImplicit(context, Type));
typeDeclBuilder.getRecordDecl()->addAttr(
ConstructNodeRecordAvailabilityAttribute(context));

QualType elementType = context.getTemplateTypeParmType(
0, 0, ParameterPackFalse, outputTemplateParamDecl);
Expand Down Expand Up @@ -546,14 +567,6 @@ hlsl::DeclareRecordTypeWithHandle(ASTContext &context, StringRef name,
return typeDeclBuilder.getRecordDecl();
}

AvailabilityAttr *ConstructAvailabilityAttribute(clang::ASTContext &context,
VersionTuple Introduced) {
AvailabilityAttr *AAttr = AvailabilityAttr::CreateImplicit(
context, &context.Idents.get(""), clang::VersionTuple(6, 9),
clang::VersionTuple(), clang::VersionTuple(), false, "");
return AAttr;
}

// creates a global static constant unsigned integer with value.
// equivalent to: static const uint name = val;
static void AddConstUInt(clang::ASTContext &context, DeclContext *DC,
Expand Down Expand Up @@ -1355,6 +1368,8 @@ CXXRecordDecl *hlsl::DeclareNodeOrRecordType(

Builder.getRecordDecl()->addAttr(
HLSLNodeObjectAttr::CreateImplicit(Ctx, Type));
Builder.getRecordDecl()->addAttr(
ConstructNodeRecordAvailabilityAttribute(Ctx));

if (IsRecordTypeTemplate) {
QualType ParamTy = QualType(TyParamDecl->getTypeForDecl(), 0);
Expand Down Expand Up @@ -1488,6 +1503,8 @@ CXXRecordDecl *hlsl::DeclareNodeOutputArray(clang::ASTContext &Ctx,

Builder.getRecordDecl()->addAttr(
HLSLNodeObjectAttr::CreateImplicit(Ctx, Type));
Builder.getRecordDecl()->addAttr(
ConstructNodeRecordAvailabilityAttribute(Ctx));

QualType ResultType;
if (IsRecordTypeTemplate) {
Expand Down
29 changes: 24 additions & 5 deletions tools/clang/lib/Sema/SemaHLSL.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2090,12 +2090,31 @@ static void AddHLSLIntrinsicAttr(FunctionDecl *FD, ASTContext &context,
FD->addAttr(PureAttr::CreateImplicit(context));
if (pIntrinsic->Flags & INTRIN_FLAG_IS_WAVE)
FD->addAttr(HLSLWaveSensitiveAttr::CreateImplicit(context));
if (pIntrinsic->MinShaderModel) {
unsigned Major = pIntrinsic->MinShaderModel >> 4;
unsigned Minor = pIntrinsic->MinShaderModel & 0xF;
if (pIntrinsic->MinShaderModel || pIntrinsic->MaxShaderModel) {
clang::VersionTuple Introduced;
if (pIntrinsic->MinShaderModel) {
unsigned Major = pIntrinsic->MinShaderModel >> 4;
unsigned Minor = pIntrinsic->MinShaderModel & 0xF;
Introduced = clang::VersionTuple(Major, Minor);
}
// The maximum shader model is the last one that still supports the
// intrinsic: it is deprecated there, and obsoleted in the next minor
// shader model version. We could give longer deprecation periods in the
// future if there is a need for that.
Comment on lines +2100 to +2103

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not 100% sure we should worry about this idea of retrospectively deprecating the feature. I'm also not sure we should think about shader models as time frames, it seems like we're inventing some complexity here.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deprecation and removal are built into how availability attributes are implemented in Clang. We could set the deprecation to 0 and not support warnings on those, but I think there are benefits to this capability generally.

For example, I think we should figure out what features of SM 6.x we don't plan to bring to SM 7 (looking at you geometry shaders!), and start emitting warnings for those at some point soon so that users can adapt their code.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure that keying off SM is the right way to do this. WG's are as deprecated in SM 6.8 as they are in SM 6.9. I don't think we should think of SM's as timeframes where everybody uniformally updates all their shaders to the latest SM.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand the "timeframes" statement. Shader Models are fundamentally a collection of APIs, and they (historically) build on each other as the numbers increase.

I think of it like a version of a library. Version 6.9 has some features that are being removed in 6.10, so we annotate them as such.

clang::VersionTuple Deprecated;
clang::VersionTuple Obsoleted;
if (pIntrinsic->MaxShaderModel) {
unsigned Major = pIntrinsic->MaxShaderModel >> 4;
unsigned Minor = pIntrinsic->MaxShaderModel & 0xF;
Deprecated = clang::VersionTuple(Major, Minor);
DXASSERT(
Minor <= 14,
"I don't know how we should handle this, so let's assert for now.");
Obsoleted = clang::VersionTuple(Major, Minor + 1);
}
Comment on lines +2106 to +2114

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've added an assert to cover this because it is unclear to me exactly what we would do. Bumping the major version is possible, as is reving the file format to remove the restrictions on minor version count.

FD->addAttr(AvailabilityAttr::CreateImplicit(
context, &context.Idents.get(""), clang::VersionTuple(Major, Minor),
clang::VersionTuple(), clang::VersionTuple(), false, ""));
context, &context.Idents.get(""), Introduced, Deprecated, Obsoleted,
false, ""));
}
}

Expand Down
51 changes: 43 additions & 8 deletions tools/clang/lib/Sema/SemaHLSLDiagnoseTU.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -489,31 +489,57 @@ class HLSLReachableDiagnoseVisitor
return SMVT >= AAttrVT;
}

bool CheckObsoleted(VersionTuple ObsoletedVT) {
if (ObsoletedVT.empty() || IsTargetProfileLib6x(*sema))
return true;
VersionTuple SMVT = VersionTuple(SM->GetMajor(), SM->GetMinor());
return SMVT < ObsoletedVT;
}

void DiagnoseAvailability(AvailabilityAttr *AAttr, QualType Ty,
SourceLocation Loc) {
VersionTuple AAttrVT = AAttr->getIntroduced();
if (CheckSMVersion(AAttrVT))
if (!CheckSMVersion(AAttrVT)) {
sema->Diag(Loc, diag::warn_hlsl_builtin_type_unavailable)
<< Ty << SM->GetName() << AAttrVT.getAsString();
return;
}

sema->Diag(Loc, diag::warn_hlsl_builtin_type_unavailable)
<< Ty << SM->GetName() << AAttrVT.getAsString();
VersionTuple ObsoletedVT = AAttr->getObsoleted();
if (!CheckObsoleted(ObsoletedVT))
sema->Diag(Loc, diag::warn_hlsl_builtin_type_removed)
<< Ty << SM->GetName() << ObsoletedVT.getAsString();
}

void DiagnoseAvailability(AvailabilityAttr *AAttr, NamedDecl *ND,
SourceLocation Loc) {
VersionTuple AAttrVT = AAttr->getIntroduced();
if (CheckSMVersion(AAttrVT))
if (!CheckSMVersion(AAttrVT)) {
if (isa<FunctionDecl>(ND)) {
sema->Diag(Loc, diag::warn_hlsl_intrinsic_in_wrong_shader_model)
<< ND->getQualifiedNameAsString() << EntryDecl
<< AAttrVT.getAsString();
return;
}

sema->Diag(Loc, diag::warn_hlsl_builtin_constant_unavailable)
<< ND << SM->GetName() << AAttrVT.getAsString();
return;
}

VersionTuple ObsoletedVT = AAttr->getObsoleted();
if (CheckObsoleted(ObsoletedVT))
return;

if (isa<FunctionDecl>(ND)) {
sema->Diag(Loc, diag::warn_hlsl_intrinsic_in_wrong_shader_model)
sema->Diag(Loc, diag::warn_hlsl_intrinsic_removed)
<< ND->getQualifiedNameAsString() << EntryDecl
<< AAttrVT.getAsString();
<< ObsoletedVT.getAsString();
return;
}

sema->Diag(Loc, diag::warn_hlsl_builtin_constant_unavailable)
<< ND << SM->GetName() << AAttrVT.getAsString();
sema->Diag(Loc, diag::warn_hlsl_builtin_constant_removed)
<< ND << SM->GetName() << ObsoletedVT.getAsString();
}

clang::Sema *getSema() { return sema; }
Expand Down Expand Up @@ -768,6 +794,15 @@ void hlsl::DiagnoseTranslationUnit(clang::Sema *self) {
if (EntrySK == DXIL::ShaderKind::Library && IsTargetProfileLib6x(*self))
continue;

// Work Graphs (node shaders) were obsoleted in shader model 6.10.
// Declaring a node shader when targeting 6.10 or above is an error,
// regardless of whether any node record types are actually used.
if (EntrySK == DXIL::ShaderKind::Node && shaderModel->IsSMAtLeast(6, 10) &&
!IsTargetProfileLib6x(*self)) {
self->Diag(FDecl->getLocation(), diag::warn_hlsl_node_shader_removed)
<< shaderModel->GetName();
}

// Visit all visited functions in call graph to collect illegal intrinsic
// calls.
HLSLReachableDiagnoseVisitor Visitor(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ void node01(DispatchNodeInputRecord<RECORD> input) {}
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct DispatchNodeInputRecord definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit DispatchNodeInputRecord
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Get 'const recordtype &() const'
//CHECK-NEXT: HLSLIntrinsicAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit "subscript" "" 0
Expand All @@ -34,6 +35,7 @@ void node02(GroupNodeInputRecords<RECORD> input) {}
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct GroupNodeInputRecords definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit GroupNodeInputRecords
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Get 'const recordtype &(unsigned int) const'
//CHECK-NEXT: ParmVarDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Index 'unsigned int' cinit
Expand Down Expand Up @@ -63,6 +65,7 @@ void node03(ThreadNodeInputRecord<RECORD> input) {}
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct ThreadNodeInputRecord definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit ThreadNodeInputRecord
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Get 'const recordtype &() const'
//CHECK-NEXT: HLSLIntrinsicAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit "subscript" "" 0
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ void node01(NodeOutput<RECORD> output)
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct GroupNodeOutputRecords definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit GroupNodeOutputRecords
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> operator[] 'recordType &(unsigned int)'
//CHECK-NEXT: ParmVarDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Index 'unsigned int'
Expand Down Expand Up @@ -54,6 +55,7 @@ void node01(NodeOutput<RECORD> output)
//CHECK-NEXT: TemplateArgument type 'RECORD'
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit GroupNodeOutputRecords
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> operator[] 'RECORD &(unsigned int)'
//CHECK-NEXT: ParmVarDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Index 'unsigned int'
Expand Down Expand Up @@ -95,6 +97,7 @@ void node02(NodeOutput<RECORD> output)
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct ThreadNodeOutputRecords definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit ThreadNodeOutputRecords
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> operator[] 'recordType &(unsigned int)'
//CHECK-NEXT: ParmVarDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Index 'unsigned int'
Expand Down Expand Up @@ -126,6 +129,7 @@ void node02(NodeOutput<RECORD> output)
//CHECK-NEXT: TemplateArgument type 'RECORD'
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit ThreadNodeOutputRecords
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> operator[] 'RECORD &(unsigned int)'
//CHECK-NEXT: ParmVarDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Index 'unsigned int'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ void node01(RWDispatchNodeInputRecord<RECORD> input) {}
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct RWDispatchNodeInputRecord definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit RWDispatchNodeInputRecord
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Get 'recordtype &()'
//CHECK-NEXT: HLSLIntrinsicAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit "subscript" "" 0
Expand All @@ -40,6 +41,7 @@ void node02(RWGroupNodeInputRecords<RECORD> input) {}
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct RWGroupNodeInputRecords definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit RWGroupNodeInputRecords
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Get 'recordtype &(unsigned int)'
//CHECK-NEXT: ParmVarDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Index 'unsigned int' cinit
Expand Down Expand Up @@ -78,6 +80,7 @@ void node03(RWThreadNodeInputRecord<RECORD> input) {}
//CHECK-NEXT: CXXRecordDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit struct RWThreadNodeInputRecord definition
//CHECK-NEXT: FinalAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit final
//CHECK-NEXT: HLSLNodeObjectAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit RWThreadNodeInputRecord
//CHECK-NEXT: AvailabilityAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit 6.8 6.9 6.10 ""
//CHECK-NEXT: FieldDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> implicit h 'int'
//CHECK-NEXT: CXXMethodDecl {{0x[0-9a-fA-F]+}} <<invalid sloc>> <invalid sloc> Get 'recordtype &()'
//CHECK-NEXT: HLSLIntrinsicAttr {{0x[0-9a-fA-F]+}} <<invalid sloc>> Implicit "subscript" "" 0
Expand Down

This file was deleted.

Loading
Loading