From 0260e22dcfd5375349a871e08c25bbed4f8fac51 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 12 Feb 2025 12:44:59 -0800 Subject: [PATCH 1/4] Fix modifier parsing. --- source/slang/slang-ast-support-types.h | 1 + source/slang/slang-lookup.cpp | 6 +++++- source/slang/slang-parser.cpp | 2 +- tests/front-end/in-redeclare.slang | 11 +++++++++++ 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 tests/front-end/in-redeclare.slang diff --git a/source/slang/slang-ast-support-types.h b/source/slang/slang-ast-support-types.h index 72707ab38a..94fae9d728 100644 --- a/source/slang/slang-ast-support-types.h +++ b/source/slang/slang-ast-support-types.h @@ -1217,6 +1217,7 @@ enum class LookupMask : uint8_t Function = 0x2, Value = 0x4, Attribute = 0x8, + SyntaxDecl = 0x10, Default = type | Function | Value, }; diff --git a/source/slang/slang-lookup.cpp b/source/slang/slang-lookup.cpp index 9b9034c63f..a2284eaa84 100644 --- a/source/slang/slang-lookup.cpp +++ b/source/slang/slang-lookup.cpp @@ -71,7 +71,11 @@ bool DeclPassesLookupMask(Decl* decl, LookupMask mask) { return (int(mask) & int(LookupMask::Attribute)) != 0; } - + // syntax declaration + else if (const auto syntaxDecl = as(decl)) + { + return (int(mask) & int(LookupMask::SyntaxDecl)) != 0; + } // default behavior is to assume a value declaration // (no overloading allowed) diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 38285c41f0..43d80ab5be 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -1100,7 +1100,7 @@ static SyntaxDecl* tryLookUpSyntaxDecl(Parser* parser, Name* name) nullptr, // no semantics visitor available yet name, parser->currentScope, - LookupMask::Default, + LookupMask::SyntaxDecl, true); // If we didn't find anything, or the result was overloaded, diff --git a/tests/front-end/in-redeclare.slang b/tests/front-end/in-redeclare.slang new file mode 100644 index 0000000000..4c6de94a9e --- /dev/null +++ b/tests/front-end/in-redeclare.slang @@ -0,0 +1,11 @@ +//TEST:SIMPLE(filecheck=CHECK):-target spirv + +// CHECK: OpEntryPoint + +struct Foo{ float4 v; } + +[shader("vertex")] +float4 vert(in Foo in, in Foo o) : SV_Position +{ + return in.v; +} \ No newline at end of file From 524845651d72e78895ab5c34fadb17837e1dde15 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 12 Feb 2025 13:09:41 -0800 Subject: [PATCH 2/4] Fix. --- source/slang/slang-ast-support-types.h | 2 +- source/slang/slang-parser.cpp | 21 +++++++++++++++------ 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/source/slang/slang-ast-support-types.h b/source/slang/slang-ast-support-types.h index 94fae9d728..d240077216 100644 --- a/source/slang/slang-ast-support-types.h +++ b/source/slang/slang-ast-support-types.h @@ -1218,7 +1218,7 @@ enum class LookupMask : uint8_t Value = 0x4, Attribute = 0x8, SyntaxDecl = 0x10, - Default = type | Function | Value, + Default = type | Function | Value | SyntaxDecl, }; /// Flags for options to be used when looking up declarations diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 43d80ab5be..1530be1948 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -1091,7 +1091,10 @@ static Token peekToken(Parser* parser) return parser->tokenReader.peekToken(); } -static SyntaxDecl* tryLookUpSyntaxDecl(Parser* parser, Name* name) +static SyntaxDecl* tryLookUpSyntaxDecl( + Parser* parser, + Name* name, + LookupMask syntaxLookupMask = LookupMask::Default) { // Let's look up the name and see what we find. @@ -1100,7 +1103,7 @@ static SyntaxDecl* tryLookUpSyntaxDecl(Parser* parser, Name* name) nullptr, // no semantics visitor available yet name, parser->currentScope, - LookupMask::SyntaxDecl, + syntaxLookupMask, true); // If we didn't find anything, or the result was overloaded, @@ -1175,7 +1178,10 @@ bool tryParseUsingSyntaxDeclImpl(Parser* parser, SyntaxDecl* syntaxDecl, T** out } template -bool tryParseUsingSyntaxDecl(Parser* parser, T** outSyntax) +bool tryParseUsingSyntaxDecl( + Parser* parser, + T** outSyntax, + LookupMask syntaxLookupMask = LookupMask::Default) { if (peekTokenType(parser) != TokenType::Identifier) return false; @@ -1183,7 +1189,7 @@ bool tryParseUsingSyntaxDecl(Parser* parser, T** outSyntax) auto nameToken = peekToken(parser); auto name = nameToken.getName(); - auto syntaxDecl = tryLookUpSyntaxDecl(parser, name); + auto syntaxDecl = tryLookUpSyntaxDecl(parser, name, syntaxLookupMask); if (!syntaxDecl) return false; @@ -1212,7 +1218,10 @@ static Modifiers ParseModifiers(Parser* parser) Token nameToken = peekToken(parser); Modifier* parsedModifier = nullptr; - if (tryParseUsingSyntaxDecl(parser, &parsedModifier)) + if (tryParseUsingSyntaxDecl( + parser, + &parsedModifier, + LookupMask::SyntaxDecl)) { parsedModifier->keywordName = nameToken.getName(); if (!parsedModifier->loc.isValid()) @@ -4918,7 +4927,7 @@ static DeclBase* ParseDeclWithModifiers( // as a declaration keyword and parse a declaration using // its associated callback: Decl* parsedDecl = nullptr; - if (tryParseUsingSyntaxDecl(parser, &parsedDecl)) + if (tryParseUsingSyntaxDecl(parser, &parsedDecl, LookupMask::Default)) { decl = parsedDecl; break; From d9c993e8f102610776b46e74f1af1527b8a38b60 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 12 Feb 2025 15:42:10 -0800 Subject: [PATCH 3/4] Fix. --- source/slang-core-module/CMakeLists.txt | 2 +- source/slang/slang-parser.cpp | 9 +++------ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/source/slang-core-module/CMakeLists.txt b/source/slang-core-module/CMakeLists.txt index 0518908266..67b0e9af26 100644 --- a/source/slang-core-module/CMakeLists.txt +++ b/source/slang-core-module/CMakeLists.txt @@ -121,7 +121,7 @@ add_custom_command( slang-bootstrap -archive-type riff-lz4 -save-core-module-bin-source ${core_module_generated_header} -save-glsl-module-bin-source ${glsl_module_generated_header} - DEPENDS slang-bootstrap + DEPENDS slang-bootstrap slang-without-embedded-core-module VERBATIM ) # Add a target so that we can depend on the above step when we create the glsl diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 1530be1948..00cfd79b6e 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -1197,7 +1197,7 @@ bool tryParseUsingSyntaxDecl( return tryParseUsingSyntaxDeclImpl(parser, syntaxDecl, outSyntax); } -static Modifiers ParseModifiers(Parser* parser) +static Modifiers ParseModifiers(Parser* parser, LookupMask modifierLookupMask = LookupMask::Default) { Modifiers modifiers; Modifier** modifierLink = &modifiers.first; @@ -1218,10 +1218,7 @@ static Modifiers ParseModifiers(Parser* parser) Token nameToken = peekToken(parser); Modifier* parsedModifier = nullptr; - if (tryParseUsingSyntaxDecl( - parser, - &parsedModifier, - LookupMask::SyntaxDecl)) + if (tryParseUsingSyntaxDecl(parser, &parsedModifier, modifierLookupMask)) { parsedModifier->keywordName = nameToken.getName(); if (!parsedModifier->loc.isValid()) @@ -6302,7 +6299,7 @@ ExpressionStmt* Parser::ParseExpressionStatement() ParamDecl* Parser::ParseParameter() { ParamDecl* parameter = astBuilder->create(); - parameter->modifiers = ParseModifiers(this); + parameter->modifiers = ParseModifiers(this, LookupMask::SyntaxDecl); currentLookupScope = currentScope->parent; _parseTraditionalParamDeclCommonBase(this, parameter, kDeclaratorParseOption_AllowEmpty); resetLookupScope(); From a96b33423545dc5772451a47e5d0ae74ee39ab37 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 12 Feb 2025 15:45:52 -0800 Subject: [PATCH 4/4] Fix. --- source/slang/slang-parser.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 00cfd79b6e..82cb8caf3d 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -4259,7 +4259,7 @@ static ParamDecl* parseModernParamDecl(Parser* parser) // like `in`, `out`, and `in out`/`inout` be applied to the // type (after the colon). // - auto modifiers = ParseModifiers(parser); + auto modifiers = ParseModifiers(parser, LookupMask::SyntaxDecl); // We want to allow both "modern"-style and traditional-style // parameters to appear in any modern-style parameter list,