aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2003-03-13 19:57:12 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-03-13 19:57:12 +0000
commit26f86471531d569c550a3e16fbd88a0cae6f18dd (patch)
treed2580badfc894825e324e272981797cd242d90e3
parent7210d5ae56f8e4230a227fcfd000015b6df6224e (diff)
downloadgcc-26f86471531d569c550a3e16fbd88a0cae6f18dd.zip
gcc-26f86471531d569c550a3e16fbd88a0cae6f18dd.tar.gz
gcc-26f86471531d569c550a3e16fbd88a0cae6f18dd.tar.bz2
call.c (initialize_reference): Remove bogus assertion.
* call.c (initialize_reference): Remove bogus assertion. * decl.c (build_ptrmemfunc_type): Revert change of 2003-03-09. * g++.dg/init/ref5.C: New test. * g++.dg/parse/ptrmem1.C: Likewise. From-SVN: r64316
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/call.c3
-rw-r--r--gcc/cp/decl.c38
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/init/ref5.C12
-rw-r--r--gcc/testsuite/g++.dg/parse/ptrmem1.C10
6 files changed, 33 insertions, 40 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 71d7536..da84998 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2003-03-13 Mark Mitchell <mark@codesourcery.com>
+
+ * call.c (initialize_reference): Remove bogus assertion.
+ * decl.c (build_ptrmemfunc_type): Revert change of 2003-03-09.
+
2003-03-12 Andrew Lewycky <andrew@mxc.ca>
PR c++/7050
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index c8baf74..d6496ad 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -6088,9 +6088,8 @@ initialize_reference (tree type, tree expr, tree decl)
conv = TREE_OPERAND (conv, 0);
/* If the next conversion is a BASE_CONV, skip that too -- but
remember that the conversion was required. */
- if (TREE_CODE (conv) == BASE_CONV)
+ if (TREE_CODE (conv) == BASE_CONV && !NEED_TEMPORARY_P (conv))
{
- my_friendly_assert (!NEED_TEMPORARY_P (conv), 20030307);
base_conv_type = TREE_TYPE (conv);
conv = TREE_OPERAND (conv, 0);
}
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index eeae35a..1763c41 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -9297,49 +9297,11 @@ 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. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6492c09..3407e5c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2003-03-13 Mark Mitchell <mark@codesourcery.com>
+
+ * g++.dg/init/ref5.C: New test.
+ * g++.dg/parse/ptrmem1.C: Likewise.
+
2003-03-12 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
* gcc.dg/special/ecos.exp (gcsec-1.c): Find linker used by gcc.
diff --git a/gcc/testsuite/g++.dg/init/ref5.C b/gcc/testsuite/g++.dg/init/ref5.C
new file mode 100644
index 0000000..ad1c30c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/ref5.C
@@ -0,0 +1,12 @@
+struct A { };
+struct B : public A { };
+struct X {
+ operator B();
+};
+X x;
+
+int main()
+{
+ const A& r = x;
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/parse/ptrmem1.C b/gcc/testsuite/g++.dg/parse/ptrmem1.C
new file mode 100644
index 0000000..b1174c7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/ptrmem1.C
@@ -0,0 +1,10 @@
+struct A {
+ void f(int = 0) const;
+};
+
+typedef void (A::*PF)(int) const;
+
+void f()
+{
+ PF pf = &A::f;
+}