mirror of
https://github.com/dlang/dmd.git
synced 2025-04-29 06:30:10 +03:00
Move Expression.checkValue to expressionsem.d (#20797)
This commit is contained in:
parent
acaa88abee
commit
17ad9f98a1
5 changed files with 70 additions and 80 deletions
|
@ -57,7 +57,7 @@ import dmd.dsymbolsem : dsymbolSemantic, checkDeprecated, aliasSemantic, search,
|
||||||
import dmd.errors;
|
import dmd.errors;
|
||||||
import dmd.errorsink;
|
import dmd.errorsink;
|
||||||
import dmd.expression;
|
import dmd.expression;
|
||||||
import dmd.expressionsem : resolveLoc, expressionSemantic, resolveProperties;
|
import dmd.expressionsem : resolveLoc, expressionSemantic, resolveProperties, checkValue;
|
||||||
import dmd.func;
|
import dmd.func;
|
||||||
import dmd.funcsem : functionSemantic, leastAsSpecialized, overloadApply;
|
import dmd.funcsem : functionSemantic, leastAsSpecialized, overloadApply;
|
||||||
import dmd.globals;
|
import dmd.globals;
|
||||||
|
|
|
@ -522,25 +522,6 @@ extern (C++) abstract class Expression : ASTNode
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************
|
|
||||||
* Check that the expression has a valid value.
|
|
||||||
* If not, generates an error "... has no value".
|
|
||||||
* Returns:
|
|
||||||
* true if the expression is not valid or has void type.
|
|
||||||
*/
|
|
||||||
bool checkValue()
|
|
||||||
{
|
|
||||||
if (type && type.toBasetype().ty == Tvoid)
|
|
||||||
{
|
|
||||||
error(loc, "expression `%s` is `void` and has no value", toChars());
|
|
||||||
//print(); assert(0);
|
|
||||||
if (!global.gag)
|
|
||||||
type = Type.terror;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************
|
/******************************
|
||||||
* Take address of expression.
|
* Take address of expression.
|
||||||
*/
|
*/
|
||||||
|
@ -2360,12 +2341,6 @@ extern (C++) final class TypeExp : Expression
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
override bool checkValue()
|
|
||||||
{
|
|
||||||
error(loc, "type `%s` has no value", toChars());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
override void accept(Visitor v)
|
override void accept(Visitor v)
|
||||||
{
|
{
|
||||||
v.visit(this);
|
v.visit(this);
|
||||||
|
@ -2419,12 +2394,6 @@ extern (C++) final class ScopeExp : Expression
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
override bool checkValue()
|
|
||||||
{
|
|
||||||
error(loc, "%s `%s` has no value", sds.kind(), sds.toChars());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
override void accept(Visitor v)
|
override void accept(Visitor v)
|
||||||
{
|
{
|
||||||
v.visit(this);
|
v.visit(this);
|
||||||
|
@ -2458,12 +2427,6 @@ extern (C++) final class TemplateExp : Expression
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
override bool checkValue()
|
|
||||||
{
|
|
||||||
error(loc, "%s `%s` has no value", td.kind(), toChars());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
override void accept(Visitor v)
|
override void accept(Visitor v)
|
||||||
{
|
{
|
||||||
v.visit(this);
|
v.visit(this);
|
||||||
|
@ -2746,16 +2709,6 @@ extern (C++) final class FuncExp : Expression
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
override bool checkValue()
|
|
||||||
{
|
|
||||||
if (td)
|
|
||||||
{
|
|
||||||
error(loc, "template lambda has no value");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
override void accept(Visitor v)
|
override void accept(Visitor v)
|
||||||
{
|
{
|
||||||
v.visit(this);
|
v.visit(this);
|
||||||
|
@ -3179,12 +3132,6 @@ extern (C++) final class DotTemplateExp : UnaExp
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
override bool checkValue()
|
|
||||||
{
|
|
||||||
error(loc, "%s `%s` has no value", td.kind(), toChars());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
override void accept(Visitor v)
|
override void accept(Visitor v)
|
||||||
{
|
{
|
||||||
v.visit(this);
|
v.visit(this);
|
||||||
|
@ -3263,18 +3210,6 @@ extern (C++) final class DotTemplateInstanceExp : UnaExp
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
override bool checkValue()
|
|
||||||
{
|
|
||||||
if (ti.tempdecl &&
|
|
||||||
ti.semantictiargsdone &&
|
|
||||||
ti.semanticRun == PASS.initial)
|
|
||||||
|
|
||||||
error(loc, "partial %s `%s` has no value", ti.kind(), toChars());
|
|
||||||
else
|
|
||||||
error(loc, "%s `%s` has no value", ti.kind(), ti.toChars());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
override void accept(Visitor v)
|
override void accept(Visitor v)
|
||||||
{
|
{
|
||||||
v.visit(this);
|
v.visit(this);
|
||||||
|
|
|
@ -101,7 +101,6 @@ public:
|
||||||
virtual StringExp *toStringExp();
|
virtual StringExp *toStringExp();
|
||||||
virtual bool isLvalue();
|
virtual bool isLvalue();
|
||||||
virtual bool checkType();
|
virtual bool checkType();
|
||||||
virtual bool checkValue();
|
|
||||||
Expression *addressOf();
|
Expression *addressOf();
|
||||||
Expression *deref();
|
Expression *deref();
|
||||||
|
|
||||||
|
@ -485,7 +484,6 @@ class TypeExp final : public Expression
|
||||||
public:
|
public:
|
||||||
TypeExp *syntaxCopy() override;
|
TypeExp *syntaxCopy() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor *v) override { v->visit(this); }
|
void accept(Visitor *v) override { v->visit(this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -496,7 +494,6 @@ public:
|
||||||
|
|
||||||
ScopeExp *syntaxCopy() override;
|
ScopeExp *syntaxCopy() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor *v) override { v->visit(this); }
|
void accept(Visitor *v) override { v->visit(this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -508,7 +505,6 @@ public:
|
||||||
|
|
||||||
bool isLvalue() override;
|
bool isLvalue() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor *v) override { v->visit(this); }
|
void accept(Visitor *v) override { v->visit(this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -608,7 +604,6 @@ public:
|
||||||
FuncExp *syntaxCopy() override;
|
FuncExp *syntaxCopy() override;
|
||||||
const char *toChars() const override;
|
const char *toChars() const override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
|
|
||||||
void accept(Visitor *v) override { v->visit(this); }
|
void accept(Visitor *v) override { v->visit(this); }
|
||||||
};
|
};
|
||||||
|
@ -752,7 +747,6 @@ public:
|
||||||
TemplateDeclaration *td;
|
TemplateDeclaration *td;
|
||||||
|
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor *v) override { v->visit(this); }
|
void accept(Visitor *v) override { v->visit(this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -773,7 +767,6 @@ public:
|
||||||
|
|
||||||
DotTemplateInstanceExp *syntaxCopy() override;
|
DotTemplateInstanceExp *syntaxCopy() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor *v) override { v->visit(this); }
|
void accept(Visitor *v) override { v->visit(this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14829,6 +14829,75 @@ private bool checkArithmeticBin(BinExp e)
|
||||||
return (e.e1.checkArithmetic(e.op) || e.e2.checkArithmetic(e.op));
|
return (e.e1.checkArithmetic(e.op) || e.e2.checkArithmetic(e.op));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
* Check that the expression has a valid value.
|
||||||
|
* If not, generates an error "... has no value".`
|
||||||
|
*
|
||||||
|
* Params:
|
||||||
|
* e = expression to check
|
||||||
|
*
|
||||||
|
* Returns:
|
||||||
|
* `true` if the expression is not valid or has `void` type.
|
||||||
|
*/
|
||||||
|
bool checkValue(Expression e)
|
||||||
|
{
|
||||||
|
if (auto te = e.isTypeExp())
|
||||||
|
{
|
||||||
|
error(e.loc, "type `%s` has no value", e.toChars());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto dtie = e.isDotTemplateInstanceExp())
|
||||||
|
{
|
||||||
|
if (dtie.ti.tempdecl &&
|
||||||
|
dtie.ti.semantictiargsdone &&
|
||||||
|
dtie.ti.semanticRun == PASS.initial)
|
||||||
|
|
||||||
|
error(e.loc, "partial %s `%s` has no value", dtie.ti.kind(), e.toChars());
|
||||||
|
else
|
||||||
|
error(e.loc, "%s `%s` has no value", dtie.ti.kind(), dtie.ti.toChars());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto se = e.isScopeExp())
|
||||||
|
{
|
||||||
|
error(e.loc, "%s `%s` has no value", se.sds.kind(), se.sds.toChars());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto te = e.isTemplateExp())
|
||||||
|
{
|
||||||
|
error(e.loc, "%s `%s` has no value", te.td.kind(), te.toChars());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto fe = e.isFuncExp())
|
||||||
|
{
|
||||||
|
if (fe.td)
|
||||||
|
{
|
||||||
|
error(e.loc, "template lambda has no value");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (auto dte = e.isDotTemplateExp())
|
||||||
|
{
|
||||||
|
error(e.loc, "%s `%s` has no value", dte.td.kind(), e.toChars());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (e.type && e.type.toBasetype().ty == Tvoid)
|
||||||
|
{
|
||||||
|
error(e.loc, "expression `%s` is `void` and has no value", e.toChars());
|
||||||
|
//print(); assert(0);
|
||||||
|
if (!global.gag)
|
||||||
|
e.type = Type.terror;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/***************************************
|
/***************************************
|
||||||
* If expression is shared, check that we can access it.
|
* If expression is shared, check that we can access it.
|
||||||
* Give error message if not.
|
* Give error message if not.
|
||||||
|
|
|
@ -2242,7 +2242,6 @@ public:
|
||||||
virtual StringExp* toStringExp();
|
virtual StringExp* toStringExp();
|
||||||
virtual bool isLvalue();
|
virtual bool isLvalue();
|
||||||
virtual bool checkType();
|
virtual bool checkType();
|
||||||
virtual bool checkValue();
|
|
||||||
Expression* addressOf();
|
Expression* addressOf();
|
||||||
Expression* deref();
|
Expression* deref();
|
||||||
int32_t isConst();
|
int32_t isConst();
|
||||||
|
@ -2749,7 +2748,6 @@ class DotTemplateExp final : public UnaExp
|
||||||
public:
|
public:
|
||||||
TemplateDeclaration* td;
|
TemplateDeclaration* td;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor* v) override;
|
void accept(Visitor* v) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2759,7 +2757,6 @@ public:
|
||||||
TemplateInstance* ti;
|
TemplateInstance* ti;
|
||||||
DotTemplateInstanceExp* syntaxCopy() override;
|
DotTemplateInstanceExp* syntaxCopy() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor* v) override;
|
void accept(Visitor* v) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3048,7 +3045,6 @@ public:
|
||||||
FuncExp* syntaxCopy() override;
|
FuncExp* syntaxCopy() override;
|
||||||
const char* toChars() const override;
|
const char* toChars() const override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor* v) override;
|
void accept(Visitor* v) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3366,7 +3362,6 @@ public:
|
||||||
ScopeDsymbol* sds;
|
ScopeDsymbol* sds;
|
||||||
ScopeExp* syntaxCopy() override;
|
ScopeExp* syntaxCopy() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor* v) override;
|
void accept(Visitor* v) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3565,7 +3560,6 @@ public:
|
||||||
FuncDeclaration* fd;
|
FuncDeclaration* fd;
|
||||||
bool isLvalue() override;
|
bool isLvalue() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor* v) override;
|
void accept(Visitor* v) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3609,7 +3603,6 @@ class TypeExp final : public Expression
|
||||||
public:
|
public:
|
||||||
TypeExp* syntaxCopy() override;
|
TypeExp* syntaxCopy() override;
|
||||||
bool checkType() override;
|
bool checkType() override;
|
||||||
bool checkValue() override;
|
|
||||||
void accept(Visitor* v) override;
|
void accept(Visitor* v) override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue