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)