From 0c366bc0a4332ee14d08f2555396a18cb64229fa Mon Sep 17 00:00:00 2001 From: Yong He Date: Tue, 15 Aug 2023 20:30:01 -0700 Subject: Fix a bug that warning 39001 can't be fully disabled. (#3112) Co-authored-by: Yong He --- source/compiler-core/slang-diagnostic-sink.cpp | 9 +++++---- source/compiler-core/slang-diagnostic-sink.h | 18 ++++++++++-------- source/slang/slang-parameter-binding.cpp | 6 +++--- 3 files changed, 18 insertions(+), 15 deletions(-) (limited to 'source') diff --git a/source/compiler-core/slang-diagnostic-sink.cpp b/source/compiler-core/slang-diagnostic-sink.cpp index a8d981545..2d3f34c5c 100644 --- a/source/compiler-core/slang-diagnostic-sink.cpp +++ b/source/compiler-core/slang-diagnostic-sink.cpp @@ -550,7 +550,7 @@ SlangResult DiagnosticSink::getBlobIfNeeded(ISlangBlob** outBlob) return SLANG_OK; } -void DiagnosticSink::diagnoseImpl(DiagnosticInfo const& info, const UnownedStringSlice& formattedMessage) +bool DiagnosticSink::diagnoseImpl(DiagnosticInfo const& info, const UnownedStringSlice& formattedMessage) { if (info.severity >= Severity::Error) { @@ -576,6 +576,7 @@ void DiagnosticSink::diagnoseImpl(DiagnosticInfo const& info, const UnownedStrin // TODO: figure out a better policy for aborting compilation SLANG_ABORT_COMPILATION(""); } + return true; } Severity DiagnosticSink::getEffectiveMessageSeverity(DiagnosticInfo const& info) @@ -598,13 +599,13 @@ Severity DiagnosticSink::getEffectiveMessageSeverity(DiagnosticInfo const& info) return effectiveSeverity; } -void DiagnosticSink::diagnoseImpl(SourceLoc const& pos, DiagnosticInfo info, int argCount, DiagnosticArg const* args) +bool DiagnosticSink::diagnoseImpl(SourceLoc const& pos, DiagnosticInfo info, int argCount, DiagnosticArg const* args) { // Override the severity in the 'info' structure to pass it further into formatDiagnostics info.severity = getEffectiveMessageSeverity(info); if (info.severity == Severity::Disable) - return; + return false; StringBuilder messageBuilder; { @@ -621,7 +622,7 @@ void DiagnosticSink::diagnoseImpl(SourceLoc const& pos, DiagnosticInfo info, int formatDiagnostic(this, diagnostic, messageBuilder); } - diagnoseImpl(info, messageBuilder.getUnownedSlice()); + return diagnoseImpl(info, messageBuilder.getUnownedSlice()); } void DiagnosticSink::diagnoseRaw( diff --git a/source/compiler-core/slang-diagnostic-sink.h b/source/compiler-core/slang-diagnostic-sink.h index fc5e31b47..1969e66b6 100644 --- a/source/compiler-core/slang-diagnostic-sink.h +++ b/source/compiler-core/slang-diagnostic-sink.h @@ -163,30 +163,31 @@ public: SLANG_FORCE_INLINE int getErrorCount() { return m_errorCount; } template - void diagnose(P const& pos, DiagnosticInfo const& info, Args const&... args ) + bool diagnose(P const& pos, DiagnosticInfo const& info, Args const&... args ) { DiagnosticArg as[] = { DiagnosticArg(args)... }; - diagnoseImpl(getDiagnosticPos(pos), info, sizeof...(args), as); + return diagnoseImpl(getDiagnosticPos(pos), info, sizeof...(args), as); } template - void diagnose(P const& pos, DiagnosticInfo const& info) + bool diagnose(P const& pos, DiagnosticInfo const& info) { // MSVC gets upset with the zero sized array above, so overload that case here - diagnoseImpl(getDiagnosticPos(pos), info, 0, nullptr); + return diagnoseImpl(getDiagnosticPos(pos), info, 0, nullptr); } // Useful for notes on existing diagnostics, where it would be redundant to display the same line again. // (Ideally we would print the error/warning and notes in one call...) template - void diagnoseWithoutSourceView(P const& pos, DiagnosticInfo const& info, Args const&... args ) + bool diagnoseWithoutSourceView(P const& pos, DiagnosticInfo const& info, Args const&... args ) { const auto fs = this->getFlags(); this->resetFlag(Flag::SourceLocationLine); - diagnose(pos, info, args...); + auto result = diagnose(pos, info, args...); this->setFlags(fs); + return result; } // Add a diagnostic with raw text @@ -259,8 +260,9 @@ public: ISlangWriter* writer = nullptr; protected: - void diagnoseImpl(SourceLoc const& pos, DiagnosticInfo info, int argCount, DiagnosticArg const* args); - void diagnoseImpl(DiagnosticInfo const& info, const UnownedStringSlice& formattedMessage); + // Returns true if a diagnostic is actually written. + bool diagnoseImpl(SourceLoc const& pos, DiagnosticInfo info, int argCount, DiagnosticArg const* args); + bool diagnoseImpl(DiagnosticInfo const& info, const UnownedStringSlice& formattedMessage); Severity getEffectiveMessageSeverity(DiagnosticInfo const& info); diff --git a/source/slang/slang-parameter-binding.cpp b/source/slang/slang-parameter-binding.cpp index f9e2433cf..7d7cfeefe 100644 --- a/source/slang/slang-parameter-binding.cpp +++ b/source/slang/slang-parameter-binding.cpp @@ -946,11 +946,11 @@ static void addExplicitParameterBinding( } else { - getSink(context)->diagnose(paramA, diagnosticInfo, + bool written = getSink(context)->diagnose(paramA, diagnosticInfo, getReflectionName(paramA), getReflectionName(paramB)); - - getSink(context)->diagnose(paramB, Diagnostics::seeDeclarationOf, getReflectionName(paramB)); + if (written) + getSink(context)->diagnose(paramB, Diagnostics::seeDeclarationOf, getReflectionName(paramB)); } } } -- cgit v1.2.3