summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorTim Foley <tim.foley.is@gmail.com>2017-08-15 11:09:03 -0700
committerGitHub <noreply@github.com>2017-08-15 11:09:03 -0700
commite6abc6821a1bf13a9826e7db74362ce34ccaca2a (patch)
tree34d2ad3937c3986dfa7ce8d660cf902c19315581 /source
parent4a9b281c154422cdef03ef629718a458f753093f (diff)
parentf64bbf712e4e0719604d1e6728eef74539c9ceda (diff)
Merge pull request #162 from tfoleyNV/gh-38
Improve diagnostics for overlapping/conflicting bindings
Diffstat (limited to 'source')
-rw-r--r--source/slang/diagnostic-defs.h8
-rw-r--r--source/slang/diagnostics.cpp9
-rw-r--r--source/slang/parameter-binding.cpp14
-rw-r--r--source/slangc/main.cpp10
4 files changed, 29 insertions, 12 deletions
diff --git a/source/slang/diagnostic-defs.h b/source/slang/diagnostic-defs.h
index 17af6cbbb..a748b39bd 100644
--- a/source/slang/diagnostic-defs.h
+++ b/source/slang/diagnostic-defs.h
@@ -39,6 +39,10 @@ DIAGNOSTIC(-1, Note, seePreviousDefinition, "see previous definition")
DIAGNOSTIC(-1, Note, seePreviousDefinitionOf, "see previous definition of '$0'")
DIAGNOSTIC(-1, Note, seeRequirementDeclaration, "see requirement declaration")
DIAGNOSTIC(-1, Note, doYouForgetToMakeComponentAccessible, "do you forget to make component '$0' acessible from '$1' (missing public qualifier)?")
+
+DIAGNOSTIC(-1, Note, seeDeclarationOf, "see declaration of '$0'")
+DIAGNOSTIC(-1, Note, seeOtherDeclarationOf, "see other declaration of '$0'")
+
//
// 0xxxx - Command line and interaction with host platform APIs.
//
@@ -301,8 +305,8 @@ DIAGNOSTIC(39999, Error, tooManyArguments, "too many arguments to call (got $0,
DIAGNOSTIC(39999, Error, invalidIntegerLiteralSuffix, "invalid suffix '$0' on integer literal")
DIAGNOSTIC(39999, Error, invalidFloatingPOintLiteralSuffix, "invalid suffix '$0' on floating-point literal")
-DIAGNOSTIC(39999, Error, conflictingExplicitBindingsForParameter, "conflicting explicit bindings for parameter '$0'")
-DIAGNOSTIC(39999, Error, parameterBindingsOverlap, "explicit parameter bindings overlap for parameters '$0' and '$1'")
+DIAGNOSTIC(39999, Error, conflictingExplicitBindingsForParameter, "conflicting explicit bindings for parameter '$0'")
+DIAGNOSTIC(39999, Warning, parameterBindingsOverlap, "explicit binding for parameter '$0' overlaps with parameter '$1'")
//
// 4xxxx - IL code generation.
diff --git a/source/slang/diagnostics.cpp b/source/slang/diagnostics.cpp
index 45adf0ad8..65161db1d 100644
--- a/source/slang/diagnostics.cpp
+++ b/source/slang/diagnostics.cpp
@@ -162,8 +162,13 @@ static void formatDiagnostic(
sb << humaneLoc.line;
sb << "): ";
sb << getSeverityName(diagnostic.severity);
- sb << " ";
- sb << diagnostic.ErrorID;
+
+ if( diagnostic.ErrorID >= 0 )
+ {
+ sb << " ";
+ sb << diagnostic.ErrorID;
+ }
+
sb << ": ";
sb << diagnostic.Message;
sb << "\n";
diff --git a/source/slang/parameter-binding.cpp b/source/slang/parameter-binding.cpp
index 757662101..a00520c05 100644
--- a/source/slang/parameter-binding.cpp
+++ b/source/slang/parameter-binding.cpp
@@ -735,6 +735,7 @@ static RefPtr<UsedRangeSet> findUsedRangeSetForTranslationUnit(
static void addExplicitParameterBinding(
ParameterBindingContext* context,
RefPtr<ParameterInfo> parameterInfo,
+ VarDeclBase* varDecl,
LayoutSemanticInfo const& semanticInfo,
UInt count,
RefPtr<UsedRangeSet> usedRangeSet = nullptr)
@@ -751,8 +752,13 @@ static void addExplicitParameterBinding(
|| bindingInfo.index != semanticInfo.index
|| bindingInfo.space != semanticInfo.space )
{
+ getSink(context)->diagnose(varDecl, Diagnostics::conflictingExplicitBindingsForParameter, getReflectionName(varDecl));
+
auto firstVarDecl = parameterInfo->varLayouts[0]->varDecl.getDecl();
- getSink(context)->diagnose(firstVarDecl, Diagnostics::conflictingExplicitBindingsForParameter, getReflectionName(firstVarDecl));
+ if( firstVarDecl != varDecl )
+ {
+ getSink(context)->diagnose(firstVarDecl, Diagnostics::seeOtherDeclarationOf, getReflectionName(firstVarDecl));
+ }
}
// TODO(tfoley): `register` semantics can technically be
@@ -781,6 +787,8 @@ static void addExplicitParameterBinding(
getSink(context)->diagnose(paramA, Diagnostics::parameterBindingsOverlap,
getReflectionName(paramA),
getReflectionName(paramB));
+
+ getSink(context)->diagnose(paramB, Diagnostics::seeDeclarationOf, getReflectionName(paramB));
}
}
}
@@ -822,7 +830,7 @@ static void addExplicitParameterBindings_HLSL(
// TODO: warning here!
}
- addExplicitParameterBinding(context, parameterInfo, semanticInfo, count);
+ addExplicitParameterBinding(context, parameterInfo, varDecl, semanticInfo, count);
}
}
@@ -888,7 +896,7 @@ static void addExplicitParameterBindings_GLSL(
auto count = resInfo->count;
semanticInfo.kind = kind;
- addExplicitParameterBinding(context, parameterInfo, semanticInfo, int(count), usedRangeSet);
+ addExplicitParameterBinding(context, parameterInfo, varDecl, semanticInfo, int(count), usedRangeSet);
}
// Given a single parameter, collect whatever information we have on
diff --git a/source/slangc/main.cpp b/source/slangc/main.cpp
index 6fb394cce..da670909d 100644
--- a/source/slangc/main.cpp
+++ b/source/slangc/main.cpp
@@ -34,6 +34,11 @@ int MAIN(int argc, char** argv)
SlangSession* session = spCreateSession(nullptr);
SlangCompileRequest* compileRequest = spCreateCompileRequest(session);
+ spSetDiagnosticCallback(
+ compileRequest,
+ &diagnosticCallback,
+ nullptr);
+
spSetCommandLineCompilerMode(compileRequest);
char const* appName = "slangc";
@@ -46,11 +51,6 @@ int MAIN(int argc, char** argv)
exit(1);
}
- spSetDiagnosticCallback(
- compileRequest,
- &diagnosticCallback,
- nullptr);
-
// Invoke the compiler
#ifndef _DEBUG