2011-08-25 23:28:26 +08:00
|
|
|
// RUN: %clang_cc1 %s -ast-print -o - -chain-include %s -chain-include %s
|
2013-05-23 09:49:11 +08:00
|
|
|
// RUN: %clang_cc1 %s -ast-print -o - -fmodules -chain-include %s -chain-include %s
|
2011-08-25 23:28:26 +08:00
|
|
|
|
|
|
|
#if !defined(PASS1)
|
|
|
|
#define PASS1
|
|
|
|
|
|
|
|
template <class T> class TClass;
|
|
|
|
|
|
|
|
namespace NS {
|
|
|
|
template <class X, class Y> TClass<X> problematic(X * ptr, const TClass<Y> &src);
|
|
|
|
|
|
|
|
template <class T>
|
|
|
|
class TBaseClass
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
template <class X, class Y> friend TClass<X> problematic(X * ptr, const TClass<Y> &src);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class T>
|
|
|
|
class TClass: public NS::TBaseClass<T>
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
inline TClass() { }
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
namespace NS {
|
|
|
|
template <class X, class T>
|
|
|
|
TClass<X> problematic(X *ptr, const TClass<T> &src);
|
|
|
|
}
|
|
|
|
|
|
|
|
template <class X, class T>
|
|
|
|
TClass<X> unconst(const TClass<T> &src);
|
|
|
|
|
|
|
|
#elif !defined(PASS2)
|
|
|
|
#define PASS2
|
|
|
|
|
|
|
|
namespace std {
|
|
|
|
class s {};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
typedef TClass<std::s> TStr;
|
|
|
|
|
|
|
|
struct crash {
|
|
|
|
TStr str;
|
|
|
|
|
|
|
|
crash(const TClass<std::s> p)
|
|
|
|
{
|
|
|
|
unconst<TStr>(p);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
void f() {
|
|
|
|
const TStr p;
|
|
|
|
crash c(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|