Prevent PrintOptions from being implicitly copied.

NFC *except* that I noticed a bug by inspection where we suppress
`@escaping` when print enum element types. Since this affects
recursive positions, we end up suppressing `@escaping` in places
we shouldn't. This is unlikely to affect much real code, but should
still obviously be fixed.

The new design is a little sketchy in that we're using `const` to
prevent direct use (and allow initialization of `const &` parameters)
but still relying on modification of the actual object.  Essentially,
we are treating the `const`-ness of the reference as a promise to leave
the original value in the object after computation rather than a
guarantee of not modifying the object. This is okay --- a temporary
bound to a `const` reference is still a non-`const` object formally
and can be modified without invoking UB --- but makes me a little
uncomfortable.
This commit is contained in:
John McCall
2025-06-04 22:28:33 -04:00
parent 67b55566fe
commit b3493bfa23
17 changed files with 411 additions and 241 deletions

View File

@@ -704,8 +704,9 @@ public:
// Preserve the behavior of previous implementations which formatted of
// empty extensions compactly with '{}' on the same line.
PrintOptions extensionPrintOptions = printOptions;
extensionPrintOptions.PrintEmptyMembersOnSameLine = true;
PrintOptions::OverrideScope extensionPrintingScope(printOptions);
OVERRIDE_PRINT_OPTION(extensionPrintingScope,
PrintEmptyMembersOnSameLine, true);
// Then walk the remaining ones, and see what we need to print.
// FIXME: This will pick the availability attributes from the first sight
@@ -744,7 +745,7 @@ public:
!M->isImportedImplementationOnly(inherited->getParentModule())) {
auto protoAndAvailability = ProtocolAndAvailability(
inherited, availability, isUnchecked, otherAttrs);
printSynthesizedExtension(out, extensionPrintOptions, M, nominal,
printSynthesizedExtension(out, printOptions, M, nominal,
protoAndAvailability);
return TypeWalker::Action::SkipNode;
}