]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/65193 (ICE: Segmentation fault with -g -flto)
authorRichard Biener <rguenther@suse.de>
Fri, 27 Feb 2015 11:34:14 +0000 (11:34 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 27 Feb 2015 11:34:14 +0000 (11:34 +0000)
2015-02-27  Richard Biener  <rguenther@suse.de>

PR lto/65193
Backport from mainline
2014-07-24  Jan Hubicka  <hubicka@ucw.cz>

* lto-streamer-out.c (tree_is_indexable): Consider IMPORTED_DECL
as non-indexable.

* g++.dg/lto/pr65193_0.C: New testcase.

From-SVN: r221054

gcc/ChangeLog
gcc/lto-streamer-out.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/lto/pr65193_0.C [new file with mode: 0644]

index d42bc827c97da47561848db9a5309b4b4a581f58..dce2ea05ae7bd382e6150c24d61cf774beac7a57 100644 (file)
@@ -1,3 +1,12 @@
+2015-02-27  Richard Biener  <rguenther@suse.de>
+
+       PR lto/65193
+       Backport from mainline
+       2014-07-24  Jan Hubicka  <hubicka@ucw.cz>
+       * lto-streamer-out.c (tree_is_indexable): Consider IMPORTED_DECL
+       as non-indexable.
+
 2015-02-26  Peter Bergner  <bergner@vnet.ibm.com>
 
        Backport from mainline
index b205092f597b0c0219f69e7d737d935cb95cb84b..c898c23d6f668c96b6769c7088c7d0899cc1c0b6 100644 (file)
@@ -129,6 +129,9 @@ tree_is_indexable (tree t)
   else if (TREE_CODE (t) == VAR_DECL && decl_function_context (t)
           && !TREE_STATIC (t))
     return false;
+  /* IMPORTED_DECL is put into BLOCK and thus it never can be shared.  */
+  else if (TREE_CODE (t) == IMPORTED_DECL)
+    return false;
   /* Variably modified types need to be streamed alongside function
      bodies because they can refer to local entities.  Together with
      them we have to localize their members as well.
index 1b29c10d6fceb898ea1d51cf478ab256dd4cded0..10317c10a3ef1136b74a7e3d386a4ee9aa323b36 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-27  Richard Biener  <rguenther@suse.de>
+
+       PR lto/65193
+       * g++.dg/lto/pr65193_0.C: New testcase.
+
 2015-02-26  Peter Bergner  <bergner@vnet.ibm.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/g++.dg/lto/pr65193_0.C b/gcc/testsuite/g++.dg/lto/pr65193_0.C
new file mode 100644 (file)
index 0000000..d778fca
--- /dev/null
@@ -0,0 +1,71 @@
+/* { dg-lto-do link } */
+/* { dg-require-effective-target fpic } */
+/* { dg-lto-options {{-fPIC -r -nostdlib -flto -O2 -g}} } */
+
+void frexp (int, int *);
+namespace std
+{
+  int ldexp (int, int);
+  struct A
+    {
+    };
+  template <class T> T get_min_shift_value ();
+  template <class> struct min_shift_initializer
+    {
+      struct B
+       {
+         B () { get_min_shift_value<long double> (); }
+       } static const b;
+      static void
+         m_fn1 ()
+           {
+             b;
+           }
+    };
+  template <class T>
+      const typename min_shift_initializer<T>::B min_shift_initializer<T>::b;
+  template <class T>
+      inline T
+      get_min_shift_value ()
+       {
+         using std::ldexp;
+         static T c = ldexp (0, 0);
+         min_shift_initializer<T>::m_fn1;
+       }
+  template <class T, class Policy>
+      void
+      float_next_imp (T p1, Policy p2)
+       {
+         using std::ldexp;
+         int d;
+         float_next (0, p2);
+         frexp (p1, &d);
+       }
+  template <class T, class Policy>
+      int
+      float_next (const T &p1, Policy &p2)
+       {
+         float_next_imp (p1, p2);
+       }
+  template <class T, class Policy> void float_prior_imp (T, Policy)
+    {
+      get_min_shift_value<T> ();
+    }
+  template <class T, class Policy> int float_prior (T, Policy)
+    {
+      float_prior_imp (static_cast<T> (0), 0);
+    }
+  template <class T, class U, class Policy>
+      void
+      nextafter (T p1, U p2, Policy p3)
+       {
+         p2 ? float_next (0, p3) : float_prior (p1, 0);
+       }
+  long double e;
+  int f;
+  void
+      nextafter ()
+       {
+         nextafter (e, f, A ());
+       }
+}