@@ -35,14 +35,17 @@ namespace {
3535
3636struct TemplateParameterListBuilder ;
3737
38- struct BuiltinTypeDeclBuilder {
39- Sema &SemaRef;
40- CXXRecordDecl *Record = nullptr ;
38+ class BuiltinTypeDeclBuilder {
4139 ClassTemplateDecl *Template = nullptr ;
4240 ClassTemplateDecl *PrevTemplate = nullptr ;
4341 NamespaceDecl *HLSLNamespace = nullptr ;
4442 llvm::StringMap<FieldDecl *> Fields;
4543
44+ public:
45+ Sema &SemaRef;
46+ CXXRecordDecl *Record = nullptr ;
47+ friend struct TemplateParameterListBuilder ;
48+
4649 BuiltinTypeDeclBuilder (Sema &SemaRef, CXXRecordDecl *R)
4750 : SemaRef(SemaRef), Record(R) {
4851 Record->startDefinition ();
@@ -51,7 +54,7 @@ struct BuiltinTypeDeclBuilder {
5154
5255 BuiltinTypeDeclBuilder (Sema &SemaRef, NamespaceDecl *Namespace,
5356 StringRef Name)
54- : SemaRef(SemaRef ), HLSLNamespace(Namespace ) {
57+ : HLSLNamespace(Namespace ), SemaRef(SemaRef ) {
5558 ASTContext &AST = SemaRef.getASTContext ();
5659 IdentifierInfo &II = AST.Idents .get (Name, tok::TokenKind::identifier);
5760
@@ -91,6 +94,18 @@ struct BuiltinTypeDeclBuilder {
9194 HLSLNamespace->addDecl (Record);
9295 }
9396
97+ CXXRecordDecl *finalizeForwardDeclaration () {
98+ // Force the QualType to be generated for the record declaration. In most
99+ // cases this will happen naturally when something uses the type the
100+ // QualType gets lazily created. Unfortunately, with our injected types if a
101+ // type isn't used in a translation unit the QualType may not get
102+ // automatically generated before a PCH is generated. To resolve this we
103+ // just force that the QualType is generated after we create a forward
104+ // declaration.
105+ (void )Record->getASTContext ().getRecordType (Record);
106+ return Record;
107+ }
108+
94109 BuiltinTypeDeclBuilder &
95110 addMemberVariable (StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs,
96111 AccessSpecifier Access = AccessSpecifier::AS_private) {
@@ -849,7 +864,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
849864 constructTypedBufferConceptDecl (*SemaPtr, HLSLNamespace);
850865 Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RWBuffer" )
851866 .addSimpleTemplateParams ({" element_type" }, TypedBufferConcept)
852- .Record ;
867+ .finalizeForwardDeclaration () ;
853868
854869 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
855870 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV,
@@ -862,7 +877,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
862877 Decl =
863878 BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RasterizerOrderedBuffer" )
864879 .addSimpleTemplateParams ({" element_type" })
865- .Record ;
880+ .finalizeForwardDeclaration () ;
866881 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
867882 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV,
868883 ResourceKind::TypedBuffer, /* IsROV=*/ true ,
@@ -873,7 +888,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
873888
874889 Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " StructuredBuffer" )
875890 .addSimpleTemplateParams ({" element_type" })
876- .Record ;
891+ .finalizeForwardDeclaration () ;
877892 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
878893 setupBufferType (Decl, *SemaPtr, ResourceClass::SRV, ResourceKind::RawBuffer,
879894 /* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -883,7 +898,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
883898
884899 Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RWStructuredBuffer" )
885900 .addSimpleTemplateParams ({" element_type" })
886- .Record ;
901+ .finalizeForwardDeclaration () ;
887902 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
888903 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
889904 /* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -896,7 +911,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
896911 Decl =
897912 BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " AppendStructuredBuffer" )
898913 .addSimpleTemplateParams ({" element_type" })
899- .Record ;
914+ .finalizeForwardDeclaration () ;
900915 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
901916 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
902917 /* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -906,7 +921,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
906921 Decl =
907922 BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " ConsumeStructuredBuffer" )
908923 .addSimpleTemplateParams ({" element_type" })
909- .Record ;
924+ .finalizeForwardDeclaration () ;
910925 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
911926 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
912927 /* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -916,7 +931,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
916931 Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace,
917932 " RasterizerOrderedStructuredBuffer" )
918933 .addSimpleTemplateParams ({" element_type" })
919- .Record ;
934+ .finalizeForwardDeclaration () ;
920935 onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
921936 setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
922937 /* IsROV=*/ true , /* RawBuffer=*/ true )
@@ -925,6 +940,32 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
925940 .addDecrementCounterMethod ()
926941 .completeDefinition ();
927942 });
943+
944+ Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " ByteAddressBuffer" )
945+ .finalizeForwardDeclaration ();
946+ onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
947+ setupBufferType (Decl, *SemaPtr, ResourceClass::SRV, ResourceKind::RawBuffer,
948+ /* IsROV=*/ false ,
949+ /* RawBuffer=*/ true )
950+ .completeDefinition ();
951+ });
952+ Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RWByteAddressBuffer" )
953+ .finalizeForwardDeclaration ();
954+ onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
955+ setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
956+ /* IsROV=*/ false ,
957+ /* RawBuffer=*/ true )
958+ .completeDefinition ();
959+ });
960+ Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace,
961+ " RasterizerOrderedByteAddressBuffer" )
962+ .finalizeForwardDeclaration ();
963+ onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
964+ setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
965+ /* IsROV=*/ true ,
966+ /* RawBuffer=*/ true )
967+ .completeDefinition ();
968+ });
928969}
929970
930971void HLSLExternalSemaSource::onCompletion (CXXRecordDecl *Record,
0 commit comments