[libcxx-commits] [libcxx] r356918 - Cleaup of requirements for optional. While researching LWG3196, I realized that optional did not reject 'const in_place_t' like it should. Added a test as well, and a check for arrays (which were already disallowed, but now we get a better error message). Should not affect anyone's code.

Marshall Clow via libcxx-commits libcxx-commits at lists.llvm.org
Mon Mar 25 09:35:59 PDT 2019


Author: marshall
Date: Mon Mar 25 09:35:59 2019
New Revision: 356918

URL: http://llvm.org/viewvc/llvm-project?rev=356918&view=rev
Log:
Cleaup of requirements for optional. While researching LWG3196, I realized that optional did not reject 'const in_place_t' like it should. Added a test as well, and a check for arrays (which were already disallowed, but now we get a better error message). Should not affect anyone's code.

Added:
    libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp
Modified:
    libcxx/trunk/include/optional

Modified: libcxx/trunk/include/optional
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/optional?rev=356918&r1=356917&r2=356918&view=diff
==============================================================================
--- libcxx/trunk/include/optional (original)
+++ libcxx/trunk/include/optional Mon Mar 25 09:35:59 2019
@@ -592,7 +592,7 @@ public:
 
 private:
      // Disable the reference extension using this static assert.
-    static_assert(!is_same_v<value_type, in_place_t>,
+    static_assert(!is_same_v<__uncvref_t<value_type>, in_place_t>,
         "instantiation of optional with in_place_t is ill-formed");
     static_assert(!is_same_v<__uncvref_t<value_type>, nullopt_t>,
         "instantiation of optional with nullopt_t is ill-formed");
@@ -600,6 +600,8 @@ private:
         "instantiation of optional with a reference type is ill-formed");
     static_assert(is_destructible_v<value_type>,
         "instantiation of optional with a non-destructible type is ill-formed");
+    static_assert(!is_array_v<value_type>,
+        "instantiation of optional with an array type is ill-formed");
 
     // LWG2756: conditionally explicit conversion from _Up
     struct _CheckOptionalArgsConstructor {

Added: libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp?rev=356918&view=auto
==============================================================================
--- libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp (added)
+++ libcxx/trunk/test/std/utilities/optional/optional.object/optional.object.ctor/ctor.fail.cpp Mon Mar 25 09:35:59 2019
@@ -0,0 +1,47 @@
+//===----------------------------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+// UNSUPPORTED: c++98, c++03, c++11, c++14
+// <optional>
+
+// T shall be an object type other than cv in_place_t or cv nullopt_t 
+//   and shall satisfy the Cpp17Destructible requirements.
+// Note: array types do not satisfy the Cpp17Destructible requirements.
+
+#include <optional>
+#include <type_traits>
+#include <cassert>
+
+#include "test_macros.h"
+
+struct NonDestructible { ~NonDestructible() = delete; };
+
+int main(int, char**)
+{
+	{
+	std::optional<char &> o1;	        // expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with a reference type is ill-formed"}}
+	std::optional<NonDestructible> o2;  // expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with a non-destructible type is ill-formed"}}	
+	std::optional<char[20]> o3;	        // expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with an array type is ill-formed"}}	
+	}
+
+	{
+	std::optional<               std::in_place_t> o1;  // expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}}
+	std::optional<const          std::in_place_t> o2;  // expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}}
+	std::optional<      volatile std::in_place_t> o3;  // expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}}
+	std::optional<const volatile std::in_place_t> o4;  // expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with in_place_t is ill-formed"}}
+	}
+
+	{
+	std::optional<               std::nullopt_t> o1;	// expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}}
+	std::optional<const          std::nullopt_t> o2;	// expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}}
+	std::optional<      volatile std::nullopt_t> o3;	// expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}}
+	std::optional<const volatile std::nullopt_t> o4;	// expected-error-re at optional:* {{static_assert failed{{.*}} "instantiation of optional with nullopt_t is ill-formed"}}
+	}
+
+	return 0;
+}




More information about the libcxx-commits mailing list