public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* C++ PATCH for c++/50614 (ICE with NSDMI and -fcompare-debug)
@ 2011-10-13 21:45 Jason Merrill
  2011-10-14 19:37 ` Jason Merrill
  0 siblings, 1 reply; 2+ messages in thread
From: Jason Merrill @ 2011-10-13 21:45 UTC (permalink / raw)
  To: gcc-patches List

[-- Attachment #1: Type: text/plain, Size: 517 bytes --]

The problem here was that with -fcompare-debug, 
execute_cleanup_cfg_post_optimizing wants to print out all the decls 
used in a function, which involves printing the DECL_INITIAL, and the 
instantiation of a FIELD_DECL with an NSDMI had an uninstantiated 
DECL_INITIAL, so the dumper got confused by the C++ tree codes.  Fixed 
by setting DECL_INITIAL of instantiated FIELD_DECLs to error_mark_node 
and using DECL_TEMPLATE_INFO to look up the original NSDMI instead.

Tested x86_64-pc-linux-gnu, applying to trunk.

[-- Attachment #2: 50614.patch --]
[-- Type: text/x-patch, Size: 3921 bytes --]

commit 69647e299fba76f47d157699d80afcc2c703e408
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Oct 13 16:59:42 2011 -0400

    	PR c++/50614
    	* cp-tree.h (VAR_TEMPL_TYPE_FIELD_OR_FUNCTION_DECL_CHECK): New.
    	(DECL_TEMPLATE_INFO): Use it.
    	* pt.c (tsubst_decl) [FIELD_DECL]: Set DECL_TEMPLATE_INFO
    	if the decl has an NSDMI.
    	* init.c (perform_member_init): Use it.

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index e42cda1..98599f9 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -201,6 +201,9 @@ c-common.h, not after.
 #define VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK(NODE) \
   TREE_CHECK4(NODE,VAR_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL)
 
+#define VAR_TEMPL_TYPE_FIELD_OR_FUNCTION_DECL_CHECK(NODE) \
+  TREE_CHECK5(NODE,VAR_DECL,FIELD_DECL,FUNCTION_DECL,TYPE_DECL,TEMPLATE_DECL)
+
 #define BOUND_TEMPLATE_TEMPLATE_PARM_TYPE_CHECK(NODE) \
   TREE_CHECK(NODE,BOUND_TEMPLATE_TEMPLATE_PARM)
 
@@ -2556,7 +2559,7 @@ extern void decl_shadowed_for_var_insert (tree, tree);
    global function f.  In this case, DECL_TEMPLATE_INFO for S<int>::f
    will be non-NULL, but DECL_USE_TEMPLATE will be zero.  */
 #define DECL_TEMPLATE_INFO(NODE) \
-  (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_OR_FUNCTION_DECL_CHECK (NODE)) \
+  (DECL_LANG_SPECIFIC (VAR_TEMPL_TYPE_FIELD_OR_FUNCTION_DECL_CHECK (NODE)) \
    ->u.min.template_info)
 
 /* For a VAR_DECL, indicates that the variable is actually a
@@ -2701,7 +2704,10 @@ extern void decl_shadowed_for_var_insert (tree, tree);
      template <class T> struct S { friend void f<int>(int, double); }
 
    the DECL_TI_TEMPLATE will be an IDENTIFIER_NODE for `f' and the
-   DECL_TI_ARGS will be {int}.  */
+   DECL_TI_ARGS will be {int}.
+
+   For a FIELD_DECL, this value is the FIELD_DECL it was instantiated
+   from.  */
 #define DECL_TI_TEMPLATE(NODE)      TI_TEMPLATE (DECL_TEMPLATE_INFO (NODE))
 
 /* The template arguments used to obtain this decl from the most
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index a21e566..4561979 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -497,11 +497,11 @@ perform_member_init (tree member, tree init)
      mem-initializer for this field.  */
   if (init == NULL_TREE)
     {
-      if (CLASSTYPE_TEMPLATE_INSTANTIATION (DECL_CONTEXT (member)))
+      if (DECL_LANG_SPECIFIC (member) && DECL_TEMPLATE_INFO (member))
 	/* Do deferred instantiation of the NSDMI.  */
 	init = (tsubst_copy_and_build
-		(DECL_INITIAL (member),
-		 CLASSTYPE_TI_ARGS (DECL_CONTEXT (member)),
+		(DECL_INITIAL (DECL_TI_TEMPLATE (member)),
+		 DECL_TI_ARGS (member),
 		 tf_warning_or_error, member, /*function_p=*/false,
 		 /*integral_constant_expression_p=*/false));
       else
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 880f3d1..1632c01 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10269,6 +10269,16 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
 	    = tsubst_expr (DECL_INITIAL (t), args,
 			   complain, in_decl,
 			   /*integral_constant_expression_p=*/true);
+	else if (DECL_INITIAL (t))
+	  {
+	    /* Set up DECL_TEMPLATE_INFO so that we can get at the
+	       NSDMI in perform_member_init.  Still set DECL_INITIAL
+	       to error_mark_node so that we know there is one.  */
+	    DECL_INITIAL (r) = error_mark_node;
+	    gcc_assert (DECL_LANG_SPECIFIC (r) == NULL);
+	    retrofit_lang_decl (r);
+	    DECL_TEMPLATE_INFO (r) = build_template_info (t, args);
+	  }
 	/* We don't have to set DECL_CONTEXT here; it is set by
 	   finish_member_declaration.  */
 	DECL_CHAIN (r) = NULL_TREE;
diff --git a/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C
new file mode 100644
index 0000000..27b0aa5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/nsdmi-template2.C
@@ -0,0 +1,14 @@
+// PR c++/50614
+// { dg-options "-std=c++0x -fcompare-debug" }
+
+struct A
+{
+  int f ();
+};
+
+template <int> struct B : A
+{
+  int i = this->f ();
+};
+
+B<0> b;

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: C++ PATCH for c++/50614 (ICE with NSDMI and -fcompare-debug)
  2011-10-13 21:45 C++ PATCH for c++/50614 (ICE with NSDMI and -fcompare-debug) Jason Merrill
@ 2011-10-14 19:37 ` Jason Merrill
  0 siblings, 0 replies; 2+ messages in thread
From: Jason Merrill @ 2011-10-14 19:37 UTC (permalink / raw)
  Cc: gcc-patches List

[-- Attachment #1: Type: text/plain, Size: 279 bytes --]

On 10/13/2011 05:22 PM, Jason Merrill wrote:
> +	    DECL_INITIAL (r) = error_mark_node;

While working on 50507 I noticed that we check for error_mark_node in 
walk_field_subobs, so I'm changing the placeholder to void_zero_node.

Tested x86_64-pc-linux-gnu, applying to trunk.

[-- Attachment #2: 50614-2.patch --]
[-- Type: text/x-patch, Size: 886 bytes --]

commit ca436fb810b1b85abcb3bd7bc950e55df259dafd
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Oct 13 21:56:23 2011 -0400

    	* pt.c (tsubst_decl) [FIELD_DECL]: Use void_zero_node
    	instead of error_mark_node as a placeholder.

diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 1632c01..bbe1139 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -10273,8 +10273,8 @@ tsubst_decl (tree t, tree args, tsubst_flags_t complain)
 	  {
 	    /* Set up DECL_TEMPLATE_INFO so that we can get at the
 	       NSDMI in perform_member_init.  Still set DECL_INITIAL
-	       to error_mark_node so that we know there is one.  */
-	    DECL_INITIAL (r) = error_mark_node;
+	       so that we know there is one.  */
+	    DECL_INITIAL (r) = void_zero_node;
 	    gcc_assert (DECL_LANG_SPECIFIC (r) == NULL);
 	    retrofit_lang_decl (r);
 	    DECL_TEMPLATE_INFO (r) = build_template_info (t, args);

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-10-14 18:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-10-13 21:45 C++ PATCH for c++/50614 (ICE with NSDMI and -fcompare-debug) Jason Merrill
2011-10-14 19:37 ` Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).