diff mbox

[c++] : Fix PR/47211 - ICE: in cp_build_addr_expr_1, at cp/typeck.c:4866 with -fms-extensions

Message ID AANLkTi=PTsOEXusOWaSdMZjW2y5VhME7UXX7NPmScBr1@mail.gmail.com
State New
Headers show

Commit Message

Kai Tietz Jan. 7, 2011, 2:39 p.m. UTC
Hello,

this patch addresses issue reported at
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47211

2011-01-07  Kai Tietz

	PR c++/47211
	* decl.c (build_ptrmem_type): Resolve VAR_DECL
	and FUNCTION_DECL to their underlying type.
	* typeck.c (cp_build_addr_expr_1): Handle flag_ms_extensions.

2011-01-07  Kai Tietz

	PR c++/47211
	* g++.dg/ext/pr47211.C: New.


Tested for x86_64-w64-mingw32, and i686-pc-cygwin. I am not sure if
this ...DECL handling should be done in build_ptrmem_type itself, or
if we should handle it just in typeck.c's cp_build_addr_expr_1.

Ok?

Regards,
Kai

Comments

Paolo Carlini Jan. 7, 2011, 2:50 p.m. UTC | #1
... very minor nit:

+};
+
+

watch trailing empty lines.

Paolo.
diff mbox

Patch

Index: gcc/gcc/cp/decl.c
===================================================================
--- gcc.orig/gcc/cp/decl.c	2011-01-07 15:21:47.000000000 +0100
+++ gcc/gcc/cp/decl.c	2011-01-07 14:48:03.354579300 +0100
@@ -7423,6 +7423,9 @@  build_ptrmemfunc_type (tree type)
 tree
 build_ptrmem_type (tree class_type, tree member_type)
 {
+  if (TREE_CODE (class_type) == FUNCTION_DECL
+      || TREE_CODE (class_type) == VAR_DECL)
+    class_type = TREE_TYPE (class_type);
   if (TREE_CODE (member_type) == METHOD_TYPE)
     {
       cp_cv_quals quals = type_memfn_quals (member_type);
Index: gcc/gcc/cp/typeck.c
===================================================================
--- gcc.orig/gcc/cp/typeck.c	2011-01-07 15:23:34.000000000 +0100
+++ gcc/gcc/cp/typeck.c	2011-01-07 15:18:12.580785500 +0100
@@ -4859,11 +4859,12 @@  cp_build_addr_expr_1 (tree arg, bool str
     offset_ref:
       /* Turn a reference to a non-static data member into a
 	 pointer-to-member.  */
+
       {
 	tree type;
 	tree t;
 
-	gcc_assert (PTRMEM_OK_P (arg));
+	gcc_assert (PTRMEM_OK_P (arg) || flag_ms_extensions);
 
 	t = TREE_OPERAND (arg, 1);
 	if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
@@ -4878,7 +4879,7 @@  cp_build_addr_expr_1 (tree arg, bool str
 	t = make_ptrmem_cst (type, TREE_OPERAND (arg, 1));
 	return t;
       }
-
+      /* Fall through.  */
     default:
       break;
     }
Index: gcc/gcc/testsuite/g++.dg/ext/pr47211.C
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gcc/gcc/testsuite/g++.dg/ext/pr47211.C	2011-01-07 15:29:44.492606100 +0100
@@ -0,0 +1,13 @@ 
+/* { dg-do compile } */
+/* { dg-options "-fms-extensions" } */
+
+class chile
+{
+  typedef void (chile::* pmf) ();
+  void bar (pmf pmethod)
+  {
+    &(this->*pmethod);
+  }
+};
+
+