From 220cb1f7bbf6405117b953526c50a21a5ef5788f Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Thu, 18 Feb 2021 12:04:02 -0500 Subject: [PATCH] verilog: error on macro invocations with missing argument lists This would previously complain about an undefined internal macro if the unapplied macro had not already been used. If it had, it would incorrectly use the arguments from the previous invocation. --- frontends/verilog/preproc.cc | 11 ++++++++++- tests/verilog/macro_unapplied.ys | 17 +++++++++++++++++ tests/verilog/macro_unapplied_newline.ys | 5 +++++ 3 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 tests/verilog/macro_unapplied.ys create mode 100644 tests/verilog/macro_unapplied_newline.ys diff --git a/frontends/verilog/preproc.cc b/frontends/verilog/preproc.cc index c451c4c20..de707593f 100644 --- a/frontends/verilog/preproc.cc +++ b/frontends/verilog/preproc.cc @@ -477,7 +477,16 @@ static bool try_expand_macro(define_map_t &defines, std::string &tok) std::string name = tok.substr(1); std::string skipped_spaces = skip_spaces(); tok = next_token(false); - if (tok == "(" && body->has_args) { + if (body->has_args) { + if (tok != "(") { + if (tok.size() == 1 && iscntrl(tok[0])) { + char buf[5]; + snprintf(buf, sizeof(buf), "\\x%02x", tok[0]); + tok = buf; + } + log_error("Expected to find '(' to begin macro arguments for '%s', but instead found '%s'\n", + name.c_str(), tok.c_str()); + } std::vector args; bool done = false; while (!done) { diff --git a/tests/verilog/macro_unapplied.ys b/tests/verilog/macro_unapplied.ys new file mode 100644 index 000000000..81eb10b8b --- /dev/null +++ b/tests/verilog/macro_unapplied.ys @@ -0,0 +1,17 @@ +logger -expect-no-warnings +read_verilog -sv <