From d63b5e9f25067b433a4dec4dea8539170761fcd6 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Tue, 16 Dec 2003 19:50:54 +0000 Subject: [PATCH] re PR c++/9043 ([ABI] incorrect name mangling for array dimension in template function) cp: PR c++/9043 C++ ABI change: Mangling array indices in templates. * decl.c (compute_array_index_type): Reorganize for earlier template errors. Use value_dependent_expression_p for abi-2. * mangle.c (write_array_type): Check broken mangling for expression indices on abi-1 testsuite: PR c++/9043 * g++.dg/abi/mangle20-1.C: New test. * g++.dg/abi/mangle20-2.C: New test. From-SVN: r74707 --- gcc/cp/ChangeLog | 41 +++++++------ gcc/cp/decl.c | 105 +++++++++++++++------------------- gcc/cp/mangle.c | 15 ++++- gcc/testsuite/ChangeLog | 6 ++ gcc/testsuite/g++.dg/abi/mangle20-1.C | 19 ++++++ gcc/testsuite/g++.dg/abi/mangle20-2.C | 16 ++++++ 6 files changed, 125 insertions(+), 77 deletions(-) create mode 100644 gcc/testsuite/g++.dg/abi/mangle20-1.C create mode 100644 gcc/testsuite/g++.dg/abi/mangle20-2.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1262901..3e6d1b2 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2003-12-16 Nathan Sidwell + + PR c++/9043 + C++ ABI change: Mangling array indices in templates. + * decl.c (compute_array_index_type): Reorganize for earlier + template errors. Use value_dependent_expression_p for abi-2. + * mangle.c (write_array_type): Check broken mangling for + expression indices on abi-1 + 2003-12-16 Mark Mitchell PR c++/13275 @@ -10,18 +19,18 @@ (cp_parser_unary_expression): Allow the use of "&" in a constant expression if implementing offsetof. -2003-12-16 Giovanni Bajo - - PR c++/2294 +2003-12-16 Giovanni Bajo + + PR c++/2294 * name-lookup.c (push_overloaded_decl): always construct an OVERLOAD - if the declaration comes from an using declaration. + if the declaration comes from an using declaration. 2003-12-16 Giovanni Bajo * semantics.c (finish_id_expression): Refactor the code to handle template parameters, and emit a more informative error message when they are used within an integral constant expression. - + 2003-12-16 Nathan Sidwell PR c++/13387 @@ -17403,7 +17412,7 @@ * parse.y (member_init): Just pass in the type. * init.c (expand_member_init): Handle getting a type. -2000-07-04 Martin v. Löwis +2000-07-04 Martin v. Löwis Jason Merrill * decl.c (finish_function): Warn if a function has no return @@ -17749,7 +17758,7 @@ * decl.c (pushdecl): Don't set DECL_CONTEXT from current_namespace. (push_namespace): Set DECL_CONTEXT for a new NAMESPACE_DECL. -2000-06-24 Martin v. Löwis +2000-06-24 Martin v. Löwis * parse.y (complex_direct_notype_declarator): Support global_scope. * Makefile.in: Adjust conflict count. @@ -18934,7 +18943,7 @@ * semantics.c (finish_member_declaration): Don't mark members of classes declared in an extern "C" region as extern "C". -2000-05-22 Martin v. Löwis +2000-05-22 Martin v. Löwis * decl2.c (qualified_lookup_using_namespace): Look through namespace aliases. @@ -19388,7 +19397,7 @@ * ir.texi: Correct typo. -2000-04-25 Martin v. Löwis +2000-04-25 Martin v. Löwis * decl.c (grokdeclarator): Reject VLAs as members. @@ -19687,7 +19696,7 @@ (interface_only): Don't declare. (interface_unknown): Likewise. -2000-04-11 Martin v. Löwis +2000-04-11 Martin v. Löwis * tree.h (HAVE_TEMPLATES): Remove definition. * lang-options.h (-fthis-is-variable): Remove documentation. @@ -19742,7 +19751,7 @@ (__pointer_to_member_type_info::__do_catch): Remove. (__pointer_to_member_type_info::__pointer_catch): Implement. -2000-04-10 Martin v. Löwis +2000-04-10 Martin v. Löwis * lex.c (init_parse): Remove traces of classof and headof. * decl2.c (flag_operator_names): Default to 1. @@ -20455,7 +20464,7 @@ Wed Apr 5 15:12:18 MET DST 2000 Jan Hubicka * init.c (build_offset_ref): Handle the case of a templated member function. -2000-03-19 Martin v. Löwis +2000-03-19 Martin v. Löwis * except.c (expand_exception_blocks): Clear catch_clauses_last. @@ -20481,7 +20490,7 @@ Wed Apr 5 15:12:18 MET DST 2000 Jan Hubicka (layout_class_type): Implement new ABI handling of bitfields longer than their types. -2000-03-18 Martin v. Löwis +2000-03-18 Martin v. Löwis * parse.y (extdefs): Call ggc_collect. * parse.c: Regenerated. @@ -21091,7 +21100,7 @@ Wed Apr 5 15:12:18 MET DST 2000 Jan Hubicka * decl.c (decls_match): Remove obsolete static member nadgering. -2000-02-21 Martin v. Löwis +2000-02-21 Martin v. Löwis * decl.c (grokdeclarator): Change ANSI to ISO. * lex.c (consume_string, readescape, do_identifier): Likewise. @@ -22118,7 +22127,7 @@ Wed Apr 5 15:12:18 MET DST 2000 Jan Hubicka * optimize.c (copy_body_r): Clear the operand three of a TARGET_EXPR when copying it. -2000-01-14 Martin v. Löwis +2000-01-14 Martin v. Löwis * method.c (build_decl_overload_real): Check whether we are in :: before returning __builtin_new/delete. @@ -22415,6 +22424,6 @@ Wed Apr 5 15:12:18 MET DST 2000 Jan Hubicka (fixup_vtable_deltas1): Likewise. (finish_struct_1): Likewise. -2000-01-01 Martin v. Löwis +2000-01-01 Martin v. Löwis * call.c (build_new_method_call): Also check destructors. diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 1eafe2e..c054bfb 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -5982,48 +5982,35 @@ check_static_variable_definition (tree decl, tree type) tree compute_array_index_type (tree name, tree size) { + tree type = TREE_TYPE (size); tree itype; - /* If this involves a template parameter, it will be a constant at - instantiation time, but we don't know what the value is yet. - Even if no template parameters are involved, we may an expression - that is not a constant; we don't even simplify `1 + 2' when - processing a template. */ - if (processing_template_decl) + /* The array bound must be an integer type. */ + if (!dependent_type_p (type) && !INTEGRAL_TYPE_P (type)) { - /* Resolve a qualified reference to an enumerator or static - const data member of ours. */ - if (TREE_CODE (size) == SCOPE_REF - && TREE_OPERAND (size, 0) == current_class_type) - { - tree t = lookup_field (current_class_type, - TREE_OPERAND (size, 1), 0, false); - if (t) - size = t; - } - - return build_index_type (build_min (MINUS_EXPR, sizetype, - size, integer_one_node)); + if (name) + error ("size of array `%D' has non-integral type `%T'", name, type); + else + error ("size of array has non-integral type `%T'", type); + size = integer_one_node; + type = TREE_TYPE (size); } + if (abi_version_at_least (2) + /* We should only handle value dependent expressions specially. */ + ? value_dependent_expression_p (size) + /* But for abi-1, we handled all instances in templates. This + effects the manglings produced. */ + : processing_template_decl) + return build_index_type (build_min (MINUS_EXPR, sizetype, + size, integer_one_node)); + /* The size might be the result of a cast. */ STRIP_TYPE_NOPS (size); /* It might be a const variable or enumeration constant. */ size = decl_constant_value (size); - /* The array bound must be an integer type. */ - if (TREE_CODE (TREE_TYPE (size)) != INTEGER_TYPE - && TREE_CODE (TREE_TYPE (size)) != ENUMERAL_TYPE - && TREE_CODE (TREE_TYPE (size)) != BOOLEAN_TYPE) - { - if (name) - error ("size of array `%D' has non-integer type", name); - else - error ("size of array has non-integer type"); - size = integer_one_node; - } - /* Normally, the array-bound will be a constant. */ if (TREE_CODE (size) == INTEGER_CST) { @@ -6065,38 +6052,36 @@ compute_array_index_type (tree name, tree size) else error ("size of array is not an integral constant-expression"); } - - /* Compute the index of the largest element in the array. It is - one less than the number of elements in the array. */ - itype - = fold (cp_build_binary_op (MINUS_EXPR, - cp_convert (ssizetype, size), - cp_convert (ssizetype, - integer_one_node))); - - /* Check for variable-sized arrays. We allow such things as an - extension, even though they are not allowed in ANSI/ISO C++. */ - if (!TREE_CONSTANT (itype)) + else if (pedantic) { - if (pedantic) - { - if (name) - pedwarn ("ISO C++ forbids variable-size array `%D'", - name); - else - pedwarn ("ISO C++ forbids variable-size array"); - } - - /* Create a variable-sized array index type. */ - itype = variable_size (itype); + if (name) + pedwarn ("ISO C++ forbids variable-size array `%D'", name); + else + pedwarn ("ISO C++ forbids variable-size array"); } - /* Make sure that there was no overflow when creating to a signed - index type. (For example, on a 32-bit machine, an array with - size 2^32 - 1 is too big.) */ - else if (TREE_OVERFLOW (itype)) + + if (processing_template_decl && !TREE_CONSTANT (size)) + /* A variable sized array. */ + itype = build_min (MINUS_EXPR, sizetype, size, integer_one_node); + else { - error ("overflow in array dimension"); - TREE_OVERFLOW (itype) = 0; + /* Compute the index of the largest element in the array. It is + one less than the number of elements in the array. */ + itype + = fold (cp_build_binary_op (MINUS_EXPR, + cp_convert (ssizetype, size), + cp_convert (ssizetype, integer_one_node))); + if (!TREE_CONSTANT (itype)) + /* A variable sized array. */ + itype = variable_size (itype); + /* Make sure that there was no overflow when creating to a signed + index type. (For example, on a 32-bit machine, an array with + size 2^32 - 1 is too big.) */ + else if (TREE_OVERFLOW (itype)) + { + error ("overflow in array dimension"); + TREE_OVERFLOW (itype) = 0; + } } /* Create and return the appropriate index type. */ diff --git a/gcc/cp/mangle.c b/gcc/cp/mangle.c index fe01120..b34c309 100644 --- a/gcc/cp/mangle.c +++ b/gcc/cp/mangle.c @@ -2242,7 +2242,20 @@ write_array_type (const tree type) write_unsigned_number (tree_low_cst (max, 1)); } else - write_expression (TREE_OPERAND (max, 0)); + { + max = TREE_OPERAND (max, 0); + if (!abi_version_at_least (2)) + { + /* value_dependent_expression_p presumes nothing is + dependent when PROCESSING_TEMPLATE_DECL is zero. */ + ++processing_template_decl; + if (!value_dependent_expression_p (max)) + G.need_abi_warning = 1; + --processing_template_decl; + } + write_expression (max); + } + } write_char ('_'); write_type (TREE_TYPE (type)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 72832a8..a2d9eaf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2003-12-16 Nathan Sidwell + + PR c++/9043 + * g++.dg/abi/mangle20-1.C: New test. + * g++.dg/abi/mangle20-2.C: New test. + 2003-12-16 Mark Mitchell PR c++/13275 diff --git a/gcc/testsuite/g++.dg/abi/mangle20-1.C b/gcc/testsuite/g++.dg/abi/mangle20-1.C new file mode 100644 index 0000000..09cf51b --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle20-1.C @@ -0,0 +1,19 @@ +// { dg-do compile } +// { dg-options "-fabi-version=2" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2003 + +// PR 9043 +// mangled array types in templates + +template void f(int (*)[2]) {} +template void g(int (*)[I+2]) {} + +static const int I=1; +static const int J=2; + +template void f<1>(int (*)[2]); +// { dg-final { scan-assembler "\n_Z1fILi1EEvPA2_i:" } } +template void g<1>(int (*)[3]); +// { dg-final { scan-assembler "\n_Z1gILi1EEvPAplT_Li2E_i:" } } diff --git a/gcc/testsuite/g++.dg/abi/mangle20-2.C b/gcc/testsuite/g++.dg/abi/mangle20-2.C new file mode 100644 index 0000000..44d3afe --- /dev/null +++ b/gcc/testsuite/g++.dg/abi/mangle20-2.C @@ -0,0 +1,16 @@ +// { dg-do compile } +// { dg-options "-fabi-version=1 -Wabi" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 15 Dec 2003 + +// PR 9043 +// mangled array types in templates + +template void f(int (*)[2]) {} +template void g(int (*)[I+2]) {} + +template void f<1>(int (*)[2]); // { dg-warning "mangled name" } +// { dg-final { scan-assembler "\n_Z1fILi1EEvPALi2E_i:" } } +template void g<1>(int (*)[3]); +// { dg-final { scan-assembler "\n_Z1gILi1EEvPAplT_Li2E_i:" } } -- 2.7.4