brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 2444131 Raw
70 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// REQUIRES: c++0310 11// <utility>12 13// template <class T1, class T2> struct pair14 15// pair& operator=(pair const& p);16 17#include <utility>18#include <memory>19#include <cassert>20 21#include "test_macros.h"22 23struct NonAssignable {24  NonAssignable() {}25private:26  NonAssignable& operator=(NonAssignable const&);27};28 29struct Incomplete;30extern Incomplete inc_obj;31 32struct ConstructibleFromInt {33  ConstructibleFromInt() : value(-1) { }34  explicit ConstructibleFromInt(int v) : value(v) { }35  int value;36};37 38int main(int, char**)39{40    {41      // Test that we don't constrain the assignment operator in C++03 mode.42      // Since we don't have access control SFINAE having pair evaluate SFINAE43      // may cause a hard error.44      typedef std::pair<int, NonAssignable> P;45      static_assert(std::is_copy_assignable<P>::value, "");46    }47    {48      typedef std::pair<int, Incomplete&> P;49      static_assert(std::is_copy_assignable<P>::value, "");50      P p(42, inc_obj);51      assert(&p.second == &inc_obj);52    }53    {54      // The type is constructible from int, but not assignable from int.55      // This ensures that operator=(pair const&) can be used in conjunction with56      // pair(pair<U, V> const&) to mimic operator=(pair<U, V> const&) in C++03.57      // This is weird but valid in C++03.58      std::pair<ConstructibleFromInt, char> p;59      std::pair<int, char> from(11, 'x');60      p = from;61      assert(p.first.value == 11);62      assert(p.second == 'x');63    }64 65  return 0;66}67 68struct Incomplete {};69Incomplete inc_obj;70