brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.2 KiB · 8c00adc Raw
120 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// UNSUPPORTED: c++03, c++11, c++1410 11// <map>12 13// template<class InputIterator,14//          class Compare = less<iter-value-type<InputIterator>>,15//          class Allocator = allocator<iter-value-type<InputIterator>>>16// map(InputIterator, InputIterator,17//          Compare = Compare(), Allocator = Allocator())18//   -> map<iter-value-type<InputIterator>, Compare, Allocator>;19// template<class Key, class Compare = less<Key>, class Allocator = allocator<Key>>20// map(initializer_list<Key>, Compare = Compare(), Allocator = Allocator())21//   -> map<Key, Compare, Allocator>;22// template<class InputIterator, class Allocator>23// map(InputIterator, InputIterator, Allocator)24//   -> map<iter-value-type<InputIterator>, less<iter-value-type<InputIterator>>, Allocator>;25// template<class Key, class Allocator>26// map(initializer_list<Key>, Allocator)27//   -> map<Key, less<Key>, Allocator>;28 29#include <array>30#include <climits> // INT_MAX31#include <functional>32#include <map>33#include <tuple>34#include <type_traits>35 36struct NotAnAllocator {37  friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; }38};39 40using P  = std::pair<int, long>;41using PC = std::pair<const int, long>;42 43int main(int, char**) {44  {45    // cannot deduce Key and T from nothing46    std::map m;47    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}48  }49  {50    // cannot deduce Key and T from just (Compare)51    std::map m(std::less<int>{});52    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}53  }54  {55    // cannot deduce Key and T from just (Compare, Allocator)56    std::map m(std::less<int>{}, std::allocator<PC>{});57    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}58  }59  {60    // cannot deduce Key and T from just (Allocator)61    std::map m(std::allocator<PC>{});62    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}63  }64  {65    // refuse to rebind the allocator if Allocator::value_type is not exactly what we expect66    const P arr[] = {{1, 1L}, {2, 2L}, {3, 3L}};67    std::map m(arr, arr + 3, std::allocator<P>());68    // expected-error-re@map:*{{static assertion failed{{( due to requirement '.*')?}}{{.*}}Allocator::value_type must be same type as value_type}}69  }70  {71    // cannot convert from some arbitrary unrelated type72    NotAnAllocator a;73    std::map m(a);74    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}75  }76  {77    // cannot deduce that the inner braced things should be std::pair and not something else78    std::map m{{1, 1L}, {2, 2L}, {3, 3L}};79    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}80  }81  {82    // cannot deduce that the inner braced things should be std::pair and not something else83    std::map m({{1, 1L}, {2, 2L}, {3, 3L}}, std::less<int>());84    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}85  }86  {87    // cannot deduce that the inner braced things should be std::pair and not something else88    std::map m({{1, 1L}, {2, 2L}, {3, 3L}}, std::less<int>(), std::allocator<PC>());89    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}90  }91  {92    // cannot deduce that the inner braced things should be std::pair and not something else93    std::map m({{1, 1L}, {2, 2L}, {3, 3L}}, std::allocator<PC>());94    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}95  }96  {97    // since we have parens, not braces, this deliberately does not find the initializer_list constructor98    std::map m(P{1, 1L});99    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}100  }101  {102    // since we have parens, not braces, this deliberately does not find the initializer_list constructor103    std::map m(PC{1, 1L});104    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}105  }106  {107    // cannot deduce from tuple-like objects without proper iterator108    std::tuple<int, double> t{1, 2.0};109    std::map m(t);110    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}111  }112  {113    // cannot deduce from array-like objects without proper iterator114    std::array<int, 2> arr{1, 2};115    std::map m(arr);116    // expected-error-re@-1{{no viable constructor or deduction guide for deduction of template arguments of '{{(std::)?}}map'}}117  }118  return 0;119}120