|  | // Copyright 2018 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // This is a "No Compile Test" suite. | 
|  | // http://dev.chromium.org/developers/testing/no-compile-tests | 
|  |  | 
|  | #include <type_traits> | 
|  |  | 
|  | #include "base/optional.h" | 
|  |  | 
|  | namespace base { | 
|  |  | 
|  | #if defined(NCTEST_EXPLICIT_CONVERTING_COPY_CONSTRUCTOR)  // [r"fatal error: no matching function for call to object of type"] | 
|  |  | 
|  | // Optional<T>(const Optional<U>& arg) constructor is marked explicit if | 
|  | // T is not convertible from "const U&". | 
|  | void WontCompile() { | 
|  | struct Test { | 
|  | // Declares as explicit so that Test is still constructible from int, | 
|  | // but not convertible. | 
|  | explicit Test(int a) {} | 
|  | }; | 
|  |  | 
|  | static_assert(!std::is_convertible<const int&, Test>::value, | 
|  | "const int& to Test is convertible"); | 
|  | const Optional<int> arg(in_place, 1); | 
|  | ([](Optional<Test> param) {})(arg); | 
|  | } | 
|  |  | 
|  | #elif defined(NCTEST_EXPLICIT_CONVERTING_MOVE_CONSTRUCTOR)  // [r"fatal error: no matching function for call to object of type"] | 
|  |  | 
|  | // Optional<T>(Optional<U>&& arg) constructor is marked explicit if | 
|  | // T is not convertible from "U&&". | 
|  | void WontCompile() { | 
|  | struct Test { | 
|  | // Declares as explicit so that Test is still constructible from int, | 
|  | // but not convertible. | 
|  | explicit Test(int a) {} | 
|  | }; | 
|  |  | 
|  | static_assert(!std::is_convertible<int&&, Test>::value, | 
|  | "int&& to Test is convertible"); | 
|  | ([](Optional<Test> param) {})(Optional<int>(in_place, 1)); | 
|  | } | 
|  |  | 
|  | #elif defined(NCTEST_EXPLICIT_VALUE_FORWARD_CONSTRUCTOR)  // [r"fatal error: no matching function for call to object of type"] | 
|  |  | 
|  | // Optional<T>(U&&) constructor is marked explicit if T is not convertible | 
|  | // from U&&. | 
|  | void WontCompile() { | 
|  | struct Test { | 
|  | // Declares as explicit so that Test is still constructible from int, | 
|  | // but not convertible. | 
|  | explicit Test(int a) {} | 
|  | }; | 
|  |  | 
|  | static_assert(!std::is_convertible<int&&, Test>::value, | 
|  | "int&& to Test is convertible"); | 
|  | ([](Optional<Test> param) {})(1); | 
|  | } | 
|  |  | 
|  | #endif | 
|  |  | 
|  | }  // namespace base |