[cfe-dev] Q on patch for CWG 2352
Robinson, Paul via cfe-dev
cfe-dev at lists.llvm.org
Thu Mar 5 11:41:32 PST 2020
> Richard Smith made a patch in f041e9ad for CWG2352.
> As a consequence of this patch, we had an obscure test failure,
> and it's not clear to me that it's an intentional consequence.
> So I figured I'd ask here.
>
> Reduced test case:
Slightly edited and expanded test case:
bool foo(void * const * const * &&) { return false; } // new choice
bool foo(void * * const * const &) { return true; } // old choice
bool bar() {
return foo(reinterpret_cast<void***>(2));
}
// A couple of additional cases:
void*** p;
void*** q() { return p; }
bool func1() { return foo(p); } // old and new both call '&' overload
bool func2() { return foo(q()); } // old calls '&', new calls '&&'
So it looks like it matters whether the argument is an expression?
--paulr
> Prior to the patch, the compiler selected the second overload;
> after the patch, it selects the first overload. Apparently there's
> some subtle difference in the preferred-ness of one over the other,
> and AFAICT the const-nesses aren't supposed to factor in any more?
> so it's about the &-ref versus the &&-ref?
>
> As I said, mainly I want to make sure this was intentional; if it
> is, we can fiddle our test and that's the end of it. But if it's
> not intentional, this change is in the almost-final Clang 10.0
> release, and might want to be fixed before it goes out.
>
> Thanks,
> --paulr
More information about the cfe-dev
mailing list