1 // RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -verify %s
2 
3 // expected-warning@+1 {{expected quoted string after equals sign}}
4 /// <a href=>
5 int test_html1(int);
6 
7 // expected-warning@+1 {{expected quoted string after equals sign}}
8 /// <a href==>
9 int test_html2(int);
10 
11 // expected-warning@+2 {{expected quoted string after equals sign}}
12 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
13 /// <a href= blah
14 int test_html3(int);
15 
16 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
17 /// <a =>
18 int test_html4(int);
19 
20 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
21 /// <a "aaa">
22 int test_html5(int);
23 
24 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
25 /// <a a="b" =>
26 int test_html6(int);
27 
28 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
29 /// <a a="b" "aaa">
30 int test_html7(int);
31 
32 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
33 /// <a a="b" =
34 int test_html8(int);
35 
36 // expected-warning@+2 {{HTML start tag prematurely ended, expected attribute name or '>'}} expected-note@+1 {{HTML tag started here}}
37 /** Aaa bbb<ccc ddd eee
38  * fff ggg.
39  */
40 int test_html9(int);
41 
42 // expected-warning@+1 {{HTML start tag prematurely ended, expected attribute name or '>'}}
43 /** Aaa bbb<ccc ddd eee 42%
44  * fff ggg.
45  */
46 int test_html10(int);
47 
48 // expected-warning@+1 {{HTML end tag 'br' is forbidden}}
49 /// <br></br>
50 int test_html11(int);
51 
52 /// <blockquote>Meow</blockquote>
53 int test_html_nesting1(int);
54 
55 /// <b><i>Meow</i></b>
56 int test_html_nesting2(int);
57 
58 /// <p>Aaa<br>
59 /// Bbb</p>
60 int test_html_nesting3(int);
61 
62 /// <p>Aaa<br />
63 /// Bbb</p>
64 int test_html_nesting4(int);
65 
66 // expected-warning@+1 {{HTML end tag does not match any start tag}}
67 /// <b><i>Meow</a>
68 int test_html_nesting5(int);
69 
70 // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
71 // expected-warning@+1 {{HTML end tag does not match any start tag}}
72 /// <b><i>Meow</b></b>
73 int test_html_nesting6(int);
74 
75 // expected-warning@+2 {{HTML start tag 'i' closed by 'b'}}
76 // expected-warning@+1 {{HTML end tag does not match any start tag}}
77 /// <b><i>Meow</b></i>
78 int test_html_nesting7(int);
79 
80 
81 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
82 /// \brief\brief Aaa
83 int test_block_command1(int);
84 
85 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
86 /// \brief \brief Aaa
87 int test_block_command2(int);
88 
89 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
90 /// \brief
91 /// \brief Aaa
92 int test_block_command3(int);
93 
94 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
95 /// \brief
96 ///
97 /// \brief Aaa
98 int test_block_command4(int);
99 
100 // There is trailing whitespace on one of the following lines, don't remove it!
101 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
102 /// \brief
103 ///
104 /// \brief Aaa
105 int test_block_command5(int);
106 
107 /// \brief \c Aaa
108 int test_block_command6(int);
109 
110 // expected-warning@+1 {{'\param' command used in a comment that is not attached to a function declaration}}
111 /// \param a Blah blah.
112 int test_param1;
113 
114 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
115 /// \param
116 /// \param a Blah blah.
117 int test_param2(int a);
118 
119 // expected-warning@+1 {{empty paragraph passed to '\param' command}}
120 /// \param a
121 int test_param3(int a);
122 
123 /// \param a Blah blah.
124 int test_param4(int a);
125 
126 /// \param [in] a Blah blah.
127 int test_param5(int a);
128 
129 /// \param [out] a Blah blah.
130 int test_param6(int a);
131 
132 /// \param [in,out] a Blah blah.
133 int test_param7(int a);
134 
135 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
136 /// \param [ in ] a Blah blah.
137 int test_param8(int a);
138 
139 // expected-warning@+1 {{whitespace is not allowed in parameter passing direction}}
140 /// \param [in, out] a Blah blah.
141 int test_param9(int a);
142 
143 // expected-warning@+1 {{unrecognized parameter passing direction, valid directions are '[in]', '[out]' and '[in,out]'}}
144 /// \param [ junk] a Blah blah.
145 int test_param10(int a);
146 
147 // expected-warning@+1 {{parameter 'a' not found in the function declaration}}
148 /// \param a Blah blah.
149 int test_param11();
150 
151 // expected-warning@+1 {{parameter 'A' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
152 /// \param A Blah blah.
153 int test_param12(int a);
154 
155 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
156 /// \param aab Blah blah.
157 int test_param13(int aaa, int bbb);
158 
159 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
160 /// \param aab Blah blah.
161 int test_param14(int bbb, int ccc);
162 
163 class C {
164   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
165   /// \param aaa Blah blah.
166   C(int bbb, int ccc);
167 
168   // expected-warning@+1 {{parameter 'aaa' not found in the function declaration}}
169   /// \param aaa Blah blah.
170  int test_param15(int bbb, int ccc);
171 };
172 
173 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}}
174 /// \param aab Blah blah.
175 template<typename T>
176 void test_param16(int bbb, int ccc);
177 
178 // expected-warning@+3 {{parameter 'a' is already documented}}
179 // expected-note@+1 {{previous documentation}}
180 /// \param a Aaa.
181 /// \param a Aaa.
182 int test_param17(int a);
183 
184 // expected-warning@+4 {{parameter 'x2' is already documented}}
185 // expected-note@+2 {{previous documentation}}
186 /// \param x1 Aaa.
187 /// \param x2 Bbb.
188 /// \param x2 Ccc.
189 int test_param18(int x1, int x2, int x3);
190 
191 
192 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
193 /// \tparam T Aaa
194 int test_tparam1;
195 
196 // expected-warning@+1 {{'\tparam' command used in a comment that is not attached to a template declaration}}
197 /// \tparam T Aaa
198 void test_tparam2(int aaa);
199 
200 // expected-warning@+1 {{empty paragraph passed to '\tparam' command}}
201 /// \tparam
202 /// \param aaa Blah blah
203 template<typename T>
204 void test_tparam3(T aaa);
205 
206 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
207 /// \tparam T Aaa
208 template<typename TT>
209 void test_tparam4(TT aaa);
210 
211 // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TT'?}}
212 /// \tparam T Aaa
213 template<typename TT>
214 class test_tparam5 {
215   // expected-warning@+1 {{template parameter 'T' not found in the template declaration}} expected-note@+1 {{did you mean 'TTT'?}}
216   /// \tparam T Aaa
217   template<typename TTT>
218   void test_tparam6(TTT aaa);
219 };
220 
221 /// \tparam T1 Aaa
222 /// \tparam T2 Bbb
223 template<typename T1, typename T2>
224 void test_tparam7(T1 aaa, T2 bbb);
225 
226 // expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
227 /// \tparam SomTy Aaa
228 /// \tparam OtherTy Bbb
229 template<typename SomeTy, typename OtherTy>
230 void test_tparam8(SomeTy aaa, OtherTy bbb);
231 
232 // expected-warning@+2 {{template parameter 'T1' is already documented}} expected-note@+1 {{previous documentation}}
233 /// \tparam T1 Aaa
234 /// \tparam T1 Bbb
235 template<typename T1, typename T2>
236 void test_tparam9(T1 aaa, T2 bbb);
237 
238 /// \tparam T Aaa
239 /// \tparam TT Bbb
240 template<template<typename T> class TT>
241 void test_tparam10(TT<int> aaa);
242 
243 /// \tparam T Aaa
244 /// \tparam TT Bbb
245 /// \tparam TTT Ccc
246 template<template<template<typename T> class TT, class C> class TTT>
247 void test_tparam11();
248 
249 /// \tparam I Aaa
250 template<int I>
251 void test_tparam12();
252 
253 template<typename T, typename U>
254 class test_tparam13 { };
255 
256 /// \tparam T Aaa
257 template<typename T>
258 using test_tparam14 = test_tparam13<T, int>;
259 
260 // expected-warning@+1 {{template parameter 'U' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
261 /// \tparam U Aaa
262 template<typename T>
263 using test_tparam15 = test_tparam13<T, int>;
264 
265 // no-warning
266 /// \returns Aaa
267 int test_returns_right_decl_1(int);
268 
269 class test_returns_right_decl_2 {
270   // no-warning
271   /// \returns Aaa
272   int test_returns_right_decl_3(int);
273 };
274 
275 // no-warning
276 /// \returns Aaa
277 template<typename T>
278 int test_returns_right_decl_4(T aaa);
279 
280 // no-warning
281 /// \returns Aaa
282 template<>
283 int test_returns_right_decl_4(int aaa);
284 
285 /// \returns Aaa
286 template<typename T>
287 T test_returns_right_decl_5(T aaa);
288 
289 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}}
290 /// \returns Aaa
291 int test_returns_wrong_decl_1;
292 
293 // expected-warning@+1 {{'\return' command used in a comment that is not attached to a function declaration}}
294 /// \return Aaa
295 int test_returns_wrong_decl_2;
296 
297 // expected-warning@+1 {{'\result' command used in a comment that is not attached to a function declaration}}
298 /// \result Aaa
299 int test_returns_wrong_decl_3;
300 
301 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a void function}}
302 /// \returns Aaa
303 void test_returns_wrong_decl_4(int);
304 
305 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a void function}}
306 /// \returns Aaa
307 template<typename T>
308 void test_returns_wrong_decl_5(T aaa);
309 
310 // expected-warning@+1 {{'\returns' command used in a comment that is attached to a void function}}
311 /// \returns Aaa
312 template<>
313 void test_returns_wrong_decl_5(int aaa);
314 
315 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}}
316 /// \returns Aaa
317 struct test_returns_wrong_decl_6 { };
318 
319 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}}
320 /// \returns Aaa
321 class test_returns_wrong_decl_7 {
322   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a constructor}}
323   /// \returns Aaa
324   test_returns_wrong_decl_7();
325 
326   // expected-warning@+1 {{'\returns' command used in a comment that is attached to a destructor}}
327   /// \returns Aaa
328   ~test_returns_wrong_decl_7();
329 };
330 
331 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}}
332 /// \returns Aaa
333 enum test_returns_wrong_decl_8 {
334   // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}}
335   /// \returns Aaa
336   test_returns_wrong_decl_9
337 };
338 
339 // expected-warning@+1 {{'\returns' command used in a comment that is not attached to a function declaration}}
340 /// \returns Aaa
341 namespace test_returns_wrong_decl_10 { };
342 
343 
344 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
345 int test1; ///< \brief\brief Aaa
346 
347 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
348 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
349 int test2, ///< \brief\brief Aaa
350     test3; ///< \brief\brief Aaa
351 
352 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
353 int test4; ///< \brief
354            ///< \brief Aaa
355 
356 
357 // Check that we attach the comment to the declaration during parsing in the
358 // following cases.  The test is based on the fact that we don't parse
359 // documentation comments that are not attached to anything.
360 
361 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
362 /// \brief\brief Aaa
363 int test_attach1;
364 
365 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
366 /// \brief\brief Aaa
367 int test_attach2(int);
368 
369 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
370 /// \brief\brief Aaa
371 struct test_attach3 {
372   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
373   /// \brief\brief Aaa
374   int test_attach4;
375 
376   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
377   int test_attach5; ///< \brief\brief Aaa
378 
379   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
380   /// \brief\brief Aaa
381   int test_attach6(int);
382 };
383 
384 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
385 /// \brief\brief Aaa
386 class test_attach7 {
387   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
388   /// \brief\brief Aaa
389   int test_attach8;
390 
391   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
392   int test_attach9; ///< \brief\brief Aaa
393 
394   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
395   /// \brief\brief Aaa
396   int test_attach10(int);
397 };
398 
399 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
400 /// \brief\brief Aaa
401 enum test_attach9 {
402   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
403   /// \brief\brief Aaa
404   test_attach10,
405 
406   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
407   test_attach11 ///< \brief\brief Aaa
408 };
409 
410 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
411 /// \brief\brief Aaa
412 struct test_noattach12 *test_attach13;
413 
414 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
415 /// \brief\brief Aaa
416 typedef struct test_noattach14 *test_attach15;
417 
418 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
419 /// \brief\brief Aaa
420 typedef struct test_attach16 { int a; } test_attach17;
421 
422 struct S { int a; };
423 
424 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
425 /// \brief\brief Aaa
426 struct S *test_attach18;
427 
428 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
429 /// \brief\brief Aaa
430 typedef struct S *test_attach19;
431 
432 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
433 /// \brief\brief Aaa
434 struct test_attach20;
435 
436 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
437 /// \brief\brief Aaa
438 typedef struct test_attach21 {
439   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
440   /// \brief\brief Aaa
441   int test_attach22;
442 } test_attach23;
443 
444 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
445 /// \brief\brief Aaa
446 namespace test_attach24 {
447   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
448   /// \brief\brief Aaa
449   namespace test_attach25 {
450   }
451 }
452 
453 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
454 /// \brief\brief Aaa
455 /// \tparam T Aaa
456 template<typename T>
457 void test_attach26(T aaa);
458 
459 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
460 /// \brief\brief Aaa
461 /// \tparam T Aaa
462 template<typename T, typename U>
463 void test_attach27(T aaa, U bbb);
464 
465 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
466 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
467 /// \brief\brief Aaa
468 /// \tparam T Aaa
469 template<>
470 void test_attach27(int aaa, int bbb);
471 
472 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
473 /// \brief\brief Aaa
474 /// \tparam T Aaa
475 template<typename T>
476 class test_attach28 {
477   T aaa;
478 };
479 
480 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
481 /// \brief\brief Aaa
482 using test_attach29 = test_attach28<int>;
483 
484 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
485 /// \brief\brief Aaa
486 /// \tparam T Aaa
487 template<typename T, typename U>
488 class test_attach30 { };
489 
490 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
491 /// \brief\brief Aaa
492 /// \tparam T Aaa
493 template<typename T>
494 class test_attach30<T, int> { };
495 
496 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
497 /// \brief\brief Aaa
498 template<>
499 class test_attach30<int, int> { };
500 
501 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
502 /// \brief\brief Aaa
503 template<typename T>
504 using test_attach31 = test_attach30<T, int>;
505 
506 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
507 /// \brief\brief Aaa
508 /// \tparam T Aaa
509 template<typename T, typename U, typename V>
510 class test_attach32 { };
511 
512 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
513 /// \brief\brief Aaa
514 /// \tparam T Aaa
515 template<typename T, typename U>
516 class test_attach32<T, U, int> { };
517 
518 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
519 /// \brief\brief Aaa
520 /// \tparam T Aaa
521 template<typename T>
522 class test_attach32<T, int, int> { };
523 
524 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
525 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
526 /// \brief\brief Aaa
527 /// \tparam T Aaa
528 template<>
529 class test_attach32<int, int, int> { };
530 
531 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
532 /// \brief\brief Aaa
533 class test_attach33 {
534   // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
535   /// \brief\brief Aaa
536   /// \tparam T Aaa
537   template<typename T, typename U>
538   void test_attach34(T aaa, U bbb);
539 };
540 
541 template<typename T>
542 class test_attach35 {
543   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
544   // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
545   /// \brief\brief Aaa
546   /// \tparam T Aaa
547   template<typename TT, typename UU>
548   void test_attach36(TT aaa, UU bbb);
549 };
550 
551 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
552 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
553 /// \brief\brief Aaa
554 /// \tparam T Aaa
555 template<> template<>
556 void test_attach35<int>::test_attach36(int aaa, int bbb) {}
557 
558 template<typename T>
559 class test_attach37 {
560   // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
561   // expected-warning@+2 {{'\tparam' command used in a comment that is not attached to a template declaration}}
562   /// \brief\brief Aaa
563   /// \tparam T Aaa
564   void test_attach38(int aaa, int bbb);
565 };
566 
567 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
568 /// \brief\brief Aaa
569 /// \tparam T Aaa
570 template<typename T>
571 void test_attach37<T>::test_attach38(int aaa, int bbb) {}
572 
573 // expected-warning@+2 {{empty paragraph passed to '\brief' command}}
574 // expected-warning@+2 {{template parameter 'T' not found in the template declaration}}
575 /// \brief\brief Aaa
576 /// \tparam T Aaa
577 template<>
578 void test_attach37<int>::test_attach38(int aaa, int bbb) {}
579 
580 
581 // PR13411, reduced.  We used to crash on this.
582 /**
583  * @code Aaa.
584  */
585 void test_nocrash1(int);
586 
587 // We used to crash on this.
588 // expected-warning@+2 {{empty paragraph passed to '\param' command}}
589 // expected-warning@+1 {{empty paragraph passed to '\brief' command}}
590 /// \param\brief
591 void test_nocrash2(int);
592 
593