13ec39215SFariborz Jahanian // RUN: rm -rf %t
23ec39215SFariborz Jahanian // RUN: mkdir %t
33ec39215SFariborz Jahanian // RUN: c-index-test -test-load-source all -comments-xml-schema=%S/../../bindings/xml/comment-xml-schema.rng -target x86_64-apple-darwin10 std=c++11 %s > %t/out
43ec39215SFariborz Jahanian // RUN: FileCheck %s < %t/out
53ec39215SFariborz Jahanian 
63ec39215SFariborz Jahanian // Ensure that XML we generate is not invalid.
73ec39215SFariborz Jahanian // RUN: FileCheck %s -check-prefix=WRONG < %t/out
83ec39215SFariborz Jahanian // WRONG-NOT: CommentXMLInvalid
93ec39215SFariborz Jahanian // rdar://12378714
103ec39215SFariborz Jahanian 
113ec39215SFariborz Jahanian /**
123ec39215SFariborz Jahanian  * \brief Aaa
133ec39215SFariborz Jahanian */
143ec39215SFariborz Jahanian template<typename T> struct A {
153ec39215SFariborz Jahanian /**
163ec39215SFariborz Jahanian  * \brief Bbb
173ec39215SFariborz Jahanian */
183ec39215SFariborz Jahanian   A();
193ec39215SFariborz Jahanian /**
203ec39215SFariborz Jahanian  * \brief Ccc
213ec39215SFariborz Jahanian */
223ec39215SFariborz Jahanian   ~A();
233ec39215SFariborz Jahanian /**
243ec39215SFariborz Jahanian  * \brief Ddd
253ec39215SFariborz Jahanian */
fA263ec39215SFariborz Jahanian   void f() { }
273ec39215SFariborz Jahanian };
28e7d10a1fSManuel Klimek // CHECK: <Declaration>template &lt;typename T&gt; struct A {}</Declaration>
29a14523f1SFariborz Jahanian // CHECK: <Declaration>A&lt;T&gt;()</Declaration>
302907b082SBenjamin Kramer // CHECK: <Declaration>~A&lt;T&gt;()</Declaration>
313ec39215SFariborz Jahanian 
323ec39215SFariborz Jahanian /**
333ec39215SFariborz Jahanian  * \Brief Eee
343ec39215SFariborz Jahanian */
353ec39215SFariborz Jahanian template <typename T> struct D : A<T> {
363ec39215SFariborz Jahanian /**
373ec39215SFariborz Jahanian  * \brief
383ec39215SFariborz Jahanian */
393ec39215SFariborz Jahanian   using A<T>::f;
403ec39215SFariborz Jahanian 
413ec39215SFariborz Jahanian   void f();
423ec39215SFariborz Jahanian };
43e7d10a1fSManuel Klimek // CHECK: <Declaration>template &lt;typename T&gt; struct D :  A&lt;T&gt; {}</Declaration>
443ec39215SFariborz Jahanian // CHECK: <Declaration>using A&lt;T&gt;::f</Declaration>
45b42b6f26SFariborz Jahanian 
46b42b6f26SFariborz Jahanian struct Base {
47b42b6f26SFariborz Jahanian     int foo;
48b42b6f26SFariborz Jahanian };
49b42b6f26SFariborz Jahanian /**
50b42b6f26SFariborz Jahanian  * \brief
51b42b6f26SFariborz Jahanian */
52b42b6f26SFariborz Jahanian template<typename T> struct E : Base {
53b42b6f26SFariborz Jahanian /**
54b42b6f26SFariborz Jahanian  * \brief
55b42b6f26SFariborz Jahanian */
56b42b6f26SFariborz Jahanian   using Base::foo;
57b42b6f26SFariborz Jahanian };
58e7d10a1fSManuel Klimek // CHECK: <Declaration>template &lt;typename T&gt; struct E :  Base {}</Declaration>
59b42b6f26SFariborz Jahanian // CHECK: <Declaration>using Base::foo</Declaration>
60b42b6f26SFariborz Jahanian 
61b42b6f26SFariborz Jahanian /// \tparam
62b42b6f26SFariborz Jahanian /// \param AAA Blah blah
63b42b6f26SFariborz Jahanian template<typename T>
64b42b6f26SFariborz Jahanian void func_template_1(T AAA);
65b42b6f26SFariborz Jahanian // CHECK: <Declaration>template &lt;typename T&gt; void func_template_1(T AAA)</Declaration>
66b42b6f26SFariborz Jahanian 
67b42b6f26SFariborz Jahanian template<template<template<typename CCC> class DDD, class BBB> class AAA>
68b42b6f26SFariborz Jahanian void func_template_2();
69e7d10a1fSManuel Klimek // FIXME: There is not Declaration field in the generated output.
70*7daabbd5SArgyrios Kyrtzidis 
71*7daabbd5SArgyrios Kyrtzidis namespace rdar16128173 {
72*7daabbd5SArgyrios Kyrtzidis // CHECK: <Declaration>template &lt;class PtrTy&gt; class OpaquePtr {}</Declaration>
73*7daabbd5SArgyrios Kyrtzidis 
74*7daabbd5SArgyrios Kyrtzidis /// \brief Wrapper for void* pointer.
75*7daabbd5SArgyrios Kyrtzidis /// \tparam PtrTy Either a pointer type like 'T*' or a type that behaves like
76*7daabbd5SArgyrios Kyrtzidis ///               a pointer.
77*7daabbd5SArgyrios Kyrtzidis template <class PtrTy>
78*7daabbd5SArgyrios Kyrtzidis class OpaquePtr {};
79*7daabbd5SArgyrios Kyrtzidis 
80*7daabbd5SArgyrios Kyrtzidis // CHECK: <Declaration>typedef OpaquePtr&lt;int&gt; DeclGroupPtrTy</Declaration>
81*7daabbd5SArgyrios Kyrtzidis typedef OpaquePtr<int> DeclGroupPtrTy;
82*7daabbd5SArgyrios Kyrtzidis 
83*7daabbd5SArgyrios Kyrtzidis DeclGroupPtrTy blah;
84*7daabbd5SArgyrios Kyrtzidis }
85