2012-05-02 Martin Jambor <mjambor@suse.cz>
authorjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 May 2012 19:50:37 +0000 (19:50 +0000)
committerjamborm <jamborm@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 2 May 2012 19:50:37 +0000 (19:50 +0000)
PR lto/52605
* dwarf2out.c (dwarf2out_decl): Only lookup die representing context
of a variable when the contect is a function.

* gcc/testsuite/g++.dg/lto/pr52605_0.C: New test.

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

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

index 7611f01..8367cb6 100644 (file)
@@ -1,3 +1,9 @@
+2012-05-02  Martin Jambor  <mjambor@suse.cz>
+
+       PR lto/52605
+       * dwarf2out.c (dwarf2out_decl): Only lookup die representing context
+       of a variable when the contect is a function.
+
 2012-05-02  Michael Matz  <matz@suse.de>
 
        * coretypes.h (gimple_seq, const_gimple_seq): Typedef as gimple.
index 8bbf954..10a5389 100644 (file)
@@ -19122,7 +19122,9 @@ dwarf2out_decl (tree decl)
        return;
 
       /* For local statics lookup proper context die.  */
-      if (TREE_STATIC (decl) && decl_function_context (decl))
+      if (TREE_STATIC (decl)
+         && DECL_CONTEXT (decl)
+         && TREE_CODE (DECL_CONTEXT (decl)) == FUNCTION_DECL)
        context_die = lookup_decl_die (DECL_CONTEXT (decl));
 
       /* If we are in terse mode, don't generate any DIEs to represent any
index c447969..4f831b1 100644 (file)
@@ -1,3 +1,8 @@
+2012-05-02  Martin Jambor  <mjambor@suse.cz>
+
+       PR lto/52605
+       * g++.dg/lto/pr52605_0.C: New test.
+
 2012-05-02  Kirill Yukhin  <kirill.yukhin@intel.com>
 
        * gcc.target/i386/hle-cmpxchg-acq-1.c: New.
diff --git a/gcc/testsuite/g++.dg/lto/pr52605_0.C b/gcc/testsuite/g++.dg/lto/pr52605_0.C
new file mode 100644 (file)
index 0000000..22540ab
--- /dev/null
@@ -0,0 +1,39 @@
+// { dg-lto-do link }
+// { dg-lto-options {{-flto -g}} }
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+  virtual int foo (int i);
+};
+
+int A::foo (int i)
+{
+  return i + 1;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+  return 1;
+}
+
+int main (int argc, char *argv[])
+{
+
+  class B : public A
+  {
+  public:
+    int bar (int i)
+    {
+      return foo (i) + 2;
+    }
+  };
+  class B b;
+
+  if (b.bar (get_input ()) != 4)
+    abort ();
+  return 0;
+}
+