Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Tuple toString #10645

Merged
merged 5 commits into from
Feb 20, 2025
Merged

Tuple toString #10645

merged 5 commits into from
Feb 20, 2025

Conversation

Inkrementator
Copy link
Contributor

  • Use formattedWrite instead of format
  • Remove some workarounds for shared types that have been put in there a few years ago

I'm not entirely sure why these workaround have been added, but I suspect that #6207 fixed this in std.format. The unittests still work.

This is a breaking change. See line 1787 (in the new version), If a class is null, the Tuple.toString will now print null instead of the mangled typename (because this is what std.format does)

The tests are still working. Is it safe to assume that the workaround
would've only been merged if there is a test-case checking it?
For shared classes, it prints the mangled name, for struct pointers it will
print the adress.

This version of Tuple.toString won't work anymore in @safe code in
general if the tuple contains anything descended from Object. I think
this is correct even if a breaking change, since dealing with this issue
should be the responsibility of the caller.
@dlang-bot
Copy link
Contributor

Thanks for your pull request and interest in making D better, @Inkrementator! We are looking forward to reviewing it, and you should be hearing from a maintainer soon.
Please verify that your PR follows this checklist:

  • My PR is fully covered with tests (you can see the coverage diff by visiting the details link of the codecov check)
  • My PR is as minimal as possible (smaller, focused PRs are easier to review than big ones)
  • I have provided a detailed rationale explaining my changes
  • New or modified functions have Ddoc comments (with Params: and Returns:)

Please see CONTRIBUTING.md for more information.


If you have addressed all reviews or aren't sure how to proceed, don't hesitate to ping us with a simple comment.

Bugzilla references

Your PR doesn't reference any Bugzilla issue.

If your PR contains non-trivial changes, please reference a Bugzilla issue or create a manual changelog.

Testing this PR locally

If you don't have a local development environment setup, you can use Digger to test this PR:

dub run digger -- build "master + phobos#10645"

@thewilsonator
Copy link
Contributor

does this fix #9811 ?

@Inkrementator
Copy link
Contributor Author

No, it doesn't. It would need to remove const from all toString() methods. I intentionally did not do that in this PR because I'm not sure yet how much this would break.

@Inkrementator
Copy link
Contributor Author

Inkrementator commented Feb 20, 2025

5fa226e actually put the surprising behaviour in a unittest (as documentation), before I understood why it happened

@Inkrementator
Copy link
Contributor Author

does this fix #9811 ?

It actually already partly fixes it. If toString is const in the type that is inside the Tuple, it will work correctly after this is merged.

@thewilsonator thewilsonator merged commit 310bd9b into dlang:master Feb 20, 2025
10 checks passed
Inkrementator added a commit to Inkrementator/phobos that referenced this pull request Feb 21, 2025
Now, member structs won't become const due to transitiveness and the
code in `std.format` can choose (erroneously) non-cost toString()
functions of member structs.

An expert has to decide whether this is worth the breaking change. Now,
code that uses `const` tuples and calls toString directly on them will
break. Alternatively, we could use
[Template this parameters](https://dlang.org/spec/template.html#template_this_parameter).

That way, we get a template parameter with the real type of this. Then we can
cast away constness of `this` when we now for certain that it isn't,
since `is(T != typeof(this))` (where T is the template this parameter).
Of course, this implies making toString `@trusted` too.

This might also lead to unforeseen bugs when `const` is cast away but
the member objects are actually const. I'm not sure how this works.

Fwiw, currently std.format and `std.conv: to` already intercepts const tuples,
thus it at least won't call toString directly. The breaking change will
only effect code that calls toString on const tuples directly.

That's why I have added non-prescritive tests. If something in
std.format changes, they'll be alerted and can then decide whether to
change the tests or whether this module also needs work, in case this
would lead a bigger breaking change.

Followup to dlang#10645.
thewilsonator pushed a commit that referenced this pull request Feb 22, 2025
Now, member structs won't become const due to transitiveness and the
code in `std.format` can choose (erroneously) non-cost toString()
functions of member structs.

An expert has to decide whether this is worth the breaking change. Now,
code that uses `const` tuples and calls toString directly on them will
break. Alternatively, we could use
[Template this parameters](https://dlang.org/spec/template.html#template_this_parameter).

That way, we get a template parameter with the real type of this. Then we can
cast away constness of `this` when we now for certain that it isn't,
since `is(T != typeof(this))` (where T is the template this parameter).
Of course, this implies making toString `@trusted` too.

This might also lead to unforeseen bugs when `const` is cast away but
the member objects are actually const. I'm not sure how this works.

Fwiw, currently std.format and `std.conv: to` already intercepts const tuples,
thus it at least won't call toString directly. The breaking change will
only effect code that calls toString on const tuples directly.

That's why I have added non-prescritive tests. If something in
std.format changes, they'll be alerted and can then decide whether to
change the tests or whether this module also needs work, in case this
would lead a bigger breaking change.

Followup to #10645.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants