diff options
author | Mark Mitchell <mmitchell@usa.net> | 1997-09-10 02:28:20 +0000 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 1997-09-09 22:28:20 -0400 |
commit | 03555413998ae48323618a55b7c7decca29a1594 (patch) | |
tree | a1194d52597ec6e15cb52fb2ede9749a7004c06f /gcc | |
parent | a2676865a6f4f980779e6ff60839739fbc3ad826 (diff) | |
download | gcc-03555413998ae48323618a55b7c7decca29a1594.zip gcc-03555413998ae48323618a55b7c7decca29a1594.tar.gz gcc-03555413998ae48323618a55b7c7decca29a1594.tar.bz2 |
error.c (dump_decl): Avoid crashing when presented with a uninitialized constant...
Tue Sep 9 17:57:25 1997 Mark Mitchell <mmitchell@usa.net>
* error.c (dump_decl): Avoid crashing when presented with a
uninitialized constant, as can occur with a template parameter.
From-SVN: r15208
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/cp/error.c | 55 |
2 files changed, 36 insertions, 24 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 39b5e1c..c9eabf9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +Tue Sep 9 17:57:25 1997 Mark Mitchell <mmitchell@usa.net> + + * error.c (dump_decl): Avoid crashing when presented with a + uninitialized constant, as can occur with a template parameter. + 1997-09-09 Brendan Kehoe <brendan@lisa.cygnus.com> * typeck.c (build_indirect_ref): Heed FLAG_VOLATILE similar to diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 847bfa2..4f4c599 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -782,10 +782,13 @@ dump_decl (t, v) case CONST_DECL: if ((TREE_TYPE (t) != NULL_TREE && NEXT_CODE (t) == ENUMERAL_TYPE) - || TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_CONST_PARM) + || (DECL_INITIAL (t) && + TREE_CODE (DECL_INITIAL (t)) == TEMPLATE_CONST_PARM)) goto general; - else + else if (DECL_INITIAL (t)) dump_expr (DECL_INITIAL (t), 0); + else + OB_PUTS ("enumerator"); break; case USING_DECL: @@ -1363,29 +1366,33 @@ dump_expr (t, nop) } case TEMPLATE_CONST_PARM: - if (current_template_parms) - { - int i; - int l = list_length (current_template_parms); - tree parms = current_template_parms; - tree r; - - for (i = 0; i < l - TEMPLATE_CONST_LEVEL (t); ++i) - { - parms = TREE_CHAIN (parms); - my_friendly_assert (parms != NULL_TREE, 0); - } + { + int l = current_template_parms ? + list_length (current_template_parms) : 0; - r = TREE_VEC_ELT (TREE_VALUE (parms), - TEMPLATE_CONST_IDX (t)); - dump_decl (TREE_VALUE (r), -1); - } - else - { - OB_PUTS ("<tparm "); - OB_PUTI (TEMPLATE_CONST_IDX (t)); - OB_PUTS (">"); - } + if (l >= TEMPLATE_CONST_LEVEL (t)) + { + int i; + tree parms = current_template_parms; + tree r; + + for (i = 0; i < l - TEMPLATE_CONST_LEVEL (t); ++i) + { + parms = TREE_CHAIN (parms); + my_friendly_assert (parms != NULL_TREE, 0); + } + + r = TREE_VEC_ELT (TREE_VALUE (parms), + TEMPLATE_CONST_IDX (t)); + dump_decl (TREE_VALUE (r), -1); + } + else + { + OB_PUTS ("<tparm "); + OB_PUTI (TEMPLATE_CONST_IDX (t)); + OB_PUTS (">"); + } + } break; case IDENTIFIER_NODE: |