Fix noreturn discard warning (#887)

Fixes https://github.com/dlang-community/D-Scanner/issues/886
This commit is contained in:
Zachary Yedidia 2023-01-31 13:16:48 -08:00 committed by GitHub
parent e94c4fad77
commit 40235d3f9d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 15 additions and 0 deletions

View File

@ -37,12 +37,16 @@ private:
public: public:
const(DSymbol)* void_; const(DSymbol)* void_;
const(DSymbol)* noreturn_;
/// ///
this(string fileName, const(Scope)* sc, bool skipTests = false) this(string fileName, const(Scope)* sc, bool skipTests = false)
{ {
super(fileName, sc, skipTests); super(fileName, sc, skipTests);
void_ = sc.getSymbolsByName(internString("void"))[0]; 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) override void visit(const(ExpressionStatement) decl)
@ -85,6 +89,8 @@ public:
return; return;
if (sym.type is void_) if (sym.type is void_)
return; return;
if (noreturn_ && sym.type is noreturn_)
return;
} }
addErrorMessage(decl.expression.line, decl.expression.column, KEY, MSG); addErrorMessage(decl.expression.line, decl.expression.column, KEY, MSG);
@ -109,6 +115,15 @@ unittest
} }
}c, sac); }c, sac);
assertAnalyzerWarnings(q{
alias noreturn = typeof(*null);
noreturn fun() { while (1) {} }
noreturn main()
{
fun();
}
}c, sac);
assertAnalyzerWarnings(q{ assertAnalyzerWarnings(q{
int fun() { return 1; } int fun() { return 1; }
void main() void main()