1aab8383aSDmitri Gribenko // Run lines are sensitive to line numbers and come below the code.
2aab8383aSDmitri Gribenko 
3aab8383aSDmitri Gribenko #ifndef HEADER
4aab8383aSDmitri Gribenko #define HEADER
5aab8383aSDmitri Gribenko 
6aab8383aSDmitri Gribenko // Not a Doxygen comment.  NOT_DOXYGEN
7aab8383aSDmitri Gribenko void notdoxy1(void);
8aab8383aSDmitri Gribenko 
9aab8383aSDmitri Gribenko /* Not a Doxygen comment.  NOT_DOXYGEN */
10aab8383aSDmitri Gribenko void notdoxy2(void);
11aab8383aSDmitri Gribenko 
12aab8383aSDmitri Gribenko /*/ Not a Doxygen comment.  NOT_DOXYGEN */
13aab8383aSDmitri Gribenko void notdoxy3(void);
14aab8383aSDmitri Gribenko 
15aab8383aSDmitri Gribenko /** Doxygen comment.  isdoxy4 IS_DOXYGEN_SINGLE */
16aab8383aSDmitri Gribenko void isdoxy4(void);
17aab8383aSDmitri Gribenko 
18aab8383aSDmitri Gribenko /**
19aab8383aSDmitri Gribenko  * Doxygen comment.  isdoxy5 IS_DOXYGEN_SINGLE */
20aab8383aSDmitri Gribenko void isdoxy5(void);
21aab8383aSDmitri Gribenko 
22aab8383aSDmitri Gribenko /**
23aab8383aSDmitri Gribenko  * Doxygen comment.
24aab8383aSDmitri Gribenko  * isdoxy6 IS_DOXYGEN_SINGLE */
25aab8383aSDmitri Gribenko void isdoxy6(void);
26aab8383aSDmitri Gribenko 
27aab8383aSDmitri Gribenko /**
28aab8383aSDmitri Gribenko  * Doxygen comment.
29aab8383aSDmitri Gribenko  * isdoxy7 IS_DOXYGEN_SINGLE
30aab8383aSDmitri Gribenko  */
31aab8383aSDmitri Gribenko void isdoxy7(void);
32aab8383aSDmitri Gribenko 
33aab8383aSDmitri Gribenko /*! Doxygen comment.  isdoxy8 IS_DOXYGEN_SINGLE */
34aab8383aSDmitri Gribenko void isdoxy8(void);
35aab8383aSDmitri Gribenko 
36aab8383aSDmitri Gribenko /// Doxygen comment.  isdoxy9 IS_DOXYGEN_SINGLE
37aab8383aSDmitri Gribenko void isdoxy9(void);
38aab8383aSDmitri Gribenko 
39aab8383aSDmitri Gribenko // Not a Doxygen comment.  NOT_DOXYGEN
40aab8383aSDmitri Gribenko /// Doxygen comment.  isdoxy10 IS_DOXYGEN_SINGLE
41aab8383aSDmitri Gribenko void isdoxy10(void);
42aab8383aSDmitri Gribenko 
43aab8383aSDmitri Gribenko /// Doxygen comment.  isdoxy11 IS_DOXYGEN_SINGLE
44aab8383aSDmitri Gribenko // Not a Doxygen comment.  NOT_DOXYGEN
45aab8383aSDmitri Gribenko void isdoxy11(void);
46aab8383aSDmitri Gribenko 
47aab8383aSDmitri Gribenko /** Doxygen comment.  isdoxy12  IS_DOXYGEN_SINGLE */
48aab8383aSDmitri Gribenko /* Not a Doxygen comment.  NOT_DOXYGEN */
49aab8383aSDmitri Gribenko void isdoxy12(void);
50aab8383aSDmitri Gribenko 
51aab8383aSDmitri Gribenko /// Doxygen comment.  isdoxy13 IS_DOXYGEN_START
52aab8383aSDmitri Gribenko /// Doxygen comment.  IS_DOXYGEN_END
53aab8383aSDmitri Gribenko void isdoxy13(void);
54aab8383aSDmitri Gribenko 
55aab8383aSDmitri Gribenko /// Doxygen comment.  isdoxy14 IS_DOXYGEN_START
56aab8383aSDmitri Gribenko /// Blah-blah-blah.
57aab8383aSDmitri Gribenko /// Doxygen comment.  IS_DOXYGEN_END
58aab8383aSDmitri Gribenko void isdoxy14(void);
59aab8383aSDmitri Gribenko 
60aab8383aSDmitri Gribenko /// Doxygen comment.  isdoxy15 IS_DOXYGEN_START
61aab8383aSDmitri Gribenko /** Blah-blah-blah */
62aab8383aSDmitri Gribenko /// Doxygen comment.  IS_DOXYGEN_END
63aab8383aSDmitri Gribenko void isdoxy15(void);
64aab8383aSDmitri Gribenko 
65aab8383aSDmitri Gribenko /** Blah-blah-blah. isdoxy16 IS_DOXYGEN_START *//** Blah */
66aab8383aSDmitri Gribenko /// Doxygen comment.  IS_DOXYGEN_END
67aab8383aSDmitri Gribenko void isdoxy16(void);
68aab8383aSDmitri Gribenko 
69aab8383aSDmitri Gribenko /// isdoxy17 IS_DOXYGEN_START
70aab8383aSDmitri Gribenko // Not a Doxygen comment, but still picked up.
71aab8383aSDmitri Gribenko /// IS_DOXYGEN_END
72aab8383aSDmitri Gribenko void isdoxy17(void);
73aab8383aSDmitri Gribenko 
74aab8383aSDmitri Gribenko unsigned
75aab8383aSDmitri Gribenko // NOT_DOXYGEN
76aab8383aSDmitri Gribenko /// isdoxy18 IS_DOXYGEN_START
77aab8383aSDmitri Gribenko // Not a Doxygen comment, but still picked up.
78aab8383aSDmitri Gribenko /// IS_DOXYGEN_END
79aab8383aSDmitri Gribenko // NOT_DOXYGEN
80aab8383aSDmitri Gribenko int isdoxy18(void);
81aab8383aSDmitri Gribenko 
82aab8383aSDmitri Gribenko //! It all starts here. isdoxy19 IS_DOXYGEN_START
83aab8383aSDmitri Gribenko /*! It's a little odd to continue line this,
84aab8383aSDmitri Gribenko  *
85aab8383aSDmitri Gribenko  * but we need more multi-line comments. */
86aab8383aSDmitri Gribenko /// This comment comes before my other comments
87aab8383aSDmitri Gribenko /** This is a block comment that is associated with the function f. It
88aab8383aSDmitri Gribenko  *  runs for three lines.  IS_DOXYGEN_END
89aab8383aSDmitri Gribenko  */
90aab8383aSDmitri Gribenko void isdoxy19(int, int);
91aab8383aSDmitri Gribenko 
92aab8383aSDmitri Gribenko // NOT IN THE COMMENT  NOT_DOXYGEN
93aab8383aSDmitri Gribenko /// This is a BCPL comment.  isdoxy20 IS_DOXYGEN_START
94aab8383aSDmitri Gribenko /// It has only two lines.
95aab8383aSDmitri Gribenko /** But there are other blocks that are part of the comment, too.  IS_DOXYGEN_END */
96aab8383aSDmitri Gribenko void isdoxy20(int);
97aab8383aSDmitri Gribenko 
98*44cd7e67SDmitri Gribenko void notdoxy21(int); ///< This is a member comment.  isdoxy21 IS_DOXYGEN_NOT_ATTACHED
99aab8383aSDmitri Gribenko 
100*44cd7e67SDmitri Gribenko void notdoxy22(int); /*!< This is a member comment.  isdoxy22 IS_DOXYGEN_NOT_ATTACHED */
101aab8383aSDmitri Gribenko 
102*44cd7e67SDmitri Gribenko void notdoxy23(int); /**< This is a member comment.  isdoxy23 IS_DOXYGEN_NOT_ATTACHED */
103aab8383aSDmitri Gribenko 
104aab8383aSDmitri Gribenko void notdoxy24(int); // NOT_DOXYGEN
105aab8383aSDmitri Gribenko 
106aab8383aSDmitri Gribenko /// IS_DOXYGEN_SINGLE
107aab8383aSDmitri Gribenko struct isdoxy25 {
108aab8383aSDmitri Gribenko };
109aab8383aSDmitri Gribenko 
110aab8383aSDmitri Gribenko struct test26 {
111aab8383aSDmitri Gribenko   /// IS_DOXYGEN_SINGLE
112aab8383aSDmitri Gribenko   int isdoxy26;
113aab8383aSDmitri Gribenko };
114aab8383aSDmitri Gribenko 
115aab8383aSDmitri Gribenko struct test27 {
116aab8383aSDmitri Gribenko   int isdoxy27; ///< IS_DOXYGEN_SINGLE
117aab8383aSDmitri Gribenko };
118aab8383aSDmitri Gribenko 
119aab8383aSDmitri Gribenko struct notdoxy28 {
120aab8383aSDmitri Gribenko }; ///< IS_DOXYGEN_NOT_ATTACHED
121aab8383aSDmitri Gribenko 
122aab8383aSDmitri Gribenko /// IS_DOXYGEN_SINGLE
123aab8383aSDmitri Gribenko enum isdoxy29 {
124aab8383aSDmitri Gribenko };
125aab8383aSDmitri Gribenko 
126aab8383aSDmitri Gribenko enum notdoxy30 {
127aab8383aSDmitri Gribenko }; ///< IS_DOXYGEN_NOT_ATTACHED
128aab8383aSDmitri Gribenko 
129aab8383aSDmitri Gribenko /// IS_DOXYGEN_SINGLE
130aab8383aSDmitri Gribenko namespace isdoxy31 {
131aab8383aSDmitri Gribenko };
132aab8383aSDmitri Gribenko 
133aab8383aSDmitri Gribenko namespace notdoxy32 {
134aab8383aSDmitri Gribenko }; ///< IS_DOXYGEN_NOT_ATTACHED
135aab8383aSDmitri Gribenko 
136aab8383aSDmitri Gribenko class test33 {
137aab8383aSDmitri Gribenko                 ///< IS_DOXYGEN_NOT_ATTACHED
138aab8383aSDmitri Gribenko   int isdoxy33; ///< isdoxy33 IS_DOXYGEN_SINGLE
139aab8383aSDmitri Gribenko   int isdoxy34; ///< isdoxy34 IS_DOXYGEN_SINGLE
140aab8383aSDmitri Gribenko 
141aab8383aSDmitri Gribenko                 ///< IS_DOXYGEN_NOT_ATTACHED
142aab8383aSDmitri Gribenko   int isdoxy35, ///< isdoxy35 IS_DOXYGEN_SINGLE
143aab8383aSDmitri Gribenko       isdoxy36; ///< isdoxy36 IS_DOXYGEN_SINGLE
144aab8383aSDmitri Gribenko 
145aab8383aSDmitri Gribenko                 ///< IS_DOXYGEN_NOT_ATTACHED
146aab8383aSDmitri Gribenko   int isdoxy37  ///< isdoxy37 IS_DOXYGEN_SINGLE
147aab8383aSDmitri Gribenko     , isdoxy38  ///< isdoxy38 IS_DOXYGEN_SINGLE
148aab8383aSDmitri Gribenko     , isdoxy39; ///< isdoxy39 IS_DOXYGEN_SINGLE
149aab8383aSDmitri Gribenko };
150aab8383aSDmitri Gribenko 
151aab8383aSDmitri Gribenko // Verified that Doxygen attaches these.
152aab8383aSDmitri Gribenko 
153aab8383aSDmitri Gribenko /// isdoxy40 IS_DOXYGEN_SINGLE
154aab8383aSDmitri Gribenko // NOT_DOXYGEN
155aab8383aSDmitri Gribenko void isdoxy40(int);
156aab8383aSDmitri Gribenko 
157aab8383aSDmitri Gribenko unsigned
158aab8383aSDmitri Gribenko /// isdoxy41 IS_DOXYGEN_SINGLE
159aab8383aSDmitri Gribenko // NOT_DOXYGEN
160aab8383aSDmitri Gribenko int isdoxy41(int);
161aab8383aSDmitri Gribenko 
162aab8383aSDmitri Gribenko class test42 {
163aab8383aSDmitri Gribenko   int isdoxy42; /* NOT_DOXYGEN */ ///< isdoxy42 IS_DOXYGEN_SINGLE
164aab8383aSDmitri Gribenko };
165aab8383aSDmitri Gribenko 
1665188c4b9SDmitri Gribenko /// IS_DOXYGEN_START
1675188c4b9SDmitri Gribenko /// It is fine to have a command at the end of comment.
1685188c4b9SDmitri Gribenko ///\brief
1695188c4b9SDmitri Gribenko ///
1705188c4b9SDmitri Gribenko /// Some malformed command.
1715188c4b9SDmitri Gribenko /* \*/
1725188c4b9SDmitri Gribenko /**
1735188c4b9SDmitri Gribenko  * \brief Aaa aaaaaaa aaaa.
1745188c4b9SDmitri Gribenko  * IS_DOXYGEN_END
1755188c4b9SDmitri Gribenko  */
1765188c4b9SDmitri Gribenko void isdoxy43(void);
1775188c4b9SDmitri Gribenko 
1785188c4b9SDmitri Gribenko /// IS_DOXYGEN_START Aaa bbb
1795188c4b9SDmitri Gribenko /// ccc.
1805188c4b9SDmitri Gribenko ///
1815188c4b9SDmitri Gribenko /// Ddd eee.
1825188c4b9SDmitri Gribenko /// Fff.
1835188c4b9SDmitri Gribenko ///
1845188c4b9SDmitri Gribenko /// Ggg. IS_DOXYGEN_END
1855188c4b9SDmitri Gribenko void isdoxy44(void);
1865188c4b9SDmitri Gribenko 
1875188c4b9SDmitri Gribenko /// IS_DOXYGEN_START Aaa bbb
1885188c4b9SDmitri Gribenko /// ccc.
1895188c4b9SDmitri Gribenko ///
1905188c4b9SDmitri Gribenko /// \brief
1915188c4b9SDmitri Gribenko /// Ddd eee.
1925188c4b9SDmitri Gribenko /// Fff.
1935188c4b9SDmitri Gribenko ///
1945188c4b9SDmitri Gribenko /// Ggg. IS_DOXYGEN_END
1955188c4b9SDmitri Gribenko void isdoxy45(void);
1965188c4b9SDmitri Gribenko 
1977e8729b9SDmitri Gribenko /// IS_DOXYGEN_NOT_ATTACHED
1987e8729b9SDmitri Gribenko #define FOO
1997e8729b9SDmitri Gribenko void notdoxy46(void);
2007e8729b9SDmitri Gribenko 
201a1e9c8e7SDmitri Gribenko /// IS_DOXYGEN_START Aaa bbb
202a1e9c8e7SDmitri Gribenko /// \param ccc
203a1e9c8e7SDmitri Gribenko /// \returns ddd IS_DOXYGEN_END
204a1e9c8e7SDmitri Gribenko void isdoxy47(int);
205a1e9c8e7SDmitri Gribenko 
206aab8383aSDmitri Gribenko #endif
207aab8383aSDmitri Gribenko 
208aab8383aSDmitri Gribenko // RUN: rm -rf %t
209aab8383aSDmitri Gribenko // RUN: mkdir %t
210aab8383aSDmitri Gribenko // RUN: %clang_cc1 -x c++ -emit-pch -o %t/out.pch %s
211aab8383aSDmitri Gribenko // RUN: %clang_cc1 -x c++ -include-pch %t/out.pch -fsyntax-only %s
212aab8383aSDmitri Gribenko 
213aab8383aSDmitri Gribenko // RUN: c-index-test -test-load-source all %s > %t/out.c-index-direct
214aab8383aSDmitri Gribenko // RUN: c-index-test -test-load-tu %t/out.pch all > %t/out.c-index-pch
215aab8383aSDmitri Gribenko 
216aab8383aSDmitri Gribenko // RUN: FileCheck %s -check-prefix=WRONG < %t/out.c-index-direct
217aab8383aSDmitri Gribenko // RUN: FileCheck %s -check-prefix=WRONG < %t/out.c-index-pch
218aab8383aSDmitri Gribenko 
219aab8383aSDmitri Gribenko // Declarations without Doxygen comments should not pick up some Doxygen comments.
220aab8383aSDmitri Gribenko // WRONG-NOT: notdoxy{{.*}}Comment=
221aab8383aSDmitri Gribenko // WRONG-NOT: test{{.*}}Comment=
222aab8383aSDmitri Gribenko 
223aab8383aSDmitri Gribenko // Non-Doxygen comments should not be attached to anything.
224aab8383aSDmitri Gribenko // WRONG-NOT: NOT_DOXYGEN
225aab8383aSDmitri Gribenko 
226aab8383aSDmitri Gribenko // Some Doxygen comments are not attached to anything.
227aab8383aSDmitri Gribenko // WRONG-NOT: IS_DOXYGEN_NOT_ATTACHED
228aab8383aSDmitri Gribenko 
229aab8383aSDmitri Gribenko // Ensure we don't pick up extra comments.
2305188c4b9SDmitri Gribenko // WRONG-NOT: IS_DOXYGEN_START{{.*}}IS_DOXYGEN_START{{.*}}BriefComment=
2315188c4b9SDmitri Gribenko // WRONG-NOT: IS_DOXYGEN_END{{.*}}IS_DOXYGEN_END{{.*}}BriefComment=
232aab8383aSDmitri Gribenko 
233aab8383aSDmitri Gribenko // RUN: FileCheck %s < %t/out.c-index-direct
234aab8383aSDmitri Gribenko // RUN: FileCheck %s < %t/out.c-index-pch
235aab8383aSDmitri Gribenko 
236aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:16:6: FunctionDecl=isdoxy4:{{.*}} isdoxy4 IS_DOXYGEN_SINGLE
237aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:20:6: FunctionDecl=isdoxy5:{{.*}} isdoxy5 IS_DOXYGEN_SINGLE
238aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:25:6: FunctionDecl=isdoxy6:{{.*}} isdoxy6 IS_DOXYGEN_SINGLE
239aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:31:6: FunctionDecl=isdoxy7:{{.*}} isdoxy7 IS_DOXYGEN_SINGLE
240aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:34:6: FunctionDecl=isdoxy8:{{.*}} isdoxy8 IS_DOXYGEN_SINGLE
241aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:37:6: FunctionDecl=isdoxy9:{{.*}} isdoxy9 IS_DOXYGEN_SINGLE
242aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:41:6: FunctionDecl=isdoxy10:{{.*}} isdoxy10 IS_DOXYGEN_SINGLE
243aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:53:6: FunctionDecl=isdoxy13:{{.*}} isdoxy13 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
244aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:58:6: FunctionDecl=isdoxy14:{{.*}} isdoxy14 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
245aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:63:6: FunctionDecl=isdoxy15:{{.*}} isdoxy15 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
246aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:67:6: FunctionDecl=isdoxy16:{{.*}} isdoxy16 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
247aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:72:6: FunctionDecl=isdoxy17:{{.*}} isdoxy17 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
248aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:80:5: FunctionDecl=isdoxy18:{{.*}} isdoxy18 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
249aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:90:6: FunctionDecl=isdoxy19:{{.*}} isdoxy19 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
250aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:96:6: FunctionDecl=isdoxy20:{{.*}} isdoxy20 IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
251aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:107:8: StructDecl=isdoxy25:{{.*}} IS_DOXYGEN_SINGLE
252aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:112:7: FieldDecl=isdoxy26:{{.*}} IS_DOXYGEN_SINGLE
253aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:116:7: FieldDecl=isdoxy27:{{.*}} IS_DOXYGEN_SINGLE
254aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:123:6: EnumDecl=isdoxy29:{{.*}} IS_DOXYGEN_SINGLE
255aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:130:11: Namespace=isdoxy31:{{.*}} IS_DOXYGEN_SINGLE
256aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:138:7: FieldDecl=isdoxy33:{{.*}} isdoxy33 IS_DOXYGEN_SINGLE
257aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:139:7: FieldDecl=isdoxy34:{{.*}} isdoxy34 IS_DOXYGEN_SINGLE
258aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:142:7: FieldDecl=isdoxy35:{{.*}} isdoxy35 IS_DOXYGEN_SINGLE
259aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:143:7: FieldDecl=isdoxy36:{{.*}} isdoxy36 IS_DOXYGEN_SINGLE
260aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:146:7: FieldDecl=isdoxy37:{{.*}} isdoxy37 IS_DOXYGEN_SINGLE
261aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:147:7: FieldDecl=isdoxy38:{{.*}} isdoxy38 IS_DOXYGEN_SINGLE
262aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:148:7: FieldDecl=isdoxy39:{{.*}} isdoxy39 IS_DOXYGEN_SINGLE
263aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:155:6: FunctionDecl=isdoxy40:{{.*}} isdoxy40 IS_DOXYGEN_SINGLE
264aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:160:5: FunctionDecl=isdoxy41:{{.*}} isdoxy41 IS_DOXYGEN_SINGLE
265aab8383aSDmitri Gribenko // CHECK: annotate-comments.cpp:163:7: FieldDecl=isdoxy42:{{.*}} isdoxy42 IS_DOXYGEN_SINGLE
2665188c4b9SDmitri Gribenko // CHECK: annotate-comments.cpp:176:6: FunctionDecl=isdoxy43:{{.*}} IS_DOXYGEN_START{{.*}} IS_DOXYGEN_END
2675188c4b9SDmitri Gribenko 
2680743f946SDmitri Gribenko // CHECK: annotate-comments.cpp:185:6: FunctionDecl=isdoxy44:{{.*}} BriefComment=[IS_DOXYGEN_START Aaa bbb ccc.]
2690743f946SDmitri Gribenko // CHECK: annotate-comments.cpp:195:6: FunctionDecl=isdoxy45:{{.*}} BriefComment=[Ddd eee. Fff.]
2700743f946SDmitri Gribenko // CHECK: annotate-comments.cpp:204:6: FunctionDecl=isdoxy47:{{.*}} BriefComment=[IS_DOXYGEN_START Aaa bbb]
271aab8383aSDmitri Gribenko 
272