From 65f0c5b308fc97731b8d34236c4852ac58db2d29 Mon Sep 17 00:00:00 2001
From: Jason Merrill <jason@redhat.com>
Date: Mon, 2 Jul 2012 23:29:58 -0400
Subject: [PATCH] re PR c++/53816 (internal compiler error: tree check:
 expected field_decl, have identifier_node in fixed_type_or_null, at
 cp/class.c:6419, with -std=c++11 option)

	PR c++/53816
	* class.c (resolves_to_fixed_type_p): Check uses_template_parms
	(current_function_decl) instead of processing_template_decl.

From-SVN: r189187
---
 gcc/cp/ChangeLog                     |  4 ++++
 gcc/cp/class.c                       |  5 ++++-
 gcc/testsuite/ChangeLog              |  5 +++++
 gcc/testsuite/g++.dg/template/ref6.C | 15 +++++++++++++++
 4 files changed, 28 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/g++.dg/template/ref6.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fb8a34de04c9..f00ff70f8f10 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,5 +1,9 @@
 2012-07-02  Jason Merrill  <jason@redhat.com>
 
+	PR c++/53816
+	* class.c (resolves_to_fixed_type_p): Check uses_template_parms
+	(current_function_decl) instead of processing_template_decl.
+
 	PR c++/53821
 	* semantics.c (maybe_add_lambda_conv_op): Don't set
 	DECL_INTERFACE_KNOWN.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 264258c1dbc1..e70e6747b55b 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -6521,7 +6521,10 @@ resolves_to_fixed_type_p (tree instance, int* nonnull)
   int cdtorp = 0;
   tree fixed;
 
-  if (processing_template_decl)
+  /* processing_template_decl can be false in a template if we're in
+     fold_non_dependent_expr, but we still want to suppress this check.  */
+  if (current_function_decl
+      && uses_template_parms (current_function_decl))
     {
       /* In a template we only care about the type of the result.  */
       if (nonnull)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dead28172925..fc712849a65a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-07-02  Jason Merrill  <jason@redhat.com>
+
+	PR c++/53816
+	* g++.dg/template/ref6.C: New.
+
 2012-07-03  Oleg Endo  <olegendo@gcc.gnu.org>
 
 	PR target/53568
diff --git a/gcc/testsuite/g++.dg/template/ref6.C b/gcc/testsuite/g++.dg/template/ref6.C
new file mode 100644
index 000000000000..2e1254ae35b2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/ref6.C
@@ -0,0 +1,15 @@
+// PR c++/53816
+
+template <typename T>
+struct S { int v () const; };
+template <typename T>
+struct V : public S<T> {};
+struct U
+{
+  V<int> v;
+  template<typename T>
+  struct W
+  {
+    W (U const &x) { V<int> const &v = x.v; v.v(); }
+  };
+};
-- 
GitLab