Message ID | 1376250573-13753-4-git-send-email-adam@jessamine.co.uk |
---|---|
State | New |
Headers | show |
This patch doesn't seem to depend on the others; go ahead and apply it. Jason
Hi Jason, Was just about to compose a mail to gcc-patches... Been busy, then ill, now just about ready to submit a new set of diffs. On 27.08.2013 17:47, Jason Merrill wrote: > > This patch doesn't seem to depend on the others; go ahead and apply > it. > Okay. As it stands, it means that you get an additional 'const' in diagnostics for lambda's not declared 'mutable'. I didn't think this to be necessarily a bad thing (distinguishing between 'mutable' and 'plain' lambdas and pointing at the cause for possible user error attempting to write to by-value captures) but it's probably contentious. Do you want me to ditch the 'const' output prior to pushing? Cheers, Adam
On 08/27/2013 02:46 PM, Adam Butcher wrote: > Okay. As it stands, it means that you get an additional 'const' in > diagnostics for lambda's not declared 'mutable'. Hmm, I guess it would be preferable to use 'mutable' or nothing when printing the lambda just like when declaring one. Jason
diff --git a/gcc/cp/error.c b/gcc/cp/error.c index 440169a..bd5f8cc 100644 --- a/gcc/cp/error.c +++ b/gcc/cp/error.c @@ -1374,14 +1374,7 @@ dump_function_decl (tree t, int flags) int do_outer_scope = ! (flags & TFF_UNQUALIFIED_NAME); tree exceptions; vec<tree, va_gc> *typenames = NULL; - - if (DECL_NAME (t) && LAMBDA_FUNCTION_P (t)) - { - /* A lambda's signature is essentially its "type", so defer. */ - gcc_assert (LAMBDA_TYPE_P (DECL_CONTEXT (t))); - dump_type (DECL_CONTEXT (t), flags); - return; - } + bool lambda_p = false; flags &= ~(TFF_UNQUALIFIED_NAME | TFF_TEMPLATE_NAME); if (TREE_CODE (t) == TEMPLATE_DECL) @@ -1443,16 +1436,23 @@ dump_function_decl (tree t, int flags) else if (cname) { dump_type (cname, flags); - pp_cxx_colon_colon (cxx_pp); + if (LAMBDA_TYPE_P (cname)) + lambda_p = true; + else + pp_cxx_colon_colon (cxx_pp); } else dump_scope (CP_DECL_CONTEXT (t), flags); - dump_function_name (t, flags); + /* A lambda's signature is essentially its "type", which has already been + dumped. */ + if (!lambda_p) + dump_function_name (t, flags); if (!(flags & TFF_NO_FUNCTION_ARGUMENTS)) { - dump_parameters (parmtypes, flags); + if (!lambda_p) + dump_parameters (parmtypes, flags); if (TREE_CODE (fntype) == METHOD_TYPE) {