blob: 2f042a8341ec5e8d47dc485c8e79ba023e60f61f [file] [log] [blame]
Douglas Gregoraa7cbfd2011-08-25 15:28:26 +00001// RUN: %clang_cc1 %s -ast-print -o - -chain-include %s -chain-include %s
Richard Smith1d209d02013-05-23 01:49:11 +00002// RUN: %clang_cc1 %s -ast-print -o - -fmodules -chain-include %s -chain-include %s
Douglas Gregoraa7cbfd2011-08-25 15:28:26 +00003
4#if !defined(PASS1)
5#define PASS1
6
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 TBaseClass
14 {
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 PASS2
38
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#else
56
57void f() {
58 const TStr p;
59 crash c(p);
60}
61
62#endif