1// { dg-options "-std=gnu++11" } 2 3// Copyright (C) 2008-2015 Free Software Foundation, Inc. 4// 5// This file is part of the GNU ISO C++ Library. This library is free 6// software; you can redistribute it and/or modify it under the 7// terms of the GNU General Public License as published by the 8// Free Software Foundation; either version 3, or (at your option) 9// any later version. 10// 11// This library is distributed in the hope that it will be useful, 12// but WITHOUT ANY WARRANTY; without even the implied warranty of 13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14// GNU General Public License for more details. 15// 16// You should have received a copy of the GNU General Public License along 17// with this library; see the file COPYING3. If not see 18// <http://www.gnu.org/licenses/>. 19 20#include <functional> 21#include <type_traits> 22#include <testsuite_hooks.h> 23#include <testsuite_tr1.h> 24 25using namespace __gnu_test; 26 27bool test __attribute__((unused)) = true; 28 29struct X 30{ 31 typedef int result_type; 32 33 X() : bar(17) {} 34 35 int foo(float x) { return truncate_float(x); } 36 int foo_c(float x) const { return truncate_float(x); } 37 int foo_v(float x) volatile { return truncate_float(x); } 38 int foo_cv(float x) const volatile { return truncate_float(x); } 39 int foo_varargs(float x, ...) { return truncate_float(x); } 40 41 int operator()(float x) 42 { 43 return foo(x) + 1; 44 } 45 46 int operator()(float x) const 47 { 48 return foo_c(x) + 2; 49 } 50 51 int bar; 52 53 private: 54 X(const X&); 55 X& operator=(const X&); 56}; 57 58int seventeen() { return 17; } 59 60struct get_seventeen 61{ 62 typedef int result_type; 63 int operator()() const { return 17; } 64}; 65 66void test01() 67{ 68 using std::ref; 69 using std::cref; 70 71 ::get_seventeen get_sev; 72 ::X x; 73 ::X* xp = &x; 74 int (::X::* p_foo)(float) = &::X::foo; 75 int (::X::* p_foo_c)(float) const = &::X::foo_c; 76 int (::X::* p_foo_v)(float) volatile = &::X::foo_v; 77 int (::X::* p_foo_cv)(float) const volatile = &::X::foo_cv; 78 int (::X::* p_foo_varargs)(float, ...) __attribute__((unused)) 79 = &::X::foo_varargs; 80 int ::X::* p_bar = &::X::bar; 81 82 const float pi = 3.14; 83 84 // Functions 85 VERIFY(ref(truncate_float)(pi) == 3); 86 VERIFY(ref(seventeen)() == 17); 87 88 // Function pointers 89 VERIFY(cref(truncate_float)(pi) == 3); 90 VERIFY(cref(seventeen)() == 17); 91 92 // Member function pointers 93 VERIFY(ref(p_foo)(x, pi) == 3); 94 VERIFY(ref(p_foo)(xp, pi) == 3); 95 VERIFY(ref(p_foo_c)(x, pi) == 3); 96 VERIFY(ref(p_foo_c)(xp, pi) == 3); 97 VERIFY(ref(p_foo_v)(x, pi) == 3); 98 VERIFY(ref(p_foo_v)(xp, pi) == 3); 99 VERIFY(ref(p_foo_cv)(x, pi) == 3); 100 VERIFY(ref(p_foo_cv)(xp, pi) == 3); 101 // VERIFY(ref(p_foo_varargs)(x, pi) == 3); 102 // VERIFY(ref(p_foo_varargs)(xp, pi, 1, 1) == 3); 103 // VERIFY(ref(p_foo_varargs)(x, pi, 1, 1) == 3); 104 // VERIFY(ref(p_foo_varargs)(xp, pi) == 3); 105 106 // Member data pointers 107 VERIFY(ref(p_bar)(x) == 17); 108 VERIFY(ref(p_bar)(xp) == 17); 109 110 // Function objects 111 VERIFY(ref(get_sev)() == 17); 112 VERIFY(cref(get_sev)() == 17); 113 VERIFY(ref(x)(pi) == 4); 114 VERIFY(cref(x)(pi) == 5); 115} 116 117int main() 118{ 119 test01(); 120 return 0; 121} 122