diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-03-04 21:27:21 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2016-03-04 21:27:21 +0000 |
commit | acf07a0f1a4db91e47d9555167fed394bb434e19 (patch) | |
tree | 86fc8f39f3116cc8830ec7f44cb6085fe8111737 | |
parent | e1626feb8253d291baf90c36f373a18870f7a62b (diff) | |
download | clang-acf07a0f1a4db91e47d9555167fed394bb434e19.tar.gz |
Implement P0036R0: remove support for empty unary folds of +, *, |, &.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262747 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaTemplateVariadic.cpp | 15 | ||||
-rw-r--r-- | test/SemaTemplate/cxx1z-fold-expressions.cpp | 15 | ||||
-rw-r--r-- | www/cxx_status.html | 2 |
3 files changed, 9 insertions, 23 deletions
diff --git a/lib/Sema/SemaTemplateVariadic.cpp b/lib/Sema/SemaTemplateVariadic.cpp index cb67d71f9e..c692c9f75c 100644 --- a/lib/Sema/SemaTemplateVariadic.cpp +++ b/lib/Sema/SemaTemplateVariadic.cpp @@ -996,10 +996,6 @@ ExprResult Sema::BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, BinaryOperatorKind Operator) { // [temp.variadic]p9: // If N is zero for a unary fold-expression, the value of the expression is - // * -> 1 - // + -> int() - // & -> -1 - // | -> int() // && -> true // || -> false // , -> void() @@ -1009,17 +1005,6 @@ ExprResult Sema::BuildEmptyCXXFoldExpr(SourceLocation EllipsisLoc, // prevent the result from being a null pointer constant. QualType ScalarType; switch (Operator) { - case BO_Add: - ScalarType = Context.IntTy; - break; - case BO_Mul: - return ActOnIntegerConstant(EllipsisLoc, 1); - case BO_Or: - ScalarType = Context.IntTy; - break; - case BO_And: - return CreateBuiltinUnaryOp(EllipsisLoc, UO_Minus, - ActOnIntegerConstant(EllipsisLoc, 1).get()); case BO_LOr: return ActOnCXXBoolLiteral(EllipsisLoc, tok::kw_false); case BO_LAnd: diff --git a/test/SemaTemplate/cxx1z-fold-expressions.cpp b/test/SemaTemplate/cxx1z-fold-expressions.cpp index 8bb79113fa..aefee92f64 100644 --- a/test/SemaTemplate/cxx1z-fold-expressions.cpp +++ b/test/SemaTemplate/cxx1z-fold-expressions.cpp @@ -25,10 +25,6 @@ constexpr bool check() { static_assert(check()); template<int ...N> void empty() { - static_assert((N + ...) == 0); - static_assert((N * ...) == 1); - static_assert((N | ...) == 0); - static_assert((N & ...) == -1); static_assert((N || ...) == false); static_assert((N && ...) == true); (N, ...); @@ -36,14 +32,19 @@ template<int ...N> void empty() { template void empty<>(); // An empty fold-expression isn't a null pointer just because it's an integer -// with value 0. +// with value 0. (This is no longer an issue since empty pack expansions don't +// produce integers any more.) template<int ...N> void null_ptr() { - void *p = (N + ...); // expected-error {{rvalue of type 'int'}} - void *q = (N | ...); // expected-error {{rvalue of type 'int'}} + void *p = (N || ...); // expected-error {{rvalue of type 'bool'}} + void *q = (N , ...); // expected-error {{rvalue of type 'void'}} } template void null_ptr<>(); // expected-note {{in instantiation of}} template<int ...N> void bad_empty() { + (N + ...); // expected-error {{empty expansion for operator '+' with no fallback}} + (N * ...); // expected-error {{empty expansion for operator '*' with no fallback}} + (N | ...); // expected-error {{empty expansion for operator '|' with no fallback}} + (N & ...); // expected-error {{empty expansion for operator '&' with no fallback}} (N - ...); // expected-error {{empty expansion for operator '-' with no fallback}} (N / ...); // expected-error {{empty expansion for operator '/' with no fallback}} (N % ...); // expected-error {{empty expansion for operator '%' with no fallback}} diff --git a/www/cxx_status.html b/www/cxx_status.html index b2a13ac5d5..f116aee4dc 100644 --- a/www/cxx_status.html +++ b/www/cxx_status.html @@ -577,7 +577,7 @@ as the draft C++1z standard evolves.</p> </tr> <tr> <!-- from Jacksonville --> <td><a href="http://wg21.link/p0036r0">P0036R0</a></td> - <td class="no" align="center">No</td> + <td class="svn" align="center">SVN</td> </tr> <tr> <td><tt>u8</tt> character literals</td> |