summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2020-04-21 17:16:22 -0400
committerGitHub <noreply@github.com>2020-04-21 14:16:22 -0700
commit2c55d3736a3ee933adf684a146135d9086b8b94f (patch)
treec5353a9f3656f27bdbd1896d20b968273632d032 /source
parent77d59713ac665785b7ebee4ad2b5dcbb73cf5af5 (diff)
Fix for a generic definition, followed by a declaration with target intrisic causing a crash (#1329)
* * Make a 'definition' if a function has a body or a target intrinsic defined * Added test for this situation. * Fix tab. * Fix single-target-intrisic.slang expected output. Co-authored-by: Tim Foley <tfoleyNV@users.noreply.github.com>
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-check-decl.cpp19
1 files changed, 18 insertions, 1 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index d028ebfe4..d6d115859 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -2382,6 +2382,23 @@ namespace Slang
return subst;
}
+ // For simplicity we will make having a definition of a function include having a body or a target intrinsics defined.
+ // It may be useful to add other modifiers to mark as having body - for example perhaps
+ // any target intrinsic modifier (like SPIR-V version) should be included.
+ //
+ // Note that not having this check around TargetIntrinsicModifier can lead to a crash in the compiler
+ // with a definition, followed by a declaration with a target intrinsic.
+ // That this doesn't appear to be the case with other modifiers.
+ // TODO:
+ // We may want to be able to add target intrinsics with other declarations, that being the case this logic
+ // would need to change.
+ // We might also want are more precise error that pointed out the actually problem - because strictly speaking
+ // having a target intrinsic isn't a 'body'.
+ bool _isDefinition(FuncDecl* decl)
+ {
+ return decl->Body || decl->HasModifier<TargetIntrinsicModifier>();
+ }
+
Result SemanticsVisitor::checkFuncRedeclaration(
FuncDecl* newDecl,
FuncDecl* oldDecl)
@@ -2555,7 +2572,7 @@ namespace Slang
// If both of the declarations have a body, then there
// is trouble, because we wouldn't know which one to
// use during code generation.
- if (newDecl->Body && oldDecl->Body)
+ if (_isDefinition(newDecl) && _isDefinition(oldDecl))
{
// Redefinition
getSink()->diagnose(newDecl, Diagnostics::functionRedefinition, newDecl->getName());