[PATCH 1/2] v3: C++: more location wrapper nodes (PR c++/43064, PR c++/43486)
Jason Merrill
jason@redhat.com
Wed Dec 12 20:37:00 GMT 2018
On 12/7/18 3:13 PM, David Malcolm wrote:
> On Tue, 2018-12-04 at 18:31 -0500, Jason Merrill wrote:
>> On 12/3/18 5:10 PM, Jeff Law wrote:
>>> On 11/19/18 9:51 AM, David Malcolm wrote:
> [...]
>>> @@ -1058,6 +1058,9 @@ grokbitfield (const cp_declarator
>>> *declarator,
>>> return NULL_TREE;
>>> }
>>>
>>> + if (width)
>>> + STRIP_ANY_LOCATION_WRAPPER (width);
>>
>> Why is this needed? We should already be reducing width to an
>> unwrapped
>> constant value somewhere along the line.
>
> "width" is coming from cp_parser_member_declaration, from:
>
> /* Get the width of the bitfield. */
> width = cp_parser_constant_expression (parser, false, NULL,
> cxx_dialect >= cxx11);
>
> and currently nothing is unwrapping the value. We presumably need to
> unwrap (or fold?) it before it is stashed in
> DECL_BIT_FIELD_REPRESENTATIVE (value).
>
> Without stripping (or folding) here, we e.g. lose a warning and get this:
> FAIL: g++.dg/abi/empty22.C -std=gnu++98 (test for warnings, line 15)
Why does that happen? check_bitfield_decl ought to handle the location
wrapper fine. That's where it gets folded.
>>> @@ -656,6 +656,9 @@ add_capture (tree lambda, tree id, tree
>>> orig_init, bool by_reference_p,
>>> listmem = make_pack_expansion (member);
>>> initializer = orig_init;
>>> }
>>> +
>>> + STRIP_ANY_LOCATION_WRAPPER (initializer);
>>
>> Why is this needed? What cares about the tree codes of the capture
>> initializer?
>
> This is used to populate LAMBDA_EXPR_CAPTURE_LIST. Without stripping,
> we end up with wrapped VAR_DECLs, rather than the VAR_DECLs themselves,
Sure, that sounds fine.
> and this confuses things later on, for example leading to:
>
> PASS -> FAIL : g++.dg/cpp0x/lambda/lambda-type.C -std=c++14 (test for excess errors)
> PASS -> FAIL : g++.dg/cpp0x/lambda/lambda-type.C -std=c++17 (test for excess errors)
Confuses how?
Jason
More information about the Gcc-patches
mailing list