summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/debug
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/g++.dg/debug
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/g++.dg/debug')
-rw-r--r--gcc/testsuite/g++.dg/debug/anonunion1.C14
-rw-r--r--gcc/testsuite/g++.dg/debug/const1.C11
-rw-r--r--gcc/testsuite/g++.dg/debug/const2.C15
-rw-r--r--gcc/testsuite/g++.dg/debug/const3.C3
-rw-r--r--gcc/testsuite/g++.dg/debug/const4.C2
-rw-r--r--gcc/testsuite/g++.dg/debug/crash1.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/debug.exp30
-rw-r--r--gcc/testsuite/g++.dg/debug/debug1.C48
-rw-r--r--gcc/testsuite/g++.dg/debug/debug2.C42
-rw-r--r--gcc/testsuite/g++.dg/debug/debug3.C47
-rw-r--r--gcc/testsuite/g++.dg/debug/debug4.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/debug5.C10
-rw-r--r--gcc/testsuite/g++.dg/debug/debug6.C7
-rw-r--r--gcc/testsuite/g++.dg/debug/debug7.C19
-rw-r--r--gcc/testsuite/g++.dg/debug/debug8.C2
-rw-r--r--gcc/testsuite/g++.dg/debug/debug9.C26
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2-1.C22
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2-2.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C24
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C18
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/const2.C6
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/const2b.C7
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp43
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C34
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/enum1.C19
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C19
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C126
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h42
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C126
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h42
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C126
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h42
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C126
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h42
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C126
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h42
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/fesd.h67
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C13
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/icf.C50
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C18
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C21
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C35
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/inline1.C18
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C13
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C30
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C76
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C76
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C30
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C29
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C37
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C20
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C41
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C22
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C22
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C47
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C18
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C18
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/rv1.C15
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C28
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C29
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C12
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C12
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C37
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C16
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C22
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C24
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C38
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C28
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C38
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C59
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C15
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C22
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C23
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C25
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C36
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C29
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C44
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C21
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C15
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C28
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C33
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C11
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C19
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C10
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C10
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C30
-rw-r--r--gcc/testsuite/g++.dg/debug/enum-1.C16
-rw-r--r--gcc/testsuite/g++.dg/debug/enum-2.C22
-rw-r--r--gcc/testsuite/g++.dg/debug/minimal1.C7
-rw-r--r--gcc/testsuite/g++.dg/debug/namespace1.C258
-rw-r--r--gcc/testsuite/g++.dg/debug/namespace2.C8
-rw-r--r--gcc/testsuite/g++.dg/debug/nullptr01.C15
-rw-r--r--gcc/testsuite/g++.dg/debug/pr15736.cc12
-rw-r--r--gcc/testsuite/g++.dg/debug/pr16792.C10
-rw-r--r--gcc/testsuite/g++.dg/debug/pr22514.C13
-rw-r--r--gcc/testsuite/g++.dg/debug/pr27657.C9
-rw-r--r--gcc/testsuite/g++.dg/debug/pr29906.C10
-rw-r--r--gcc/testsuite/g++.dg/debug/pr30898.C13
-rw-r--r--gcc/testsuite/g++.dg/debug/pr34895.C19
-rw-r--r--gcc/testsuite/g++.dg/debug/pr43010.C8
-rw-r--r--gcc/testsuite/g++.dg/debug/pr44178.C39
-rw-r--r--gcc/testsuite/g++.dg/debug/pr44182.C26
-rw-r--r--gcc/testsuite/g++.dg/debug/pr45660.C16
-rw-r--r--gcc/testsuite/g++.dg/debug/pr46123.C47
-rw-r--r--gcc/testsuite/g++.dg/debug/pr46240.cc172
-rw-r--r--gcc/testsuite/g++.dg/debug/pr46241.C19
-rw-r--r--gcc/testsuite/g++.dg/debug/pr46338.C24
-rw-r--r--gcc/testsuite/g++.dg/debug/pr46583.C40
-rw-r--r--gcc/testsuite/g++.dg/debug/pr47106.C38
-rw-r--r--gcc/testsuite/g++.dg/debug/pr47209.C12
-rw-r--r--gcc/testsuite/g++.dg/debug/pr47283.C58
-rw-r--r--gcc/testsuite/g++.dg/debug/static1.C16
-rw-r--r--gcc/testsuite/g++.dg/debug/template1.C15
-rw-r--r--gcc/testsuite/g++.dg/debug/trivial.C6
-rw-r--r--gcc/testsuite/g++.dg/debug/typedef1.C17
-rw-r--r--gcc/testsuite/g++.dg/debug/typedef2.C12
-rw-r--r--gcc/testsuite/g++.dg/debug/typedef3.C19
-rw-r--r--gcc/testsuite/g++.dg/debug/using1.C15
-rw-r--r--gcc/testsuite/g++.dg/debug/using2.C21
-rw-r--r--gcc/testsuite/g++.dg/debug/using3.C8
-rw-r--r--gcc/testsuite/g++.dg/debug/vartrack1.C99
125 files changed, 3996 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/debug/anonunion1.C b/gcc/testsuite/g++.dg/debug/anonunion1.C
new file mode 100644
index 000000000..c48a8cdc1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/anonunion1.C
@@ -0,0 +1,14 @@
+// PR debug/9039
+// Verify that the debugging backends don't get confused by ALIAS_DECLs.
+
+int foo()
+{
+ union
+ {
+ int z;
+ unsigned int w;
+ };
+
+ w = 0;
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/const1.C b/gcc/testsuite/g++.dg/debug/const1.C
new file mode 100644
index 000000000..7cbc57141
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/const1.C
@@ -0,0 +1,11 @@
+// PR c++/6381
+// Bug: we were emitting the initializer for bar, which referenced foo,
+// which was not emitted.
+
+// { dg-options "-O" }
+// { dg-do link }
+
+static const int foo[] = { 0 };
+static const int * const bar[] = { foo };
+
+int main() {}
diff --git a/gcc/testsuite/g++.dg/debug/const2.C b/gcc/testsuite/g++.dg/debug/const2.C
new file mode 100644
index 000000000..8e98f8b19
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/const2.C
@@ -0,0 +1,15 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 1 Apr 2005 <nathan@codesourcery.com>
+
+// { dg-options "-ggdb2" }
+// Origin: ivan <ivanr@syncad.com>
+// pinskia@gcc.gnu.org
+// Bug 20505: ICE with -ggdb2
+
+struct b
+{
+ static const int d;
+ virtual bool IsEmpty() const=0;
+ int e,c;
+};
+const int b::d = ((__SIZE_TYPE__)(&((b*)1)->c) - 1);
diff --git a/gcc/testsuite/g++.dg/debug/const3.C b/gcc/testsuite/g++.dg/debug/const3.C
new file mode 100644
index 000000000..375c548a3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/const3.C
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+typedef float FloatVect __attribute__((__vector_size__(16)));
+const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 };
diff --git a/gcc/testsuite/g++.dg/debug/const4.C b/gcc/testsuite/g++.dg/debug/const4.C
new file mode 100644
index 000000000..ec8133d77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/const4.C
@@ -0,0 +1,2 @@
+/* { dg-do compile } */
+const __complex__ int x = 2i;
diff --git a/gcc/testsuite/g++.dg/debug/crash1.C b/gcc/testsuite/g++.dg/debug/crash1.C
new file mode 100644
index 000000000..4fba256b7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/crash1.C
@@ -0,0 +1,17 @@
+template <typename T>
+class foo
+{
+ T t;
+};
+
+class bar;
+typedef foo<bar> foobar;
+
+class obj
+{
+ virtual foobar* yeah() = 0;
+};
+
+class bar : virtual public obj
+{
+};
diff --git a/gcc/testsuite/g++.dg/debug/debug.exp b/gcc/testsuite/g++.dg/debug/debug.exp
new file mode 100644
index 000000000..e98d0fe55
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug.exp
@@ -0,0 +1,30 @@
+# Copyright (C) 2002, 2007 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# G++ testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+gcc-dg-debug-runtest g++_target_compile trivial.C [list -O2 -O3] \
+ [lsort [glob -nocomplain $srcdir/$subdir/*.C]]
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/g++.dg/debug/debug1.C b/gcc/testsuite/g++.dg/debug/debug1.C
new file mode 100644
index 000000000..3efcbc98f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug1.C
@@ -0,0 +1,48 @@
+// Test whether dwarf2 debug info works with named return value optimization
+// { dg-do compile }
+
+struct S
+{
+ virtual ~S();
+ S (const char *str);
+ S& operator= (const char *str);
+ operator const char *() const;
+ S& operator+= (const char *str);
+};
+inline S operator+ (const char *s1, const S &s2)
+{
+ S x (s1);
+ x += s2;
+ return x;
+}
+struct U
+{
+ U ();
+ U& operator= (const char *);
+ const char *foo() const;
+ operator const char *() const { return foo(); }
+};
+template <class T> struct V
+{
+ T v;
+};
+template <class T> struct W
+{
+ V<T> *w;
+ W() : w (0) {}
+ const T& operator* () const { return w->v; }
+ T& operator* () { return w->v; }
+};
+struct X {
+ X();
+};
+struct Y {
+ Y (const U &u);
+};
+X::X()
+{
+ W<U> a;
+ U b;
+ b = (*a) + "xx";
+ Y c (b);
+}
diff --git a/gcc/testsuite/g++.dg/debug/debug2.C b/gcc/testsuite/g++.dg/debug/debug2.C
new file mode 100644
index 000000000..e0164202d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug2.C
@@ -0,0 +1,42 @@
+/* Verify that sched re-inserts needed scopes properly. */
+/* { dg-do compile } */
+/* { dg-options "-mcpu=ev5" { target alpha*-*-* } } */
+
+template <class T>
+inline void foo()
+{
+ void (T::*x)() __attribute__ ((__unused__)) = &T::bar;
+}
+
+template <class T>
+struct D
+{
+ void bar() {
+ }
+ T i;
+};
+
+template <class T>
+struct E
+{
+ void bar() {
+ foo <D<T> > ();
+ *i-- = *i;
+ }
+ T i;
+};
+
+struct A {};
+template<typename T> struct B { typedef typename T::t t; };
+template<typename T> struct B<T*> { typedef T& t; };
+template<typename T>
+struct C
+{
+ T b;
+ explicit C (const T& i) : b (i) { }
+ typename B<T>::t operator* () const { return *b; }
+ C operator-- (int) { return C (b--); }
+};
+
+template void foo <E<C<A**> > > ();
+template void foo <D<C<A**> > > ();
diff --git a/gcc/testsuite/g++.dg/debug/debug3.C b/gcc/testsuite/g++.dg/debug/debug3.C
new file mode 100644
index 000000000..c7251429f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug3.C
@@ -0,0 +1,47 @@
+// PR optimization/5547
+// This testcase caused ICE on IA-32, since DWARF-2 was unable
+// to emit location expression for parameter a of operator+.
+// { dg-do compile { target fpic } }
+// { dg-options "-fpic" }
+
+struct A { char *s; };
+
+inline A operator+ (char a, const A &b)
+{
+ A s;
+ s.s = new char[12];
+ s.s[0] = a;
+ return s;
+}
+
+int b (const A &);
+
+void test1 (const A &x, int y)
+{
+ int j = b ("012345"[y] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test2 (const A &x, int y)
+{
+ int j = b ("012345678"[y + 2] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test3 (const A &x, int y)
+{
+ int j = b ("012345678"[y - 6] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test4 (const A &x, int y)
+{
+ int j = b ("012345678"[2 * y - 10] + x);
+ for (int i = 0; i < y; i++);
+}
+
+void test5 (const A &x, int y)
+{
+ int j = b ("012345678"[4 * y] + x);
+ for (int i = 0; i < y; i++);
+}
diff --git a/gcc/testsuite/g++.dg/debug/debug4.C b/gcc/testsuite/g++.dg/debug/debug4.C
new file mode 100644
index 000000000..8dceb0875
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug4.C
@@ -0,0 +1,17 @@
+/* PR debug/5770
+ This testcase failed at -O -g because the following constants
+ were optimized away since they were never referenced, but
+ since they are variables with initializers, rtl_for_decl_location
+ run expand_expr on their initializers and returned it.
+ This lead to references to constants which were deferred and thus
+ never emitted. */
+/* { dg-do link } */
+
+static const char foo[] = "foo string";
+static const char bar[30] = "bar string";
+static const wchar_t baz[] = L"baz string";
+
+int
+main ()
+{
+}
diff --git a/gcc/testsuite/g++.dg/debug/debug5.C b/gcc/testsuite/g++.dg/debug/debug5.C
new file mode 100644
index 000000000..8dffa9487
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug5.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+int foo()
+{
+ int a = 1;
+ int b = 1;
+ int e[a][b];
+ e[0][0] = 0;
+ return e[a-1][b-1];
+}
diff --git a/gcc/testsuite/g++.dg/debug/debug6.C b/gcc/testsuite/g++.dg/debug/debug6.C
new file mode 100644
index 000000000..64f121b00
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug6.C
@@ -0,0 +1,7 @@
+// { dg-do compile }
+
+void foo()
+{
+ int i=1, x[i];
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/debug7.C b/gcc/testsuite/g++.dg/debug/debug7.C
new file mode 100644
index 000000000..8731cf81d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug7.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-prune-output "note" }
+
+void f (int);
+
+int
+main() {
+
+ int a = 4;
+ int b = 5;
+ int (*x)[b] = new int[a][b]; // { dg-error "" }
+
+ x[2][1] = 7;
+
+ for (int i = 0; i < a; ++i)
+ for (int j = 0; j < b; ++j)
+ f (x[i][j]);
+ delete [] x;
+}
diff --git a/gcc/testsuite/g++.dg/debug/debug8.C b/gcc/testsuite/g++.dg/debug/debug8.C
new file mode 100644
index 000000000..1f8a18ac8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug8.C
@@ -0,0 +1,2 @@
+struct t{};
+struct g : public t{};
diff --git a/gcc/testsuite/g++.dg/debug/debug9.C b/gcc/testsuite/g++.dg/debug/debug9.C
new file mode 100644
index 000000000..aa328ee6f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/debug9.C
@@ -0,0 +1,26 @@
+/* { dg-do assemble } */
+/* This testcase requires entries in the debug_range section in DWARF which
+ refer to a vague linkage function. */
+
+struct s
+{
+ ~s ();
+};
+
+bool f1 ();
+s f2 (s);
+
+template<int x> void
+f3(const s & a)
+{
+ while (f1 () && f1 ())
+ {
+ s c = f2(a);
+ }
+}
+
+int main()
+{
+ f3<0>(s ());
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C b/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C
new file mode 100644
index 000000000..5c72588e5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf-eh-personality-1.C
@@ -0,0 +1,17 @@
+// { dg-options "-fno-dwarf2-cfi-asm" }
+
+extern void bar (void);
+int foo (void)
+{
+ try {
+ bar();
+ } catch (...) {
+ return 1;
+ }
+ return 0;
+}
+
+int foobar (void)
+{
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2-1.C b/gcc/testsuite/g++.dg/debug/dwarf2-1.C
new file mode 100644
index 000000000..e90d51030
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2-1.C
@@ -0,0 +1,22 @@
+// Copyright (C) 2006 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 6 Jan 2006 <nathan@codesourcery.com>
+
+// PR 24824
+// Origin: wanderer@rsu.ru
+
+// { dg-options "-feliminate-dwarf2-dups" }
+
+namespace N
+{
+ struct Base
+ {
+ int m;
+ };
+
+ struct Derived : Base
+ {
+ using Base::m;
+ };
+}
+
+N::Derived thing;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2-2.C b/gcc/testsuite/g++.dg/debug/dwarf2-2.C
new file mode 100644
index 000000000..9e6dbd216
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2-2.C
@@ -0,0 +1,17 @@
+// PR debug/27057
+// { dg-do compile }
+// { dg-options "-g -feliminate-dwarf2-dups" }
+
+namespace N
+{
+}
+
+struct A
+{
+ void foo ();
+};
+
+void A::foo ()
+{
+ using namespace N;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C b/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C
new file mode 100644
index 000000000..4992f4191
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/accessibility1.C
@@ -0,0 +1,24 @@
+// PR debug/44668
+// { dg-do compile }
+// { dg-options "-g -dA" }
+
+struct C
+{
+private:
+ typedef int a;
+ a b;
+ enum g { g1, g2 } h;
+ struct D { int i; } i;
+protected:
+ typedef int c;
+ c d;
+public:
+ typedef int e;
+ e f;
+} c;
+
+// 3 private DW_TAG_member dies, 1 private DW_TAG_typedef,
+// 1 private DW_TAG_enumeration_type and 1 private DW_TAG_structure_type
+// { dg-final { scan-assembler-times "3\[^\\r\\n\]* DW_AT_accessibility" 6 } }
+// 1 private DW_TAG_member die, 1 private DW_TAG_typedef
+// { dg-final { scan-assembler-times "2\[^\\r\\n\]* DW_AT_accessibility" 2 } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C b/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C
new file mode 100644
index 000000000..b1cae2140
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/anonname1.C
@@ -0,0 +1,18 @@
+// PR debug/41828
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -std=c++0x" }
+// { dg-final { scan-assembler-not "<anonymous" } }
+// { dg-final { scan-assembler-not "\\._\[0-9\]" } }
+// { dg-final { scan-assembler-not "\$_\[0-9\]" } }
+// { dg-final { scan-assembler-not "__anon_" } }
+
+struct
+{
+ union
+ {
+ struct
+ {
+ enum { a, b, c } x;
+ } s;
+ };
+} x;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/const2.C b/gcc/testsuite/g++.dg/debug/dwarf2/const2.C
new file mode 100644
index 000000000..27f4c2658
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/const2.C
@@ -0,0 +1,6 @@
+/* { dg-do compile { target powerpc_altivec_ok } } */
+/* { dg-options "-O -gdwarf-2 -dA -maltivec" } */
+/* { dg-final { scan-assembler "DW_AT_const_value" } } */
+
+typedef float FloatVect __attribute__((__vector_size__(16)));
+const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 };
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C
new file mode 100644
index 000000000..81360c243
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/const2b.C
@@ -0,0 +1,7 @@
+/* { dg-do compile { target i386*-*-* } } */
+/* { dg-options "-O -gdwarf-2 -dA -msse" } */
+/* { dg-require-effective-target sse } */
+/* { dg-final { scan-assembler "DW_AT_const_value" } } */
+
+typedef float FloatVect __attribute__((__vector_size__(16)));
+const FloatVect Foo = { 250000000.0, 0.0, 0.0, 0.0 };
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp
new file mode 100644
index 000000000..37dd794be
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf2.exp
@@ -0,0 +1,43 @@
+# Copyright (C) 2007, 2007, 2010 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# G++ testsuite that uses the `dg.exp' driver.
+
+# Load support procs.
+load_lib g++-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CFLAGS
+if ![info exists DEFAULT_CFLAGS] then {
+ set DEFAULT_CFLAGS " -gdwarf-2"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+set comp_output [g++_target_compile \
+ "$srcdir/$subdir/../trivial.C" "trivial.S" assembly \
+ "additional_flags=-gdwarf-2"]
+if { ! [string match "*: target system does not support the * debug format*" \
+ $comp_output] } {
+ remove-build-file "trivial.S"
+ dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.C $srcdir/c-c++-common/dwarf2/*.c]] \
+ "" $DEFAULT_CFLAGS
+}
+
+# All done.
+dg-finish
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C
new file mode 100644
index 000000000..c5520fa72
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/dwarf4-typedef.C
@@ -0,0 +1,34 @@
+/* { dg-do compile } */
+/* { dg-options "-gdwarf-4" } */
+
+/* Regression test for an ICE in output_die when using -gdwarf-4. */
+
+namespace {
+
+struct A {
+ virtual ~A();
+};
+
+struct B : public A {
+ template <typename A>
+ bool foo(A x[2]) { }
+};
+
+template <typename T>
+struct C {
+ T v[2];
+};
+
+template <typename T>
+bool X(T &b) {
+ typedef C<int> D;
+ D x[2];
+ return b.foo(x);
+}
+
+void f() {
+ B b;
+ X<B>(b);
+}
+
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C b/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C
new file mode 100644
index 000000000..b5518ef18
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/enum1.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-g -dA -gno-strict-dwarf -std=c++0x" }
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_enumeration_type" 3 } }
+// { dg-final { scan-assembler-times " DW_AT_enum_class" 2 } }
+
+enum A { a1, a2 } a;
+enum struct B { b1, b2 } b;
+enum class C { c1, c2 } c;
+
+void
+foo ()
+{
+ a = a1;
+ a = A::a2;
+ b = B::b1;
+ b = B::b2;
+ c = C::c1;
+ c = C::c2;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C b/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C
new file mode 100644
index 000000000..32d205d20
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/explicit-constructor.C
@@ -0,0 +1,19 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++
+// { dg-do compile }
+// { dg-options "-O -g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler-times "DW_AT_explicit" 2 } }
+
+struct Foo
+{
+ Foo () {}
+ explicit Foo (int) {}
+ Foo (char) {}
+ ~Foo () {};
+};
+
+void
+bar ()
+{
+ Foo foo;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C
new file mode 100644
index 000000000..a4a0b50ee
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=any" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-any.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-any.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-any.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-any.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-any.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C
new file mode 100644
index 000000000..4f580ebd3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-baseonly" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-baseonly.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-baseonly.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-baseonly.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-baseonly.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-baseonly.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C
new file mode 100644
index 000000000..0af0a83d8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=none" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-none.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-none.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-none.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-none.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-none.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C
new file mode 100644
index 000000000..a93b90f05
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-reduced" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-reduced.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-reduced.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-reduced.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-reduced.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-reduced.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C
new file mode 100644
index 000000000..95a9a31ff
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.C
@@ -0,0 +1,126 @@
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -femit-struct-debug-detailed=sys" }
+// { dg-final { scan-assembler "timespec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_sec.*DW_AT_name" } }
+// { dg-final { scan-assembler "tv_nsec.*DW_AT_name" } }
+// { dg-final { scan-assembler "itimerspec.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_interval.*DW_AT_name" } }
+// { dg-final { scan-assembler "it_value.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_head.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_ordy_decl_ref_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_fld_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_head_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_decl_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ref_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "gstruct_head_tmpl_defn_ptr_head<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_head.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_ordy_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_ordy_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_ordy_decl_ref_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_var_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_fld_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_fld_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_var_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field1_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_inc.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ref.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_ptr.*DW_AT_name" } }
+// { dg-final { scan-assembler "field2_base_tmpl_defn_var_base_fld.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_head_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler-not "field_head_tmpl_defn_ptr_base.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_decl_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ref_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "gstruct_base_tmpl_defn_ptr_base<int>.*DW_AT_name" } }
+// { dg-final { scan-assembler "field_base_tmpl_defn_ptr_base.*DW_AT_name" } }
+# 1 "fesd-sys.C"
+# 1 "<built-in>"
+# 1 "<command-line>"
+# 1 "fesd-sys.C"
+
+//#include "time.h"
+# 1 "time.h" 1 3 4
+struct timespec
+ {
+ long int tv_sec;
+ long int tv_nsec;
+ };
+
+struct itimerspec
+ {
+ struct timespec it_interval;
+ struct timespec it_value;
+ };
+
+# 6 "fesd-sys.C" 2
+
+struct timespec base_var8;
+struct itimerspec *base_var9;
+
+#include "fesd-sys.h"
+
+struct gstruct_head_ordy_defn_var_base base_var1;
+struct gstruct_base_ordy_defn_var_base base_var2;
+
+struct gstruct_head_tmpl_defn_var_base< int > base_var5;
+struct gstruct_base_tmpl_defn_var_base< int > base_var6;
+
+int base_function() {
+ return 0
++ base_var1.field_head_ordy_defn_var_base
++ base_var2.field1_base_ordy_defn_var_base_ptr->field_head_ordy_defn_ptr_base
++ base_var2.field1_base_ordy_defn_var_base_fld.field_head_ordy_defn_fld_base
++ base_var2.field2_base_ordy_defn_var_base_ptr->field_base_ordy_defn_ptr_base
++ base_var2.field2_base_ordy_defn_var_base_fld.field_base_ordy_defn_fld_base
++ base_var5.field_head_tmpl_defn_var_base
++ base_var6.field1_base_tmpl_defn_var_base_ptr->field_head_tmpl_defn_ptr_base
++ base_var6.field1_base_tmpl_defn_var_base_fld.field_head_tmpl_defn_fld_base
++ base_var6.field2_base_tmpl_defn_var_base_ptr->field_base_tmpl_defn_ptr_base
++ base_var6.field2_base_tmpl_defn_var_base_fld.field_base_tmpl_defn_fld_base
+;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h
new file mode 100644
index 000000000..762f5878f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd-sys.h
@@ -0,0 +1,42 @@
+#include "fesd.h"
+
+struct gstruct_base_ordy_decl_not;
+struct gstruct_base_ordy_defn_not { int field_base_ordy_defn_not; };
+
+struct gstruct_base_ordy_decl_ref_base;
+struct gstruct_base_ordy_defn_ref_base { int field_base_ordy_defn_ref_base; };
+struct gstruct_base_ordy_defn_ptr_base { int field_base_ordy_defn_ptr_base; };
+struct gstruct_base_ordy_defn_fld_base { int field_base_ordy_defn_fld_base; };
+struct gstruct_base_ordy_defn_var_base {
+ gstruct_head_ordy_decl_ref_base *field1_base_ordy_defn_var_base_inc;
+ gstruct_head_ordy_defn_ref_base *field1_base_ordy_defn_var_base_ref;
+ gstruct_head_ordy_defn_ptr_base *field1_base_ordy_defn_var_base_ptr;
+ gstruct_head_ordy_defn_fld_base field1_base_ordy_defn_var_base_fld;
+ gstruct_base_ordy_decl_ref_base *field2_base_ordy_defn_var_base_inc;
+ gstruct_base_ordy_defn_ref_base *field2_base_ordy_defn_var_base_ref;
+ gstruct_base_ordy_defn_ptr_base *field2_base_ordy_defn_var_base_ptr;
+ gstruct_base_ordy_defn_fld_base field2_base_ordy_defn_var_base_fld;
+};
+
+template< typename T > struct gstruct_base_tmpl_decl_not;
+template< typename T > struct gstruct_base_tmpl_defn_not
+{ int field_base_tmpl_defn_not; };
+
+template< typename T > struct gstruct_base_tmpl_decl_ref_base;
+template< typename T > struct gstruct_base_tmpl_defn_ref_base
+{ int field_base_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_base_tmpl_defn_ptr_base
+{ int field_base_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_base_tmpl_defn_fld_base
+{ int field_base_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_base_tmpl_defn_var_base {
+ gstruct_head_tmpl_decl_ref_base< T > *field1_base_tmpl_defn_var_base_inc;
+ gstruct_head_tmpl_defn_ref_base< T > *field1_base_tmpl_defn_var_base_ref;
+ gstruct_head_tmpl_defn_ptr_base< T > *field1_base_tmpl_defn_var_base_ptr;
+ gstruct_head_tmpl_defn_fld_base< T > field1_base_tmpl_defn_var_base_fld;
+ gstruct_base_tmpl_decl_ref_base< T > *field2_base_tmpl_defn_var_base_inc;
+ gstruct_base_tmpl_defn_ref_base< T > *field2_base_tmpl_defn_var_base_ref;
+ gstruct_base_tmpl_defn_ptr_base< T > *field2_base_tmpl_defn_var_base_ptr;
+ gstruct_base_tmpl_defn_fld_base< T > field2_base_tmpl_defn_var_base_fld;
+};
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h b/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h
new file mode 100644
index 000000000..83bb15a17
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/fesd.h
@@ -0,0 +1,67 @@
+/*
+where from: base = matching base; head = other header
+what kind: ordy = ordinary struct; tmpl = template struct
+definition: decl = incomplete declaration; defn = full definition
+how used: not = not used; ref = by ref; ptr = through pointer;
+ fld = as field; var = as variable
+from where: base = from base; head = other header
+*/
+
+struct gstruct_head_ordy_decl_not;
+struct gstruct_head_ordy_defn_not { int field_head_ordy_defn_not; };
+
+struct gstruct_head_ordy_decl_ref_head;
+struct gstruct_head_ordy_defn_ref_head { int field_head_ordy_defn_ref_head; };
+struct gstruct_head_ordy_defn_ptr_head { int field_head_ordy_defn_ptr_head; };
+struct gstruct_head_ordy_defn_fld_head { int field_head_ordy_defn_fld_head; };
+struct gstruct_head_ordy_defn_var_head {
+ gstruct_head_ordy_decl_ref_head *field_head_ordy_defn_var_head_inc;
+ gstruct_head_ordy_defn_ref_head *field_head_ordy_defn_var_head_ref;
+ gstruct_head_ordy_defn_ptr_head *field_head_ordy_defn_var_head_ptr;
+ gstruct_head_ordy_defn_fld_head field_head_ordy_defn_var_head_fld;
+};
+extern struct gstruct_head_ordy_defn_var_head head_var1;
+
+struct gstruct_head_ordy_decl_ref_base;
+struct gstruct_head_ordy_defn_ref_base { int field_head_ordy_defn_ref_base; };
+struct gstruct_head_ordy_defn_ptr_base { int field_head_ordy_defn_ptr_base; };
+struct gstruct_head_ordy_defn_fld_base { int field_head_ordy_defn_fld_base; };
+struct gstruct_head_ordy_defn_var_base { int field_head_ordy_defn_var_base; };
+
+template< typename T > struct gstruct_head_tmpl_decl_not;
+template< typename T > struct gstruct_head_tmpl_defn_not
+{ T field_head_tmpl_defn_not; };
+
+template< typename T > struct gstruct_head_tmpl_decl_ref_head;
+template< typename T > struct gstruct_head_tmpl_defn_ref_head
+{ T field_head_tmpl_defn_ref_head; };
+template< typename T > struct gstruct_head_tmpl_defn_ptr_head
+{ T field_head_tmpl_defn_ptr_head; };
+template< typename T > struct gstruct_head_tmpl_defn_fld_head
+{ T field_head_tmpl_defn_fld_head; };
+template< typename T > struct gstruct_head_tmpl_defn_var_head {
+ gstruct_head_tmpl_decl_ref_head< T > *field_head_tmpl_defn_var_head_inc;
+ gstruct_head_tmpl_defn_ref_head< T > *field_head_tmpl_defn_var_head_ref;
+ gstruct_head_tmpl_defn_ptr_head< T > *field_head_tmpl_defn_var_head_ptr;
+ gstruct_head_tmpl_defn_fld_head< T > field_head_tmpl_defn_var_head_fld;
+};
+extern gstruct_head_tmpl_defn_var_head< int > head_var5;
+
+template< typename T > struct gstruct_head_tmpl_decl_ref_base;
+template< typename T > struct gstruct_head_tmpl_defn_ref_base
+{ T field_head_tmpl_defn_ref_base; };
+template< typename T > struct gstruct_head_tmpl_defn_ptr_base
+{ T field_head_tmpl_defn_ptr_base; };
+template< typename T > struct gstruct_head_tmpl_defn_fld_base
+{ T field_head_tmpl_defn_fld_base; };
+template< typename T > struct gstruct_head_tmpl_defn_var_base
+{ T field_head_tmpl_defn_var_base; };
+
+inline int head_function() {
+ return 0
++ head_var1.field_head_ordy_defn_var_head_ptr->field_head_ordy_defn_ptr_head
++ head_var1.field_head_ordy_defn_var_head_fld.field_head_ordy_defn_fld_head
++ head_var5.field_head_tmpl_defn_var_head_ptr->field_head_tmpl_defn_ptr_head
++ head_var5.field_head_tmpl_defn_var_head_fld.field_head_tmpl_defn_fld_head
+;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C
new file mode 100644
index 000000000..69b56478a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/global-used-types-1.C
@@ -0,0 +1,13 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-do compile }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumeration_type" 1 } }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_enumerator" 2 } }
+// { dg-final { scan-assembler-times "ascii \"a.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "ascii \"b.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } }
+
+struct foo
+{
+ enum { a, b };
+};
+char s[foo::b];
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/icf.C b/gcc/testsuite/g++.dg/debug/dwarf2/icf.C
new file mode 100644
index 000000000..523ee8700
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/icf.C
@@ -0,0 +1,50 @@
+// Test support for ICF debugging.
+// { dg-do compile }
+// { dg-options "-O0 -gdwarf-2 -fenable-icf-debug -dA" }
+
+class A
+{
+ public:
+ A();
+ virtual void work();
+ virtual int p();
+ private:
+ int i;
+};
+
+class B
+{
+ public:
+ B();
+ ~B();
+ void work(const A* a);
+ private:
+ int j;
+};
+
+int
+test1(A* a)
+{
+ a->work();
+}
+
+int
+test2(A* a)
+{
+ if (a->p())
+ {
+ B b;
+ b.work(a);
+ }
+}
+
+// Verify that we get .debug_dcall and .debug_vcall tables generated
+// and that we see entries for both virtual calls.
+// { dg-final { scan-assembler "\\.section.*\.debug_dcall" { xfail mips-sgi-irix* } } }
+// { dg-final { scan-assembler "\\.section.*\.debug_vcall" } }
+// { dg-final { scan-assembler "New caller" { xfail mips-sgi-irix* } } }
+// { dg-final { scan-assembler "Caller DIE offset" { xfail mips-sgi-irix* } } }
+// { dg-final { scan-assembler "Point of call" } }
+// { dg-final { scan-assembler "Callee DIE offset" { xfail mips-sgi-irix* } } }
+// { dg-final { scan-assembler "0\[ \t\]+.*Vtable slot" } }
+// { dg-final { scan-assembler "0x1\[ \t\]+.*Vtable slot" } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C
new file mode 100644
index 000000000..bfdb4f8f5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-decl-1.C
@@ -0,0 +1,17 @@
+// PR debug/39524
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -O0 -fno-merge-debug-strings" }
+
+namespace A
+{
+ static int var2 = 2;
+}
+
+int
+func ()
+{
+ using A::var2;
+ return var2;
+}
+
+// { dg-final { scan-assembler-times "var2\[^\n\r\]*DW_AT_name" 1 } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C
new file mode 100644
index 000000000..65141d74e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-2.C
@@ -0,0 +1,18 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR debug/38390
+// { dg-do compile }
+// { dg-options "-g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler "DW_TAG_imported_module" } }
+
+namespace A
+{
+ int v;
+}
+
+int
+f ()
+{
+ using namespace A;
+ return v;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C
new file mode 100644
index 000000000..6c563752a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-3.C
@@ -0,0 +1,17 @@
+// PR debug/39379
+// { dg-do compile }
+// { dg-options "-g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler "DW_TAG_imported_module" } }
+
+namespace A
+{
+ int v;
+}
+
+int
+main ()
+{
+ using namespace A;
+ v++;
+ return v - 1;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C
new file mode 100644
index 000000000..a325ce20f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module-4.C
@@ -0,0 +1,21 @@
+// PR debug/39379
+// { dg-do compile }
+// { dg-options "-g -dA -gno-strict-dwarf" }
+// { dg-final { scan-assembler "DW_TAG_imported_module" } }
+
+namespace A
+{
+ int v;
+}
+
+int
+f ()
+{
+ int i;
+ {
+ using namespace A;
+ v++;
+ i = v - 1;
+ }
+ return i;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C
new file mode 100644
index 000000000..7b25233f1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/imported-module.C
@@ -0,0 +1,35 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR debug/37410
+// { dg-do compile }
+
+namespace A1
+ {
+ int aaa = 1;
+ };
+namespace A2
+ {
+ int aaa = 2;
+ };
+
+int
+foo (void)
+{
+ int x;
+
+ {
+ int block_create;
+ using namespace A1;
+
+ block_create = aaa; /* break1 */
+ }
+
+ {
+ int block_create;
+ using namespace A2;
+
+ block_create = aaa; /* break2 */
+ }
+
+ return x = 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C b/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C
new file mode 100644
index 000000000..ea405f853
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/inline1.C
@@ -0,0 +1,18 @@
+// This isn't really testing dwarf output, but rather that we can inline f
+// even though the call precedes the definition.
+
+// { dg-options "-gdwarf-2 -dA -O" }
+// { dg-final { scan-assembler "DW_TAG_inlined_subroutine" } }
+
+template <class T>
+inline T f(T);
+
+int main()
+{
+ f(1);
+}
+
+int i;
+
+template <class T>
+inline T f(T t) { ++i; return t; }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C b/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C
new file mode 100644
index 000000000..e0ef7f71c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+// { dg-options "-g -O0 -dA" }
+
+struct C { // { dg-function-on-line {_ZN1CC[12]Ev} }
+ virtual void
+ foo() {} // { dg-function-on-line _ZN1C3fooEv }
+};
+static C dummy;
+
+int
+main (void)
+{ // { dg-function-on-line main }
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C b/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C
new file mode 100644
index 000000000..d61d27fe7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/local-var-in-contructor.C
@@ -0,0 +1,30 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR27574
+// { dg-do compile }
+// { dg-options "-O0 -g" }
+// { dg-final { scan-assembler "problem" } }
+
+void f (int *)
+{
+}
+
+class A
+{
+public:
+ A(int i);
+};
+
+A::A(int i)
+{
+ int *problem = new int(i);
+ f (problem);
+}
+
+int
+main (void)
+{
+ A a (0);
+
+ return 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C b/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C
new file mode 100644
index 000000000..c7c55e12d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/localclass1.C
@@ -0,0 +1,76 @@
+// PR c++/27017
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -feliminate-unused-debug-types -fno-merge-debug-strings" }
+
+int
+foo (int arg1)
+{
+ struct localstruct1
+ {
+ static inline int staticfn1 (int arg2)
+ {
+ int var2 = arg2 << 2;
+ return arg2 + var2;
+ }
+ static int staticfn2 (int arg3)
+ {
+ int var3 = arg3 << 2;
+ return arg3 + var3;
+ }
+ static inline int staticfn3 (int arg4)
+ {
+ int var4 = arg4 << 2;
+ return arg4 + var4;
+ }
+ static int staticfn4 (int arg5)
+ {
+ int var5 = arg5 << 2;
+ return arg5 + var5;
+ }
+ int method1 (int arg6)
+ {
+ int var6 = arg6 << 2;
+ return arg6 + var6;
+ }
+ };
+ struct localstruct2
+ {
+ static inline int staticfn5 (int arg7)
+ {
+ int var7 = arg7 << 2;
+ return arg7 + var7;
+ }
+ static int staticfn6 (int arg8)
+ {
+ int var8 = arg8 << 2;
+ return arg8 + var8;
+ }
+ };
+ return localstruct1::staticfn1 (arg1) + localstruct1::staticfn2 (arg1);
+}
+
+int
+main ()
+{
+ return foo (1) - 10;
+}
+
+// { dg-final { scan-assembler "main\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "foo\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "method1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg7\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg8\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "localstruct1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "localstruct2\[^\n\r\]*DW_AT_name" } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C b/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C
new file mode 100644
index 000000000..6e9a0664f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/localclass2.C
@@ -0,0 +1,76 @@
+// PR c++/27017
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA -O2 -feliminate-unused-debug-types -fno-merge-debug-strings" }
+
+int
+foo (int arg1)
+{
+ struct localstruct1
+ {
+ static inline int staticfn1 (int arg2)
+ {
+ int var2 = arg2 << 2;
+ return arg2 + var2;
+ }
+ static int staticfn2 (int arg3)
+ {
+ int var3 = arg3 << 2;
+ return arg3 + var3;
+ }
+ static inline int staticfn3 (int arg4)
+ {
+ int var4 = arg4 << 2;
+ return arg4 + var4;
+ }
+ static int staticfn4 (int arg5)
+ {
+ int var5 = arg5 << 2;
+ return arg5 + var5;
+ }
+ int method1 (int arg6)
+ {
+ int var6 = arg6 << 2;
+ return arg6 + var6;
+ }
+ };
+ struct localstruct2
+ {
+ static inline int staticfn5 (int arg7)
+ {
+ int var7 = arg7 << 2;
+ return arg7 + var7;
+ }
+ static int staticfn6 (int arg8)
+ {
+ int var8 = arg8 << 2;
+ return arg8 + var8;
+ }
+ };
+ return localstruct1::staticfn1 (arg1) + localstruct1::staticfn2 (arg1);
+}
+
+int
+main ()
+{
+ return foo (1) - 10;
+}
+
+// { dg-final { scan-assembler "main\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "foo\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "staticfn2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "staticfn6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "method1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg2\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "arg3\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg4\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg5\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg6\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg7\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "arg8\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "localstruct1\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler-not "localstruct2\[^\n\r\]*DW_AT_name" } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C
new file mode 100644
index 000000000..6137125ec
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/namespace-1.C
@@ -0,0 +1,30 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/41170
+// { dg-options "-g -dA -fno-merge-debug-strings -gno-strict-dwarf" }
+//
+// We want to test that there is a DW_TAG_namespace DIE DW_AT_name is set
+// to "not_emitted". That namespace die has a child DW_TAG_typedef DIE
+// which DW_AT_name is the null terminated string "T".
+// { dg-final { scan-assembler-times "DIE +\\(\[^\n\]*\\) DW_TAG_namespace" 1 } }
+// { dg-final { scan-assembler-times "\"not_emitted.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "DIE +\\(\[^\n\]*\\) DW_TAG_typedef" 1 } }
+// { dg-final { scan-assembler-times "\.ascii \"T.0\"\[\t \]+\[^\n\]*DW_AT_name" 1 } }
+
+struct strukt
+{
+ int m;
+};
+
+namespace not_emitted
+{
+ typedef strukt T;
+}
+
+int
+main()
+{
+ not_emitted::T t;
+ t.m = 0;
+ return 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C
new file mode 100644
index 000000000..336582c11
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/nested-1.C
@@ -0,0 +1,29 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/40109
+// { dg-do compile }
+// { dg-options "-g -dA -O0" }
+
+namespace A
+{
+
+ class B
+ {
+ };
+ typedef A::B AB;
+};
+
+int
+main()
+{
+ A::AB ab;
+ return 0;
+}
+
+// { dg-final { scan-assembler "DW_TAG_typedef" } }
+//
+// What we want to do here is to be sure that the DIE of A::AB is generated
+// as a child of the DIE of the namespace A declaration.
+// So this test won't catch a regression on this fix yet. To write a proper
+// test for this fix, we would need a dwarf reader written in tcl,
+// or something along those lines.
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C
new file mode 100644
index 000000000..3e6f6b591
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C
@@ -0,0 +1,37 @@
+/*
+ Origin: PR debug/45024
+ { dg-options "-g -dA -fno-merge-debug-strings" }
+ { dg-do compile }
+*/
+
+struct S {
+ template<typename Z> struct T { };
+};
+
+S::T<int> tval;
+
+/*
+We want to express that the DIE of S::T<int> must be a child of the DIE of S, like in assembly this output:
+
+ .uleb128 0x2 # (DIE (0x9e) DW_TAG_structure_type)
+ .ascii "S\0" # DW_AT_name
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc)
+ .byte 0x1 # DW_AT_decl_line
+ .long 0xbc # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0xa8) DW_TAG_structure_type)
+ .ascii "T<int>\0" # DW_AT_name
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc)
+ .byte 0x2 # DW_AT_decl_line
+ .uleb128 0x4 # (DIE (0xb3) DW_TAG_template_type_param)
+ .ascii "Z\0" # DW_AT_name
+ .long 0xbc # DW_AT_type
+ .byte 0 # end of children of DIE 0xa8
+ .byte 0 # end of children of DIE 0x9e
+
+Hence the slightly odd regexp:
+
+ { dg-final { scan-assembler "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"S\\\\0\"\[ \t\]+\(\[@|#;!\]|//?\)\[ \t\]+DW_AT_name\[\n\r\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"T<int>\\\\0\"\[ \t\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_template_type_param\\)\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\(\[@|#;!\]|//?\)\[ \t\]+end of children of DIE\[^\n\r\]*\[\n\r\]+\[^\n\r\]*end of children of DIE\[^\n\r\]*" } }
+
+ */
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C
new file mode 100644
index 000000000..f23efef13
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr41063.C
@@ -0,0 +1,20 @@
+// Contributed by Cary Coutant <ccoutant@google.com>
+// Origin: PR debug/41063
+// { dg-do compile }
+
+struct A {
+ virtual void run();
+};
+
+void test() {
+ struct B : public A {
+ void run() {
+ struct C : public A {
+ C() { }
+ B *b_;
+ };
+ C c;
+ }
+ };
+ B b;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C
new file mode 100644
index 000000000..2df002f6b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C
@@ -0,0 +1,41 @@
+// Origin: PR 44641
+// { dg-do compile }
+// { dg-options "-g -O0 -dA" }
+
+template <class A> struct MisplacedDbg;
+template<class T> struct MisplacedDbg<T*>;
+struct Full;
+template<> struct MisplacedDbg<Full>;
+
+struct Arg;
+typedef MisplacedDbg<Arg> Typedef1;
+typedef MisplacedDbg<Arg*> Typedef2;
+typedef MisplacedDbg<Full> Typedef3;
+
+template<typename T> struct Base {
+ virtual ~Base() {
+ }
+};
+
+template <>
+struct MisplacedDbg<Full> // { dg-function-on-line {_ZN12MisplacedDbgI4FullEC[12]Ev} }
+ // { dg-function-on-line {_ZN12MisplacedDbgI4FullED0Ev} { target *-*-* } 21 }
+
+ : public Base<int> {
+};
+
+template <class T>
+struct MisplacedDbg<T*> // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgEC[12]Ev} }
+ // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgED0Ev} { target *-*-* } 28 }
+ : public Base<int> {
+};
+
+template <class A>
+struct MisplacedDbg // { dg-function-on-line {_ZN12MisplacedDbgI3ArgEC[12]Ev} }
+ // { dg-function-on-line {_ZN12MisplacedDbgI3ArgED0Ev} { target *-*-* } 34 }
+ : public Base<int> {
+};
+
+static MisplacedDbg<Arg> static_var1;
+static MisplacedDbg<Arg*> static_var2;
+static MisplacedDbg<Full> static_var3;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C
new file mode 100644
index 000000000..72f24ad4a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-1.C
@@ -0,0 +1,22 @@
+// PR debug/45997
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA" }
+
+typedef int my_int;
+typedef const my_int const_my_int;
+typedef volatile const_my_int volatile_const_my_int;
+
+my_int v_my_int = 0;
+const_my_int v_const_my_int = 1;
+volatile_const_my_int v_volatile_const_my_int = 4;
+
+int
+main ()
+{
+ asm volatile ("" : : "r" (&v_my_int));
+ asm volatile ("" : : "r" (&v_const_my_int));
+ asm volatile ("" : : "r" (&v_volatile_const_my_int));
+ return 0;
+}
+
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_base_type" 1 } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C
new file mode 100644
index 000000000..ade542804
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr45997-2.C
@@ -0,0 +1,22 @@
+// PR debug/45997
+// { dg-do compile }
+// { dg-options "-gdwarf-2 -dA" }
+
+typedef int my_int;
+typedef volatile my_int volatile_my_int;
+typedef const volatile_my_int const_volatile_my_int;
+
+my_int v_my_int = 0;
+volatile_my_int v_volatile_my_int = 1;
+const_volatile_my_int v_const_volatile_my_int = 4;
+
+int
+main ()
+{
+ asm volatile ("" : : "r" (&v_my_int));
+ asm volatile ("" : : "r" (&v_volatile_my_int));
+ asm volatile ("" : : "r" (&v_const_volatile_my_int));
+ return 0;
+}
+
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_base_type" 1 } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C
new file mode 100644
index 000000000..eee192c26
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr46123.C
@@ -0,0 +1,47 @@
+// PR debug/46123
+// { dg-do compile }
+// { dg-options "-gdwarf-4" }
+
+struct foo
+{
+ static int bar ()
+ {
+ int i;
+ static int baz = 1;
+ {
+ static int baz = 2;
+ i = baz++;
+ }
+ {
+ struct baz
+ {
+ static int m ()
+ {
+ static int n;
+ return n += 10;
+ }
+ };
+ baz a;
+ i += a.m ();
+ }
+ {
+ static int baz = 3;
+ i += baz;
+ baz += 30;
+ }
+ i += baz;
+ baz += 60;
+ return i;
+ }
+};
+
+int main ()
+{
+ foo x;
+
+ if (x.bar () != 16)
+ return 1;
+ if (x.bar() != 117)
+ return 1;
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C
new file mode 100644
index 000000000..dfc983b17
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr46527.C
@@ -0,0 +1,18 @@
+// Origin: PR 46527
+// { dg-do compile }
+// { dg-options "-g -O0 -dA" }
+
+template <typename T> struct Struct {
+ double defined_later();
+};
+struct WrapperStruct {
+ Struct<double> ClassInstantiated;
+};
+template <typename T> double
+Struct<T>::defined_later() // { dg-function-on-line {_ZN6StructIdE13defined_laterEv} }
+{
+ return 1;
+}
+void InstantiateMethod() {
+ Struct<double>().defined_later();
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C
new file mode 100644
index 000000000..63e04e426
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pubnames-1.C
@@ -0,0 +1,17 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/39706
+// { dg-do compile { target *-*-darwin* } }
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+//
+// There should be one debug_pubnames section generated.
+// { dg-final { scan-assembler-times "\.section\[\t \]\[^\n\]*debug_pubnames" 1 } }
+//
+// Then check of the presence of the names we are interested in.
+// { dg-final { scan-assembler-times "\"main.0\"\[^\n\]*external name" 1 } }
+// { dg-final { scan-assembler-times "\"ns::ns_x\[^\n\]*external name" 1 } }
+// { dg-final { scan-assembler-times "\"y::y_x\[^\n\]*external name" 1 } }
+
+namespace ns { int ns_x; }
+class y { public: static int y_x; };
+int y::y_x;
+int main() { return ns::ns_x; }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
new file mode 100644
index 000000000..8aaff8ef2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/redeclaration-1.C
@@ -0,0 +1,18 @@
+// Origin: PR debug/43325
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE \[^\n\r\]*DW_TAG_lexical_block\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_low_pc\[\n\r\]{1,2}\[^\n\r\]*DW_AT_high_pc\[\n\r\]{1,2}\[^\n\r\]*\\(DIE \[^\n\r\]*DW_TAG_variable\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_name" 2 } }
+
+namespace S
+{
+ int
+ f()
+ {
+ int i = 42;
+ {
+ extern int i;
+ return i;
+ }
+ }
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C b/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C
new file mode 100644
index 000000000..c954daa91
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/rv1.C
@@ -0,0 +1,15 @@
+// { dg-do compile }
+// { dg-options "-g -dA -gdwarf-4 -std=c++0x" }
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_reference_type" 1 } }
+// { dg-final { scan-assembler-times "DIE\[^\n\r\]*DW_TAG_rvalue_reference_type" 1 } }
+
+struct A { A (); ~A (); };
+struct B { B (); ~B (); };
+
+void
+foo ()
+{
+ A v;
+ A &a = v;
+ B &&b = B ();
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
new file mode 100644
index 000000000..81bcb2775
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
@@ -0,0 +1,28 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+struct A
+{
+ virtual ~A();
+};
+
+struct B : public A
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
new file mode 100644
index 000000000..b1c5401da
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
@@ -0,0 +1,29 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+template<class T>
+struct A
+{
+ virtual ~A();
+};
+
+struct B : public A<int>
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A<int>* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C
new file mode 100644
index 000000000..dce279ed4
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member1.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+
+struct A
+{
+ static int staticdatamember;
+};
+
+int A::staticdatamember = 6;
+
+// { dg-final { scan-assembler "DW_TAG_member\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticdatamember\[^\n\r\]*DW_AT_name" } }
+// { dg-final { scan-assembler "DW_TAG_variable\[^\n\r\]*\[\n\r\]*\[^\n\r\]*DW_AT_specification" } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C
new file mode 100644
index 000000000..568144503
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/static-data-member2.C
@@ -0,0 +1,12 @@
+// PR debug/26965
+// { dg-options "-gdwarf-2 -dA" }
+// { dg-final { scan-assembler-not "DW_TAG_variable" } }
+// { dg-final { scan-assembler-not "DW_TAG_enumerator" } }
+// { dg-final { scan-assembler-not "DW_TAG_enumeration_type" } }
+
+enum x { i = 1 };
+class c {
+ static const x beg = i;
+ int foo () { return (int) beg; }
+};
+void bar () { }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C b/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C
new file mode 100644
index 000000000..a1bf6b53c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/static-local-var-in-ctor.C
@@ -0,0 +1,37 @@
+// PR debug/39372
+// { dg-do compile }
+// { dg-options "-O0 -g -dA" }
+// { dg-final { scan-assembler "DW_OP_addr\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticvar1" } }
+// { dg-final { scan-assembler "DW_OP_addr\[^\n\r\]*\[\n\r\]*\[^\n\r\]*staticvar2" } }
+
+extern void f (int *);
+
+struct A
+{
+ A(int i);
+ void foo(int i);
+};
+
+A::A(int i)
+{
+ static int *staticvar1 = new int(i);
+ f (staticvar1);
+}
+
+void A::foo(int i)
+{
+ static int *staticvar2 = new int(i);
+ f (staticvar2);
+}
+
+void f (int *)
+{
+}
+
+int
+main (void)
+{
+ A a(42);
+ a.foo(42);
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C
new file mode 100644
index 000000000..3a43d9fa5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-1.C
@@ -0,0 +1,16 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "U.*DW_AT_name" } }
+
+template <class U>
+U
+func(U m)
+{
+ return m;
+}
+
+int i = func<int>(2);
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C
new file mode 100644
index 000000000..27c68d796
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-2.C
@@ -0,0 +1,22 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "i.*DW_AT_name" } }
+// { dg-final { scan-assembler "3.*DW_AT_const_value" } }
+
+
+template <int i>
+int
+func()
+{
+ int j = i;
+ return j;
+}
+
+const int foo = 1;
+const int bar = 2;
+
+int h = func<foo+bar>();
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C
new file mode 100644
index 000000000..4c7249035
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-3.C
@@ -0,0 +1,24 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "f.*DW_AT_name" } }
+// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
+
+typedef void (*func_ptr)();
+
+template <func_ptr f>
+int
+func()
+{
+ f();
+ return 0;
+}
+
+void
+bleh()
+{
+}
+
+int c = func<bleh>();
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C
new file mode 100644
index 000000000..85401b228
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-4.C
@@ -0,0 +1,38 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-std=c++0x -g -dA" }
+//
+// In theory the compiler instantiates count<int, char, long>,
+// count<char, long> and count<long>. In practice, only
+// count<int, char, long> is emitted, thanks to constant folding.
+// So in theory, each of the 3 instances of count yields a
+// DW_TAG_GNU_template_parameter_pack DIE, but in practise, there is only one
+// DW_TAG_GNU_template_parameter_pack as there is only count<int, char, long>
+// is emitted.
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1} }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 3} }
+
+
+template <typename... Args> struct count;
+
+template <>
+struct count<>
+{
+ static const int value = 0;
+};
+
+template <typename T, typename... Args>
+struct count<T, Args...>
+{
+ static const int value = 1 + count<Args...>::value;
+};
+
+template<typename... P>
+int
+do_count()
+{
+ return count<P...>::value;
+}
+
+int c = do_count<int, char, long>();
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C
new file mode 100644
index 000000000..c4fd8dc3e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-5.C
@@ -0,0 +1,28 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "T.*DW_AT_name" } }
+
+template <class T>
+struct vector
+{
+ int size;
+
+ vector () : size (0)
+ {
+ }
+};
+
+
+template<template <class T> class U>
+int
+bar()
+{
+ U<int> u;
+ return u.size;
+}
+
+vector<int> v;
+int j = bar<vector>();
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C
new file mode 100644
index 000000000..99bbba3da
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-6.C
@@ -0,0 +1,38 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-final { scan-assembler-times "DW_TAG_GNU_template_template_param" 2 } }
+// { dg-final { scan-assembler-times "\"vector.0\".*?DW_AT_GNU_template_name" 1 } }
+// { dg-final { scan-assembler-times ".ascii \"U.0\".*?DW_AT_name" 1 } }
+
+template <class T>
+struct vector_base
+{
+
+ static int get_sizeof_t()
+ {
+ return 0;
+ }
+};
+
+template <class T>
+struct vector : public vector_base<T>
+{
+ static int get_sizeof_t()
+ {
+ return sizeof (T);
+ }
+ T member1;
+ T member2;
+};
+
+template <template <class T> class U>
+int
+bar()
+{
+ return U<int>::get_sizeof_t();
+}
+
+int i = bar<vector>();
+
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C
new file mode 100644
index 000000000..fc82dce79
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-func-params-7.C
@@ -0,0 +1,59 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -std=c++0x -fno-merge-debug-strings" }
+// { dg-do compile }
+
+// There must be 5 subprograms generated:
+// printf(const char*), printf<int, char, int>,
+// printf<char, int>, printf<int> and foo().
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_subprogram" 5 } }
+
+// That makes 6 template type parameters.
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 6 } }
+// { dg-final {scan-assembler-times "\"printf<int, char, int>.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final {scan-assembler-times "\"printf<char, int>.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final {scan-assembler-times "\"printf<int>.0\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final {scan-assembler-times "\"printf.0\"\[^\n\]*DW_AT_name" 1 } }
+
+// printf<int, char, int> and printf<char, int> have a pack expansion as
+// function parameters. There should then be 3
+// DW_TAG_GNU_template_parameter_pack and 3 DW_TAG_GNU_formal_parameter_pack DIEs
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 3 } }
+// { dg-final {scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_formal_parameter_pack" 3 } }
+// These 3 function template instantiations has a total of 3 template
+// parameters named T.
+// { dg_final {scan-assembler-times "\.ascii \"T.0\"\[\t \]+\[^\n\]*DW_AT_name" 3 } }
+
+
+void
+printf(const char* s)
+{
+ /* Commented this to not pull std::cout into what should be
+ a simple test.
+ while (*s)
+ std::cout << *s++;
+ */
+}
+
+template<typename T, typename... PackTypes>
+void
+printf(const char* s,
+ T value,
+ PackTypes... args)
+{
+ while (*s)
+ {
+ if (*s == '%' && *++s != '%')
+ {
+ /* std::cout << value; */
+ return printf(++s, args...);
+ }
+ }
+}
+
+void
+foo ()
+{
+ int x;
+ printf("%c %d", x, 'x', 3);
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C
new file mode 100644
index 000000000..e28297b55
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-1.C
@@ -0,0 +1,15 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "U.*DW_AT_name" } }
+
+template <class U>
+class A
+{
+ U m;
+};
+
+A<int> a;
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C
new file mode 100644
index 000000000..c12fe3990
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-10.C
@@ -0,0 +1,22 @@
+// Origin PR c++/47291
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+struct S;
+template< int S::* cst> struct D {};
+
+struct S
+{
+ int i;
+ D < &S::i > di; //<-- folding &S::i was failing
+ // because i has no offset as S is not laid out yet
+};
+
+int
+main()
+{
+ S s;
+ return s.i;
+}
+
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param" 1 } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C
new file mode 100644
index 000000000..ce5fbab74
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-2.C
@@ -0,0 +1,23 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "i.*DW_AT_name" } }
+// { dg-final { scan-assembler "3.*DW_AT_const_value" } }
+
+template <int i>
+struct A
+{
+ int m;
+ A ()
+ {
+ m = i;
+ }
+};
+
+const int foo = 1;
+const int bar = 2;
+
+A<foo+bar> a;
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C
new file mode 100644
index 000000000..e69e1c9f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-3.C
@@ -0,0 +1,25 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -gno-strict-dwarf -fno-merge-debug-strings" }
+// { dg-final { scan-assembler "DW_TAG_template_value_param" } }
+// { dg-final { scan-assembler "f.*DW_AT_name" } }
+// { dg-final { scan-assembler "DW_AT_location\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_addr\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*_Z4blehv\[^\\r\\n\]*\[\\r\\n\]*\[^\\r\\n\]*DW_OP_stack_value" } } */
+
+typedef void (*func_ptr) ();
+
+template <func_ptr f>
+struct A
+{
+ A ()
+ {
+ f ();
+ }
+};
+
+void
+bleh ()
+{
+}
+
+A<bleh> a;
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C
new file mode 100644
index 000000000..a0ca6137c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-4.C
@@ -0,0 +1,36 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-std=c++0x -g -dA" }
+//
+// In theory the compiler instantiates count<int, char, long>,
+// count<char, long> and count<long>. In practice, only
+// count<int, char, long> is emitted, thanks to constant folding.
+// So in theory, each of the 3 instances of count yields a
+// DW_TAG_GNU_template_parameter_pack DIE, but in practise, there is only one
+// DW_TAG_GNU_template_parameter_pack as there is only count<int, char, long>
+// is emitted.
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1} }
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_template_type_param" 3} }
+
+template <typename... Args> struct count;
+
+template <>
+struct count<>
+{
+ static const int value = 0;
+};
+
+template <typename T, typename... Args>
+struct count<T, Args...>
+{
+ static const int value = 1 + count<Args...>::value;
+};
+
+int
+foo ()
+{
+ count<int, char, long> c;
+ int nb = count<int, char, long>::value;
+ return nb;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C
new file mode 100644
index 000000000..f36eac5f3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-5.C
@@ -0,0 +1,29 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler "DW_TAG_template_type_param" } }
+// { dg-final { scan-assembler "T.*DW_AT_name" } }
+
+template <class T>
+struct vector
+{
+ int size;
+
+ vector () : size (0)
+ {
+ }
+};
+
+template<template <class T> class U>
+struct bar
+{
+ U<int> u;
+ int m;
+ bar () : m (u.size)
+ {
+ }
+};
+
+vector<int> v;
+bar<vector> b;
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C
new file mode 100644
index 000000000..06cdef5b2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-6.C
@@ -0,0 +1,44 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-g -dA -fno-merge-debug-strings" }
+// { dg-final { scan-assembler-times "DW_TAG_GNU_template_template_param" 2 } }
+// { dg-final { scan-assembler-times "\"vector.0\"\[^\n\]*DW_AT_GNU_template_name" 1 } }
+// { dg-final { scan-assembler-times ".ascii \"U.0\"\[^\n\]*DW_AT_name" 1 } }
+
+template <class T>
+struct vector_base
+{
+ T tab[3 + 1];
+ static int get_sizeof_t()
+ {
+ return sizeof (tab);
+ }
+};
+
+template <class T>
+struct vector : public vector_base<T>
+{
+ static int get_sizeof_t()
+ {
+ return sizeof (T);
+ }
+ T member1;
+ T member2;
+};
+
+template <template <class T> class U>
+struct bar
+{
+ int foo()
+ {
+ return U<int>::get_sizeof_t ();
+ }
+};
+
+
+int
+foo_func ()
+{
+ bar<vector> b;
+ return b.foo ();
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C
new file mode 100644
index 000000000..2b393594f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-7.C
@@ -0,0 +1,21 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin PR debug/30161
+// { dg-options "-std=c++0x -g -dA -fno-merge-debug-strings" }
+
+// The type M<> should have one DW_TAG_GNU_template_parameter_pack DIE,
+// with no DW_AT_name attribute. We don't test the fact that it has no
+// DW_AT_name though.
+// { dg-final { scan-assembler-times "DIE \\(0x\[^\n\]*\\) DW_TAG_GNU_template_parameter_pack" 1 } }
+
+
+template <typename...>
+struct M
+{
+};
+
+struct R :
+ M<>
+{
+};
+
+R r;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C
new file mode 100644
index 000000000..db4e0580a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-8.C
@@ -0,0 +1,15 @@
+// Origin PR debug/46955
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+struct S { int f; };
+template<int S::*MP> struct T { };
+T<&S::f> v;
+
+// For the type of v, we should have this DWARF generated:
+// .uleb128 0x6 # (DIE (0x57) DW_TAG_template_value_param)
+// .ascii "MP\0" # DW_AT_name
+// .long 0x61 # DW_AT_type
+// .byte 0 # DW_AT_const_value
+// So let's look for that.
+// { dg-final { scan-assembler-times "\[^\n\r\]*DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*DW_AT_name\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}\[^\n\r\]*DW_AT_const_value\[\n\r\]{1,2}" 1 } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C
new file mode 100644
index 000000000..7af1d9192
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/template-params-9.C
@@ -0,0 +1,28 @@
+// Origin PR debug/PR46973
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+struct S
+{
+ int f;
+};
+
+template<typename T, int I, int *P, int S::*MP>
+struct Base
+{
+ template<typename Z>
+ struct Inner
+ {
+ };
+};
+
+int a_global;
+
+int main ()
+{
+ Base<long, 47, &a_global, &S::f>::Inner<float> inner;
+ return 0;
+}
+
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_type_param" 2 } }
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\r\]*\\) DW_TAG_template_value_param" 3 } }
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C
new file mode 100644
index 000000000..a9ce44d52
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef1.C
@@ -0,0 +1,33 @@
+// Contributed by Dodji Seketeli <dodji@redhat.com>
+// Origin: PR c++/40705
+// { dg-options "-g -dA" }
+// { dg-do compile }
+// { dg-final { scan-assembler-times "DW_TAG_structure_type" 2 } }
+// { dg-final { scan-assembler-times "DW_AT_name: \"foo<1u>\"|\"foo<1u>..\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "DW_TAG_enumeration_type" 2 } }
+// { dg-final { scan-assembler-times "DW_AT_name: \"typedef foo<1u>::type type\"|\"typedef foo<1u>::type type..\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "DIE \\(\[^\n\]*\\) DW_TAG_enumeration_type" 1 } }
+// { dg-final { scan-assembler-times "\"e0..\"\[^\n\]*DW_AT_name" 1 } }
+// { dg-final { scan-assembler-times "\"e1..\"\[^\n\]*DW_AT_name" 1 } }
+
+template <unsigned int n>
+struct foo
+{
+public:
+ typedef
+ unsigned char type;
+};
+
+template<>
+struct foo<1>
+{
+ typedef enum { e0, e1 } type;
+};
+
+int
+main()
+{
+ foo<1> f;
+ foo<1>::type t = foo<1>::e1;
+ return t;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C
new file mode 100644
index 000000000..5bf04998a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef2.C
@@ -0,0 +1,11 @@
+// Origin: PR debug/43628
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_formal_parameter\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}" 1 } }
+class C
+{
+ public:
+ typedef void (*t) (C);
+};
+C::t f;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C
new file mode 100644
index 000000000..ca70d9cac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef3.C
@@ -0,0 +1,19 @@
+// Origin: PR debug/44188
+// { dg-options "-g -dA" }
+// { dg-do compile }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_typedef\\)" 1 } }
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)" 1 } }
+
+typedef struct
+{
+ int i;
+} AAA;
+
+int
+main(void)
+{
+ AAA aa;
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C
new file mode 100644
index 000000000..2879f6099
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef4.C
@@ -0,0 +1,10 @@
+// Origin: PR debug/45171
+// { dg-options "-g -dA -fno-eliminate-unused-debug-types" }
+// { dg-do compile }
+
+// There should be 2 real instances of byte_size -- one for the
+// struct and one for "int". The other two instances are from
+// the comments in the .debug_abbrev section.
+// { dg-final { scan-assembler-times "DW_AT_byte_size" 4 } }
+
+typedef struct { int a, b; } x;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C
new file mode 100644
index 000000000..d9d058c9c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C
@@ -0,0 +1,10 @@
+// Origin: PR debug/46101
+// { dg-options "-g -feliminate-dwarf2-dups" }
+// { dg-do compile }
+
+typedef struct
+{
+ virtual void f () { }
+} A;
+
+A a;
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C
new file mode 100644
index 000000000..8896446a7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef6.C
@@ -0,0 +1,30 @@
+// Origin PR debug/
+// { dg-options "-g -dA" }
+
+class C {
+public:
+ C() {}
+ ~C() {}
+};
+typedef struct {
+ C m;
+} t;
+typedef t s;
+s v;
+
+/*
+ We want to check that we have a DIE describing the typedef t like this:
+
+ .uleb128 0xc # (DIE (0xb8) DW_TAG_typedef)
+ .ascii "t\0" # DW_AT_name
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test.cc)
+ .byte 0xb # DW_AT_decl_line
+ .long 0x78 # DW_AT_type
+
+ e.g, it should not haven any child DIE -- the bug here was that this
+ DIE had children DIEs. So we check that the last line is immediately
+ followed by a line containing the pattern "(DIE (", instead of a
+ line containing a DW_AT_sibling attribute.
+ */
+
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE \[^\n\r\]* DW_TAG_typedef\\)\[\n\r\]{1,2}\[^\n\r\].*\"t\\\\0\"\[^\n\r\]*DW_AT_name\[\n\r\]{1,2}\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type\[\n\r\]{1,2}\[^\n\r\]*\\(DIE" 1 } }
diff --git a/gcc/testsuite/g++.dg/debug/enum-1.C b/gcc/testsuite/g++.dg/debug/enum-1.C
new file mode 100644
index 000000000..7681e9b52
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/enum-1.C
@@ -0,0 +1,16 @@
+/* Verify that used enums are output. */
+/* { dg-do compile } */
+/* { dg-final { scan-assembler "JTI_MAX" } } */
+
+int var;
+
+enum java_tree_index
+{
+ JTI_MAX
+};
+
+void function (void)
+{
+ var = JTI_MAX;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/enum-2.C b/gcc/testsuite/g++.dg/debug/enum-2.C
new file mode 100644
index 000000000..d5501313d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/enum-2.C
@@ -0,0 +1,22 @@
+/* Verify that used enums are output. */
+/* { dg-do compile } */
+/* { dg-final { scan-assembler "JTI_MAX" } } */
+
+int var;
+
+enum java_tree_index
+{
+ JTI_MAX
+};
+
+template<int X>
+void tmpl (void)
+{
+ var = JTI_MAX + X;
+}
+
+void
+function (void)
+{
+ tmpl<2>();
+}
diff --git a/gcc/testsuite/g++.dg/debug/minimal1.C b/gcc/testsuite/g++.dg/debug/minimal1.C
new file mode 100644
index 000000000..c2daa0ff2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/minimal1.C
@@ -0,0 +1,7 @@
+// PR debug/6387
+// Verify that -g1 works with local class member functions.
+
+void foo();
+void bar() {
+ struct A { A() { foo(); } } a;
+}
diff --git a/gcc/testsuite/g++.dg/debug/namespace1.C b/gcc/testsuite/g++.dg/debug/namespace1.C
new file mode 100644
index 000000000..6629efb9a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/namespace1.C
@@ -0,0 +1,258 @@
+/* Test DWARF namespace support.
+ This test case is based on GDB testsuite test case. */
+/* { dg-do compile } */
+
+namespace AAA {
+ char c;
+ int i;
+ int A_xyzq (int);
+ char xyzq (char);
+ class inA {
+ public:
+ int xx;
+ int fum (int);
+ };
+};
+
+int AAA::inA::fum (int i)
+{
+ return 10 + i;
+}
+
+namespace BBB {
+ char c;
+ int i;
+ int B_xyzq (int);
+ char xyzq (char);
+
+ namespace CCC {
+ char xyzq (char);
+ };
+
+ class Klasse {
+ public:
+ char xyzq (char);
+ int dummy;
+ };
+};
+
+int AAA::A_xyzq (int x)
+{
+ return 2 * x;
+}
+
+char AAA::xyzq (char c)
+{
+ return 'a';
+}
+
+
+int BBB::B_xyzq (int x)
+{
+ return 3 * x;
+}
+
+char BBB::xyzq (char c)
+{
+ return 'b';
+}
+
+char BBB::CCC::xyzq (char c)
+{
+ return 'z';
+}
+
+char BBB::Klasse::xyzq (char c)
+{
+ return 'o';
+}
+
+void marker1(void)
+{
+ return;
+}
+
+namespace
+{
+ int X = 9;
+
+ namespace G
+ {
+ int Xg = 10;
+
+ namespace
+ {
+ int XgX = 11;
+ }
+ }
+}
+
+namespace H
+{
+ int h = 14;
+}
+
+namespace I = H;
+
+namespace J
+{
+ int j = 15;
+}
+
+using namespace J;
+
+namespace K
+{
+ int k = 16;
+}
+
+namespace L
+{
+ using namespace K;
+}
+
+namespace O
+{
+ int o = 18;
+}
+
+namespace P
+{
+ using namespace O;
+}
+
+namespace Q
+{
+ using namespace P;
+}
+
+namespace R
+{
+ int r1 = 19;
+ int r2 = 20;
+}
+
+using R::r1;
+
+namespace C
+{
+ int c = 1;
+ int shadow = 12;
+
+ class CClass {
+ public:
+ int x;
+ class NestedClass {
+ public:
+ int y;
+ };
+ };
+
+ namespace
+ {
+ int cX = 6;
+
+ namespace F
+ {
+ int cXf = 7;
+
+ namespace
+ {
+ int cXfX = 8;
+ }
+ }
+ }
+
+ namespace C
+ {
+ int cc = 2;
+ }
+
+ namespace E
+ {
+ int ce = 4;
+ }
+
+ namespace D
+ {
+ int cd = 3;
+ int shadow = 13;
+
+ namespace E
+ {
+ int cde = 5;
+ }
+
+ namespace M
+ {
+ int cdm = 17;
+ }
+
+ using namespace M;
+
+ void marker2 (void)
+ {
+ // NOTE: carlton/2003-04-23: I'm listing the expressions that I
+ // plan to have GDB try to print out, just to make sure that the
+ // compiler and I agree which ones should be legal! It's easy
+ // to screw up when testing the boundaries of namespace stuff.
+ c;
+ //cc;
+ C::cc;
+ cd;
+ //C::D::cd;
+ E::cde;
+ shadow;
+ //E::ce;
+ cX;
+ F::cXf;
+ F::cXfX;
+ X;
+ G::Xg;
+ //cXOtherFile;
+ //XOtherFile;
+ G::XgX;
+ I::h;
+ j;
+ L::k;
+ //k;
+ cdm;
+ Q::o;
+ //o;
+ r1;
+ //r2;
+
+ return;
+ }
+
+ }
+}
+
+int main ()
+{
+ using AAA::inA;
+ char c1;
+
+ using namespace BBB;
+
+ c1 = xyzq ('x');
+ c1 = AAA::xyzq ('x');
+ c1 = BBB::CCC::xyzq ('m');
+
+ inA ina;
+
+ ina.xx = 33;
+
+ int y;
+
+ y = AAA::A_xyzq (33);
+ y += B_xyzq (44);
+
+ BBB::Klasse cl;
+
+ c1 = cl.xyzq('e');
+
+ marker1();
+
+ C::D::marker2 ();
+}
diff --git a/gcc/testsuite/g++.dg/debug/namespace2.C b/gcc/testsuite/g++.dg/debug/namespace2.C
new file mode 100644
index 000000000..f70bc8fad
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/namespace2.C
@@ -0,0 +1,8 @@
+// PR debug/36278
+// { dg-do compile }
+
+namespace N
+{
+ typedef void T;
+}
+using N::T;
diff --git a/gcc/testsuite/g++.dg/debug/nullptr01.C b/gcc/testsuite/g++.dg/debug/nullptr01.C
new file mode 100644
index 000000000..ab08588f2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/nullptr01.C
@@ -0,0 +1,15 @@
+// Test that debugging backends don't crash on NULLPTR_TYPE.
+// { dg-options "-std=c++0x" }
+
+typedef decltype(nullptr) nullptr_t;
+
+nullptr_t np1;
+void f (nullptr_t) { }
+template <class T> struct A { };
+template <class T> nullptr_t g(T t);
+template <> nullptr_t g(A<nullptr_t>)
+{
+ nullptr_t local;
+}
+// { dg-final { scan-assembler "_Z1fDn" } }
+// { dg-final { scan-assembler "_Z1gI1AIDnEES1_T_" } }
diff --git a/gcc/testsuite/g++.dg/debug/pr15736.cc b/gcc/testsuite/g++.dg/debug/pr15736.cc
new file mode 100644
index 000000000..6e83cd26c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr15736.cc
@@ -0,0 +1,12 @@
+// Test PR 15736 fix
+// Contributed by Devang Patel <dpatel@apple.com>
+// { dg-do compile }
+
+
+struct B {
+ int n;
+};
+
+struct A : B {
+ using B::n;
+};
diff --git a/gcc/testsuite/g++.dg/debug/pr16792.C b/gcc/testsuite/g++.dg/debug/pr16792.C
new file mode 100644
index 000000000..39003cbe2
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr16792.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+
+struct S { S(); };
+int foo (S b, double j) { };
+
+int main ()
+{
+ int foo (S, double);
+ S v;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr22514.C b/gcc/testsuite/g++.dg/debug/pr22514.C
new file mode 100644
index 000000000..ed31cc7a1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr22514.C
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+namespace s
+{
+ template <int> struct _List_base
+ {
+ int _M_impl;
+ };
+ template<int i> struct list : _List_base<i>
+ {
+ using _List_base<i>::_M_impl;
+ } // { dg-error "after struct definition" }
+}
+s::list<1> OutputModuleListType;
diff --git a/gcc/testsuite/g++.dg/debug/pr27657.C b/gcc/testsuite/g++.dg/debug/pr27657.C
new file mode 100644
index 000000000..8351625bb
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr27657.C
@@ -0,0 +1,9 @@
+/* { dg-do link } */
+
+const char s[] = "";
+const char *const p = s;
+
+int main()
+{
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr29906.C b/gcc/testsuite/g++.dg/debug/pr29906.C
new file mode 100644
index 000000000..08bbe879b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr29906.C
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "-g -fno-emit-class-debug-always" }
+
+struct A{
+ typedef int T;
+ virtual ~A();
+};
+struct B:public A{
+ using A::T;
+};
diff --git a/gcc/testsuite/g++.dg/debug/pr30898.C b/gcc/testsuite/g++.dg/debug/pr30898.C
new file mode 100644
index 000000000..4c06ea608
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr30898.C
@@ -0,0 +1,13 @@
+// { dg-do compile }
+
+double foo()
+{
+ union
+ {
+ int i;
+ double d;
+ };
+
+ i = 0;
+ return d;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr34895.C b/gcc/testsuite/g++.dg/debug/pr34895.C
new file mode 100644
index 000000000..ca06336c6
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr34895.C
@@ -0,0 +1,19 @@
+// { dg-do compile }
+// { dg-options "-O2 -g" }
+//
+// Copyright (C) 2008 Free Software Foundation, Inc.
+// Contributed by Theodore.Papadopoulo 20 Jan 2008 <Theodore.Papadopoulo@sophia.inria.fr>
+
+struct A {
+ A() { }
+ unsigned operator()() { return 1; }
+};
+struct B: public A {
+ typedef const A base;
+ using base::operator();
+ B() { }
+};
+int
+main() {
+ B b;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr43010.C b/gcc/testsuite/g++.dg/debug/pr43010.C
new file mode 100644
index 000000000..24b5b2713
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr43010.C
@@ -0,0 +1,8 @@
+// PR debug/43010
+// { dg-do compile }
+// { dg-options "-g -femit-struct-debug-baseonly" }
+# 1 "foo.C"
+# 1 "bar.h" 1
+typedef struct { int i; } S __attribute__((aligned));
+typedef struct { struct { int i; } j; } T __attribute__((aligned));
+# 1 "foo.C" 2
diff --git a/gcc/testsuite/g++.dg/debug/pr44178.C b/gcc/testsuite/g++.dg/debug/pr44178.C
new file mode 100644
index 000000000..2df566926
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr44178.C
@@ -0,0 +1,39 @@
+// PR debug/44178
+// { dg-do compile }
+// { dg-options "-funroll-loops -fcompare-debug" { target i?86-*-* x86_64-*-* } }
+// { dg-options "-fsched-pressure -funroll-loops -fschedule-insns -fcompare-debug" { target i?86-*-* x86_64-*-* } }
+
+struct A
+{
+ A ();
+ A (const A &) {}
+ A &operator = (const A &);
+};
+
+struct B
+{
+ int u1;
+ A u2;
+ int u3;
+ int i;
+};
+
+B f1 (int *);
+B f2 (int, int, int, int);
+B f3 (B *, B *);
+
+B
+f4 (int x, int y, int z)
+{
+ B b1, b2;
+ for (int i = x; i > 0; i--)
+ for (int j = y; j > 0; j--)
+ {
+ int k;
+ f1 (&k);
+ b2 = f2 (i, 0, 0, z);
+ if (b2.i) return b2;
+ f3 (&b1, &b2);
+ }
+ return b1;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr44182.C b/gcc/testsuite/g++.dg/debug/pr44182.C
new file mode 100644
index 000000000..3e062a3fe
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr44182.C
@@ -0,0 +1,26 @@
+// PR tree-optimization/44182
+// { dg-do compile }
+// { dg-options "-fcompare-debug" }
+
+struct S
+{
+ int i;
+ S ();
+ ~S ();
+ void f1 ();
+ void f2 (S s)
+ {
+ f3 (s.i);
+ for (int j = 0; j < s.i; j++) f1 ();
+ }
+ void f3 (int j)
+ {
+ if (j > i) f1 ();
+ }
+};
+
+void
+f (S *x)
+{
+ x->f2 (S ());
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr45660.C b/gcc/testsuite/g++.dg/debug/pr45660.C
new file mode 100644
index 000000000..4f03fd5e7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr45660.C
@@ -0,0 +1,16 @@
+// PR debug/45660
+// { dg-do compile }
+// { dg-options "-g -fno-inline" }
+
+void
+test ()
+{
+ struct S
+ {
+ typedef void (**T) (void);
+ static T i (void) { return 0; }
+ };
+ S s;
+ if (s.i ())
+ *s.i () = 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr46123.C b/gcc/testsuite/g++.dg/debug/pr46123.C
new file mode 100644
index 000000000..9e115cd06
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr46123.C
@@ -0,0 +1,47 @@
+// PR debug/46123
+// { dg-do compile }
+// { dg-options "-g -feliminate-dwarf2-dups" }
+
+struct foo
+{
+ static int bar ()
+ {
+ int i;
+ static int baz = 1;
+ {
+ static int baz = 2;
+ i = baz++;
+ }
+ {
+ struct baz
+ {
+ static int m ()
+ {
+ static int n;
+ return n += 10;
+ }
+ };
+ baz a;
+ i += a.m ();
+ }
+ {
+ static int baz = 3;
+ i += baz;
+ baz += 30;
+ }
+ i += baz;
+ baz += 60;
+ return i;
+ }
+};
+
+int main ()
+{
+ foo x;
+
+ if (x.bar () != 16)
+ return 1;
+ if (x.bar() != 117)
+ return 1;
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr46240.cc b/gcc/testsuite/g++.dg/debug/pr46240.cc
new file mode 100644
index 000000000..c12a6988a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr46240.cc
@@ -0,0 +1,172 @@
+// { dg-do compile }
+// { dg-options "-O3 -g" }
+
+template <typename T>
+T &max (T &a, T &b)
+{
+ if (a < b) return b; else return a;
+}
+int foo (double);
+struct S
+{
+ struct T
+ {
+ int dims, count;
+ T (int, int) : dims (), count () {}
+ };
+ T *rep;
+ S () {}
+ S (int r, int c) : rep (new T (r, c)) {}
+ ~S () { delete rep; }
+};
+template <typename T>
+struct U
+{
+ static T epsilon () throw ();
+};
+template <class T>
+struct V
+{
+ struct W
+ {
+ T * data;
+ int count;
+ W (int n) : data (new T[n]), count () {}
+ };
+ V::W *rep;
+ S dimensions;
+ int slice_len;
+ V (S s) : rep (new V <T>::W (get_size (s))) {}
+ int capacity () { return slice_len; }
+ int get_size (S);
+};
+template <class T>
+struct Z : public V <T>
+{
+ Z () : V <T> (S (0, 0)) {}
+ Z (int r, int c) : V <T> (S (r, c)) {}
+};
+template <class T>
+struct A : public Z <T>
+{
+ A () : Z <T> () {}
+ A (int n, int m) : Z <T> (n, m) {}
+};
+template <class T>
+struct B : public V <T>
+{
+};
+struct C : public A <double>
+{
+ C () : A <double> () {}
+ C (int r, int c) : A <double> (r, c) {}
+};
+struct D : public B <double>
+{
+};
+template <class T>
+struct E
+{
+};
+template <class T>
+struct G : public E <T>
+{
+};
+struct H : public G <double>
+{
+};
+template <class R>
+struct I
+{
+ R scl, sum;
+ void accum (R val)
+ {
+ R t = __builtin_fabs (val);
+ if (scl == t)
+ sum += 1;
+ }
+ operator R () { __builtin_sqrt (sum); return R (); }
+};
+template <class R>
+struct J
+{
+ template < class U > void accum (U val) {}
+ operator R () { return R (); }
+};
+template <class R>
+struct K
+{
+ R max;
+ template <class U> void accum (U val)
+ {
+ double z = __builtin_fabs (val);
+ max = ::max (max, z);
+ }
+ operator R () { return max; }
+};
+template <class R>
+struct L
+{
+ unsigned num;
+ template <class U> void accum (U) {}
+ operator R () { return num; }
+};
+template <class T, class R, class S>
+void bar (V <T> &v, R &res, S acc)
+{
+ for (int i = 0; i < v.capacity (); i++)
+ acc.accum ((i));
+ res = acc;
+}
+template <class T, class R>
+void bar (B <T> &v, R)
+{
+ R res;
+ bar (v, res, I <R> ());
+}
+template <class T, class R>
+R bar (A <T> &v, R p)
+{
+ R res;
+ if (p == 2)
+ bar (v, res, I <R> ());
+ else if (p == 1)
+ bar (v, res, J <R> ());
+ else if (p == sizeof (float) ? (p) : foo (p))
+ {
+ if (p > 0)
+ bar (v, res, K <R> ());
+ }
+ else if (p == 0)
+ bar (v, res, L <R> ());
+ return res;
+}
+template <class CT, class VectorT, class R>
+void
+baz (CT m, R p, R tol, int maxiter, VectorT)
+{
+ VectorT y (0, 0), z (0, 1);
+ R q = 0;
+ R gamma = 0, gamma1 = 0;
+ gamma = bar (y, p);
+ (void) (bar (z, q) <= (gamma1 <= gamma));
+}
+int a = 100;
+template <class CT, class VectorT, class R>
+void
+test (CT m, R p, VectorT)
+{
+ VectorT x;
+ R sqrteps (U <R>::epsilon ());
+ baz (m, p, sqrteps, a, x);
+}
+void
+fn (D x, double p)
+{
+ bar (x, p);
+}
+void
+fn (H x, double p)
+{
+ test (x, p, C ());
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr46241.C b/gcc/testsuite/g++.dg/debug/pr46241.C
new file mode 100644
index 000000000..95c814d4f
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr46241.C
@@ -0,0 +1,19 @@
+class btIDebugDraw;
+class btCollisionWorld {
+ virtual btIDebugDraw* getDebugDrawer() { };
+ static void rayTestSingle();
+};
+class btTriangleCallback {
+public:
+ virtual ~btTriangleCallback();
+};
+class btTriangleRaycastCallback: public btTriangleCallback {
+public:
+ btTriangleRaycastCallback();
+};
+void btCollisionWorld::rayTestSingle()
+{
+ struct BridgeTriangleRaycastCallback : public btTriangleRaycastCallback {
+ BridgeTriangleRaycastCallback() : btTriangleRaycastCallback() { }
+ };
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr46338.C b/gcc/testsuite/g++.dg/debug/pr46338.C
new file mode 100644
index 000000000..dfa92452d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr46338.C
@@ -0,0 +1,24 @@
+// PR debug/46338
+// { dg-do compile }
+// { dg-options "-O -fprofile-generate -fcompare-debug" }
+
+void bar ();
+
+struct S
+{
+ int f ()
+ {
+ }
+};
+
+S *s;
+
+void
+foo (int x)
+{
+ if (x)
+ return;
+ bar ();
+ for (int j = 0; j < s->f (); j++)
+ ;
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr46583.C b/gcc/testsuite/g++.dg/debug/pr46583.C
new file mode 100644
index 000000000..a4e94238e
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr46583.C
@@ -0,0 +1,40 @@
+// PR debug/46583
+// { dg-do compile }
+// { dg-options "-O -fno-inline -fipa-cp -fipa-cp-clone -fcompare-debug" }
+
+template < typename = unsigned long >struct A
+{
+ unsigned long elems[3];
+ unsigned long *begin ()
+ {
+ return 0;
+ }
+};
+
+void
+bar (unsigned long *a1, unsigned long, unsigned long *a3, unsigned const &)
+{
+ *a3 = *a1;
+}
+
+A < >operatorM (A < >a1, unsigned long a2)
+{
+ typedef A < >G;
+ G a3;
+ bar (a1.begin (), a2, a3.begin (), 0);
+ return a3;
+}
+
+struct B
+{
+ B (A < >m):n (operatorM (m, 1))
+ {
+ }
+ A < >n;
+};
+
+void
+foo ()
+{
+ B (A < >());
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr47106.C b/gcc/testsuite/g++.dg/debug/pr47106.C
new file mode 100644
index 000000000..3a8100f8c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr47106.C
@@ -0,0 +1,38 @@
+// { dg-do compile }
+// { dg-options "-O -fpartial-inlining -flto -fconserve-stack -fcompare-debug" }
+// { dg-require-effective-target lto }
+
+void end (int, int) __attribute__ ((__noreturn__));
+
+struct S
+{
+ int i;
+ S *s;
+};
+
+inline bool f (S *s)
+{
+ if (!s->s)
+ end (0, 0);
+ return s->s == s;
+}
+
+inline bool
+baz (S s1, S)
+{
+ while (f (&s1));
+}
+
+inline bool
+bar (S s1, S s2, S)
+{
+ baz (s1, s2);
+}
+
+S getS ();
+
+bool
+foo ()
+{
+ bar (getS (), getS (), getS ());
+}
diff --git a/gcc/testsuite/g++.dg/debug/pr47209.C b/gcc/testsuite/g++.dg/debug/pr47209.C
new file mode 100644
index 000000000..c144c1639
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr47209.C
@@ -0,0 +1,12 @@
+// { dg-do compile }
+// { dg-options "-femit-struct-debug-baseonly" }
+struct A
+{
+ void foo ();
+};
+
+struct B : A
+{
+ typedef const A base;
+ using base::foo;
+};
diff --git a/gcc/testsuite/g++.dg/debug/pr47283.C b/gcc/testsuite/g++.dg/debug/pr47283.C
new file mode 100644
index 000000000..dadbeff3d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/pr47283.C
@@ -0,0 +1,58 @@
+// PR debug/47283
+// { dg-do compile }
+
+template <typename T> inline const T &
+f1 (const T &a, const T &b)
+{
+ if (a < b)
+ return b;
+ return a;
+};
+
+struct A
+{
+ A (int w, int h) { a1 = w; }
+ A f2 (const A &) const;
+ int a1, a2;
+};
+
+inline A
+A::f2 (const A &x) const
+{
+ return A (f1 (a1, x.a1), f1 (a2, x.a2));
+};
+
+struct B
+{
+ A f3 () const;
+ void f4 (const A &) { b2 = 5 + b1; }
+ int b1, b2;
+};
+
+struct C
+{
+};
+
+struct D
+{
+ virtual C f5 (const C &) const;
+};
+
+struct E
+{
+ C f6 () const;
+ int f7 () const;
+ virtual B f8 (const C &) const;
+ A f9 () const;
+ virtual void f10 ();
+ struct F { D *h; } *d;
+};
+
+void
+E::f10 ()
+{
+ const C c = d->h->f5 (f6 ());
+ B b = f8 (c);
+ b.f4 (b.f3 ().f2 (f9 ()));
+ f7 ();
+}
diff --git a/gcc/testsuite/g++.dg/debug/static1.C b/gcc/testsuite/g++.dg/debug/static1.C
new file mode 100644
index 000000000..7419ce507
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/static1.C
@@ -0,0 +1,16 @@
+// PR c++/24569
+
+template <int dim>
+struct S
+{
+ static const int u = 2 * dim;
+ static const int p[u];
+ static int f();
+};
+
+template <>
+inline int S<3>::f () { return 1; }
+
+template <int dim> const int S<dim>::u;
+
+template class S<3>;
diff --git a/gcc/testsuite/g++.dg/debug/template1.C b/gcc/testsuite/g++.dg/debug/template1.C
new file mode 100644
index 000000000..279b4b173
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/template1.C
@@ -0,0 +1,15 @@
+// PR c++/5118
+
+template <int Count>
+class d
+{
+public:
+ d()
+ {
+ myInt = Count;
+ }
+ int myInt;
+ virtual ~d() {}
+};
+
+volatile d<5> instD;
diff --git a/gcc/testsuite/g++.dg/debug/trivial.C b/gcc/testsuite/g++.dg/debug/trivial.C
new file mode 100644
index 000000000..5b125eca9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/trivial.C
@@ -0,0 +1,6 @@
+/* { dg-do run } */
+
+int main(void)
+{
+ return 0;
+}
diff --git a/gcc/testsuite/g++.dg/debug/typedef1.C b/gcc/testsuite/g++.dg/debug/typedef1.C
new file mode 100644
index 000000000..82455358b
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/typedef1.C
@@ -0,0 +1,17 @@
+// PR debug/6436
+// { dg-do compile }
+
+typedef struct
+{
+ unsigned int a0, a1;
+} A __attribute__ ((aligned(8)));
+
+typedef struct
+{
+ A a;
+} B;
+
+struct C
+{
+ B *bp;
+};
diff --git a/gcc/testsuite/g++.dg/debug/typedef2.C b/gcc/testsuite/g++.dg/debug/typedef2.C
new file mode 100644
index 000000000..a216242c7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/typedef2.C
@@ -0,0 +1,12 @@
+// PR c++/17695
+
+template<typename T> struct A
+{
+ T t;
+ A();
+};
+
+struct B
+{
+ B() { typedef int C; A<C> a; }
+} b;
diff --git a/gcc/testsuite/g++.dg/debug/typedef3.C b/gcc/testsuite/g++.dg/debug/typedef3.C
new file mode 100644
index 000000000..366c69a68
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/typedef3.C
@@ -0,0 +1,19 @@
+// PR debug/16261
+// { dg-do compile }
+
+namespace N
+{
+ struct A {};
+ typedef A B;
+}
+
+void foo()
+{
+ struct C
+ {
+ C(N::B) {}
+ };
+
+ N::B b;
+ C c(b);
+}
diff --git a/gcc/testsuite/g++.dg/debug/using1.C b/gcc/testsuite/g++.dg/debug/using1.C
new file mode 100644
index 000000000..d3168fc6c
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/using1.C
@@ -0,0 +1,15 @@
+// PR c++/19406
+// { dg-do compile }
+
+struct A
+{
+ virtual int foo();
+ double d;
+};
+
+struct B : public A
+{
+ A::d;
+};
+
+B b;
diff --git a/gcc/testsuite/g++.dg/debug/using2.C b/gcc/testsuite/g++.dg/debug/using2.C
new file mode 100644
index 000000000..94f0deae7
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/using2.C
@@ -0,0 +1,21 @@
+// PR c++/22489
+
+namespace N { }
+
+struct T
+{
+ T () { }
+};
+
+void
+bar ()
+{
+ struct U : public T
+ {
+ void baz ()
+ {
+ using namespace N;
+ }
+ } u;
+ u.baz();
+}
diff --git a/gcc/testsuite/g++.dg/debug/using3.C b/gcc/testsuite/g++.dg/debug/using3.C
new file mode 100644
index 000000000..df3e3dfa3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/using3.C
@@ -0,0 +1,8 @@
+// PR debug/31899
+
+namespace NS {
+ int x = 0;
+ int &ref = x;
+}
+
+using NS::ref;
diff --git a/gcc/testsuite/g++.dg/debug/vartrack1.C b/gcc/testsuite/g++.dg/debug/vartrack1.C
new file mode 100644
index 000000000..d72cb6f35
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/vartrack1.C
@@ -0,0 +1,99 @@
+// This testcase used to hang the compiler in vt_find_locations.
+// { dg-do compile }
+// { dg-options "-O2 -g" }
+
+struct S
+{
+ int a;
+ S *b, *c, *d;
+};
+
+struct T
+{
+ void f1 (S *x);
+ void f2 (S *x);
+ void f3 (S *x, S *y);
+ S *e;
+};
+
+void
+T::f3 (S *x, S *y)
+{
+ while (x != this->e && (!x || x->a == 1))
+ {
+ if (x == y->c)
+ {
+ S *w = y->d;
+ if (w && w->a == 0)
+ {
+ w->a = 1;
+ y->a = 0;
+ f2 (y);
+ w = y->d;
+ }
+ if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1))
+ {
+ w->a = 0;
+ x = y;
+ y = x->b;
+ }
+ else
+ {
+ if (w && (!w->d || w->d->a == 1))
+ {
+ if (w->c)
+ w->c->a = 1;
+ w->a = 0;
+ f1 (w);
+ w = y->d;
+ }
+ if (w)
+ {
+ w->a = y->a;
+ if (w->d)
+ w->d->a = 1;
+ }
+ y->a = 1;
+ f2 (y);
+ x = e;
+ }
+ }
+ else
+ {
+ S *w = y->c;
+ if (w && w->a == 0)
+ {
+ w->a = 1;
+ y->a = 0;
+ f1 (y);
+ w = y->c;
+ }
+ if (w && (!w->c || w->c->a == 1) && (!w->d || w->d->a == 1))
+ {
+ w->a = 0;
+ x = y;
+ y = x->b;
+ }
+ else
+ {
+ if (w && (!w->c || w->c->a == 1))
+ {
+ w->a = 0;
+ if (w->d)
+ w->d->a = 1;
+ f2 (w);
+ w = y->c;
+ }
+ if (w)
+ {
+ w->a = y->a;
+ if (w->c)
+ w->c->a = 1;
+ }
+ y->a = 1;
+ f1 (y);
+ x = e;
+ }
+ }
+ }
+}