mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
Allow constants with the same name and value (#462)
Co-authored-by: legaii <jgates.ardux@gmail.com>
This commit is contained in:
parent
2512f0287b
commit
3b1d33f543
2 changed files with 30 additions and 6 deletions
|
@ -254,9 +254,7 @@ void parse_const_decl(Lexer& lex) {
|
|||
if (!sym_def) {
|
||||
lex.cur().error_at("cannot define global symbol `", "`");
|
||||
}
|
||||
if (sym_def->value) {
|
||||
lex.cur().error_at("global symbol `", "` already exists");
|
||||
}
|
||||
Lexem ident = lex.cur();
|
||||
lex.next();
|
||||
if (lex.tp() != '=') {
|
||||
lex.cur().error_at("expected = instead of ", "");
|
||||
|
@ -273,10 +271,11 @@ void parse_const_decl(Lexer& lex) {
|
|||
if ((wanted_type != Expr::_None) && (x->cls != wanted_type)) {
|
||||
lex.cur().error("expression type does not match wanted type");
|
||||
}
|
||||
SymValConst* new_value = nullptr;
|
||||
if (x->cls == Expr::_Const) { // Integer constant
|
||||
sym_def->value = new SymValConst{const_cnt++, x->intval};
|
||||
new_value = new SymValConst{const_cnt++, x->intval};
|
||||
} else if (x->cls == Expr::_SliceConst) { // Slice constant (string)
|
||||
sym_def->value = new SymValConst{const_cnt++, x->strval};
|
||||
new_value = new SymValConst{const_cnt++, x->strval};
|
||||
} else if (x->cls == Expr::_Apply) {
|
||||
code.emplace_back(loc, Op::_Import, std::vector<var_idx_t>());
|
||||
auto tmp_vars = x->pre_compile(code);
|
||||
|
@ -304,10 +303,20 @@ void parse_const_decl(Lexer& lex) {
|
|||
if (op.origin.is_null() || !op.origin->is_valid()) {
|
||||
lex.cur().error("precompiled expression did not result in a valid integer constant");
|
||||
}
|
||||
sym_def->value = new SymValConst{const_cnt++, op.origin};
|
||||
new_value = new SymValConst{const_cnt++, op.origin};
|
||||
} else {
|
||||
lex.cur().error("integer or slice literal or constant expected");
|
||||
}
|
||||
if (sym_def->value) {
|
||||
SymValConst* old_value = dynamic_cast<SymValConst*>(sym_def->value);
|
||||
Keyword new_type = new_value->get_type();
|
||||
if (!old_value || old_value->get_type() != new_type ||
|
||||
(new_type == _Int && *old_value->get_int_value() != *new_value->get_int_value()) ||
|
||||
(new_type == _Slice && old_value->get_str_value() != new_value->get_str_value())) {
|
||||
ident.error_at("global symbol `", "` already exists");
|
||||
}
|
||||
}
|
||||
sym_def->value = new_value;
|
||||
}
|
||||
|
||||
FormalArgList parse_formal_args(Lexer& lex) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue