]> granicus.if.org Git - clang/commitdiff
[c++1z] P0490R0, NB comment GB 20: if std::tuple_size<T> is complete, use the
authorRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 8 Dec 2016 03:24:55 +0000 (03:24 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Thu, 8 Dec 2016 03:24:55 +0000 (03:24 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@289021 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp
test/CXX/dcl.decl/dcl.decomp/p3.cpp

index ed77a42beba54f310aa3598c40ad1d877987e9a6..fd33b3164b0d003621bacaacb455d63893ce04d5 100644 (file)
@@ -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;
index e4a7a6c4f9830d90a18b603dfd4fe95a3def9514..b7092e3af02385b79927325eac47334303197a33 100644 (file)
@@ -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}}