aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2006-08-04 04:58:36 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2006-08-04 04:58:36 +0000
commitf092a8668aa6d6a1a1fcc42d1b7e7c690aad598a (patch)
tree2d1cd1c342adf7eca633c52a85a1247b402a54a6
parent493297e3842118cddb1d20edf855b4c9d5060d7b (diff)
downloadgcc-f092a8668aa6d6a1a1fcc42d1b7e7c690aad598a.zip
gcc-f092a8668aa6d6a1a1fcc42d1b7e7c690aad598a.tar.gz
gcc-f092a8668aa6d6a1a1fcc42d1b7e7c690aad598a.tar.bz2
re PR c++/28148 (ICE with pointer to member function initializer and cast to a different type)
PR c++/28148 * varasm.c (output_constant): Give the front end another chance to expand constants, after stripping NOPs. PR c++/28148 * g++.dg/init/ptrmem3.C: New test. From-SVN: r115919
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/init/ptrmem3.C8
-rw-r--r--gcc/varasm.c3
4 files changed, 22 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 39e5cfa..216b686 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-08-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/28148
+ * varasm.c (output_constant): Give the front end another chance to
+ expand constants, after stripping NOPs.
+
2006-08-03 Jan Hubicka <jh@suse.cz>
* domwalk.c (walk_dominator_tree): Reorganize to non-recursive
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a2256d5..a07f7c1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-03 Mark Mitchell <mark@codesourcery.com>
+
+ PR c++/28148
+ * g++.dg/init/ptrmem3.C: New test.
+
2006-08-03 Dorit Nuzman <dorit@il.ibm.com>
PR tree-optimization/27770
diff --git a/gcc/testsuite/g++.dg/init/ptrmem3.C b/gcc/testsuite/g++.dg/init/ptrmem3.C
new file mode 100644
index 0000000..95b6037
--- /dev/null
+++ b/gcc/testsuite/g++.dg/init/ptrmem3.C
@@ -0,0 +1,8 @@
+// PR c++/28148
+
+struct foo {
+public:
+ virtual int bar(int);
+};
+
+void (foo::*__Virtual__foo__Var1)() = (void (foo::*)())(&foo::bar);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 1f5f43a..9837e0d 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -4048,6 +4048,9 @@ output_constant (tree exp, unsigned HOST_WIDE_INT size, unsigned int align)
code = TREE_CODE (TREE_TYPE (exp));
thissize = int_size_in_bytes (TREE_TYPE (exp));
+ /* Give the front end another chance to expand constants. */
+ exp = lang_hooks.expand_constant (exp);
+
/* Allow a constructor with no elements for any data type.
This means to fill the space with zeros. */
if (TREE_CODE (exp) == CONSTRUCTOR