From f217a7d312b662d1dc8499c55898231abc6ec7ea Mon Sep 17 00:00:00 2001 From: Aleksandr Kirsanov Date: Thu, 2 May 2024 20:54:07 +0300 Subject: [PATCH] [FunC] Forbid auto-creating undefined symbols --- crypto/func/auto-tests/legacy_tests.jsonl | 3 ++- .../legacy_tests/whales-nominators/nominators.fc | 2 +- crypto/func/auto-tests/tests/invalid-undef-1.fc | 12 ++++++++++++ crypto/func/auto-tests/tests/invalid-undef-2.fc | 10 ++++++++++ crypto/func/auto-tests/tests/invalid-undef-3.fc | 10 ++++++++++ crypto/func/func.cpp | 3 +-- crypto/func/parse-func.cpp | 16 ++++------------ 7 files changed, 40 insertions(+), 16 deletions(-) create mode 100644 crypto/func/auto-tests/tests/invalid-undef-1.fc create mode 100644 crypto/func/auto-tests/tests/invalid-undef-2.fc create mode 100644 crypto/func/auto-tests/tests/invalid-undef-3.fc diff --git a/crypto/func/auto-tests/legacy_tests.jsonl b/crypto/func/auto-tests/legacy_tests.jsonl index 0075bf83..c5eae136 100644 --- a/crypto/func/auto-tests/legacy_tests.jsonl +++ b/crypto/func/auto-tests/legacy_tests.jsonl @@ -28,7 +28,8 @@ ["jetton-minter/jetton-minter.fc", 9028309926287301331466371999814928201427184114165428257502393474125007156494] ["gg-marketplace/nft-marketplace-v2.fc", 92199806964112524639740773542356508485601908152150843819273107618799016205930] ["jetton-wallet/jetton-wallet.fc", 86251125787443633057458168028617933212663498001665054651523310772884328206542] -["whales-nominators/nominators.fc", 8941364499854379927692172316865293429893094891593442801401542636695127885153] +// (May 2024) reordered includes, they were in a wrong order +["whales-nominators/nominators.fc", 64989185004203073400683226767264384908045055609681310145961012819587514238303] // (April 2024) tact hashes changed, because '__tact_address_eq()' is now inlined as a wrapper diff --git a/crypto/func/auto-tests/legacy_tests/whales-nominators/nominators.fc b/crypto/func/auto-tests/legacy_tests/whales-nominators/nominators.fc index 8dee4e5e..198bb6d2 100644 --- a/crypto/func/auto-tests/legacy_tests/whales-nominators/nominators.fc +++ b/crypto/func/auto-tests/legacy_tests/whales-nominators/nominators.fc @@ -8,8 +8,8 @@ #include "modules/store-validator.fc"; #include "modules/model.fc"; #include "modules/op-controller.fc"; -#include "modules/op-owner.fc"; #include "modules/op-common.fc"; +#include "modules/op-owner.fc"; #include "modules/op-nominators.fc"; #include "modules/get.fc"; diff --git a/crypto/func/auto-tests/tests/invalid-undef-1.fc b/crypto/func/auto-tests/tests/invalid-undef-1.fc new file mode 100644 index 00000000..bb20d12c --- /dev/null +++ b/crypto/func/auto-tests/tests/invalid-undef-1.fc @@ -0,0 +1,12 @@ +int main(int x) { + return 1 + demo(); +} + +int demo() { + return 2; +} + +{- +@compilation_should_fail +@stderr undefined symbol `demo` +-} diff --git a/crypto/func/auto-tests/tests/invalid-undef-2.fc b/crypto/func/auto-tests/tests/invalid-undef-2.fc new file mode 100644 index 00000000..8313c6d1 --- /dev/null +++ b/crypto/func/auto-tests/tests/invalid-undef-2.fc @@ -0,0 +1,10 @@ +int main(int x) { + return 1 + demo; +} + +global int demo; + +{- +@compilation_should_fail +@stderr undefined symbol `demo` +-} diff --git a/crypto/func/auto-tests/tests/invalid-undef-3.fc b/crypto/func/auto-tests/tests/invalid-undef-3.fc new file mode 100644 index 00000000..81bccfda --- /dev/null +++ b/crypto/func/auto-tests/tests/invalid-undef-3.fc @@ -0,0 +1,10 @@ +int demo(int x); + +int main(int x) { + return 1 + demo(x); +} + +{- +@compilation_should_fail +@stderr function `demo` is just declared, not implemented +-} diff --git a/crypto/func/func.cpp b/crypto/func/func.cpp index 42cea251..d2bc8835 100644 --- a/crypto/func/func.cpp +++ b/crypto/func/func.cpp @@ -107,8 +107,7 @@ void generate_output_func(SymDef* func_sym, std::ostream &outs, std::ostream &er errs << "\n\n=========================\nfunction " << name << " : " << func_val->get_type() << std::endl; } if (!func_val->code) { - errs << "( function `" << name << "` undefined )\n"; - throw src::ParseError(func_sym->loc, name); + throw src::ParseError(func_sym->loc, "function `" + name + "` is just declared, not implemented"); } else { CodeBlob& code = *(func_val->code); if (verbosity >= 3) { diff --git a/crypto/func/parse-func.cpp b/crypto/func/parse-func.cpp index abba6068..6e11b54c 100644 --- a/crypto/func/parse-func.cpp +++ b/crypto/func/parse-func.cpp @@ -396,19 +396,11 @@ SymValCodeFunc* make_new_glob_func(SymDef* func_sym, TypeExpr* func_type, bool i return res; } -bool check_global_func(const Lexem& cur, sym_idx_t func_name = 0) { - if (!func_name) { - func_name = cur.val; - } +bool check_global_func(const Lexem& cur, sym_idx_t func_name) { SymDef* def = sym::lookup_symbol(func_name); if (!def) { - cur.loc.show_error(std::string{"undefined function `"} + symbols.get_name(func_name) + - "`, defining a global function of unknown type"); - def = sym::define_global_symbol(func_name, 0, cur.loc); - func_assert(def && "cannot define global function"); - ++undef_func_cnt; - make_new_glob_func(def, TypeExpr::new_func()); // was: ... ::new_func() - return true; + cur.error("undefined symbol `" + symbols.get_name(func_name) + "`"); + return false; } SymVal* val = dynamic_cast(def->value); if (!val) { @@ -652,7 +644,7 @@ Expr* parse_expr100(Lexer& lex, CodeBlob& code, bool nv) { // std::cerr << "defined new variable " << lex.cur().str << " : " << res->e_type << std::endl; } else { if (!sym) { - check_global_func(lex.cur()); + check_global_func(lex.cur(), lex.cur().val); sym = sym::lookup_symbol(lex.cur().val); } res->sym = sym;