Re: Ping: [PATCH gcc/* 0/2] Typed qualifiers
Arsen Arsenović <[email protected]> Mon, 03 Aug 2026 12:49:06 +0200
| Newsgroups | gmane.comp.gcc.rust,gmane.comp.gcc.patches,gmane.comp.gcc.jit |
|---|---|
| Organization | BayLibre |
| Message-ID | <[email protected]> |
Hi Joseph, Joseph Myers <[email protected]> writes: > Do you have a sense of how the design would be adapted if in future it > needs to handle an arbitrary set of qualifiers determined when the > compiler runs (so objects that can store qualifier sets need to > involve dynamic allocation in some cases)? For example, for features > such as the N3587 "strong typedefs" proposal. Hm, I think qualifier_set should ease implementing N3587, if the C FE was to be also converted to use the operations provided by qualifier_set (join, merge, etc) rather than performing the same work inline. I see that at least one more operation would have to be introduced, that strips non-virtual qualifiers ("Unlike a concrete qualifier, the virtual qualification is not removed by value conversion, and may appear at any level of derivation."), so, an operation like 'value_convert'. 'merge' would have to be adjusted to respect the hierarchy of these virtual qualifiers ("The composite type of two different strongly-typed typedef names inherits the strong typing associated with both names." - this is the operation 'merge' implements, you'll notice it does the same for address spaces), as would 'can_qualify' and 'join'. None of this should require us to go back and replace qualifier_set itself, however. It would just require us to complicate its operations. Taking the setup from example 6: [[strong]] typedef int S1; [[strong]] typedef int S2; // unrelated to each other S1 s1 = ...; S2 s2 = ...; ... it seems to me that the following holds: [[strong]] typedef typeof (s1 + s2) S3; S3 s3_1 = s1; // OK S3 s3_2 = s2; // OK S1 back_1 = s3_1; // not OK S2 back_2 = s3_2; // not OK ... and that S3 has as its "super"qualifiers those generated S1 and S2. This seems to imply to me that these virtual qualifiers form a DAG. So, we'd need a new (presumably garbage collected) type (say, 'strong_qualifier') that contains a set of its parents (from which implicit conversion is possible), and which represents one such instance of [[strong]]. If we lean into the GC here, we can use the pointers to test for equivalence (two [[strong]] typedefs of the same type would generate two new instances of strong_qualifier which are distinct by pointer even if they have the same set of parents, which is what we want; though we probably also ought to hold the location of the typedef name that created that virtual qualifier for diagnostic purposes). A qualifier_set then holds a set of such garbage collected types (to distinguish 'typedef typeof (s1 + s2) S4' from the 'S3' given above; S4 would have virt. qualifiers of S1 and S2, and S3 would have a new, singular virt. qualifier whose parents are S1 and S2). > (I think that particular proposal is seriously flawed in both the > design and the specification, including the whole idea of expressing > things in terms of qualifiers rather than some other concept, but I > still think it's worth considering how the available qualifiers being > added to during a translation unit could be handled. Certainly I hope > that typed qualifiers are a step in the right direction for anything > requiring such dynamic allocation in future.) Indeed, I'm also not really convinced by it either, but it seems implementable. -- Arsen Arsenović
signature.asc
(application/pgp-signature, 430 B)
-----BEGIN PGP SIGNATURE----- iQEKBAEWCgCyFiEE/uKz0RP8AKMWLWBhUsKUMB6ixJMFAmpwciIbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMiwyXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25z Lm9wZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXRGRUUyQjNEMTEzRkMwMEEzMTYyRDYw NjE1MkMyOTQzMDFFQTJDNDkzGBxhYXJzZW5vdmljQGJheWxpYnJlLmNvbQAKCRBS wpQwHqLEk3MtAP0Sd06JziLChuzSWVZRgpnVg01TJTJvU2rMaHzt+pIT7wD6A2dX p4GrClSV4d2hKZeDXvDsmlJJ7O2WL6/kxucr4AA= =jQ4F -----END PGP SIGNATURE-----