@@ -35,14 +35,17 @@ namespace {
35
35
36
36
struct TemplateParameterListBuilder ;
37
37
38
- struct BuiltinTypeDeclBuilder {
39
- Sema &SemaRef;
40
- CXXRecordDecl *Record = nullptr ;
38
+ class BuiltinTypeDeclBuilder {
41
39
ClassTemplateDecl *Template = nullptr ;
42
40
ClassTemplateDecl *PrevTemplate = nullptr ;
43
41
NamespaceDecl *HLSLNamespace = nullptr ;
44
42
llvm::StringMap<FieldDecl *> Fields;
45
43
44
+ public:
45
+ Sema &SemaRef;
46
+ CXXRecordDecl *Record = nullptr ;
47
+ friend struct TemplateParameterListBuilder ;
48
+
46
49
BuiltinTypeDeclBuilder (Sema &SemaRef, CXXRecordDecl *R)
47
50
: SemaRef(SemaRef), Record(R) {
48
51
Record->startDefinition ();
@@ -51,7 +54,7 @@ struct BuiltinTypeDeclBuilder {
51
54
52
55
BuiltinTypeDeclBuilder (Sema &SemaRef, NamespaceDecl *Namespace,
53
56
StringRef Name)
54
- : SemaRef(SemaRef ), HLSLNamespace(Namespace ) {
57
+ : HLSLNamespace(Namespace ), SemaRef(SemaRef ) {
55
58
ASTContext &AST = SemaRef.getASTContext ();
56
59
IdentifierInfo &II = AST.Idents .get (Name, tok::TokenKind::identifier);
57
60
@@ -91,6 +94,18 @@ struct BuiltinTypeDeclBuilder {
91
94
HLSLNamespace->addDecl (Record);
92
95
}
93
96
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
+
94
109
BuiltinTypeDeclBuilder &
95
110
addMemberVariable (StringRef Name, QualType Type, llvm::ArrayRef<Attr *> Attrs,
96
111
AccessSpecifier Access = AccessSpecifier::AS_private) {
@@ -849,7 +864,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
849
864
constructTypedBufferConceptDecl (*SemaPtr, HLSLNamespace);
850
865
Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RWBuffer" )
851
866
.addSimpleTemplateParams ({" element_type" }, TypedBufferConcept)
852
- .Record ;
867
+ .finalizeForwardDeclaration () ;
853
868
854
869
onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
855
870
setupBufferType (Decl, *SemaPtr, ResourceClass::UAV,
@@ -862,7 +877,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
862
877
Decl =
863
878
BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RasterizerOrderedBuffer" )
864
879
.addSimpleTemplateParams ({" element_type" })
865
- .Record ;
880
+ .finalizeForwardDeclaration () ;
866
881
onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
867
882
setupBufferType (Decl, *SemaPtr, ResourceClass::UAV,
868
883
ResourceKind::TypedBuffer, /* IsROV=*/ true ,
@@ -873,7 +888,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
873
888
874
889
Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " StructuredBuffer" )
875
890
.addSimpleTemplateParams ({" element_type" })
876
- .Record ;
891
+ .finalizeForwardDeclaration () ;
877
892
onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
878
893
setupBufferType (Decl, *SemaPtr, ResourceClass::SRV, ResourceKind::RawBuffer,
879
894
/* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -883,7 +898,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
883
898
884
899
Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " RWStructuredBuffer" )
885
900
.addSimpleTemplateParams ({" element_type" })
886
- .Record ;
901
+ .finalizeForwardDeclaration () ;
887
902
onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
888
903
setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
889
904
/* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -896,7 +911,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
896
911
Decl =
897
912
BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " AppendStructuredBuffer" )
898
913
.addSimpleTemplateParams ({" element_type" })
899
- .Record ;
914
+ .finalizeForwardDeclaration () ;
900
915
onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
901
916
setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
902
917
/* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -906,7 +921,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
906
921
Decl =
907
922
BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace, " ConsumeStructuredBuffer" )
908
923
.addSimpleTemplateParams ({" element_type" })
909
- .Record ;
924
+ .finalizeForwardDeclaration () ;
910
925
onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
911
926
setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
912
927
/* IsROV=*/ false , /* RawBuffer=*/ true )
@@ -916,7 +931,7 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
916
931
Decl = BuiltinTypeDeclBuilder (*SemaPtr, HLSLNamespace,
917
932
" RasterizerOrderedStructuredBuffer" )
918
933
.addSimpleTemplateParams ({" element_type" })
919
- .Record ;
934
+ .finalizeForwardDeclaration () ;
920
935
onCompletion (Decl, [this ](CXXRecordDecl *Decl) {
921
936
setupBufferType (Decl, *SemaPtr, ResourceClass::UAV, ResourceKind::RawBuffer,
922
937
/* IsROV=*/ true , /* RawBuffer=*/ true )
@@ -925,6 +940,32 @@ void HLSLExternalSemaSource::defineHLSLTypesWithForwardDeclarations() {
925
940
.addDecrementCounterMethod ()
926
941
.completeDefinition ();
927
942
});
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
+ });
928
969
}
929
970
930
971
void HLSLExternalSemaSource::onCompletion (CXXRecordDecl *Record,
0 commit comments