dw_die_ref parent = unit;
dw_die_ref copy = clone_die (targ);
- FOR_EACH_CHILD (targ, c,
- add_child_die (copy,
- clone_tree_hash (c, decl_table)));
-
- /* Make sure the cloned tree is marked as part of the
- type unit. */
- mark_dies (copy);
-
/* Record in DECL_TABLE that TARG has been copied.
Need to do this now, before the recursive call,
because DECL_TABLE may be expanded and SLOT
entry->copy = copy;
*slot = entry;
+ FOR_EACH_CHILD (targ, c,
+ add_child_die (copy,
+ clone_tree_hash (c, decl_table)));
+
+ /* Make sure the cloned tree is marked as part of the
+ type unit. */
+ mark_dies (copy);
+
/* If TARG has surrounding context, copy its ancestor tree
into the new type unit. */
if (targ->die_parent != NULL
--- /dev/null
+// PR debug/52260
+// { dg-do compile }
+// { dg-options "-gdwarf-4 -std=c++0x" }
+
+namespace { typedef decltype (nullptr) T1; }
+struct B {};
+namespace A
+{
+ template <typename T, T __v>
+ struct C { static constexpr T value = __v; };
+ typedef C <bool, false> D;
+ template <typename>
+ struct E : D {};
+ template <typename T>
+ struct F : C <bool, (E <T>::value)> {};
+ template <bool, typename T = void>
+ struct G { typedef T t; };
+}
+template <typename T>
+struct H {};
+namespace A
+{
+ template <typename T>
+ struct I : H <T> {};
+ template <typename ...> struct J;
+ template <typename> struct K;
+ struct L
+ {
+ template <typename B2>
+ struct M
+ {
+ template <typename T> static bool m2 (T) { return false; }
+ };
+ };
+ template <typename, typename> struct N;
+ template <typename T, typename B2, typename ... B4>
+ struct N <T (B4 ...), B2> : L::M <B2> {};
+ template <typename T, typename ... B4>
+ struct K <T (B4 ...)> :J <,>, L
+ {
+ typedef T O (B4 ...);
+ struct P {};
+ template <typename B2> K (B2, typename G <!F <B2>::value, P>::t = P ());
+ };
+ template <typename T, typename ... B1>
+ template <typename B2>
+ K <T (B1 ...)>::K (B2 __f, typename G <!F < B2>::value, P>::t)
+ {
+ typedef N <O, B2> Q;
+ Q::m2 (__f);
+ };
+}
+enum R { r1 };
+const R r2 = r1;
+namespace A
+{
+ template <typename>
+ struct S {};
+ template <typename T, typename _Dp = S <T>>
+ struct U {};
+ template <typename T, R _Lp = r2>
+ struct V { T *operator -> (); };
+ template <typename T>
+ struct W : V <T>
+ {
+ W (const W &);
+ W (T1) {}
+ W & operator= (W) {}
+ };
+ template <typename> struct Z;
+ struct AA
+ {
+ struct AB
+ {
+ struct AC { void operator () () {} };
+ };
+ template <typename T> using AD = U <T, AB::AC>;
+ struct AE
+ {
+ typedef AD <AB> AZ;
+ virtual ~AE ();
+ void o3 (K <AZ ()>, bool = false) {}
+ template <typename, typename _Arg> struct AY;
+ struct C1 {};
+ template <typename T> struct AY <T, C1>
+ {
+ AZ operator () () { return AZ (); }
+ Z <T> _M_Z;
+ };
+ template <typename T>
+ static AY <T, C1> _s1 (B, Z <T> *);
+ };
+ };
+ template <>
+ struct Z <void>
+ {
+ typedef AA::AE AF;
+ W <AF> o4;
+ void foo (B __p)
+ {
+ auto _s1 = AF::_s1 (__p, this);
+ o4->o3 (_s1);
+ }
+ };
+ template <typename T, typename _Alloc>
+ struct AG {};
+ template <typename T, typename D1 = A::I <T>>
+ struct AH : AG <T, D1>
+ {
+ void bar (T) { baz (); }
+ template <typename ... _Args>
+ void baz (_Args && ...);
+ };
+ template <typename T, typename D1>
+ template <typename ... _Args>
+ void AH <T, D1>::baz (_Args && ...) {}
+ namespace
+ {
+ typedef A::K <void ()> AI;
+ struct AF
+ {
+ int v2;
+ AI v1;
+ AF (int, unsigned, AI __t) : v2 (), v1 (__t) {}
+ };
+ struct D3 : A::AH <AF>
+ {
+ typedef AF AFT;
+ void v3 (AI __t) { bar (AFT (4, v4, __t)); }
+ int v4;
+ };
+ }
+}