Skip to content

domain: delete broken but unused __has_common_domain#2021

Merged
ericniebler merged 1 commit intoNVIDIA:mainfrom
romintomasetti:patch-1
Apr 12, 2026
Merged

domain: delete broken but unused __has_common_domain#2021
ericniebler merged 1 commit intoNVIDIA:mainfrom
romintomasetti:patch-1

Conversation

@romintomasetti
Copy link
Copy Markdown
Contributor

__has_common_domain incorrectly returns true for domain pairs whose common type is indeterminate_domain<...>.

For example:

struct Whatever {};

struct SomeDomain : public STDEXEC::default_domain {};
struct WontBeGoodDomain : public STDEXEC::default_domain, public Whatever {};

// Passes, but shouldn't.
static_assert(STDEXEC::__has_common_domain<SomeDomain, WontBeGoodDomain>);

// Here is the common type.
static_assert(std::same_as<STDEXEC::__common_domain_t<SomeDomain, WontBeGoodDomain>, STDEXEC::indeterminate_domain<WontBeGoodDomain, SomeDomain>>);

It could be fixed by checking that the result is not an instance of indeterminate_domain, but since __has_common_domain is never used, let's get rid of it.

@copy-pr-bot
Copy link
Copy Markdown

copy-pr-bot bot commented Apr 12, 2026

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@romintomasetti
Copy link
Copy Markdown
Contributor Author

romintomasetti commented Apr 12, 2026

@ericniebler I am not sure I actually understand what common_domain is supposed to do.

In the following, I expected that SomeDomain and SomeOtherDomain would have stdexec::default_domain as common domain. Given that it's using std::common_type under the hood, it obviously cannot understand that SomeDomain and SomeOtherDomain have stdexec::default_domain as a base.

Are you expecting people writing new domains to specialize std::common_type for pairs of domains that make sense?

  struct Whatever {};

  struct SomeDomain : public STDEXEC::default_domain {};
  struct SomeOtherDomain : public STDEXEC::default_domain {};
  struct WontBeGoodDomain : public STDEXEC::default_domain, public Whatever {};

  static_assert(STDEXEC::__has_common_domain<SomeDomain, SomeOtherDomain>);
  static_assert(STDEXEC::__has_common_domain<SomeDomain, WontBeGoodDomain>);
  static_assert(!std::same_as<STDEXEC::__common_domain_t<SomeDomain, SomeOtherDomain>, STDEXEC::default_domain>); // unexpected... ?
  static_assert(std::same_as<STDEXEC::__common_domain_t<SomeDomain, WontBeGoodDomain>, STDEXEC::indeterminate_domain<WontBeGoodDomain, SomeDomain>>);

@romintomasetti
Copy link
Copy Markdown
Contributor Author

And just to clarify, it seems that __has_common_domain says yes, no matter what you feed it with:

  struct Whatever {};
  struct ThisIsNotADog {};

  struct SomeDomain : public STDEXEC::default_domain {};
  struct SomeOtherDomain : public STDEXEC::default_domain {};
  struct WontBeGoodDomain : public STDEXEC::default_domain, public Whatever {};

  static_assert(STDEXEC::__has_common_domain<Whatever, SomeOtherDomain>);
  static_assert(STDEXEC::__has_common_domain<Whatever, ThisIsNotADog>);
  static_assert(STDEXEC::__has_common_domain<Whatever, STDEXEC::default_domain>);
  static_assert(STDEXEC::__has_common_domain<SomeDomain, SomeOtherDomain>);
  static_assert(STDEXEC::__has_common_domain<SomeDomain, STDEXEC::default_domain>);
  static_assert(STDEXEC::__has_common_domain<SomeDomain, SomeDomain>);
  static_assert(STDEXEC::__has_common_domain<SomeDomain, WontBeGoodDomain>);
  static_assert(STDEXEC::__has_common_domain<int, double>);
  static_assert(STDEXEC::__has_common_domain<int, int>);

@ericniebler
Copy link
Copy Markdown
Collaborator

yeah, __has_common_domain is vestigial since i added indeterminate_domain. deleting it is the right thing.

struct SomeDomain : public STDEXEC::default_domain {};
struct SomeOtherDomain : public STDEXEC::default_domain {};

static_assert(!std::same_as<STDEXEC::__common_domain_t<SomeDomain, SomeOtherDomain>, STDEXEC::default_domain>); // unexpected... ?

yes, that's not expected. this is what happens when i rush. i suppose it's to be expected that i would make mistakes with my 11th-hr fix for customization.

i'll address that problem in my own pr, and file an LWG issue.

@ericniebler
Copy link
Copy Markdown
Collaborator

/ok to test 969f7e6

@ericniebler ericniebler merged commit efb7e42 into NVIDIA:main Apr 12, 2026
50 of 52 checks passed
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.

2 participants