Skip to content

Commit

Permalink
Fix erroneous error from implicitly generated "reject" clause
Browse files Browse the repository at this point in the history
  • Loading branch information
nickg committed Apr 2, 2016
1 parent 5932bf4 commit 87ec88e
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 11 deletions.
4 changes: 1 addition & 3 deletions src/parse.c
@@ -1,5 +1,5 @@
//
// Copyright (C) 2014-2015 Nick Gasson
// Copyright (C) 2014-2016 Nick Gasson
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -566,8 +566,6 @@ static void set_delay_mechanism(tree_t t, tree_t reject)
: tree_waveform(t, 0));
if (tree_has_delay(w))
tree_set_reject(t, tree_delay(w));
else
tree_set_reject(t, get_time(0));
}
else
tree_set_reject(t, reject);
Expand Down
4 changes: 2 additions & 2 deletions src/sem.c
Expand Up @@ -3258,7 +3258,7 @@ static bool sem_check_signal_assign(tree_t t)
if (!sem_check_signal_target(target))
return false;

if (!sem_check_reject(tree_reject(t)))
if (tree_has_reject(t) && !sem_check_reject(tree_reject(t)))
return false;

return true;
Expand Down Expand Up @@ -3296,7 +3296,7 @@ static bool sem_check_cassign(tree_t t)
sem_error(test, "type of condition must be BOOLEAN");
}

if (!sem_check_reject(tree_reject(c)))
if (tree_has_reject(c) && !sem_check_reject(tree_reject(c)))
return false;

if (!sem_check_waveforms(c, tree_type(target)))
Expand Down
5 changes: 3 additions & 2 deletions src/simp.c
@@ -1,5 +1,5 @@
//
// Copyright (C) 2011-2015 Nick Gasson
// Copyright (C) 2011-2016 Nick Gasson
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
Expand Down Expand Up @@ -683,7 +683,8 @@ static tree_t simp_cassign(tree_t t)
tree_set_loc(s, tree_loc(t));
tree_set_target(s, target);
tree_set_ident(s, tree_ident(t));
tree_set_reject(s, tree_reject(c));
if (tree_has_reject(c))
tree_set_reject(s, tree_reject(c));

const int nwaves = tree_waveforms(c);
for (int i = 0; i < nwaves; i++) {
Expand Down
23 changes: 23 additions & 0 deletions test/sem/dwlau.vhd
@@ -0,0 +1,23 @@
entity dwl_lu is
port (
fs: in bit_vector (2 downto 1);
a, b: in bit_vector (3 downto 0);
lu_out: out bit_vector (3 downto 0);
carryout: out bit);
end dwl_lu;

architecture behavioral of dwl_lu is

begin
process (a, b)
begin
lu_out <= (not a);
carryout <= '0';
end process;

process is
begin
wait for 5 fs;
end process;

end behavioral;
4 changes: 0 additions & 4 deletions test/test_lower.c
Expand Up @@ -548,7 +548,6 @@ START_TEST(test_signal1)
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_NETS, .name = ":signal1:x" },
{ VCODE_OP_CONST, .value = 6 },
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_CONST, .value = 1 },
{ VCODE_OP_SCHED_WAVEFORM },
{ VCODE_OP_WAIT, .target = 2 }
Expand Down Expand Up @@ -1257,7 +1256,6 @@ START_TEST(test_signal4)
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_NETS, .name = ":signal4:s" },
{ VCODE_OP_CONST, .value = 4 },
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_SCHED_WAVEFORM },
{ VCODE_OP_COPY },
{ VCODE_OP_WAIT, .target = 2 }
Expand Down Expand Up @@ -1296,7 +1294,6 @@ START_TEST(test_staticwait)
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_NETS, .name = ":staticwait:x" },
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_CONST, .value = 1 },
{ VCODE_OP_SCHED_WAVEFORM },
{ VCODE_OP_WAIT, .target = 2 }
Expand Down Expand Up @@ -2301,7 +2298,6 @@ START_TEST(test_sigvar)
{ VCODE_OP_UARRAY_LEN },
{ VCODE_OP_UARRAY_LEN },
{ VCODE_OP_ARRAY_SIZE },
{ VCODE_OP_CONST, .value = 0 },
{ VCODE_OP_UNWRAP },
{ VCODE_OP_VEC_LOAD },
{ VCODE_OP_SCHED_WAVEFORM },
Expand Down
17 changes: 17 additions & 0 deletions test/test_sem.c
Expand Up @@ -1638,6 +1638,22 @@ START_TEST(test_issue276)
}
END_TEST

START_TEST(test_dwlau)
{
input_from_file(TESTDIR "/sem/dwlau.vhd");

const error_t expect[] = {
{ 20, "no suitable overload for operator \"*\"" },
{ -1, NULL }
};
expect_errors(expect);

parse_and_check(T_ENTITY, T_ARCH);

fail_unless(sem_errors() == ARRAY_LEN(expect) - 1);
}
END_TEST

int main(void)
{
Suite *s = suite_create("sem");
Expand Down Expand Up @@ -1719,6 +1735,7 @@ int main(void)
tcase_add_test(tc_core, test_issue226);
tcase_add_test(tc_core, test_issue197);
tcase_add_test(tc_core, test_issue276);
tcase_add_test(tc_core, test_dwlau);
suite_add_tcase(s, tc_core);

return nvc_run_test(s);
Expand Down

0 comments on commit 87ec88e

Please sign in to comment.