When assigning symbols to sections in ipa-comdats.c we currently
segfault when val is NULL. Fix by guarding against this case.

Tested on powerpc64-unknown-linux-gnu.
OK for trunk?

2014-10-27  Markus Trippelsdorf  <mar...@trippelsdorf.de> 

        PR ipa/63649
        * ipa-comdats.c (ipa_comdats): Guard against NULL.

        PR ipa/63649
        * g++.dg/ipa/pr63649.C: New test.

diff --git a/gcc/ipa-comdats.c b/gcc/ipa-comdats.c
index b270d9717b27..8843410545e0 100644
--- a/gcc/ipa-comdats.c
+++ b/gcc/ipa-comdats.c
@@ -317,8 +317,11 @@ ipa_comdats (void)
          && !symbol->alias
          && symbol->real_symbol_p ())
        {
-         tree group = *map.get (symbol);
+         tree *val = map.get (symbol);
+         if (!val)
+           continue;
 
+         group = *val;
          if (group == error_mark_node)
            continue;
          if (dump_file)
diff --git a/gcc/testsuite/g++.dg/ipa/pr63649.C 
b/gcc/testsuite/g++.dg/ipa/pr63649.C
new file mode 100644
index 000000000000..1bd1d13aaaf3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr63649.C
@@ -0,0 +1,28 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -std=c++11"  } */
+struct A
+{
+  typedef void Func ();
+  A () = default;
+  void *_base;
+};
+class B
+{
+  struct
+  {
+    void m_fn1 (A::Func);
+  } static b;
+};
+template <typename> class C : B
+{
+public:
+  C ();
+  static void
+  m_fn2 ()
+  {
+  }
+};
+
+A c;
+__attribute__ ((init_priority (0xfffe))) C<int> a;
+template <typename T> C<T>::C () { b.m_fn1 (m_fn2); }
-- 
Markus

Reply via email to