summaryrefslogtreecommitdiffstats
path: root/source/slang/check.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/check.cpp')
-rw-r--r--source/slang/check.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/source/slang/check.cpp b/source/slang/check.cpp
index 42bcfe4b5..7f91ac0c3 100644
--- a/source/slang/check.cpp
+++ b/source/slang/check.cpp
@@ -8635,6 +8635,42 @@ namespace Slang
SLANG_ASSERT(argIndex < globalGenericArgs.Count());
auto globalGenericArg = globalGenericArgs[argIndex];
+ // As a quick sanity check, see if the argument that is being supplied for a parameter
+ // is just the parameter itself, because this should always be an error:
+ //
+ if( auto argDeclRefType = globalGenericArg->As<DeclRefType>() )
+ {
+ auto argDeclRef = argDeclRefType->declRef;
+ if(auto argGenericParamDeclRef = argDeclRef.As<GlobalGenericParamDecl>())
+ {
+ if(argGenericParamDeclRef.getDecl() == globalGenericParam)
+ {
+ // We are trying to specialize a generic parameter using itself.
+ sink->diagnose(globalGenericParam,
+ Diagnostics::cannotSpecializeGlobalGenericToItself,
+ globalGenericParam->getName());
+ sink->diagnose(entryPointFuncDecl,
+ Diagnostics::noteWhenCompilingEntryPoint,
+ entryPointFuncDecl->getName());
+ continue;
+ }
+ else
+ {
+ // We are trying to specialize a generic parameter using a *different*
+ // global generic type parameter.
+ sink->diagnose(globalGenericParam,
+ Diagnostics::cannotSpecializeGlobalGenericToAnotherGenericParam,
+ globalGenericParam->getName(),
+ argGenericParamDeclRef.GetName());
+ sink->diagnose(entryPointFuncDecl,
+ Diagnostics::noteWhenCompilingEntryPoint,
+ entryPointFuncDecl->getName());
+ continue;
+ }
+ }
+ }
+
+
// Create a substitution for this parameter/argument.
RefPtr<GlobalGenericParamSubstitution> subst = new GlobalGenericParamSubstitution();
subst->paramDecl = globalGenericParam;