Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/src/build.d
Original file line number Diff line number Diff line change
Expand Up @@ -1592,6 +1592,7 @@ auto sourceFiles()
visitor/strict.d visitor/transitive.d
cparse.d
dfa/entry.d dfa/utils.d dfa/fast/structure.d dfa/fast/analysis.d dfa/fast/report.d dfa/fast/expression.d dfa/fast/statement.d
lint/engine.d
"),
backendHeaders: fileArray(env["C"], "
cc.d cdef.d cgcv.d code.d dt.d el.d global.d
Expand Down
65 changes: 65 additions & 0 deletions compiler/src/dmd/frontend.h
Original file line number Diff line number Diff line change
Expand Up @@ -3772,6 +3772,7 @@ class FuncDeclaration : public Declaration
AttributeViolation* pureViolation;
AttributeViolation* nothrowViolation;
ParametersDFAInfo* parametersDFAInfo;
void* lintInfo;
bool purityInprocess() const;
bool purityInprocess(bool v);
bool safetyInprocess() const;
Expand Down Expand Up @@ -5942,6 +5943,29 @@ enum class CPU : uint8_t
native = 12u,
};

enum class LintFlags : uint32_t
{
none = 0u,
constSpecial = 1u,
unusedParams = 2u,
all = 4294967295u,
};

struct TrackedParam final
{
VarDeclaration* decl;
bool used;
TrackedParam() :
decl(),
used()
{
}
TrackedParam(VarDeclaration* decl, bool used = false) :
decl(decl),
used(used)
{}
};

enum class ErrorPrintMode : uint8_t
{
simpleError = 0u,
Expand Down Expand Up @@ -7871,6 +7895,40 @@ class StatementWalker : public SemanticTimeTransitiveVisitor
void visit(Statement* st) final override;
};

class LintVisitor final : public Visitor
{
public:
using Visitor::visit;
_d_dynamicArray< LintFlags > flagsStack;
_d_dynamicArray< TrackedParam > activeParams;
LintVisitor();
LintFlags currentFlags();
void visit(Dsymbol* s) override;
void visit(Statement* s) override;
void visit(Expression* e) override;
void visit(Initializer* i) override;
void visit(DeclarationExp* de) override;
void visit(Module* m) override;
void visit(AttribDeclaration* ad) override;
void visit(PragmaDeclaration* pd) override;
void visit(PragmaStatement* ps) override;
void visit(AggregateDeclaration* ad) override;
void visit(TemplateInstance* ti) override;
void visit(FuncDeclaration* fd) override;
void visit(VarExp* ve) override;
void visit(CompoundStatement* s) override;
void visit(ExpStatement* s) override;
void visit(IfStatement* s) override;
void visit(ReturnStatement* s) override;
void visit(ForStatement* s) override;
void visit(BinExp* e) override;
void visit(UnaExp* e) override;
void visit(CallExp* e) override;
void visit(VarDeclaration* vd) override;
void visit(ExpInitializer* ei) override;
void visit(FuncExp* fe) override;
};

extern _d_real creall(complex_t x);

extern _d_real cimagl(complex_t x);
Expand Down Expand Up @@ -8871,6 +8929,13 @@ struct Id final
static Identifier* ident;
static Identifier* packed;
static Identifier* op;
static Identifier* lint;
static Identifier* constSpecial;
static Identifier* unusedParams;
static Identifier* LintParams;
static Identifier* enabled;
static Identifier* none;
static Identifier* all;
static void initialize();
Id()
{
Expand Down
2 changes: 2 additions & 0 deletions compiler/src/dmd/func.d
Original file line number Diff line number Diff line change
Expand Up @@ -302,6 +302,8 @@ extern (C++) class FuncDeclaration : Declaration

ParametersDFAInfo* parametersDFAInfo;

void* lintInfo;

/// See the `FUNCFLAG` struct
import dmd.common.bitfields;
mixin(generateBitFields!(FUNCFLAG, uint));
Expand Down
9 changes: 9 additions & 0 deletions compiler/src/dmd/id.d
Original file line number Diff line number Diff line change
Expand Up @@ -539,6 +539,15 @@ immutable Msgtable[] msgtable =

// for inline assembler
{ "op" },
// lint
{ "lint" },
{ "constSpecial" },
{ "unusedParams" },
{ "LintParams" },
{ "enabled" },
{ "none" },
{ "all" },

];


Expand Down
Loading
Loading