1 // RUN: %clang_cc1 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -fcomment-block-commands=foobar -verify %s
2 // RUN  %clang_cc1 -std=c++11 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -fcomment-block-commands=foobar -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck -DATTRIBUTE="__attribute__((deprecated))" %s
3 // RUN: %clang_cc1 -std=c++14 -fsyntax-only -Wdocumentation -Wdocumentation-pedantic -fcomment-block-commands=foobar -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck --check-prefixes=CHECK,CHECK14 -DATTRIBUTE="[[deprecated]]" %s
4 
5 // expected-warning@+1 {{parameter 'ZZZZZZZZZZ' not found in the function declaration}} expected-note@+1 {{did you mean 'a'?}}
6 /// \param ZZZZZZZZZZ Blah blah.
7 int test1(int a);
8 
9 // expected-warning@+1 {{parameter 'aab' not found in the function declaration}} expected-note@+1 {{did you mean 'aaa'?}}
10 /// \param aab Blah blah.
11 int test2(int aaa, int bbb);
12 
13 // expected-warning@+1 {{template parameter 'ZZZZZZZZZZ' not found in the template declaration}} expected-note@+1 {{did you mean 'T'?}}
14 /// \tparam ZZZZZZZZZZ Aaa
15 template<typename T>
16 void test3(T aaa);
17 
18 // expected-warning@+1 {{template parameter 'SomTy' not found in the template declaration}} expected-note@+1 {{did you mean 'SomeTy'?}}
19 /// \tparam SomTy Aaa
20 /// \tparam OtherTy Bbb
21 template<typename SomeTy, typename OtherTy>
22 void test4(SomeTy aaa, OtherTy bbb);
23 
24 // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
25 /// \deprecated
26 void test_deprecated_1();
27 
28 // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
29 /// \deprecated
30 void test_deprecated_2(int a);
31 
32 struct test_deprecated_3 {
33   // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
34   /// \deprecated
35   void test_deprecated_4();
36 
37   // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
38   /// \deprecated
test_deprecated_5test_deprecated_339   void test_deprecated_5() {
40   }
41 };
42 
43 template<typename T>
44 struct test_deprecated_6 {
45   // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
46   /// \deprecated
47   void test_deprecated_7();
48 
49   // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
50   /// \deprecated
test_deprecated_8test_deprecated_651   void test_deprecated_8() {
52   }
53 };
54 
55 class PR43753 {
56   // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
57   // expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
58   /// \deprecated
59   static void test_deprecated_static();
60 
61   // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
62   // expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
63   /// \deprecated
64   static auto test_deprecated_static_trailing_return() -> int;
65 
66 #if __cplusplus >= 201402L
67   // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
68   // expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
69   /// \deprecated
test_deprecated_static_decltype_auto()70   static decltype(auto) test_deprecated_static_decltype_auto() { return 1; }
71 #endif
72 
73   // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
74   // expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
75   /// \deprecated
76   void test_deprecated_const() const;
77 
78   // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
79   // expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
80   /// \deprecated
81   auto test_deprecated_trailing_return() -> int;
82 
83 #if __cplusplus >= 201402L
84   // expected-warning@+2 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}}
85   // expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
86   /// \deprecated
test_deprecated_decltype_auto() const87   decltype(auto) test_deprecated_decltype_auto() const { return a; }
88 
89 private:
90   int a{0};
91 #endif
92 };
93 #define MY_ATTR_DEPRECATED __attribute__((deprecated))
94 
95 // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
96 /// \deprecated
97 void test_deprecated_9(int a);
98 
99 #if __cplusplus >= 201402L
100 #define ATTRIBUTE_DEPRECATED [[deprecated]]
101 
102 // expected-warning@+1 {{declaration is marked with '\deprecated' command but does not have a deprecation attribute}} expected-note@+2 {{add a deprecation attribute to the declaration to silence this warning}}
103 /// \deprecated
104 void test_deprecated_10(int a);
105 #endif
106 
107 // rdar://12381408
108 // expected-warning@+2  {{unknown command tag name 'retur'; did you mean 'return'?}}
109 /// \brief testing fixit
110 /// \retur int in FooBar
111 int FooBar();
112 
113 // expected-warning@+1  {{unknown command tag name 'fooba'; did you mean 'foobar'?}}
114 /// \fooba bbb IS_DOXYGEN_END
115 int gorf();
116 
117 // expected-warning@+1 {{unknown command tag name}}
118 /// \t bbb IS_DOXYGEN_END
119 int Bar();
120 
121 // expected-warning@+2  {{unknown command tag name 'encode'; did you mean 'endcode'?}}
122 // expected-warning@+1  {{'\endcode' command does not terminate a verbatim text block}}
123 /// \encode PR18051
124 int PR18051();
125 
126 // CHECK: fix-it:"{{.*}}":{6:12-6:22}:"a"
127 // CHECK: fix-it:"{{.*}}":{10:12-10:15}:"aaa"
128 // CHECK: fix-it:"{{.*}}":{14:13-14:23}:"T"
129 // CHECK: fix-it:"{{.*}}":{19:13-19:18}:"SomeTy"
130 // CHECK: fix-it:"{{.*}}":{26:1-26:1}:"[[ATTRIBUTE]] "
131 // CHECK: fix-it:"{{.*}}":{30:1-30:1}:"[[ATTRIBUTE]] "
132 // CHECK: fix-it:"{{.*}}":{35:3-35:3}:"[[ATTRIBUTE]] "
133 // CHECK: fix-it:"{{.*}}":{39:3-39:3}:"[[ATTRIBUTE]] "
134 // CHECK: fix-it:"{{.*}}":{47:3-47:3}:"[[ATTRIBUTE]] "
135 // CHECK: fix-it:"{{.*}}":{51:3-51:3}:"[[ATTRIBUTE]] "
136 // CHECK: fix-it:"{{.*}}":{76:3-76:3}:"[[ATTRIBUTE]] "
137 // CHECK: fix-it:"{{.*}}":{81:3-81:3}:"[[ATTRIBUTE]] "
138 // CHECK14: fix-it:"{{.*}}":{87:3-87:3}:"[[ATTRIBUTE]] "
139 // CHECK: fix-it:"{{.*}}":{97:1-97:1}:"MY_ATTR_DEPRECATED "
140 // CHECK14: fix-it:"{{.*}}":{104:1-104:1}:"ATTRIBUTE_DEPRECATED "
141 // CHECK: fix-it:"{{.*}}":{110:6-110:11}:"return"
142 // CHECK: fix-it:"{{.*}}":{114:6-114:11}:"foobar"
143 // CHECK: fix-it:"{{.*}}":{123:6-123:12}:"endcode"
144