1d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
3d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor
4d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregornamespace PR8598 {
5d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor  template<class T> struct identity { typedef T type; };
6d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor
7d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor  template<class T, class C>
8d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor  void f(T C::*, typename identity<T>::type*){}
9d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor
10d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor  struct X { void f() {}; };
11d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor
12d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor  void g() { (f)(&X::f, 0); }
13d8f5b333f96b4e8018ff3a0d0db62d9e78eb6bddDouglas Gregor}
14fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregor
15fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregornamespace PR12132 {
16fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregor  template<typename S> void fun(const int* const S::* member) {}
17fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregor  struct A { int* x; };
18fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregor  void foo() {
19fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregor    fun(&A::x);
20fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregor  }
21fc55a8290a3e81111c0a373e1a04b09dd7da0b98Douglas Gregor}
22