re PR c++/8534 (When compiling qt contradicting aliasing class created for bitfield constructor)

PR c++/8534
	* decl.c (build_ptrmemfunc_type): Do not allow default arugments
	in pointer-to-member-function types.

	PR c++/8534
	* g++.dg/opt/ptrmem1.C: New test.

From-SVN: r64066
This commit is contained in:
Mark Mitchell 2003-03-10 06:22:28 +00:00 committed by Mark Mitchell
parent d9b4e85e24
commit f6d19bfe41
4 changed files with 61 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2003-03-09 Mark Mitchell <mark@codesourcery.com>
PR c++/8534
* decl.c (build_ptrmemfunc_type): Do not allow default arugments
in pointer-to-member-function types.
2003-03-10 Gabriel Dos Reis <gdr@integrable-solutions.net>
* expr.c (cplus_expand_constant): Use C90 prototype style.

View File

@ -9296,11 +9296,49 @@ 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. */

View File

@ -1,3 +1,8 @@
2003-03-09 Mark Mitchell <mark@codesourcery.com>
PR c++/8534
* g++.dg/opt/ptrmem1.C: New test.
2003-03-09 Eric Botcazou <ebotcazou@libertysurf.fr>
* gcc.dg/i386-loop-1.c: New test.

View File

@ -0,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;
}