member_function.pass.cpp revision a4c0d87a84b5d324726b334d10fe2f8c24215fad
10f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)//===----------------------------------------------------------------------===// 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// The LLVM Compiler Infrastructure 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Source Licenses. See LICENSE.TXT for details. 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===// 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// <functional> 11558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// template<Returnable R, class T, CopyConstructible... Args> 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// unspecified mem_fn(R (T::* pm)(Args...)); 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 150f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include <functional> 162385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch#include <cassert> 172385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)struct A 194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles){ 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test0() {return 'a';} 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test1(int) {return 'b';} 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char test2(int, double) {return 'c';} 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 24558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)template <class F> 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)test0(F f) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles){ 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A a; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) assert(f(a) == 'a'); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A* ap = &a; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f(ap) == 'a'); 340f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const F& cf = f; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(cf(ap) == 'a'); 36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 37558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 380f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)template <class F> 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)test1(F f) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A a; 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f(a, 1) == 'b'); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A* ap = &a; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f(ap, 2) == 'b'); 480f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const F& cf = f; 490f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) assert(cf(ap, 2) == 'b'); 500f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) } 510f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 5203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)template <class F> 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochvoid 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)test2(F f) 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles){ 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A a; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f(a, 1, 2) == 'c'); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) A* ap = &a; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(f(ap, 2, 3.5) == 'c'); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const F& cf = f; 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) assert(cf(ap, 2, 3.5) == 'c'); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int main() 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){ 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test0(std::mem_fn(&A::test0)); 700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) test1(std::mem_fn(&A::test1)); 710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) test2(std::mem_fn(&A::test2)); 720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)} 730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)