diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/debug')
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; + } + } + } +} |