@@ -17,13 +17,17 @@ namespace tidy {
17
17
namespace modernize {
18
18
19
19
namespace {
20
- StringRef GetNewExprName (const CXXNewExpr *NewExpr,
21
- const SourceManager &SM,
22
- const LangOptions &Lang) {
23
- return Lexer::getSourceText (
20
+ std::string GetNewExprName (const CXXNewExpr *NewExpr,
21
+ const SourceManager &SM,
22
+ const LangOptions &Lang) {
23
+ StringRef WrittenName = Lexer::getSourceText (
24
24
CharSourceRange::getTokenRange (
25
25
NewExpr->getAllocatedTypeSourceInfo ()->getTypeLoc ().getSourceRange ()),
26
26
SM, Lang);
27
+ if (NewExpr->isArray ()) {
28
+ return WrittenName.str () + " []" ;
29
+ }
30
+ return WrittenName.str ();
27
31
}
28
32
} // namespace
29
33
@@ -114,7 +118,7 @@ void MakeSmartPtrCheck::checkConstruct(SourceManager &SM,
114
118
ConstructCallEnd = ConstructCallStart.getLocWithOffset (ExprStr.size ());
115
119
Diag << FixItHint::CreateInsertion (
116
120
ConstructCallEnd,
117
- " <" + GetNewExprName (New, SM, getLangOpts ()). str () + " >" );
121
+ " <" + GetNewExprName (New, SM, getLangOpts ()) + " >" );
118
122
} else {
119
123
ConstructCallEnd = ConstructCallStart.getLocWithOffset (LAngle);
120
124
}
@@ -137,7 +141,7 @@ void MakeSmartPtrCheck::checkConstruct(SourceManager &SM,
137
141
" )" );
138
142
}
139
143
140
- replaceNew (Diag, New);
144
+ replaceNew (Diag, New, SM );
141
145
}
142
146
143
147
void MakeSmartPtrCheck::checkReset (SourceManager &SM,
@@ -162,23 +166,49 @@ void MakeSmartPtrCheck::checkReset(SourceManager &SM,
162
166
if (Expr->isArrow ())
163
167
Diag << FixItHint::CreateInsertion (ExprStart, " *" );
164
168
165
- replaceNew (Diag, New);
169
+ replaceNew (Diag, New, SM );
166
170
}
167
171
168
172
void MakeSmartPtrCheck::replaceNew (DiagnosticBuilder &Diag,
169
- const CXXNewExpr *New) {
173
+ const CXXNewExpr *New,
174
+ SourceManager& SM) {
170
175
SourceLocation NewStart = New->getSourceRange ().getBegin ();
171
176
SourceLocation NewEnd = New->getSourceRange ().getEnd ();
177
+
178
+ std::string ArraySizeExpr;
179
+ if (const auto * ArraySize = New->getArraySize ()) {
180
+ ArraySizeExpr = Lexer::getSourceText (CharSourceRange::getTokenRange (
181
+ ArraySize->getSourceRange ()),
182
+ SM, getLangOpts ())
183
+ .str ();
184
+ }
185
+
172
186
switch (New->getInitializationStyle ()) {
173
187
case CXXNewExpr::NoInit: {
174
- Diag << FixItHint::CreateRemoval (SourceRange (NewStart, NewEnd));
188
+ if (ArraySizeExpr.empty ()) {
189
+ Diag << FixItHint::CreateRemoval (SourceRange (NewStart, NewEnd));
190
+ } else {
191
+ // New array expression without written initializer:
192
+ // smart_ptr<Foo[]>(new Foo[5]);
193
+ Diag << FixItHint::CreateReplacement (SourceRange (NewStart, NewEnd),
194
+ ArraySizeExpr);
195
+ }
175
196
break ;
176
197
}
177
198
case CXXNewExpr::CallInit: {
178
- SourceRange InitRange = New->getDirectInitRange ();
179
- Diag << FixItHint::CreateRemoval (
180
- SourceRange (NewStart, InitRange.getBegin ()));
181
- Diag << FixItHint::CreateRemoval (SourceRange (InitRange.getEnd (), NewEnd));
199
+ if (ArraySizeExpr.empty ()) {
200
+ SourceRange InitRange = New->getDirectInitRange ();
201
+ Diag << FixItHint::CreateRemoval (
202
+ SourceRange (NewStart, InitRange.getBegin ()));
203
+ Diag << FixItHint::CreateRemoval (SourceRange (InitRange.getEnd (), NewEnd));
204
+ }
205
+ else {
206
+ // New array expression with default/value initialization:
207
+ // smart_ptr<Foo[]>(new int[5]());
208
+ // smart_ptr<Foo[]>(new Foo[5]());
209
+ Diag << FixItHint::CreateReplacement (SourceRange (NewStart, NewEnd),
210
+ ArraySizeExpr);
211
+ }
182
212
break ;
183
213
}
184
214
case CXXNewExpr::ListInit: {
0 commit comments