From 40235d3f9d81fab0d185fff4604442d151f6d021 Mon Sep 17 00:00:00 2001 From: Zachary Yedidia Date: Tue, 31 Jan 2023 13:16:48 -0800 Subject: [PATCH] Fix noreturn discard warning (#887) Fixes https://github.com/dlang-community/D-Scanner/issues/886 --- src/dscanner/analysis/unused_result.d | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/dscanner/analysis/unused_result.d b/src/dscanner/analysis/unused_result.d index b1e987b..85f34a4 100644 --- a/src/dscanner/analysis/unused_result.d +++ b/src/dscanner/analysis/unused_result.d @@ -37,12 +37,16 @@ private: public: const(DSymbol)* void_; + const(DSymbol)* noreturn_; /// this(string fileName, const(Scope)* sc, bool skipTests = false) { super(fileName, sc, skipTests); void_ = sc.getSymbolsByName(internString("void"))[0]; + auto symbols = sc.getSymbolsByName(internString("noreturn")); + if (symbols.length > 0) + noreturn_ = symbols[0]; } override void visit(const(ExpressionStatement) decl) @@ -85,6 +89,8 @@ public: return; if (sym.type is void_) return; + if (noreturn_ && sym.type is noreturn_) + return; } addErrorMessage(decl.expression.line, decl.expression.column, KEY, MSG); @@ -109,6 +115,15 @@ unittest } }c, sac); + assertAnalyzerWarnings(q{ + alias noreturn = typeof(*null); + noreturn fun() { while (1) {} } + noreturn main() + { + fun(); + } + }c, sac); + assertAnalyzerWarnings(q{ int fun() { return 1; } void main()