Here, we were trying to instantiate the default argument before setting
DECL_FRIEND_CONTEXT, so that the instantiated lambda ended up being treated
as part of the S template, which confused dwarf2out.
Tested x86_64-pc-linux-gnu, applying to trunk.
* pt.c (tsubst_function_decl): SET_DECL_FRIEND_CONTEXT sooner.
---
gcc/cp/pt.c | 10 +++++-----
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg9.C | 10 ++++++++++
gcc/cp/ChangeLog | 5 +++++
3 files changed, 20 insertions(+), 5 deletions(-)
create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg9.C
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index bd0a3d13bbe..76fb625a068 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -13088,6 +13088,11 @@ tsubst_function_decl (tree t, tree args,
tsubst_flags_t complain,
set_constraints (r, ci);
}
+ if (DECL_FRIEND_P (t) && DECL_FRIEND_CONTEXT (t))
+ SET_DECL_FRIEND_CONTEXT (r,
+ tsubst (DECL_FRIEND_CONTEXT (t),
+ args, complain, in_decl));
+
/* Set up the DECL_TEMPLATE_INFO for R. There's no need to do
this in the special friend case mentioned above where
GEN_TMPL is NULL. */
@@ -13149,11 +13154,6 @@ tsubst_function_decl (tree t, tree args,
tsubst_flags_t complain,
&& !grok_op_properties (r, /*complain=*/true))
return error_mark_node;
- if (DECL_FRIEND_P (t) && DECL_FRIEND_CONTEXT (t))
- SET_DECL_FRIEND_CONTEXT (r,
- tsubst (DECL_FRIEND_CONTEXT (t),
- args, complain, in_decl));
-
/* Possibly limit visibility based on template args. */
DECL_VISIBILITY (r) = VISIBILITY_DEFAULT;
if (DECL_VISIBILITY_SPECIFIED (t))
diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg9.C
b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg9.C
new file mode 100644
index 00000000000..f0436adfe9a
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg9.C
@@ -0,0 +1,10 @@
+// PR c++/89422
+// { dg-do compile { target c++11 } }
+// { dg-additional-options -g }
+
+template <int> struct S
+{
+ friend void foo (int a = []{ return 0; }()) {}
+ int b;
+};
+S<0> t;
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 228100ab21f..2f99f2b95c8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2019-02-21 Jason Merrill <[email protected]>
+
+ PR c++/89422 - ICE with -g and lambda in default arg in template.
+ * pt.c (tsubst_function_decl): SET_DECL_FRIEND_CONTEXT sooner.
+
2019-02-21 Jason Merrill <[email protected]>
PR c++/88419 - C++17 ICE with class template arg deduction.
base-commit: 147a31b69541c769274d59b0b587063e576fb974
--
2.20.1