summaryrefslogtreecommitdiff
path: root/source/slang/slang-check-decl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-decl.cpp')
-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());