On 12/03/2012 08:27 AM, Dodji Seketeli wrote:
+ - HAS_EXPANSION_ARG_P: Set to TRUE iff at least one parameter + pack has got an argument that is an expansion.
The "got" is unnecessary, just "has an argument" is better.
+ Setup APS, which is an instance of an ARGUMENT_PACK_SELECT tree, so + that it selects the Ith element out of the argument pack ARG_PACK. + If the Ith element is a pack expansion, then just select its + pattern. Otherwise, select the whole element.
I wonder if, rather than set up a temporary pack at this point, it makes sense to look through pack expansions when we use an ARGUMENT_PACK_SELECT. Is there any case where we actually want an ARGUMENT_PACK_SELECT to be an expansion?
+ /* If we have one parameter pack whose matching argument pack is + just what template_parm_to_arg returned when passed the + parameter pack, or if we only have empty arguments ... */ + else if (arg_from_pack_level_to_prune || has_empty_arg) + { + /* ... we just return a pack expansion which pattern is PATTERN + into which ARGS has been substituted. */ + *instantiation_yields_no_list_p = true; + }
I was thinking we wouldn't need to recognize this case specifically, that the code following it would work the way we want. If callers get a vector with a single pack expansion element rather than just a pack expansion, is that a problem? Alternately, if len == 1, maybe we should always just return the single element.
+ /* We could not find any argument packs that work, so we'll just + return an unsubstituted pack expansion. The caller must be + prepared to deal with this. */ if (len < 0) - return error_mark_node; + len = 1;
Why this change? Why is returning error_mark_node no longer the right thing to do?
Jason