]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
PR c++/69315
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Mar 2016 18:36:25 +0000 (18:36 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 23 Mar 2016 18:36:25 +0000 (18:36 +0000)
* cp-tree.h (defer_mark_used_calls, deferred_mark_used_calls): Remove.
* decl.c (defer_mark_used_calls, deferred_mark_used_calls): Remove.
(finish_function): Don't set or test them.
* decl2.c (mark_used): Don't handle defer_mark_used_calls.

* g++.dg/cpp0x/constexpr-69315.C: New test.
* g++.dg/cpp0x/variadic122.C: Change one dg-warning into dg-bogus.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234436 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 01fc2bd7657499e404b0814a43c1f39107ead240..499b4568f14bd2861f20ef201a2b937d849ae986 100644 (file)
@@ -1,3 +1,13 @@
+2016-03-23  Alexandre Oliva  <aoliva@redhat.com>
+           Jason Merrill  <jason@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/69315
+       * cp-tree.h (defer_mark_used_calls, deferred_mark_used_calls): Remove.
+       * decl.c (defer_mark_used_calls, deferred_mark_used_calls): Remove.
+       (finish_function): Don't set or test them.
+       * decl2.c (mark_used): Don't handle defer_mark_used_calls.
+
 2016-03-23  Jason Merrill  <jason@redhat.com>
 
        PR c++/70344
index 6462d8a35dbf56d8fc158cfd422877619ebc60af..b7b770f920085faf8db8f6c481df52f9ac227c75 100644 (file)
@@ -5846,8 +5846,6 @@ extern tree fndecl_declared_return_type           (tree);
 extern bool undeduced_auto_decl                        (tree);
 extern void require_deduced_type               (tree);
 
-extern bool defer_mark_used_calls;
-extern GTY(()) vec<tree, va_gc> *deferred_mark_used_calls;
 extern tree finish_case_label                  (location_t, tree, tree);
 extern tree cxx_maybe_build_cleanup            (tree, tsubst_flags_t);
 
index 47a53cb9f2d97297114839f77e8f30ca87fb4821..cd5db3f06dc306758bec05471abbe41f4c240c5f 100644 (file)
@@ -227,11 +227,6 @@ struct GTY((for_user)) named_label_entry {
    function, two inside the body of a function in a local class, etc.)  */
 int function_depth;
 
-/* To avoid unwanted recursion, finish_function defers all mark_used calls
-   encountered during its execution until it finishes.  */
-bool defer_mark_used_calls;
-vec<tree, va_gc> *deferred_mark_used_calls;
-
 /* States indicating how grokdeclarator() should handle declspecs marked
    with __attribute__((deprecated)).  An object declared as
    __attribute__((deprecated)) suppresses warnings of uses of other
@@ -14594,9 +14589,6 @@ finish_function (int flags)
   if (c_dialect_objc ())
     objc_finish_function ();
 
-  gcc_assert (!defer_mark_used_calls);
-  defer_mark_used_calls = true;
-
   record_key_method_defined (fndecl);
 
   fntype = TREE_TYPE (fndecl);
@@ -14846,17 +14838,6 @@ finish_function (int flags)
   /* Clean up.  */
   current_function_decl = NULL_TREE;
 
-  defer_mark_used_calls = false;
-  if (deferred_mark_used_calls)
-    {
-      unsigned int i;
-      tree decl;
-
-      FOR_EACH_VEC_SAFE_ELT (deferred_mark_used_calls, i, decl)
-       mark_used (decl);
-      vec_free (deferred_mark_used_calls);
-    }
-
   invoke_plugin_callbacks (PLUGIN_FINISH_PARSE_FUNCTION, fndecl);
   return fndecl;
 }
index 73b0d280c433793aed3103effcaa64f3947c2e1a..b3cc99a7dc1a6cad31afc2ecffc021b3b64183f7 100644 (file)
@@ -5140,14 +5140,6 @@ mark_used (tree decl, tsubst_flags_t complain)
   if (DECL_ODR_USED (decl))
     return true;
 
-  /* If within finish_function, defer the rest until that function
-     finishes, otherwise it might recurse.  */
-  if (defer_mark_used_calls)
-    {
-      vec_safe_push (deferred_mark_used_calls, decl);
-      return true;
-    }
-
   /* Normally, we can wait until instantiation-time to synthesize DECL.
      However, if DECL is a static data member initialized with a constant
      or a constexpr function, we need it right now because a reference to
index 93b731266ab57c0870c4cf605118210874cad6cd..4d620748c1b7685093cdba28e62d368d5d9f87db 100644 (file)
@@ -1,3 +1,11 @@
+2016-03-23  Alexandre Oliva  <aoliva@redhat.com>
+           Jason Merrill  <jason@redhat.com>
+           Jakub Jelinek  <jakub@redhat.com>
+
+       PR c++/69315
+       * g++.dg/cpp0x/constexpr-69315.C: New test.
+       * g++.dg/cpp0x/variadic122.C: Change one dg-warning into dg-bogus.
+
 2016-03-23  Marek Polacek  <polacek@redhat.com>
 
        PR c++/69884
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-69315.C
new file mode 100644 (file)
index 0000000..cf32938
--- /dev/null
@@ -0,0 +1,35 @@
+// PR c++/69315
+// { dg-do compile { target c++11 } }
+// { dg-options "-O2" }
+
+// Template instantiation and evaluation for folding within
+// finish_function may call finish_function recursively.
+// Make sure we don't reject or delay that sort of recursion.
+
+template <bool> struct Iter;
+
+struct Arg {
+  Iter<true> begin();
+  Iter<true> end();
+};
+
+template <bool> struct Iter {
+  int operator*();
+  Iter operator++();
+  template <bool C1, bool C2> friend constexpr bool operator==(Iter<C1>, Iter<C2>);
+  template <bool C1, bool C2> friend constexpr bool operator!=(Iter<C1>, Iter<C2>);
+};
+
+void func(Arg a) {
+  for (auto ch : a) {
+    a.begin() == a.end();
+  }
+}
+
+template <bool C1, bool C2> constexpr bool operator==(Iter<C1>, Iter<C2>) {
+  return true;
+}
+
+template <bool C1, bool C2> constexpr bool operator!=(Iter<C1> a, Iter<C2> b) {
+  return a == b;
+}
index aa21ddddd18b98ceae0d0ce3be6f5eff27f4fcbe..12dc9012c377f02ca1cdb78f7df8ed1c2a730b55 100644 (file)
@@ -9,7 +9,7 @@ template < class T > struct Container
 
 template < class T >
 T deref (T)
-{}                             // { dg-warning "no return" }
+{}                             // { dg-bogus "no return" }
 
 template < class T, class ... Args >
 auto deref (T u, int, Args ... args)->decltype (deref (u.f (), args ...))