re PR tree-optimization/65193 (ICE: Segmentation fault with -g -flto)
authorRichard Biener <rguenther@suse.de>
Fri, 27 Feb 2015 10:20:50 +0000 (10:20 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 27 Feb 2015 10:20:50 +0000 (10:20 +0000)
2015-02-27  Richard Biener  <rguenther@suse.de>

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

From-SVN: r221050

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

index ad86ce02e67b21440fc36a1e6817d6fb23b30452..3200f413e6c0c2f06ab67136303f3653ba1bf72b 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-27  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * gcc.target/s390/20140327-1.c: Remove -m31 and guard with ! lp64.
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 ());
+       }
+}