re PR c++/67108 (ICE: in cxx_eval_call_expression, at cp/constexpr.c:1345 when dumping)
authorJason Merrill <jason@redhat.com>
Wed, 12 Aug 2015 18:02:35 +0000 (14:02 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 12 Aug 2015 18:02:35 +0000 (14:02 -0400)
PR c++/67108
* decl2.c (c_parse_final_cleanups): Set at_eof to 2 at end.
* error.c (dump_template_bindings): Don't tsubst in that case.

From-SVN: r226829

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/decl2.c
gcc/cp/error.c
gcc/testsuite/g++.dg/cpp0x/constexpr-targ3.C [new file with mode: 0644]

index bed0a5eb0234804436328fcab08be37f5c46936b..4f3f46dda344362c7dd1e7c585199067f0dc7751 100644 (file)
@@ -1,5 +1,9 @@
 2015-08-12  Jason Merrill  <jason@redhat.com>
 
+       PR c++/67108
+       * decl2.c (c_parse_final_cleanups): Set at_eof to 2 at end.
+       * error.c (dump_template_bindings): Don't tsubst in that case.
+
        PR c++/67161
        * error.c (dump_decl) [TEMPLATE_ID_EXPR]: Pass
        TFF_NO_OMIT_DEFAULT_TEMPLATE_ARGUMENTS.
index 78fd4af0a2fbe6e7d817de80dbcf85fd272c08c3..ab6b3ec62069f7bd2b88ecf7858628ed3656c70e 100644 (file)
@@ -4797,7 +4797,8 @@ extern GTY(()) vec<tree, va_gc> *local_classes;
 #endif /* !defined(NO_DOLLAR_IN_LABEL) || !defined(NO_DOT_IN_LABEL) */
 
 \f
-/* Nonzero if we're done parsing and into end-of-file activities.  */
+/* Nonzero if we're done parsing and into end-of-file activities.
+   Two if we're done with front-end processing.  */
 
 extern int at_eof;
 
index 068d79cd10c16033d3170bb176f97f728a3c4f84..8e7a453ec1bbba7adc59b8ddf04750aa27c1bd13 100644 (file)
@@ -4846,6 +4846,9 @@ c_parse_final_cleanups (void)
 
   timevar_stop (TV_PHASE_DEFERRED);
   timevar_start (TV_PHASE_PARSING);
+
+  /* Indicate that we're done with front end processing.  */
+  at_eof = 2;
 }
 
 /* Perform any post compilation-proper cleanups for the C++ front-end.
index ae3e0921c5c9964b78bcc88944028330b7d7b4fe..faf8744e225c19823283e2815e198021a45bc448 100644 (file)
@@ -339,6 +339,11 @@ dump_template_bindings (cxx_pretty_printer *pp, tree parms, tree args,
       && !DECL_LANG_SPECIFIC (current_function_decl))
     return;
 
+  /* Don't try to do this once cgraph starts throwing away front-end
+     information.  */
+  if (at_eof >= 2)
+    return;
+
   FOR_EACH_VEC_SAFE_ELT (typenames, i, t)
     {
       if (need_semicolon)
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-targ3.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-targ3.C
new file mode 100644 (file)
index 0000000..d1e4482
--- /dev/null
@@ -0,0 +1,40 @@
+// PR c++/67108
+// { dg-do compile { target c++11 } }
+
+template < typename, typename > struct is_same;
+template < typename T > struct is_same <T, T >
+{
+  enum
+  {
+    value = true
+  }
+   ;
+    constexpr bool operator () ()
+  {
+    return value;
+  }
+}
+ ;
+template < bool, typename = void >struct enable_if;
+template < typename T > struct enable_if <true, T >
+{
+  typedef T type;
+}
+ ;
+struct A;
+template < typename, typename = void >struct F;
+template < typename X > struct F <X, typename enable_if < is_same < X, A >
+{
+}
+  () >::type >
+{
+  template < typename MakeDependent > F (MakeDependent)
+  {
+  }
+}
+;
+
+int main ()
+{
+  F < A > (1);
+}