diff options
| -rw-r--r-- | source/slang/slang-check-decl.cpp | 47 | ||||
| -rw-r--r-- | source/slang/slang-diagnostic-defs.h | 6 | ||||
| -rw-r--r-- | tests/modules/extension-warning.slang | 10 | ||||
| -rw-r--r-- | tests/modules/implementing-with-ext.slang | 9 |
4 files changed, 64 insertions, 8 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp index 21a16cae5..da2300d8a 100644 --- a/source/slang/slang-check-decl.cpp +++ b/source/slang/slang-check-decl.cpp @@ -10589,6 +10589,7 @@ void SemanticsDeclHeaderVisitor::visitIncludeDecl(IncludeDecl* decl) if (fileDecl->members.getCount() == 0) return; + auto firstMember = fileDecl->members[0]; if (auto moduleDeclaration = as<ModuleDeclarationDecl>(firstMember)) { @@ -10610,6 +10611,7 @@ void SemanticsDeclHeaderVisitor::visitIncludeDecl(IncludeDecl* decl) auto moduleName = getSimpleModuleName(implementing->moduleNameAndLoc.name); auto expectedModuleName = moduleDecl->getName(); bool shouldSkipDiagnostic = false; + if (moduleDecl->members.getCount()) { if (auto moduleDeclarationDecl = as<ModuleDeclarationDecl>(moduleDecl->members[0])) @@ -10629,16 +10631,44 @@ void SemanticsDeclHeaderVisitor::visitIncludeDecl(IncludeDecl* decl) } } } - if (!shouldSkipDiagnostic && !moduleName.getUnownedSlice().caseInsensitiveEquals( - getText(expectedModuleName).getUnownedSlice())) + + if (!shouldSkipDiagnostic) { - getSink()->diagnose( - decl->moduleNameAndLoc.loc, - Diagnostics::includedFileDoesNotImplementCurrentModule, - expectedModuleName, - moduleName); - return; + // First check for the case when the user has put a file extension + // in the include path + String moduleNameStr = moduleName.getUnownedSlice(); + String expectedModuleNameStr = getText(expectedModuleName).getUnownedSlice(); + + // Check if module name has a source file extension + if (moduleNameStr.endsWith(".slang")) + { + String normalizedName = moduleNameStr.subString(0, moduleNameStr.getLength() - 6); + + // If the normalized name would match, emit warning but continue + if (normalizedName.getUnownedSlice().caseInsensitiveEquals( + expectedModuleNameStr.getUnownedSlice())) + { + getSink()->diagnose( + implementing->moduleNameAndLoc.loc, + Diagnostics::moduleImplementationHasFileExtension, + moduleNameStr, + normalizedName); + return; + } + } + + if (!moduleNameStr.getUnownedSlice().caseInsensitiveEquals( + expectedModuleNameStr.getUnownedSlice())) + { + getSink()->diagnose( + decl->moduleNameAndLoc.loc, + Diagnostics::includedFileDoesNotImplementCurrentModule, + expectedModuleName, + moduleName); + return; + } } + return; } @@ -10648,6 +10678,7 @@ void SemanticsDeclHeaderVisitor::visitIncludeDecl(IncludeDecl* decl) name); } + void SemanticsDeclScopeWiringVisitor::visitImplementingDecl(ImplementingDecl* decl) { // Don't need to do anything unless we are in a language server context. diff --git a/source/slang/slang-diagnostic-defs.h b/source/slang/slang-diagnostic-defs.h index 21bf73d6e..089b57c38 100644 --- a/source/slang/slang-diagnostic-defs.h +++ b/source/slang/slang-diagnostic-defs.h @@ -933,6 +933,12 @@ DIAGNOSTIC( implementingMustReferencePrimaryModuleFile, "the source file referenced by 'implementing' must be a primary module file starting with a " "'module' declaration.") +DIAGNOSTIC( + 30506, + Warning, + moduleImplementationHasFileExtension, + "implementing directive contains file extension in module name '$0'. Module names should not " + "include extensions. The compiler will use '$1' as the module name.") // Visibilty DIAGNOSTIC(30600, Error, declIsNotVisible, "'$0' is not accessible from the current context.") diff --git a/tests/modules/extension-warning.slang b/tests/modules/extension-warning.slang new file mode 100644 index 000000000..874211539 --- /dev/null +++ b/tests/modules/extension-warning.slang @@ -0,0 +1,10 @@ +//DIAGNOSTIC_TEST:SIMPLE(filecheck=CHECK): +module mymodule; + +// This tests the issue described here: https://github.com/shader-slang/slang/issues/5995 + +//CHECK: result code = 0 +//CHECK: tests/modules/implementing-with-ext.slang(1): warning 30506: implementing directive contains file extension in module name 'mymodule.slang'. Module names should not include extensions. The compiler will use 'mymodule' as the module name. +__include "implementing-with-ext"; + +int moduleFunction() { return 0; } diff --git a/tests/modules/implementing-with-ext.slang b/tests/modules/implementing-with-ext.slang new file mode 100644 index 000000000..4e399df7d --- /dev/null +++ b/tests/modules/implementing-with-ext.slang @@ -0,0 +1,9 @@ +implementing "mymodule.slang"; + +int helperFunction() { return 0; } + +void main() +{ + int x = moduleFunction(); + int y = helperFunction(); +} |
