And herein lies the issue. Dyno and Chapel do not (currently) support param tuples, so even the above representation of the instantiated function is a little bit of a misnomer / abuse of language. Not only that, but it leads to some confusion with genericity / isUnknown, since one of the rules for a Dyno QualifiedType being generic is:
A qualified type is generic if it's a param but doesn't have a param value.
E.g., param int is generic, param int = 1 is concrete. A param _tuple as shown above does not have a value (no = ...!) so at this immediate moment in the Dyno implementation, it's considered generic. However, semantically, the value of the tuple is known and encoded in the tuple type's arguments.
This issue is about such param tuples that arise in the implementation of varargs. How should we represent them? Another thing to keep in mind is that we are thinking about adding param tuple support to Dyno anyway, so could the param tuples in varargs be unified with the "regular" param tuples in this hypothetical implementation? What representation of param tuples should be used in general, with the vararg case in mind?
There are some immediate alternatives that come to mind:
Remain unchanged, as param _tuple(param int(64) = 1 ...). In this case, we probably want to add special case logic for determining whether or not a tuple is generic (since the tuple listed just before is not generic).
Add a TupleParam, so the tuple is represented as param _tuple(int(64),...) = (1, ...).
Both (1) and (2), param _tuple(param int(64) = 1 ...) = (1, ...). There is some redundancy involved, but @mppf points out that different parts of Dyno might find it more convenient to pull data from different places.