diff options
author | Tristan Gingold <tgingold@free.fr> | 2021-04-10 21:07:58 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2021-04-11 08:58:00 +0200 |
commit | d6a8f93b543ede48005000d90612060ef05cfd8c (patch) | |
tree | 7d29b6673234f00b4e1bb6fcaefaa943dd807d42 /testsuite/gna/issue1717/package.vhdl | |
parent | 2f908c242e41693b466d6dbd45a60c063523f661 (diff) | |
download | ghdl-d6a8f93b543ede48005000d90612060ef05cfd8c.tar.gz ghdl-d6a8f93b543ede48005000d90612060ef05cfd8c.tar.bz2 ghdl-d6a8f93b543ede48005000d90612060ef05cfd8c.zip |
testsuite/gna: add a test for #1717
Diffstat (limited to 'testsuite/gna/issue1717/package.vhdl')
-rw-r--r-- | testsuite/gna/issue1717/package.vhdl | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/testsuite/gna/issue1717/package.vhdl b/testsuite/gna/issue1717/package.vhdl new file mode 100644 index 000000000..89f54a9f3 --- /dev/null +++ b/testsuite/gna/issue1717/package.vhdl @@ -0,0 +1,50 @@ +package generic_list_mwe_pkg is + generic ( + type g_element_t); + + type elementp_t is access g_element_t; + + type g_list is protected + + impure function pull return g_element_t; + + end protected; + +end package generic_list_mwe_pkg; + +package body generic_list_mwe_pkg is + + type g_list is protected body + type list_obj_t; + type listp_t is access list_obj_t; + + type list_obj_t is record + element : elementp_t; -- pointer to element + nxt : listp_t; -- pointer to next list_obj + end record; + + variable list : listp_t; + + impure function pull + return g_element_t is + variable v_list : listp_t; + variable v_elementp : elementp_t; + impure function delete_and_return + return g_element_t is + variable ret : v_elementp.all'subtype; + begin -- function delete_and_return + ret := v_elementp.all; -- Create a constrained copy of last element in list + list := list.nxt; + deallocate(v_list.element); + deallocate(v_list); + return ret; + end function delete_and_return; + begin + assert list/=null report "Tried to pull element from empty list" severity error; + v_list := list; + v_elementp := list.element; + return delete_and_return; + end function; + end protected body; + +end generic_list_mwe_pkg; |