forked from OSchip/llvm-project
[c++1z] P0490R0, NB comment GB 20: if std::tuple_size<T> is complete, use the
tuple-like interpretation of decomposition declaration even if there is no ::value member. We already did this, anticipating this resolution, just update comments and tweak a testcase. llvm-svn: 289021
This commit is contained in:
parent
41217616a8
commit
208732e954
|
@ -983,11 +983,8 @@ static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T,
|
|||
if (lookupStdTypeTraitMember(S, R, Loc, "tuple_size", Args, /*DiagID*/0))
|
||||
return IsTupleLike::NotTupleLike;
|
||||
|
||||
// FIXME: According to the standard, we're not supposed to diagnose if any
|
||||
// of the steps below fail (or if lookup for ::value is ambiguous or otherwise
|
||||
// results in an error), but this is subject to a pending CWG issue / NB
|
||||
// comment, which says we do diagnose if tuple_size<T> is complete but
|
||||
// tuple_size<T>::value is not an ICE.
|
||||
// If we get this far, we've committed to the tuple interpretation, but
|
||||
// we can still fail if there actually isn't a usable ::value.
|
||||
|
||||
struct ICEDiagnoser : Sema::VerifyICEDiagnoser {
|
||||
LookupResult &R;
|
||||
|
|
|
@ -10,7 +10,7 @@ void no_tuple_size_1() { auto [x, y] = A(); } // ok, decompose elementwise
|
|||
namespace std { template<typename T> struct tuple_size; }
|
||||
void no_tuple_size_2() { auto [x, y] = A(); } // ok, decompose elementwise
|
||||
|
||||
struct Bad1 {};
|
||||
struct Bad1 { int a, b; };
|
||||
template<> struct std::tuple_size<Bad1> {};
|
||||
void no_tuple_size_3() { auto [x, y] = Bad1(); } // expected-error {{cannot decompose this type; 'std::tuple_size<Bad1>::value' is not a valid integral constant expression}}
|
||||
|
||||
|
|
Loading…
Reference in New Issue