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

IReference operators need to go into the level-1 header #906

Merged
merged 3 commits into from
Mar 29, 2021

Conversation

oldnewthing
Copy link
Member

@oldnewthing oldnewthing commented Mar 28, 2021

That way they are defined whenever the interface is defined.

This brings IReference<T> in line with all other types with custom operator==, which had already defined those operators at the point the type is defined.

Note that operator co_await is still defined in the top header even though the type being co-awaited is defined in the level-1 or level-2 header. This isn't a problem in practice because if you try to co_await a DispatcherQueue (say), without having included the top-level header, you will be told, "I don't know how to co_await a DispatcherQueue" because the DispatcherQueue doesn't implement await_ready.

Fixes #801

That way they are defined whenever the interface is defined.
Copy link
Collaborator

@kennykerr kennykerr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the fix!

@oldnewthing
Copy link
Member Author

@kennykerr Note that write_namespace_special generated base_reference_produce.h conditionally upon the presence of PropertyValue. But write_namespace_special_1 generates base_reference_produce_1.h unconditionally. Was there an old version of Windows.Foundation that didn't have IReference support?

@kennykerr
Copy link
Collaborator

kennykerr commented Mar 29, 2021

@oldnewthing That's a remnant of the xlang side project that aimed to support C++/WinRT on non-Windows metadata. That's been canned so we can remove those conditionals.

@kennykerr kennykerr merged commit 5e1b063 into master Mar 29, 2021
@kennykerr kennykerr deleted the ireference-operators branch March 29, 2021 19:43
oldnewthing added a commit that referenced this pull request Jun 24, 2021
Implementation relies on methods in the top-level header,
so defer implementation to there.

This reverts the change to base_reference_produce.h from #906
and reduces base_reference_produce_1.h to merely forward references.
This is enough to get structures to compile, although you cannot
meaningfully use any IReferences in them until you include
Windows.Foundation.h (which is consistent with existing rules for namespace
headers).
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.

The generated 'operator==' of a struct with an 'IReference<T>' member is sensitive to inclusion/include order
2 participants