From 4bcd47e2e1975635ea18d61accf7dcbf64306aa7 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Thu, 21 Feb 2019 18:07:47 -0500 Subject: [PATCH] PR c++/89422 - ICE with -g and lambda in default arg in template. 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. * pt.c (tsubst_function_decl): SET_DECL_FRIEND_CONTEXT sooner. From-SVN: r269081 --- gcc/cp/ChangeLog | 5 +++++ gcc/cp/pt.c | 10 +++++----- gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg9.C | 10 ++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg9.C 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 + + 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 PR c++/88419 - C++17 ICE with class template arg deduction. 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 struct S +{ + friend void foo (int a = []{ return 0; }()) {} + int b; +}; +S<0> t; -- 2.30.2