diff options
Diffstat (limited to 'source/slang/slang-parser.cpp')
| -rw-r--r-- | source/slang/slang-parser.cpp | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 909a8eb72..f0c9e175f 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -114,7 +114,7 @@ namespace Slang DiagnosticSink* sink; SourceLoc lastErrorLoc; ParserOptions options; - + Modifiers* pendingModifiers = nullptr; int genericDepth = 0; // Is the parser in a "recovering" state? @@ -3095,7 +3095,7 @@ namespace Slang } static Decl* ParseHLSLBufferDecl( - Parser* parser, + Parser* parser, String bufferWrapperTypeName) { // An HLSL declaration of a constant buffer like this: @@ -3119,7 +3119,19 @@ namespace Slang // the second is a variable declaration that uses the buffer type. StructDecl* bufferDataTypeDecl = parser->astBuilder->create<StructDecl>(); - addModifier(bufferDataTypeDecl, parser->astBuilder->create<PublicModifier>()); + if (parser->pendingModifiers) + { + // Clone visibility modifier from cbuffer decl to the internal struct type decl. + // For example, if cbuffer is public, we want the element buffer type to also be + // public. + if (auto visModifier = parser->pendingModifiers->findModifier<VisibilityModifier>()) + { + auto cloneVisModifier = (VisibilityModifier*)parser->astBuilder->createByNodeType(visModifier->astNodeType); + cloneVisModifier->keywordName = visModifier->keywordName; + cloneVisModifier->loc = visModifier->loc; + addModifier(bufferDataTypeDecl, cloneVisModifier); + } + } VarDecl* bufferVarDecl = parser->astBuilder->create<VarDecl>(); @@ -4396,6 +4408,18 @@ namespace Slang Modifiers modifiers ) { DeclBase* decl = nullptr; + + struct RestorePendingModifiersRAII + { + Modifiers* oldValue; + Parser* parser; + ~RestorePendingModifiersRAII() + { + parser->pendingModifiers = oldValue; + } + }; + RestorePendingModifiersRAII restorePendingModifiersRAII{ parser->pendingModifiers, parser }; + parser->pendingModifiers = &modifiers; auto loc = parser->tokenReader.peekLoc(); |
