X-Git-Url: http://git.sourceforge.jp/view?a=blobdiff_plain;f=gcc%2Fcp%2Fmangle.c;h=7e4cf668e9c48ec831d1c1cbbbbc93ca2fe7f24d;hb=e9b1be72e8c51f2f935e82733151993527722cad;hp=13b0ed47af3daa8d6e586b55ac27d899e61b8960;hpb=fb3127b905318fa6de8ab00295da0d81d741ca92;p=pf3gnuchains%2Fgcc-fork.git diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index 13b0ed47af3..7e4cf668e9c 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2481,7 +2481,7 @@ write_expression (tree expr) } else { - int i; + int i, len; const char *name; /* When we bind a variable or function to a non-type template @@ -2582,7 +2582,27 @@ write_expression (tree expr) break; default: - for (i = 0; i < TREE_OPERAND_LENGTH (expr); ++i) + /* In the middle-end, some expressions have more operands than + they do in templates (and mangling). */ + switch (code) + { + case PREINCREMENT_EXPR: + case PREDECREMENT_EXPR: + case POSTINCREMENT_EXPR: + case POSTDECREMENT_EXPR: + len = 1; + break; + + case ARRAY_REF: + len = 2; + break; + + default: + len = TREE_OPERAND_LENGTH (expr); + break; + } + + for (i = 0; i < len; ++i) { tree operand = TREE_OPERAND (expr, i); /* As a GNU extension, the middle operand of a