63 lines · cpp
1// RUN: %clang_cc1 %s -ast-print -o - -chain-include %s -chain-include %s2// RUN: %clang_cc1 %s -ast-print -o - -fmodules -chain-include %s -chain-include %s3 4#if !defined(PASS1)5#define PASS16 7template <class T> class TClass;8 9namespace NS {10 template <class X, class Y> TClass<X> problematic(X * ptr, const TClass<Y> &src);11 12 template <class T>13 class TBaseClass14 {15 protected:16 template <class X, class Y> friend TClass<X> problematic(X * ptr, const TClass<Y> &src);17 };18}19 20template <class T>21class TClass: public NS::TBaseClass<T>22{23public:24 inline TClass() { }25};26 27 28namespace NS {29 template <class X, class T>30 TClass<X> problematic(X *ptr, const TClass<T> &src);31}32 33template <class X, class T>34TClass<X> unconst(const TClass<T> &src);35 36#elif !defined(PASS2)37#define PASS238 39namespace std {40class s {};41}42 43 44typedef TClass<std::s> TStr;45 46struct crash {47 TStr str;48 49 crash(const TClass<std::s> p)50 {51 unconst<TStr>(p);52 }53};54 55#else56 57void f() {58 const TStr p;59 crash c(p);60}61 62#endif63