1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
28e8fb3be5bd78f0564444eca02b404566a5f3b5dAndy Gibbs// expected-no-diagnostics
3550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor
4550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor// PR5311
5550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregortemplate<typename T>
6550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregorclass StringSwitch {
7550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregorpublic:
8550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor  template<unsigned N>
9550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor  void Case(const char (&S)[N], const int & Value) {
10550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor  }
11550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor};
12550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor
13c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregorvoid test_stringswitch(int argc, char *argv[]) {
14550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor  (void)StringSwitch<int>();
15550d9b28fd586db541eb6dd36f3c10d114e483d8Douglas Gregor}
16c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor
17c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregornamespace PR6986 {
18c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  template<class Class,typename Type,Type Class::*>
19c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  struct non_const_member_base
20c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  {
21c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  };
22c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor
23c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  template<class Class,typename Type,Type Class::*PtrToMember>
24c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  struct member: non_const_member_base<Class,Type,PtrToMember>
25c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  {
26c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  };
27c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor
28c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  struct test_class
29c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  {
30c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor    int int_member;
31c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  };
32c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  typedef member< test_class,const int,&test_class::int_member > ckey_m;
33c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  void test()
34c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  {
35c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor    ckey_m m;
36c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor  }
37c0c8300329718b45df259c49310d3c2b377a6e0fDouglas Gregor}
388f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor
398f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregornamespace rdar8980215 {
408f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  enum E { E1, E2, E3 };
418f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor
428f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  template<typename T, E e = E2>
438f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  struct X0 {
448f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor    X0() {}
458f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor    template<typename U> X0(const X0<U, e> &);
468f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  };
478f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor
488f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  template<typename T>
498f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  struct X1 : X0<T> {
508f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor    X1() {}
518f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor    template<typename U> X1(const X1<U> &x) : X0<T>(x) { }
528f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  };
538f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor
548f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  X1<int> x1i;
558f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor  X1<float> x1f(x1i);
568f5667d06a785719691c1139b961411d7f0aedf5Douglas Gregor}
57