This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
C++ PATCH: Fix PR 8534
- From: Mark Mitchell <mark at codesourcery dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 9 Mar 2003 22:26:42 -0800
- Subject: C++ PATCH: Fix PR 8534
- Reply-to: mark at codesourcery dot com
This program was causing conflicting alias sets to be generated on
some systems, due to the fact that the same pointer to member type was
being created more than once.
Tested on i686-pc-linux-gnu, applied on the mainline and on the
branch.
--
Mark Mitchell
CodeSourcery, LLC
mark at codesourcery dot com
2003-03-09 Mark Mitchell <mark at codesourcery dot com>
PR c++/8534
* decl.c (build_ptrmemfunc_type): Do not allow default arugments
in pointer-to-member-function types.
2003-03-09 Mark Mitchell <mark at codesourcery dot com>
PR c++/8534
* g++.dg/opt/ptrmem1.C: New test.
Index: testsuite/g++.dg/opt/ptrmem1.C
===================================================================
RCS file: testsuite/g++.dg/opt/ptrmem1.C
diff -N testsuite/g++.dg/opt/ptrmem1.C
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/opt/ptrmem1.C 10 Mar 2003 06:18:26 -0000
***************
*** 0 ****
--- 1,12 ----
+ // { dg-options "-O2" }
+
+ class QWidget
+ {
+ public: void repaint( bool erase = 1 );
+ };
+ void f (void)
+ {
+ typedef void (QWidget::*A)(bool);
+ A b = &QWidget::repaint;
+ }
+
Index: cp/decl.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/cp/decl.c,v
retrieving revision 1.1016
diff -c -5 -p -r1.1016 decl.c
*** cp/decl.c 9 Mar 2003 14:30:18 -0000 1.1016
--- cp/decl.c 10 Mar 2003 06:18:32 -0000
*************** grokvardecl (tree type,
*** 9294,9307 ****
--- 9294,9345 ----
tree
build_ptrmemfunc_type (tree type)
{
tree field, fields;
tree t;
+ tree method_type;
+ tree arg_type;
tree unqualified_variant = NULL_TREE;
if (type == error_mark_node)
return type;
+
+ /* If the METHOD_TYPE has any default parameters, make a copy that
+ does not have the default parameters. The pointer-to-member type
+ never has default parameters. */
+ method_type = TREE_TYPE (type);
+ for (arg_type = TYPE_ARG_TYPES (method_type);
+ arg_type;
+ arg_type = TREE_CHAIN (arg_type))
+ if (TREE_PURPOSE (arg_type))
+ {
+ /* At least one parameter has a default argument. */
+ tree arg_types = NULL_TREE;
+ tree *arg_type_p = &arg_types;
+
+ /* Copy the parameter types. The "this" parameter will be
+ added by build_cplus_method_type. */
+ for (arg_type = TREE_CHAIN (TYPE_ARG_TYPES (method_type));
+ arg_type;
+ arg_type = TREE_CHAIN (arg_type))
+ {
+ if (arg_type == void_list_node)
+ *arg_type_p = void_list_node;
+ else
+ *arg_type_p = build_tree_list (NULL_TREE,
+ TREE_VALUE (arg_type));
+ arg_type_p = &TREE_CHAIN (*arg_type_p);
+ }
+ /* Build the new METHOD_TYPE. */
+ method_type = build_cplus_method_type (TYPE_METHOD_BASETYPE (method_type),
+ TREE_TYPE (method_type),
+ arg_types);
+ /* Build the new POINTER_TYPE. */
+ type = cp_build_qualified_type (build_pointer_type (method_type),
+ cp_type_quals (type));
+ break;
+ }
/* If a canonical type already exists for this type, use it. We use
this method instead of type_hash_canon, because it only does a
simple equality check on the list of field members. */