clang 22.0.0git
SemaStmt.cpp
Go to the documentation of this file.
1//===--- SemaStmt.cpp - Semantic Analysis for Statements ------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements semantic analysis for statements.
10//
11//===----------------------------------------------------------------------===//
12
13#include "CheckExprLifetime.h"
15#include "clang/AST/ASTLambda.h"
17#include "clang/AST/CharUnits.h"
18#include "clang/AST/DeclObjC.h"
21#include "clang/AST/ExprCXX.h"
22#include "clang/AST/ExprObjC.h"
24#include "clang/AST/StmtCXX.h"
25#include "clang/AST/StmtObjC.h"
26#include "clang/AST/TypeLoc.h"
32#include "clang/Sema/Lookup.h"
34#include "clang/Sema/Scope.h"
36#include "clang/Sema/SemaCUDA.h"
37#include "clang/Sema/SemaObjC.h"
39#include "llvm/ADT/ArrayRef.h"
40#include "llvm/ADT/DenseMap.h"
41#include "llvm/ADT/STLExtras.h"
42#include "llvm/ADT/SmallVector.h"
43#include "llvm/ADT/StringExtras.h"
44
45using namespace clang;
46using namespace sema;
47
48StmtResult Sema::ActOnExprStmt(ExprResult FE, bool DiscardedValue) {
49 if (FE.isInvalid())
50 return StmtError();
51
52 FE = ActOnFinishFullExpr(FE.get(), FE.get()->getExprLoc(), DiscardedValue);
53 if (FE.isInvalid())
54 return StmtError();
55
56 // C99 6.8.3p2: The expression in an expression statement is evaluated as a
57 // void expression for its side effects. Conversion to void allows any
58 // operand, even incomplete types.
59
60 // Same thing in for stmt first clause (when expr) and third clause.
61 return StmtResult(FE.getAs<Stmt>());
62}
63
64
67 return StmtError();
68}
69
71 bool HasLeadingEmptyMacro) {
72 return new (Context) NullStmt(SemiLoc, HasLeadingEmptyMacro);
73}
74
76 SourceLocation EndLoc) {
77 DeclGroupRef DG = dg.get();
78
79 // If we have an invalid decl, just return an error.
80 if (DG.isNull()) return StmtError();
81
82 return new (Context) DeclStmt(DG, StartLoc, EndLoc);
83}
84
86 DeclGroupRef DG = dg.get();
87
88 // If we don't have a declaration, or we have an invalid declaration,
89 // just return.
90 if (DG.isNull() || !DG.isSingleDecl())
91 return;
92
93 Decl *decl = DG.getSingleDecl();
94 if (!decl || decl->isInvalidDecl())
95 return;
96
97 // Only variable declarations are permitted.
98 VarDecl *var = dyn_cast<VarDecl>(decl);
99 if (!var) {
100 Diag(decl->getLocation(), diag::err_non_variable_decl_in_for);
101 decl->setInvalidDecl();
102 return;
103 }
104
105 // foreach variables are never actually initialized in the way that
106 // the parser came up with.
107 var->setInit(nullptr);
108
109 // In ARC, we don't need to retain the iteration variable of a fast
110 // enumeration loop. Rather than actually trying to catch that
111 // during declaration processing, we remove the consequences here.
112 if (getLangOpts().ObjCAutoRefCount) {
113 QualType type = var->getType();
114
115 // Only do this if we inferred the lifetime. Inferred lifetime
116 // will show up as a local qualifier because explicit lifetime
117 // should have shown up as an AttributedType instead.
118 if (type.getLocalQualifiers().getObjCLifetime() == Qualifiers::OCL_Strong) {
119 // Add 'const' and mark the variable as pseudo-strong.
120 var->setType(type.withConst());
121 var->setARCPseudoStrong(true);
122 }
123 }
124}
125
126/// Diagnose unused comparisons, both builtin and overloaded operators.
127/// For '==' and '!=', suggest fixits for '=' or '|='.
128///
129/// Adding a cast to void (or other expression wrappers) will prevent the
130/// warning from firing.
131static bool DiagnoseUnusedComparison(Sema &S, const Expr *E) {
133 bool CanAssign;
134 enum { Equality, Inequality, Relational, ThreeWay } Kind;
135
136 if (const BinaryOperator *Op = dyn_cast<BinaryOperator>(E)) {
137 if (!Op->isComparisonOp())
138 return false;
139
140 if (Op->getOpcode() == BO_EQ)
141 Kind = Equality;
142 else if (Op->getOpcode() == BO_NE)
143 Kind = Inequality;
144 else if (Op->getOpcode() == BO_Cmp)
145 Kind = ThreeWay;
146 else {
147 assert(Op->isRelationalOp());
148 Kind = Relational;
149 }
150 Loc = Op->getOperatorLoc();
151 CanAssign = Op->getLHS()->IgnoreParenImpCasts()->isLValue();
152 } else if (const CXXOperatorCallExpr *Op = dyn_cast<CXXOperatorCallExpr>(E)) {
153 switch (Op->getOperator()) {
154 case OO_EqualEqual:
155 Kind = Equality;
156 break;
157 case OO_ExclaimEqual:
158 Kind = Inequality;
159 break;
160 case OO_Less:
161 case OO_Greater:
162 case OO_GreaterEqual:
163 case OO_LessEqual:
164 Kind = Relational;
165 break;
166 case OO_Spaceship:
167 Kind = ThreeWay;
168 break;
169 default:
170 return false;
171 }
172
173 Loc = Op->getOperatorLoc();
174 CanAssign = Op->getArg(0)->IgnoreParenImpCasts()->isLValue();
175 } else {
176 // Not a typo-prone comparison.
177 return false;
178 }
179
180 // Suppress warnings when the operator, suspicious as it may be, comes from
181 // a macro expansion.
183 return false;
184
185 S.Diag(Loc, diag::warn_unused_comparison)
186 << (unsigned)Kind << E->getSourceRange();
187
188 // If the LHS is a plausible entity to assign to, provide a fixit hint to
189 // correct common typos.
190 if (CanAssign) {
191 if (Kind == Inequality)
192 S.Diag(Loc, diag::note_inequality_comparison_to_or_assign)
194 else if (Kind == Equality)
195 S.Diag(Loc, diag::note_equality_comparison_to_assign)
197 }
198
199 return true;
200}
201
202static bool DiagnoseNoDiscard(Sema &S, const NamedDecl *OffendingDecl,
203 const WarnUnusedResultAttr *A, SourceLocation Loc,
204 SourceRange R1, SourceRange R2, bool IsCtor) {
205 if (!A)
206 return false;
207 StringRef Msg = A->getMessage();
208
209 if (Msg.empty()) {
210 if (OffendingDecl)
211 return S.Diag(Loc, diag::warn_unused_return_type)
212 << IsCtor << A << OffendingDecl << false << R1 << R2;
213 if (IsCtor)
214 return S.Diag(Loc, diag::warn_unused_constructor)
215 << A << false << R1 << R2;
216 return S.Diag(Loc, diag::warn_unused_result) << A << false << R1 << R2;
217 }
218
219 if (OffendingDecl)
220 return S.Diag(Loc, diag::warn_unused_return_type)
221 << IsCtor << A << OffendingDecl << true << Msg << R1 << R2;
222 if (IsCtor)
223 return S.Diag(Loc, diag::warn_unused_constructor)
224 << A << true << Msg << R1 << R2;
225 return S.Diag(Loc, diag::warn_unused_result) << A << true << Msg << R1 << R2;
226}
227
228namespace {
229
230// Diagnoses unused expressions that call functions marked [[nodiscard]],
231// [[gnu::warn_unused_result]] and similar.
232// Additionally, a DiagID can be provided to emit a warning in additional
233// contexts (such as for an unused LHS of a comma expression)
234void DiagnoseUnused(Sema &S, const Expr *E, std::optional<unsigned> DiagID) {
235 bool NoDiscardOnly = !DiagID.has_value();
236
237 // If we are in an unevaluated expression context, then there can be no unused
238 // results because the results aren't expected to be used in the first place.
239 if (S.isUnevaluatedContext())
240 return;
241
243 // In most cases, we don't want to warn if the expression is written in a
244 // macro body, or if the macro comes from a system header. If the offending
245 // expression is a call to a function with the warn_unused_result attribute,
246 // we warn no matter the location. Because of the order in which the various
247 // checks need to happen, we factor out the macro-related test here.
248 bool ShouldSuppress = S.SourceMgr.isMacroBodyExpansion(ExprLoc) ||
249 S.SourceMgr.isInSystemMacro(ExprLoc);
250
251 const Expr *WarnExpr;
253 SourceRange R1, R2;
254 if (!E->isUnusedResultAWarning(WarnExpr, Loc, R1, R2, S.Context))
255 return;
256
257 if (!NoDiscardOnly) {
258 // If this is a GNU statement expression expanded from a macro, it is
259 // probably unused because it is a function-like macro that can be used as
260 // either an expression or statement. Don't warn, because it is almost
261 // certainly a false positive.
262 if (isa<StmtExpr>(E) && Loc.isMacroID())
263 return;
264
265 // Check if this is the UNREFERENCED_PARAMETER from the Microsoft headers.
266 // That macro is frequently used to suppress "unused parameter" warnings,
267 // but its implementation makes clang's -Wunused-value fire. Prevent this.
268 if (isa<ParenExpr>(E->IgnoreImpCasts()) && Loc.isMacroID()) {
269 SourceLocation SpellLoc = Loc;
270 if (S.findMacroSpelling(SpellLoc, "UNREFERENCED_PARAMETER"))
271 return;
272 }
273 }
274
275 // Okay, we have an unused result. Depending on what the base expression is,
276 // we might want to make a more specific diagnostic. Check for one of these
277 // cases now.
278 if (const FullExpr *Temps = dyn_cast<FullExpr>(E))
279 E = Temps->getSubExpr();
280 if (const CXXBindTemporaryExpr *TempExpr = dyn_cast<CXXBindTemporaryExpr>(E))
281 E = TempExpr->getSubExpr();
282
284 return;
285
286 E = WarnExpr;
287 if (const auto *Cast = dyn_cast<CastExpr>(E))
288 if (Cast->getCastKind() == CK_NoOp ||
289 Cast->getCastKind() == CK_ConstructorConversion ||
290 Cast->getCastKind() == CK_IntegralCast)
291 E = Cast->getSubExpr()->IgnoreImpCasts();
292
293 if (const CallExpr *CE = dyn_cast<CallExpr>(E)) {
294 if (E->getType()->isVoidType())
295 return;
296
297 auto [OffendingDecl, A] = CE->getUnusedResultAttr(S.Context);
298 if (DiagnoseNoDiscard(S, OffendingDecl, A, Loc, R1, R2,
299 /*isCtor=*/false))
300 return;
301
302 // If the callee has attribute pure, const, or warn_unused_result, warn with
303 // a more specific message to make it clear what is happening. If the call
304 // is written in a macro body, only warn if it has the warn_unused_result
305 // attribute.
306 if (const Decl *FD = CE->getCalleeDecl()) {
307 if (ShouldSuppress)
308 return;
309 if (FD->hasAttr<PureAttr>()) {
310 S.Diag(Loc, diag::warn_unused_call) << R1 << R2 << "pure";
311 return;
312 }
313 if (FD->hasAttr<ConstAttr>()) {
314 S.Diag(Loc, diag::warn_unused_call) << R1 << R2 << "const";
315 return;
316 }
317 }
318 } else if (const auto *CE = dyn_cast<CXXConstructExpr>(E)) {
319 auto [OffendingDecl, A] = CE->getUnusedResultAttr(S.Context);
320 if (DiagnoseNoDiscard(S, OffendingDecl, A, Loc, R1, R2,
321 /*isCtor=*/true))
322 return;
323 } else if (const auto *ILE = dyn_cast<InitListExpr>(E)) {
324 if (const TagDecl *TD = ILE->getType()->getAsTagDecl()) {
325
326 if (DiagnoseNoDiscard(S, TD, TD->getAttr<WarnUnusedResultAttr>(), Loc, R1,
327 R2, /*isCtor=*/false))
328 return;
329 }
330 } else if (ShouldSuppress)
331 return;
332
333 E = WarnExpr;
334 if (const ObjCMessageExpr *ME = dyn_cast<ObjCMessageExpr>(E)) {
335 if (S.getLangOpts().ObjCAutoRefCount && ME->isDelegateInitCall()) {
336 S.Diag(Loc, diag::err_arc_unused_init_message) << R1;
337 return;
338 }
339
340 auto [OffendingDecl, A] = ME->getUnusedResultAttr(S.Context);
341 if (DiagnoseNoDiscard(S, OffendingDecl, A, Loc, R1, R2,
342 /*isCtor=*/false))
343 return;
344 } else if (const PseudoObjectExpr *POE = dyn_cast<PseudoObjectExpr>(E)) {
345 const Expr *Source = POE->getSyntacticForm();
346 // Handle the actually selected call of an OpenMP specialized call.
347 if (S.LangOpts.OpenMP && isa<CallExpr>(Source) &&
348 POE->getNumSemanticExprs() == 1 &&
349 isa<CallExpr>(POE->getSemanticExpr(0)))
350 return DiagnoseUnused(S, POE->getSemanticExpr(0), DiagID);
351 if (isa<ObjCSubscriptRefExpr>(Source))
352 DiagID = diag::warn_unused_container_subscript_expr;
353 else if (isa<ObjCPropertyRefExpr>(Source))
354 DiagID = diag::warn_unused_property_expr;
355 } else if (const CXXFunctionalCastExpr *FC
356 = dyn_cast<CXXFunctionalCastExpr>(E)) {
357 const Expr *E = FC->getSubExpr();
358 if (const CXXBindTemporaryExpr *TE = dyn_cast<CXXBindTemporaryExpr>(E))
359 E = TE->getSubExpr();
360 if (isa<CXXTemporaryObjectExpr>(E))
361 return;
362 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(E))
363 if (const CXXRecordDecl *RD = CE->getType()->getAsCXXRecordDecl())
364 if (!RD->getAttr<WarnUnusedAttr>())
365 return;
366 }
367
368 if (NoDiscardOnly)
369 return;
370
371 // Diagnose "(void*) blah" as a typo for "(void) blah".
372 if (const CStyleCastExpr *CE = dyn_cast<CStyleCastExpr>(E)) {
373 TypeSourceInfo *TI = CE->getTypeInfoAsWritten();
374 QualType T = TI->getType();
375
376 // We really do want to use the non-canonical type here.
377 if (T == S.Context.VoidPtrTy) {
379
380 S.Diag(Loc, diag::warn_unused_voidptr)
382 return;
383 }
384 }
385
386 // Tell the user to assign it into a variable to force a volatile load if this
387 // isn't an array.
388 if (E->isGLValue() && E->getType().isVolatileQualified() &&
389 !E->getType()->isArrayType()) {
390 S.Diag(Loc, diag::warn_unused_volatile) << R1 << R2;
391 return;
392 }
393
394 // Do not diagnose use of a comma operator in a SFINAE context because the
395 // type of the left operand could be used for SFINAE, so technically it is
396 // *used*.
397 if (DiagID == diag::warn_unused_comma_left_operand && S.isSFINAEContext())
398 return;
399
401 S.PDiag(*DiagID) << R1 << R2);
402}
403} // namespace
404
405void Sema::DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID) {
406 if (const LabelStmt *Label = dyn_cast_if_present<LabelStmt>(S))
407 S = Label->getSubStmt();
408
409 const Expr *E = dyn_cast_if_present<Expr>(S);
410 if (!E)
411 return;
412
413 DiagnoseUnused(*this, E, DiagID);
414}
415
416void Sema::ActOnStartOfCompoundStmt(bool IsStmtExpr) {
417 PushCompoundScope(IsStmtExpr);
418}
419
421 if (getCurFPFeatures().isFPConstrained()) {
423 assert(FSI);
424 FSI->setUsesFPIntrin();
425 }
426}
427
430}
431
433 return getCurFunction()->CompoundScopes.back();
434}
435
437 ArrayRef<Stmt *> Elts, bool isStmtExpr) {
438 const unsigned NumElts = Elts.size();
439
440 // If we're in C mode, check that we don't have any decls after stmts. If
441 // so, emit an extension diagnostic in C89 and potentially a warning in later
442 // versions.
443 const unsigned MixedDeclsCodeID = getLangOpts().C99
444 ? diag::warn_mixed_decls_code
445 : diag::ext_mixed_decls_code;
446 if (!getLangOpts().CPlusPlus && !Diags.isIgnored(MixedDeclsCodeID, L)) {
447 // Note that __extension__ can be around a decl.
448 unsigned i = 0;
449 // Skip over all declarations.
450 for (; i != NumElts && isa<DeclStmt>(Elts[i]); ++i)
451 /*empty*/;
452
453 // We found the end of the list or a statement. Scan for another declstmt.
454 for (; i != NumElts && !isa<DeclStmt>(Elts[i]); ++i)
455 /*empty*/;
456
457 if (i != NumElts) {
458 Decl *D = *cast<DeclStmt>(Elts[i])->decl_begin();
459 Diag(D->getLocation(), MixedDeclsCodeID);
460 }
461 }
462
463 // Check for suspicious empty body (null statement) in `for' and `while'
464 // statements. Don't do anything for template instantiations, this just adds
465 // noise.
466 if (NumElts != 0 && !CurrentInstantiationScope &&
467 getCurCompoundScope().HasEmptyLoopBodies) {
468 for (unsigned i = 0; i != NumElts - 1; ++i)
469 DiagnoseEmptyLoopBody(Elts[i], Elts[i + 1]);
470 }
471
472 // Calculate difference between FP options in this compound statement and in
473 // the enclosing one. If this is a function body, take the difference against
474 // default options. In this case the difference will indicate options that are
475 // changed upon entry to the statement.
476 FPOptions FPO = (getCurFunction()->CompoundScopes.size() == 1)
480
481 return CompoundStmt::Create(Context, Elts, FPDiff, L, R);
482}
483
486 if (!Val.get())
487 return Val;
488
490 return ExprError();
491
492 // If we're not inside a switch, let the 'case' statement handling diagnose
493 // this. Just clean up after the expression as best we can.
494 if (getCurFunction()->SwitchStack.empty())
495 return ActOnFinishFullExpr(Val.get(), Val.get()->getExprLoc(), false,
497
498 Expr *CondExpr =
499 getCurFunction()->SwitchStack.back().getPointer()->getCond();
500 if (!CondExpr)
501 return ExprError();
502 QualType CondType = CondExpr->getType();
503
504 auto CheckAndFinish = [&](Expr *E) {
505 if (CondType->isDependentType() || E->isTypeDependent())
506 return ExprResult(E);
507
508 if (getLangOpts().CPlusPlus11) {
509 // C++11 [stmt.switch]p2: the constant-expression shall be a converted
510 // constant expression of the promoted type of the switch condition.
511 llvm::APSInt TempVal;
512 return CheckConvertedConstantExpression(E, CondType, TempVal,
514 }
515
516 ExprResult ER = E;
517 if (!E->isValueDependent())
519 if (!ER.isInvalid())
520 ER = DefaultLvalueConversion(ER.get());
521 if (!ER.isInvalid())
522 ER = ImpCastExprToType(ER.get(), CondType, CK_IntegralCast);
523 if (!ER.isInvalid())
524 ER = ActOnFinishFullExpr(ER.get(), ER.get()->getExprLoc(), false);
525 return ER;
526 };
527
528 return CheckAndFinish(Val.get());
529}
530
533 SourceLocation DotDotDotLoc, ExprResult RHSVal,
534 SourceLocation ColonLoc) {
535 assert((LHSVal.isInvalid() || LHSVal.get()) && "missing LHS value");
536 assert((DotDotDotLoc.isInvalid() ? RHSVal.isUnset()
537 : RHSVal.isInvalid() || RHSVal.get()) &&
538 "missing RHS value");
539
540 if (getCurFunction()->SwitchStack.empty()) {
541 Diag(CaseLoc, diag::err_case_not_in_switch);
542 return StmtError();
543 }
544
545 if (LHSVal.isInvalid() || RHSVal.isInvalid()) {
546 getCurFunction()->SwitchStack.back().setInt(true);
547 return StmtError();
548 }
549
550 if (LangOpts.OpenACC &&
551 getCurScope()->isInOpenACCComputeConstructScope(Scope::SwitchScope)) {
552 Diag(CaseLoc, diag::err_acc_branch_in_out_compute_construct)
553 << /*branch*/ 0 << /*into*/ 1;
554 return StmtError();
555 }
556
557 auto *CS = CaseStmt::Create(Context, LHSVal.get(), RHSVal.get(),
558 CaseLoc, DotDotDotLoc, ColonLoc);
559 getCurFunction()->SwitchStack.back().getPointer()->addSwitchCase(CS);
560 return CS;
561}
562
564 cast<CaseStmt>(S)->setSubStmt(SubStmt);
565}
566
569 Stmt *SubStmt, Scope *CurScope) {
570 if (getCurFunction()->SwitchStack.empty()) {
571 Diag(DefaultLoc, diag::err_default_not_in_switch);
572 return SubStmt;
573 }
574
575 if (LangOpts.OpenACC &&
576 getCurScope()->isInOpenACCComputeConstructScope(Scope::SwitchScope)) {
577 Diag(DefaultLoc, diag::err_acc_branch_in_out_compute_construct)
578 << /*branch*/ 0 << /*into*/ 1;
579 return StmtError();
580 }
581
582 DefaultStmt *DS = new (Context) DefaultStmt(DefaultLoc, ColonLoc, SubStmt);
583 getCurFunction()->SwitchStack.back().getPointer()->addSwitchCase(DS);
584 return DS;
585}
586
589 SourceLocation ColonLoc, Stmt *SubStmt) {
590 // If the label was multiply defined, reject it now.
591 if (TheDecl->getStmt()) {
592 Diag(IdentLoc, diag::err_redefinition_of_label) << TheDecl->getDeclName();
593 Diag(TheDecl->getLocation(), diag::note_previous_definition);
594 return SubStmt;
595 }
596
598 if (isReservedInAllContexts(Status) &&
600 Diag(IdentLoc, diag::warn_reserved_extern_symbol)
601 << TheDecl << static_cast<int>(Status);
602
603 // If this label is in a compute construct scope, we need to make sure we
604 // check gotos in/out.
605 if (getCurScope()->isInOpenACCComputeConstructScope())
607
608 // OpenACC3.3 2.14.4:
609 // The update directive is executable. It must not appear in place of the
610 // statement following an 'if', 'while', 'do', 'switch', or 'label' in C or
611 // C++.
612 if (isa<OpenACCUpdateConstruct>(SubStmt)) {
613 Diag(SubStmt->getBeginLoc(), diag::err_acc_update_as_body) << /*Label*/ 4;
614 SubStmt = new (Context) NullStmt(SubStmt->getBeginLoc());
615 }
616
617 // Otherwise, things are good. Fill in the declaration and return it.
618 LabelStmt *LS = new (Context) LabelStmt(IdentLoc, TheDecl, SubStmt);
619 TheDecl->setStmt(LS);
620 if (!TheDecl->isGnuLocal()) {
621 TheDecl->setLocStart(IdentLoc);
622 if (!TheDecl->isMSAsmLabel()) {
623 // Don't update the location of MS ASM labels. These will result in
624 // a diagnostic, and changing the location here will mess that up.
625 TheDecl->setLocation(IdentLoc);
626 }
627 }
628 return LS;
629}
630
633 Stmt *SubStmt) {
634 // FIXME: this code should move when a planned refactoring around statement
635 // attributes lands.
636 for (const auto *A : Attrs) {
637 if (A->getKind() == attr::MustTail) {
638 if (!checkAndRewriteMustTailAttr(SubStmt, *A)) {
639 return SubStmt;
640 }
642 }
643 }
644
645 return AttributedStmt::Create(Context, AttrsLoc, Attrs, SubStmt);
646}
647
649 Stmt *SubStmt) {
650 SmallVector<const Attr *, 1> SemanticAttrs;
651 ProcessStmtAttributes(SubStmt, Attrs, SemanticAttrs);
652 if (!SemanticAttrs.empty())
653 return BuildAttributedStmt(Attrs.Range.getBegin(), SemanticAttrs, SubStmt);
654 // If none of the attributes applied, that's fine, we can recover by
655 // returning the substatement directly instead of making an AttributedStmt
656 // with no attributes on it.
657 return SubStmt;
658}
659
661 ReturnStmt *R = cast<ReturnStmt>(St);
662 Expr *E = R->getRetValue();
663
665 // We have to suspend our check until template instantiation time.
666 return true;
667
668 if (!checkMustTailAttr(St, MTA))
669 return false;
670
671 // FIXME: Replace Expr::IgnoreImplicitAsWritten() with this function.
672 // Currently it does not skip implicit constructors in an initialization
673 // context.
674 auto IgnoreImplicitAsWritten = [](Expr *E) -> Expr * {
677 };
678
679 // Now that we have verified that 'musttail' is valid here, rewrite the
680 // return value to remove all implicit nodes, but retain parentheses.
681 R->setRetValue(IgnoreImplicitAsWritten(E));
682 return true;
683}
684
685bool Sema::checkMustTailAttr(const Stmt *St, const Attr &MTA) {
686 assert(!CurContext->isDependentContext() &&
687 "musttail cannot be checked from a dependent context");
688
689 // FIXME: Add Expr::IgnoreParenImplicitAsWritten() with this definition.
690 auto IgnoreParenImplicitAsWritten = [](const Expr *E) -> const Expr * {
691 return IgnoreExprNodes(const_cast<Expr *>(E), IgnoreParensSingleStep,
694 };
695
696 const Expr *E = cast<ReturnStmt>(St)->getRetValue();
697 const auto *CE = dyn_cast_or_null<CallExpr>(IgnoreParenImplicitAsWritten(E));
698
699 if (!CE) {
700 Diag(St->getBeginLoc(), diag::err_musttail_needs_call) << &MTA;
701 return false;
702 }
703
704 if (const FunctionDecl *CalleeDecl = CE->getDirectCallee();
705 CalleeDecl && CalleeDecl->hasAttr<NotTailCalledAttr>()) {
706 Diag(St->getBeginLoc(), diag::err_musttail_mismatch) << /*show-function-callee=*/true << CalleeDecl;
707 Diag(CalleeDecl->getLocation(), diag::note_musttail_disabled_by_not_tail_called);
708 return false;
709 }
710
711 if (const auto *EWC = dyn_cast<ExprWithCleanups>(E)) {
712 if (EWC->cleanupsHaveSideEffects()) {
713 Diag(St->getBeginLoc(), diag::err_musttail_needs_trivial_args) << &MTA;
714 return false;
715 }
716 }
717
718 // We need to determine the full function type (including "this" type, if any)
719 // for both caller and callee.
720 struct FuncType {
721 enum {
722 ft_non_member,
723 ft_static_member,
724 ft_non_static_member,
725 ft_pointer_to_member,
726 } MemberType = ft_non_member;
727
729 const FunctionProtoType *Func;
730 const CXXMethodDecl *Method = nullptr;
731 } CallerType, CalleeType;
732
733 auto GetMethodType = [this, St, MTA](const CXXMethodDecl *CMD, FuncType &Type,
734 bool IsCallee) -> bool {
735 if (isa<CXXConstructorDecl, CXXDestructorDecl>(CMD)) {
736 Diag(St->getBeginLoc(), diag::err_musttail_structors_forbidden)
737 << IsCallee << isa<CXXDestructorDecl>(CMD);
738 if (IsCallee)
739 Diag(CMD->getBeginLoc(), diag::note_musttail_structors_forbidden)
740 << isa<CXXDestructorDecl>(CMD);
741 Diag(MTA.getLocation(), diag::note_tail_call_required) << &MTA;
742 return false;
743 }
744 if (CMD->isStatic())
745 Type.MemberType = FuncType::ft_static_member;
746 else {
747 Type.This = CMD->getFunctionObjectParameterType();
748 Type.MemberType = FuncType::ft_non_static_member;
749 }
750 Type.Func = CMD->getType()->castAs<FunctionProtoType>();
751 return true;
752 };
753
754 const auto *CallerDecl = dyn_cast<FunctionDecl>(CurContext);
755
756 // Find caller function signature.
757 if (!CallerDecl) {
758 int ContextType;
759 if (isa<BlockDecl>(CurContext))
760 ContextType = 0;
761 else if (isa<ObjCMethodDecl>(CurContext))
762 ContextType = 1;
763 else
764 ContextType = 2;
765 Diag(St->getBeginLoc(), diag::err_musttail_forbidden_from_this_context)
766 << &MTA << ContextType;
767 return false;
768 } else if (const auto *CMD = dyn_cast<CXXMethodDecl>(CurContext)) {
769 // Caller is a class/struct method.
770 if (!GetMethodType(CMD, CallerType, false))
771 return false;
772 } else {
773 // Caller is a non-method function.
774 CallerType.Func = CallerDecl->getType()->getAs<FunctionProtoType>();
775 }
776
777 const Expr *CalleeExpr = CE->getCallee()->IgnoreParens();
778 const auto *CalleeBinOp = dyn_cast<BinaryOperator>(CalleeExpr);
779 SourceLocation CalleeLoc = CE->getCalleeDecl()
780 ? CE->getCalleeDecl()->getBeginLoc()
781 : St->getBeginLoc();
782
783 // Find callee function signature.
784 if (const CXXMethodDecl *CMD =
785 dyn_cast_or_null<CXXMethodDecl>(CE->getCalleeDecl())) {
786 // Call is: obj.method(), obj->method(), functor(), etc.
787 if (!GetMethodType(CMD, CalleeType, true))
788 return false;
789 } else if (CalleeBinOp && CalleeBinOp->isPtrMemOp()) {
790 // Call is: obj->*method_ptr or obj.*method_ptr
791 const auto *MPT =
792 CalleeBinOp->getRHS()->getType()->castAs<MemberPointerType>();
793 CalleeType.This =
794 Context.getCanonicalTagType(MPT->getMostRecentCXXRecordDecl());
795 CalleeType.Func = MPT->getPointeeType()->castAs<FunctionProtoType>();
796 CalleeType.MemberType = FuncType::ft_pointer_to_member;
797 } else if (isa<CXXPseudoDestructorExpr>(CalleeExpr)) {
798 Diag(St->getBeginLoc(), diag::err_musttail_structors_forbidden)
799 << /* IsCallee = */ 1 << /* IsDestructor = */ 1;
800 Diag(MTA.getLocation(), diag::note_tail_call_required) << &MTA;
801 return false;
802 } else {
803 // Non-method function.
804 CalleeType.Func =
805 CalleeExpr->getType()->getPointeeType()->getAs<FunctionProtoType>();
806 }
807
808 // Both caller and callee must have a prototype (no K&R declarations).
809 if (!CalleeType.Func || !CallerType.Func) {
810 Diag(St->getBeginLoc(), diag::err_musttail_needs_prototype) << &MTA;
811 if (!CalleeType.Func && CE->getDirectCallee()) {
812 Diag(CE->getDirectCallee()->getBeginLoc(),
813 diag::note_musttail_fix_non_prototype);
814 }
815 if (!CallerType.Func)
816 Diag(CallerDecl->getBeginLoc(), diag::note_musttail_fix_non_prototype);
817 return false;
818 }
819
820 // Caller and callee must have matching calling conventions.
821 //
822 // Some calling conventions are physically capable of supporting tail calls
823 // even if the function types don't perfectly match. LLVM is currently too
824 // strict to allow this, but if LLVM added support for this in the future, we
825 // could exit early here and skip the remaining checks if the functions are
826 // using such a calling convention.
827 if (CallerType.Func->getCallConv() != CalleeType.Func->getCallConv()) {
828 if (const auto *ND = dyn_cast_or_null<NamedDecl>(CE->getCalleeDecl()))
829 Diag(St->getBeginLoc(), diag::err_musttail_callconv_mismatch)
830 << true << ND->getDeclName();
831 else
832 Diag(St->getBeginLoc(), diag::err_musttail_callconv_mismatch) << false;
833 Diag(CalleeLoc, diag::note_musttail_callconv_mismatch)
834 << FunctionType::getNameForCallConv(CallerType.Func->getCallConv())
835 << FunctionType::getNameForCallConv(CalleeType.Func->getCallConv());
836 Diag(MTA.getLocation(), diag::note_tail_call_required) << &MTA;
837 return false;
838 }
839
840 if (CalleeType.Func->isVariadic() || CallerType.Func->isVariadic()) {
841 Diag(St->getBeginLoc(), diag::err_musttail_no_variadic) << &MTA;
842 return false;
843 }
844
845 const auto *CalleeDecl = CE->getCalleeDecl();
846 if (CalleeDecl && CalleeDecl->hasAttr<CXX11NoReturnAttr>()) {
847 Diag(St->getBeginLoc(), diag::err_musttail_no_return) << &MTA;
848 return false;
849 }
850
851 // Caller and callee must match in whether they have a "this" parameter.
852 if (CallerType.This.isNull() != CalleeType.This.isNull()) {
853 if (const auto *ND = dyn_cast_or_null<NamedDecl>(CE->getCalleeDecl())) {
854 Diag(St->getBeginLoc(), diag::err_musttail_member_mismatch)
855 << CallerType.MemberType << CalleeType.MemberType << true
856 << ND->getDeclName();
857 Diag(CalleeLoc, diag::note_musttail_callee_defined_here)
858 << ND->getDeclName();
859 } else
860 Diag(St->getBeginLoc(), diag::err_musttail_member_mismatch)
861 << CallerType.MemberType << CalleeType.MemberType << false;
862 Diag(MTA.getLocation(), diag::note_tail_call_required) << &MTA;
863 return false;
864 }
865
866 auto CheckTypesMatch = [this](FuncType CallerType, FuncType CalleeType,
867 PartialDiagnostic &PD) -> bool {
868 enum {
873 };
874
875 auto DoTypesMatch = [this, &PD](QualType A, QualType B,
876 unsigned Select) -> bool {
877 if (!Context.hasSimilarType(A, B)) {
878 PD << Select << A.getUnqualifiedType() << B.getUnqualifiedType();
879 return false;
880 }
881 return true;
882 };
883
884 if (!CallerType.This.isNull() &&
885 !DoTypesMatch(CallerType.This, CalleeType.This, ft_different_class))
886 return false;
887
888 if (!DoTypesMatch(CallerType.Func->getReturnType(),
889 CalleeType.Func->getReturnType(), ft_return_type))
890 return false;
891
892 if (CallerType.Func->getNumParams() != CalleeType.Func->getNumParams()) {
893 PD << ft_parameter_arity << CallerType.Func->getNumParams()
894 << CalleeType.Func->getNumParams();
895 return false;
896 }
897
898 ArrayRef<QualType> CalleeParams = CalleeType.Func->getParamTypes();
899 ArrayRef<QualType> CallerParams = CallerType.Func->getParamTypes();
900 size_t N = CallerType.Func->getNumParams();
901 for (size_t I = 0; I < N; I++) {
902 if (!DoTypesMatch(CalleeParams[I], CallerParams[I],
904 PD << static_cast<int>(I) + 1;
905 return false;
906 }
907 }
908
909 return true;
910 };
911
912 PartialDiagnostic PD = PDiag(diag::note_musttail_mismatch);
913 if (!CheckTypesMatch(CallerType, CalleeType, PD)) {
914 if (const auto *ND = dyn_cast_or_null<NamedDecl>(CE->getCalleeDecl()))
915 Diag(St->getBeginLoc(), diag::err_musttail_mismatch)
916 << true << ND->getDeclName();
917 else
918 Diag(St->getBeginLoc(), diag::err_musttail_mismatch) << false;
919 Diag(CalleeLoc, PD);
920 Diag(MTA.getLocation(), diag::note_tail_call_required) << &MTA;
921 return false;
922 }
923
924 // The lifetimes of locals and incoming function parameters must end before
925 // the call, because we can't have a stack frame to store them, so diagnose
926 // any pointers or references to them passed into the musttail call.
927 for (auto ArgExpr : CE->arguments()) {
929 Context, ArgExpr->getType(), false);
930 checkExprLifetimeMustTailArg(*this, Entity, const_cast<Expr *>(ArgExpr));
931 }
932
933 return true;
934}
935
936namespace {
937class CommaVisitor : public EvaluatedExprVisitor<CommaVisitor> {
938 typedef EvaluatedExprVisitor<CommaVisitor> Inherited;
939 Sema &SemaRef;
940public:
941 CommaVisitor(Sema &SemaRef) : Inherited(SemaRef.Context), SemaRef(SemaRef) {}
942 void VisitBinaryOperator(BinaryOperator *E) {
943 if (E->getOpcode() == BO_Comma)
944 SemaRef.DiagnoseCommaOperator(E->getLHS(), E->getExprLoc());
946 }
947};
948}
949
951 IfStatementKind StatementKind,
952 SourceLocation LParenLoc, Stmt *InitStmt,
953 ConditionResult Cond, SourceLocation RParenLoc,
954 Stmt *thenStmt, SourceLocation ElseLoc,
955 Stmt *elseStmt) {
956 if (Cond.isInvalid())
957 return StmtError();
958
959 bool ConstevalOrNegatedConsteval =
960 StatementKind == IfStatementKind::ConstevalNonNegated ||
961 StatementKind == IfStatementKind::ConstevalNegated;
962
963 Expr *CondExpr = Cond.get().second;
964 assert((CondExpr || ConstevalOrNegatedConsteval) &&
965 "If statement: missing condition");
966 // Only call the CommaVisitor when not C89 due to differences in scope flags.
967 if (CondExpr && (getLangOpts().C99 || getLangOpts().CPlusPlus) &&
968 !Diags.isIgnored(diag::warn_comma_operator, CondExpr->getExprLoc()))
969 CommaVisitor(*this).Visit(CondExpr);
970
971 if (!ConstevalOrNegatedConsteval && !elseStmt)
972 DiagnoseEmptyStmtBody(RParenLoc, thenStmt, diag::warn_empty_if_body);
973
974 if (ConstevalOrNegatedConsteval ||
975 StatementKind == IfStatementKind::Constexpr) {
976 auto DiagnoseLikelihood = [&](const Stmt *S) {
977 if (const Attr *A = Stmt::getLikelihoodAttr(S)) {
978 Diags.Report(A->getLocation(),
979 diag::warn_attribute_has_no_effect_on_compile_time_if)
980 << A << ConstevalOrNegatedConsteval << A->getRange();
981 Diags.Report(IfLoc,
982 diag::note_attribute_has_no_effect_on_compile_time_if_here)
983 << ConstevalOrNegatedConsteval
984 << SourceRange(IfLoc, (ConstevalOrNegatedConsteval
985 ? thenStmt->getBeginLoc()
986 : LParenLoc)
987 .getLocWithOffset(-1));
988 }
989 };
990 DiagnoseLikelihood(thenStmt);
991 DiagnoseLikelihood(elseStmt);
992 } else {
993 std::tuple<bool, const Attr *, const Attr *> LHC =
994 Stmt::determineLikelihoodConflict(thenStmt, elseStmt);
995 if (std::get<0>(LHC)) {
996 const Attr *ThenAttr = std::get<1>(LHC);
997 const Attr *ElseAttr = std::get<2>(LHC);
998 Diags.Report(ThenAttr->getLocation(),
999 diag::warn_attributes_likelihood_ifstmt_conflict)
1000 << ThenAttr << ThenAttr->getRange();
1001 Diags.Report(ElseAttr->getLocation(), diag::note_conflicting_attribute)
1002 << ElseAttr << ElseAttr->getRange();
1003 }
1004 }
1005
1006 if (ConstevalOrNegatedConsteval) {
1007 bool Immediate = ExprEvalContexts.back().Context ==
1010 const auto *FD =
1011 dyn_cast<FunctionDecl>(Decl::castFromDeclContext(CurContext));
1012 if (FD && FD->isImmediateFunction())
1013 Immediate = true;
1014 }
1015 if (isUnevaluatedContext() || Immediate)
1016 Diags.Report(IfLoc, diag::warn_consteval_if_always_true) << Immediate;
1017 }
1018
1019 // OpenACC3.3 2.14.4:
1020 // The update directive is executable. It must not appear in place of the
1021 // statement following an 'if', 'while', 'do', 'switch', or 'label' in C or
1022 // C++.
1023 if (isa<OpenACCUpdateConstruct>(thenStmt)) {
1024 Diag(thenStmt->getBeginLoc(), diag::err_acc_update_as_body) << /*if*/ 0;
1025 thenStmt = new (Context) NullStmt(thenStmt->getBeginLoc());
1026 }
1027
1028 return BuildIfStmt(IfLoc, StatementKind, LParenLoc, InitStmt, Cond, RParenLoc,
1029 thenStmt, ElseLoc, elseStmt);
1030}
1031
1033 IfStatementKind StatementKind,
1034 SourceLocation LParenLoc, Stmt *InitStmt,
1035 ConditionResult Cond, SourceLocation RParenLoc,
1036 Stmt *thenStmt, SourceLocation ElseLoc,
1037 Stmt *elseStmt) {
1038 if (Cond.isInvalid())
1039 return StmtError();
1040
1041 if (StatementKind != IfStatementKind::Ordinary ||
1042 isa<ObjCAvailabilityCheckExpr>(Cond.get().second))
1044
1045 return IfStmt::Create(Context, IfLoc, StatementKind, InitStmt,
1046 Cond.get().first, Cond.get().second, LParenLoc,
1047 RParenLoc, thenStmt, ElseLoc, elseStmt);
1048}
1049
1050namespace {
1051 struct CaseCompareFunctor {
1052 bool operator()(const std::pair<llvm::APSInt, CaseStmt*> &LHS,
1053 const llvm::APSInt &RHS) {
1054 return LHS.first < RHS;
1055 }
1056 bool operator()(const std::pair<llvm::APSInt, CaseStmt*> &LHS,
1057 const std::pair<llvm::APSInt, CaseStmt*> &RHS) {
1058 return LHS.first < RHS.first;
1059 }
1060 bool operator()(const llvm::APSInt &LHS,
1061 const std::pair<llvm::APSInt, CaseStmt*> &RHS) {
1062 return LHS < RHS.first;
1063 }
1064 };
1065}
1066
1067/// CmpCaseVals - Comparison predicate for sorting case values.
1068///
1069static bool CmpCaseVals(const std::pair<llvm::APSInt, CaseStmt*>& lhs,
1070 const std::pair<llvm::APSInt, CaseStmt*>& rhs) {
1071 if (lhs.first < rhs.first)
1072 return true;
1073
1074 if (lhs.first == rhs.first &&
1075 lhs.second->getCaseLoc() < rhs.second->getCaseLoc())
1076 return true;
1077 return false;
1078}
1079
1080/// CmpEnumVals - Comparison predicate for sorting enumeration values.
1081///
1082static bool CmpEnumVals(const std::pair<llvm::APSInt, EnumConstantDecl*>& lhs,
1083 const std::pair<llvm::APSInt, EnumConstantDecl*>& rhs)
1084{
1085 return lhs.first < rhs.first;
1086}
1087
1088/// EqEnumVals - Comparison preficate for uniqing enumeration values.
1089///
1090static bool EqEnumVals(const std::pair<llvm::APSInt, EnumConstantDecl*>& lhs,
1091 const std::pair<llvm::APSInt, EnumConstantDecl*>& rhs)
1092{
1093 return lhs.first == rhs.first;
1094}
1095
1096/// GetTypeBeforeIntegralPromotion - Returns the pre-promotion type of
1097/// potentially integral-promoted expression @p expr.
1099 if (const auto *FE = dyn_cast<FullExpr>(E))
1100 E = FE->getSubExpr();
1101 while (const auto *ImpCast = dyn_cast<ImplicitCastExpr>(E)) {
1102 if (ImpCast->getCastKind() != CK_IntegralCast) break;
1103 E = ImpCast->getSubExpr();
1104 }
1105 return E->getType();
1106}
1107
1109 class SwitchConvertDiagnoser : public ICEConvertDiagnoser {
1110 Expr *Cond;
1111
1112 public:
1113 SwitchConvertDiagnoser(Expr *Cond)
1114 : ICEConvertDiagnoser(/*AllowScopedEnumerations*/true, false, true),
1115 Cond(Cond) {}
1116
1117 SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
1118 QualType T) override {
1119 return S.Diag(Loc, diag::err_typecheck_statement_requires_integer) << T;
1120 }
1121
1122 SemaDiagnosticBuilder diagnoseIncomplete(
1123 Sema &S, SourceLocation Loc, QualType T) override {
1124 return S.Diag(Loc, diag::err_switch_incomplete_class_type)
1125 << T << Cond->getSourceRange();
1126 }
1127
1128 SemaDiagnosticBuilder diagnoseExplicitConv(
1129 Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override {
1130 return S.Diag(Loc, diag::err_switch_explicit_conversion) << T << ConvTy;
1131 }
1132
1133 SemaDiagnosticBuilder noteExplicitConv(
1134 Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override {
1135 return S.Diag(Conv->getLocation(), diag::note_switch_conversion)
1136 << ConvTy->isEnumeralType() << ConvTy;
1137 }
1138
1139 SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc,
1140 QualType T) override {
1141 return S.Diag(Loc, diag::err_switch_multiple_conversions) << T;
1142 }
1143
1144 SemaDiagnosticBuilder noteAmbiguous(
1145 Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override {
1146 return S.Diag(Conv->getLocation(), diag::note_switch_conversion)
1147 << ConvTy->isEnumeralType() << ConvTy;
1148 }
1149
1150 SemaDiagnosticBuilder diagnoseConversion(
1151 Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override {
1152 llvm_unreachable("conversion functions are permitted");
1153 }
1154 } SwitchDiagnoser(Cond);
1155
1156 ExprResult CondResult =
1157 PerformContextualImplicitConversion(SwitchLoc, Cond, SwitchDiagnoser);
1158 if (CondResult.isInvalid())
1159 return ExprError();
1160
1161 // FIXME: PerformContextualImplicitConversion doesn't always tell us if it
1162 // failed and produced a diagnostic.
1163 Cond = CondResult.get();
1164 if (!Cond->isTypeDependent() &&
1166 return ExprError();
1167
1168 // C99 6.8.4.2p5 - Integer promotions are performed on the controlling expr.
1169 return UsualUnaryConversions(Cond);
1170}
1171
1173 SourceLocation LParenLoc,
1174 Stmt *InitStmt, ConditionResult Cond,
1175 SourceLocation RParenLoc) {
1176 Expr *CondExpr = Cond.get().second;
1177 assert((Cond.isInvalid() || CondExpr) && "switch with no condition");
1178
1179 if (CondExpr && !CondExpr->isTypeDependent()) {
1180 // We have already converted the expression to an integral or enumeration
1181 // type, when we parsed the switch condition. There are cases where we don't
1182 // have an appropriate type, e.g. a typo-expr Cond was corrected to an
1183 // inappropriate-type expr, we just return an error.
1184 if (!CondExpr->getType()->isIntegralOrEnumerationType())
1185 return StmtError();
1186 if (CondExpr->isKnownToHaveBooleanValue()) {
1187 // switch(bool_expr) {...} is often a programmer error, e.g.
1188 // switch(n && mask) { ... } // Doh - should be "n & mask".
1189 // One can always use an if statement instead of switch(bool_expr).
1190 Diag(SwitchLoc, diag::warn_bool_switch_condition)
1191 << CondExpr->getSourceRange();
1192 }
1193 }
1194
1196
1197 auto *SS = SwitchStmt::Create(Context, InitStmt, Cond.get().first, CondExpr,
1198 LParenLoc, RParenLoc);
1199 getCurFunction()->SwitchStack.push_back(
1201 return SS;
1202}
1203
1204static void AdjustAPSInt(llvm::APSInt &Val, unsigned BitWidth, bool IsSigned) {
1205 Val = Val.extOrTrunc(BitWidth);
1206 Val.setIsSigned(IsSigned);
1207}
1208
1209/// Check the specified case value is in range for the given unpromoted switch
1210/// type.
1211static void checkCaseValue(Sema &S, SourceLocation Loc, const llvm::APSInt &Val,
1212 unsigned UnpromotedWidth, bool UnpromotedSign) {
1213 // In C++11 onwards, this is checked by the language rules.
1214 if (S.getLangOpts().CPlusPlus11)
1215 return;
1216
1217 // If the case value was signed and negative and the switch expression is
1218 // unsigned, don't bother to warn: this is implementation-defined behavior.
1219 // FIXME: Introduce a second, default-ignored warning for this case?
1220 if (UnpromotedWidth < Val.getBitWidth()) {
1221 llvm::APSInt ConvVal(Val);
1222 AdjustAPSInt(ConvVal, UnpromotedWidth, UnpromotedSign);
1223 AdjustAPSInt(ConvVal, Val.getBitWidth(), Val.isSigned());
1224 // FIXME: Use different diagnostics for overflow in conversion to promoted
1225 // type versus "switch expression cannot have this value". Use proper
1226 // IntRange checking rather than just looking at the unpromoted type here.
1227 if (ConvVal != Val)
1228 S.Diag(Loc, diag::warn_case_value_overflow) << toString(Val, 10)
1229 << toString(ConvVal, 10);
1230 }
1231}
1232
1234
1235/// Returns true if we should emit a diagnostic about this case expression not
1236/// being a part of the enum used in the switch controlling expression.
1238 const EnumDecl *ED,
1239 const Expr *CaseExpr,
1240 EnumValsTy::iterator &EI,
1241 EnumValsTy::iterator &EIEnd,
1242 const llvm::APSInt &Val) {
1243 if (!ED->isClosed())
1244 return false;
1245
1246 if (const DeclRefExpr *DRE =
1247 dyn_cast<DeclRefExpr>(CaseExpr->IgnoreParenImpCasts())) {
1248 if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) {
1249 QualType VarType = VD->getType();
1251 if (VD->hasGlobalStorage() && VarType.isConstQualified() &&
1253 return false;
1254 }
1255 }
1256
1257 if (ED->hasAttr<FlagEnumAttr>())
1258 return !S.IsValueInFlagEnum(ED, Val, false);
1259
1260 while (EI != EIEnd && EI->first < Val)
1261 EI++;
1262
1263 if (EI != EIEnd && EI->first == Val)
1264 return false;
1265
1266 return true;
1267}
1268
1269static void checkEnumTypesInSwitchStmt(Sema &S, const Expr *Cond,
1270 const Expr *Case) {
1271 QualType CondType = Cond->getType();
1272 QualType CaseType = Case->getType();
1273
1274 const EnumType *CondEnumType = CondType->getAsCanonical<EnumType>();
1275 const EnumType *CaseEnumType = CaseType->getAsCanonical<EnumType>();
1276 if (!CondEnumType || !CaseEnumType)
1277 return;
1278
1279 // Ignore anonymous enums.
1280 if (!CondEnumType->getOriginalDecl()->getIdentifier() &&
1281 !CondEnumType->getOriginalDecl()->getTypedefNameForAnonDecl())
1282 return;
1283 if (!CaseEnumType->getOriginalDecl()->getIdentifier() &&
1284 !CaseEnumType->getOriginalDecl()->getTypedefNameForAnonDecl())
1285 return;
1286
1287 if (S.Context.hasSameUnqualifiedType(CondType, CaseType))
1288 return;
1289
1290 S.Diag(Case->getExprLoc(), diag::warn_comparison_of_mixed_enum_types_switch)
1291 << CondType << CaseType << Cond->getSourceRange()
1292 << Case->getSourceRange();
1293}
1294
1297 Stmt *BodyStmt) {
1298 SwitchStmt *SS = cast<SwitchStmt>(Switch);
1299 bool CaseListIsIncomplete = getCurFunction()->SwitchStack.back().getInt();
1300 assert(SS == getCurFunction()->SwitchStack.back().getPointer() &&
1301 "switch stack missing push/pop!");
1302
1303 getCurFunction()->SwitchStack.pop_back();
1304
1305 if (!BodyStmt) return StmtError();
1306
1307 // OpenACC3.3 2.14.4:
1308 // The update directive is executable. It must not appear in place of the
1309 // statement following an 'if', 'while', 'do', 'switch', or 'label' in C or
1310 // C++.
1311 if (isa<OpenACCUpdateConstruct>(BodyStmt)) {
1312 Diag(BodyStmt->getBeginLoc(), diag::err_acc_update_as_body) << /*switch*/ 3;
1313 BodyStmt = new (Context) NullStmt(BodyStmt->getBeginLoc());
1314 }
1315
1316 SS->setBody(BodyStmt, SwitchLoc);
1317
1318 Expr *CondExpr = SS->getCond();
1319 if (!CondExpr) return StmtError();
1320
1321 QualType CondType = CondExpr->getType();
1322
1323 // C++ 6.4.2.p2:
1324 // Integral promotions are performed (on the switch condition).
1325 //
1326 // A case value unrepresentable by the original switch condition
1327 // type (before the promotion) doesn't make sense, even when it can
1328 // be represented by the promoted type. Therefore we need to find
1329 // the pre-promotion type of the switch condition.
1330 const Expr *CondExprBeforePromotion = CondExpr;
1331 QualType CondTypeBeforePromotion =
1332 GetTypeBeforeIntegralPromotion(CondExprBeforePromotion);
1333
1334 // Get the bitwidth of the switched-on value after promotions. We must
1335 // convert the integer case values to this width before comparison.
1336 bool HasDependentValue
1337 = CondExpr->isTypeDependent() || CondExpr->isValueDependent();
1338 unsigned CondWidth = HasDependentValue ? 0 : Context.getIntWidth(CondType);
1339 bool CondIsSigned = CondType->isSignedIntegerOrEnumerationType();
1340
1341 // Get the width and signedness that the condition might actually have, for
1342 // warning purposes.
1343 // FIXME: Grab an IntRange for the condition rather than using the unpromoted
1344 // type.
1345 unsigned CondWidthBeforePromotion
1346 = HasDependentValue ? 0 : Context.getIntWidth(CondTypeBeforePromotion);
1347 bool CondIsSignedBeforePromotion
1348 = CondTypeBeforePromotion->isSignedIntegerOrEnumerationType();
1349
1350 // Accumulate all of the case values in a vector so that we can sort them
1351 // and detect duplicates. This vector contains the APInt for the case after
1352 // it has been converted to the condition type.
1353 typedef SmallVector<std::pair<llvm::APSInt, CaseStmt*>, 64> CaseValsTy;
1354 CaseValsTy CaseVals;
1355
1356 // Keep track of any GNU case ranges we see. The APSInt is the low value.
1357 typedef std::vector<std::pair<llvm::APSInt, CaseStmt*> > CaseRangesTy;
1358 CaseRangesTy CaseRanges;
1359
1360 DefaultStmt *TheDefaultStmt = nullptr;
1361
1362 bool CaseListIsErroneous = false;
1363
1364 // FIXME: We'd better diagnose missing or duplicate default labels even
1365 // in the dependent case. Because default labels themselves are never
1366 // dependent.
1367 for (SwitchCase *SC = SS->getSwitchCaseList(); SC && !HasDependentValue;
1368 SC = SC->getNextSwitchCase()) {
1369
1370 if (DefaultStmt *DS = dyn_cast<DefaultStmt>(SC)) {
1371 if (TheDefaultStmt) {
1372 Diag(DS->getDefaultLoc(), diag::err_multiple_default_labels_defined);
1373 Diag(TheDefaultStmt->getDefaultLoc(), diag::note_duplicate_case_prev);
1374
1375 // FIXME: Remove the default statement from the switch block so that
1376 // we'll return a valid AST. This requires recursing down the AST and
1377 // finding it, not something we are set up to do right now. For now,
1378 // just lop the entire switch stmt out of the AST.
1379 CaseListIsErroneous = true;
1380 }
1381 TheDefaultStmt = DS;
1382
1383 } else {
1384 CaseStmt *CS = cast<CaseStmt>(SC);
1385
1386 Expr *Lo = CS->getLHS();
1387
1388 if (Lo->isValueDependent()) {
1389 HasDependentValue = true;
1390 break;
1391 }
1392
1393 // We already verified that the expression has a constant value;
1394 // get that value (prior to conversions).
1395 const Expr *LoBeforePromotion = Lo;
1396 GetTypeBeforeIntegralPromotion(LoBeforePromotion);
1397 llvm::APSInt LoVal = LoBeforePromotion->EvaluateKnownConstInt(Context);
1398
1399 // Check the unconverted value is within the range of possible values of
1400 // the switch expression.
1401 checkCaseValue(*this, Lo->getBeginLoc(), LoVal, CondWidthBeforePromotion,
1402 CondIsSignedBeforePromotion);
1403
1404 // FIXME: This duplicates the check performed for warn_not_in_enum below.
1405 checkEnumTypesInSwitchStmt(*this, CondExprBeforePromotion,
1406 LoBeforePromotion);
1407
1408 // Convert the value to the same width/sign as the condition.
1409 AdjustAPSInt(LoVal, CondWidth, CondIsSigned);
1410
1411 // If this is a case range, remember it in CaseRanges, otherwise CaseVals.
1412 if (CS->getRHS()) {
1413 if (CS->getRHS()->isValueDependent()) {
1414 HasDependentValue = true;
1415 break;
1416 }
1417 CaseRanges.push_back(std::make_pair(LoVal, CS));
1418 } else
1419 CaseVals.push_back(std::make_pair(LoVal, CS));
1420 }
1421 }
1422
1423 if (!HasDependentValue) {
1424 // If we don't have a default statement, check whether the
1425 // condition is constant.
1426 llvm::APSInt ConstantCondValue;
1427 bool HasConstantCond = false;
1428 if (!TheDefaultStmt) {
1430 HasConstantCond = CondExpr->EvaluateAsInt(Result, Context,
1432 if (Result.Val.isInt())
1433 ConstantCondValue = Result.Val.getInt();
1434 assert(!HasConstantCond ||
1435 (ConstantCondValue.getBitWidth() == CondWidth &&
1436 ConstantCondValue.isSigned() == CondIsSigned));
1437 Diag(SwitchLoc, diag::warn_switch_default);
1438 }
1439 bool ShouldCheckConstantCond = HasConstantCond;
1440
1441 // Sort all the scalar case values so we can easily detect duplicates.
1442 llvm::stable_sort(CaseVals, CmpCaseVals);
1443
1444 if (!CaseVals.empty()) {
1445 for (unsigned i = 0, e = CaseVals.size(); i != e; ++i) {
1446 if (ShouldCheckConstantCond &&
1447 CaseVals[i].first == ConstantCondValue)
1448 ShouldCheckConstantCond = false;
1449
1450 if (i != 0 && CaseVals[i].first == CaseVals[i-1].first) {
1451 // If we have a duplicate, report it.
1452 // First, determine if either case value has a name
1453 StringRef PrevString, CurrString;
1454 Expr *PrevCase = CaseVals[i-1].second->getLHS()->IgnoreParenCasts();
1455 Expr *CurrCase = CaseVals[i].second->getLHS()->IgnoreParenCasts();
1456 if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(PrevCase)) {
1457 PrevString = DeclRef->getDecl()->getName();
1458 }
1459 if (DeclRefExpr *DeclRef = dyn_cast<DeclRefExpr>(CurrCase)) {
1460 CurrString = DeclRef->getDecl()->getName();
1461 }
1462 SmallString<16> CaseValStr;
1463 CaseVals[i-1].first.toString(CaseValStr);
1464
1465 if (PrevString == CurrString)
1466 Diag(CaseVals[i].second->getLHS()->getBeginLoc(),
1467 diag::err_duplicate_case)
1468 << (PrevString.empty() ? CaseValStr.str() : PrevString);
1469 else
1470 Diag(CaseVals[i].second->getLHS()->getBeginLoc(),
1471 diag::err_duplicate_case_differing_expr)
1472 << (PrevString.empty() ? CaseValStr.str() : PrevString)
1473 << (CurrString.empty() ? CaseValStr.str() : CurrString)
1474 << CaseValStr;
1475
1476 Diag(CaseVals[i - 1].second->getLHS()->getBeginLoc(),
1477 diag::note_duplicate_case_prev);
1478 // FIXME: We really want to remove the bogus case stmt from the
1479 // substmt, but we have no way to do this right now.
1480 CaseListIsErroneous = true;
1481 }
1482 }
1483 }
1484
1485 // Detect duplicate case ranges, which usually don't exist at all in
1486 // the first place.
1487 if (!CaseRanges.empty()) {
1488 // Sort all the case ranges by their low value so we can easily detect
1489 // overlaps between ranges.
1490 llvm::stable_sort(CaseRanges);
1491
1492 // Scan the ranges, computing the high values and removing empty ranges.
1493 std::vector<llvm::APSInt> HiVals;
1494 for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {
1495 llvm::APSInt &LoVal = CaseRanges[i].first;
1496 CaseStmt *CR = CaseRanges[i].second;
1497 Expr *Hi = CR->getRHS();
1498
1499 const Expr *HiBeforePromotion = Hi;
1500 GetTypeBeforeIntegralPromotion(HiBeforePromotion);
1501 llvm::APSInt HiVal = HiBeforePromotion->EvaluateKnownConstInt(Context);
1502
1503 // Check the unconverted value is within the range of possible values of
1504 // the switch expression.
1505 checkCaseValue(*this, Hi->getBeginLoc(), HiVal,
1506 CondWidthBeforePromotion, CondIsSignedBeforePromotion);
1507
1508 // Convert the value to the same width/sign as the condition.
1509 AdjustAPSInt(HiVal, CondWidth, CondIsSigned);
1510
1511 // If the low value is bigger than the high value, the case is empty.
1512 if (LoVal > HiVal) {
1513 Diag(CR->getLHS()->getBeginLoc(), diag::warn_case_empty_range)
1514 << SourceRange(CR->getLHS()->getBeginLoc(), Hi->getEndLoc());
1515 CaseRanges.erase(CaseRanges.begin()+i);
1516 --i;
1517 --e;
1518 continue;
1519 }
1520
1521 if (ShouldCheckConstantCond &&
1522 LoVal <= ConstantCondValue &&
1523 ConstantCondValue <= HiVal)
1524 ShouldCheckConstantCond = false;
1525
1526 HiVals.push_back(HiVal);
1527 }
1528
1529 // Rescan the ranges, looking for overlap with singleton values and other
1530 // ranges. Since the range list is sorted, we only need to compare case
1531 // ranges with their neighbors.
1532 for (unsigned i = 0, e = CaseRanges.size(); i != e; ++i) {
1533 llvm::APSInt &CRLo = CaseRanges[i].first;
1534 llvm::APSInt &CRHi = HiVals[i];
1535 CaseStmt *CR = CaseRanges[i].second;
1536
1537 // Check to see whether the case range overlaps with any
1538 // singleton cases.
1539 CaseStmt *OverlapStmt = nullptr;
1540 llvm::APSInt OverlapVal(32);
1541
1542 // Find the smallest value >= the lower bound. If I is in the
1543 // case range, then we have overlap.
1544 CaseValsTy::iterator I =
1545 llvm::lower_bound(CaseVals, CRLo, CaseCompareFunctor());
1546 if (I != CaseVals.end() && I->first < CRHi) {
1547 OverlapVal = I->first; // Found overlap with scalar.
1548 OverlapStmt = I->second;
1549 }
1550
1551 // Find the smallest value bigger than the upper bound.
1552 I = std::upper_bound(I, CaseVals.end(), CRHi, CaseCompareFunctor());
1553 if (I != CaseVals.begin() && (I-1)->first >= CRLo) {
1554 OverlapVal = (I-1)->first; // Found overlap with scalar.
1555 OverlapStmt = (I-1)->second;
1556 }
1557
1558 // Check to see if this case stmt overlaps with the subsequent
1559 // case range.
1560 if (i && CRLo <= HiVals[i-1]) {
1561 OverlapVal = HiVals[i-1]; // Found overlap with range.
1562 OverlapStmt = CaseRanges[i-1].second;
1563 }
1564
1565 if (OverlapStmt) {
1566 // If we have a duplicate, report it.
1567 Diag(CR->getLHS()->getBeginLoc(), diag::err_duplicate_case)
1568 << toString(OverlapVal, 10);
1569 Diag(OverlapStmt->getLHS()->getBeginLoc(),
1570 diag::note_duplicate_case_prev);
1571 // FIXME: We really want to remove the bogus case stmt from the
1572 // substmt, but we have no way to do this right now.
1573 CaseListIsErroneous = true;
1574 }
1575 }
1576 }
1577
1578 // Complain if we have a constant condition and we didn't find a match.
1579 if (!CaseListIsErroneous && !CaseListIsIncomplete &&
1580 ShouldCheckConstantCond) {
1581 // TODO: it would be nice if we printed enums as enums, chars as
1582 // chars, etc.
1583 Diag(CondExpr->getExprLoc(), diag::warn_missing_case_for_condition)
1584 << toString(ConstantCondValue, 10)
1585 << CondExpr->getSourceRange();
1586 }
1587
1588 // Check to see if switch is over an Enum and handles all of its
1589 // values. We only issue a warning if there is not 'default:', but
1590 // we still do the analysis to preserve this information in the AST
1591 // (which can be used by flow-based analyes).
1592 //
1593 // If switch has default case, then ignore it.
1594 if (!CaseListIsErroneous && !CaseListIsIncomplete && !HasConstantCond &&
1595 CondTypeBeforePromotion->isEnumeralType()) {
1596 const auto *ED = CondTypeBeforePromotion->castAsEnumDecl();
1597 if (!ED->isCompleteDefinition() || ED->enumerators().empty())
1598 goto enum_out;
1599
1600 EnumValsTy EnumVals;
1601
1602 // Gather all enum values, set their type and sort them,
1603 // allowing easier comparison with CaseVals.
1604 for (auto *EDI : ED->enumerators()) {
1605 llvm::APSInt Val = EDI->getInitVal();
1606 AdjustAPSInt(Val, CondWidth, CondIsSigned);
1607 EnumVals.push_back(std::make_pair(Val, EDI));
1608 }
1609 llvm::stable_sort(EnumVals, CmpEnumVals);
1610 auto EI = EnumVals.begin(), EIEnd = llvm::unique(EnumVals, EqEnumVals);
1611
1612 // See which case values aren't in enum.
1613 for (CaseValsTy::const_iterator CI = CaseVals.begin();
1614 CI != CaseVals.end(); CI++) {
1615 Expr *CaseExpr = CI->second->getLHS();
1616 if (ShouldDiagnoseSwitchCaseNotInEnum(*this, ED, CaseExpr, EI, EIEnd,
1617 CI->first))
1618 Diag(CaseExpr->getExprLoc(), diag::warn_not_in_enum)
1619 << CondTypeBeforePromotion;
1620 }
1621
1622 // See which of case ranges aren't in enum
1623 EI = EnumVals.begin();
1624 for (CaseRangesTy::const_iterator RI = CaseRanges.begin();
1625 RI != CaseRanges.end(); RI++) {
1626 Expr *CaseExpr = RI->second->getLHS();
1627 if (ShouldDiagnoseSwitchCaseNotInEnum(*this, ED, CaseExpr, EI, EIEnd,
1628 RI->first))
1629 Diag(CaseExpr->getExprLoc(), diag::warn_not_in_enum)
1630 << CondTypeBeforePromotion;
1631
1632 llvm::APSInt Hi =
1633 RI->second->getRHS()->EvaluateKnownConstInt(Context);
1634 AdjustAPSInt(Hi, CondWidth, CondIsSigned);
1635
1636 CaseExpr = RI->second->getRHS();
1637 if (ShouldDiagnoseSwitchCaseNotInEnum(*this, ED, CaseExpr, EI, EIEnd,
1638 Hi))
1639 Diag(CaseExpr->getExprLoc(), diag::warn_not_in_enum)
1640 << CondTypeBeforePromotion;
1641 }
1642
1643 // Check which enum vals aren't in switch
1644 auto CI = CaseVals.begin();
1645 auto RI = CaseRanges.begin();
1646 bool hasCasesNotInSwitch = false;
1647
1648 SmallVector<DeclarationName,8> UnhandledNames;
1649
1650 for (EI = EnumVals.begin(); EI != EIEnd; EI++) {
1651 // Don't warn about omitted unavailable EnumConstantDecls.
1652 switch (EI->second->getAvailability()) {
1653 case AR_Deprecated:
1654 // Deprecated enumerators need to be handled: they may be deprecated,
1655 // but can still occur.
1656 break;
1657
1658 case AR_Unavailable:
1659 // Omitting an unavailable enumerator is ok; it should never occur.
1660 continue;
1661
1663 // Partially available enum constants should be present. Note that we
1664 // suppress -Wunguarded-availability diagnostics for such uses.
1665 case AR_Available:
1666 break;
1667 }
1668
1669 if (EI->second->hasAttr<UnusedAttr>())
1670 continue;
1671
1672 // Drop unneeded case values
1673 while (CI != CaseVals.end() && CI->first < EI->first)
1674 CI++;
1675
1676 if (CI != CaseVals.end() && CI->first == EI->first)
1677 continue;
1678
1679 // Drop unneeded case ranges
1680 for (; RI != CaseRanges.end(); RI++) {
1681 llvm::APSInt Hi =
1682 RI->second->getRHS()->EvaluateKnownConstInt(Context);
1683 AdjustAPSInt(Hi, CondWidth, CondIsSigned);
1684 if (EI->first <= Hi)
1685 break;
1686 }
1687
1688 if (RI == CaseRanges.end() || EI->first < RI->first) {
1689 hasCasesNotInSwitch = true;
1690 UnhandledNames.push_back(EI->second->getDeclName());
1691 }
1692 }
1693
1694 if (TheDefaultStmt && UnhandledNames.empty() && ED->isClosedNonFlag())
1695 Diag(TheDefaultStmt->getDefaultLoc(), diag::warn_unreachable_default);
1696
1697 // Produce a nice diagnostic if multiple values aren't handled.
1698 if (!UnhandledNames.empty()) {
1699 auto DB = Diag(CondExpr->getExprLoc(), TheDefaultStmt
1700 ? diag::warn_def_missing_case
1701 : diag::warn_missing_case)
1702 << CondExpr->getSourceRange() << (int)UnhandledNames.size();
1703
1704 for (size_t I = 0, E = std::min(UnhandledNames.size(), (size_t)3);
1705 I != E; ++I)
1706 DB << UnhandledNames[I];
1707 }
1708
1709 if (!hasCasesNotInSwitch)
1711 }
1712 enum_out:;
1713 }
1714
1715 if (BodyStmt)
1716 DiagnoseEmptyStmtBody(CondExpr->getEndLoc(), BodyStmt,
1717 diag::warn_empty_switch_body);
1718
1719 // FIXME: If the case list was broken is some way, we don't have a good system
1720 // to patch it up. Instead, just return the whole substmt as broken.
1721 if (CaseListIsErroneous)
1722 return StmtError();
1723
1724 return SS;
1725}
1726
1727void
1729 Expr *SrcExpr) {
1730
1731 if (!DstType->isEnumeralType())
1732 return;
1733
1734 if (!SrcType->isIntegerType() ||
1735 Context.hasSameUnqualifiedType(SrcType, DstType))
1736 return;
1737
1738 if (SrcExpr->isTypeDependent() || SrcExpr->isValueDependent())
1739 return;
1740
1741 const auto *ED = DstType->castAsEnumDecl();
1742 if (!ED->isClosed())
1743 return;
1744
1745 if (Diags.isIgnored(diag::warn_not_in_enum_assignment, SrcExpr->getExprLoc()))
1746 return;
1747
1748 std::optional<llvm::APSInt> RHSVal = SrcExpr->getIntegerConstantExpr(Context);
1749 if (!RHSVal)
1750 return;
1751
1752 // Get the bitwidth of the enum value before promotions.
1753 unsigned DstWidth = Context.getIntWidth(DstType);
1754 bool DstIsSigned = DstType->isSignedIntegerOrEnumerationType();
1755 AdjustAPSInt(*RHSVal, DstWidth, DstIsSigned);
1756
1757 if (ED->hasAttr<FlagEnumAttr>()) {
1758 if (!IsValueInFlagEnum(ED, *RHSVal, /*AllowMask=*/true))
1759 Diag(SrcExpr->getExprLoc(), diag::warn_not_in_enum_assignment)
1760 << DstType.getUnqualifiedType();
1761 return;
1762 }
1763
1765 EnumValsTy;
1766 EnumValsTy EnumVals;
1767
1768 // Gather all enum values, set their type and sort them,
1769 // allowing easier comparison with rhs constant.
1770 for (auto *EDI : ED->enumerators()) {
1771 llvm::APSInt Val = EDI->getInitVal();
1772 AdjustAPSInt(Val, DstWidth, DstIsSigned);
1773 EnumVals.emplace_back(Val, EDI);
1774 }
1775 if (EnumVals.empty())
1776 return;
1777 llvm::stable_sort(EnumVals, CmpEnumVals);
1778 EnumValsTy::iterator EIend = llvm::unique(EnumVals, EqEnumVals);
1779
1780 // See which values aren't in the enum.
1781 EnumValsTy::const_iterator EI = EnumVals.begin();
1782 while (EI != EIend && EI->first < *RHSVal)
1783 EI++;
1784 if (EI == EIend || EI->first != *RHSVal) {
1785 Diag(SrcExpr->getExprLoc(), diag::warn_not_in_enum_assignment)
1786 << DstType.getUnqualifiedType();
1787 }
1788}
1789
1791 SourceLocation LParenLoc, ConditionResult Cond,
1792 SourceLocation RParenLoc, Stmt *Body) {
1793 if (Cond.isInvalid())
1794 return StmtError();
1795
1796 auto CondVal = Cond.get();
1797 CheckBreakContinueBinding(CondVal.second);
1798
1799 if (CondVal.second &&
1800 !Diags.isIgnored(diag::warn_comma_operator, CondVal.second->getExprLoc()))
1801 CommaVisitor(*this).Visit(CondVal.second);
1802
1803 // OpenACC3.3 2.14.4:
1804 // The update directive is executable. It must not appear in place of the
1805 // statement following an 'if', 'while', 'do', 'switch', or 'label' in C or
1806 // C++.
1807 if (isa<OpenACCUpdateConstruct>(Body)) {
1808 Diag(Body->getBeginLoc(), diag::err_acc_update_as_body) << /*while*/ 1;
1809 Body = new (Context) NullStmt(Body->getBeginLoc());
1810 }
1811
1812 if (isa<NullStmt>(Body))
1814
1815 return WhileStmt::Create(Context, CondVal.first, CondVal.second, Body,
1816 WhileLoc, LParenLoc, RParenLoc);
1817}
1818
1821 SourceLocation WhileLoc, SourceLocation CondLParen,
1822 Expr *Cond, SourceLocation CondRParen) {
1823 assert(Cond && "ActOnDoStmt(): missing expression");
1824
1825 CheckBreakContinueBinding(Cond);
1826 ExprResult CondResult = CheckBooleanCondition(DoLoc, Cond);
1827 if (CondResult.isInvalid())
1828 return StmtError();
1829 Cond = CondResult.get();
1830
1831 CondResult = ActOnFinishFullExpr(Cond, DoLoc, /*DiscardedValue*/ false);
1832 if (CondResult.isInvalid())
1833 return StmtError();
1834 Cond = CondResult.get();
1835
1836 // Only call the CommaVisitor for C89 due to differences in scope flags.
1837 if (Cond && !getLangOpts().C99 && !getLangOpts().CPlusPlus &&
1838 !Diags.isIgnored(diag::warn_comma_operator, Cond->getExprLoc()))
1839 CommaVisitor(*this).Visit(Cond);
1840
1841 // OpenACC3.3 2.14.4:
1842 // The update directive is executable. It must not appear in place of the
1843 // statement following an 'if', 'while', 'do', 'switch', or 'label' in C or
1844 // C++.
1845 if (isa<OpenACCUpdateConstruct>(Body)) {
1846 Diag(Body->getBeginLoc(), diag::err_acc_update_as_body) << /*do*/ 2;
1847 Body = new (Context) NullStmt(Body->getBeginLoc());
1848 }
1849
1850 return new (Context) DoStmt(Body, Cond, DoLoc, WhileLoc, CondRParen);
1851}
1852
1853namespace {
1854 // Use SetVector since the diagnostic cares about the ordering of the Decl's.
1855 using DeclSetVector = llvm::SmallSetVector<VarDecl *, 8>;
1856
1857 // This visitor will traverse a conditional statement and store all
1858 // the evaluated decls into a vector. Simple is set to true if none
1859 // of the excluded constructs are used.
1860 class DeclExtractor : public EvaluatedExprVisitor<DeclExtractor> {
1861 DeclSetVector &Decls;
1863 bool Simple;
1864 public:
1865 typedef EvaluatedExprVisitor<DeclExtractor> Inherited;
1866
1867 DeclExtractor(Sema &S, DeclSetVector &Decls,
1869 Inherited(S.Context),
1870 Decls(Decls),
1871 Ranges(Ranges),
1872 Simple(true) {}
1873
1874 bool isSimple() { return Simple; }
1875
1876 // Replaces the method in EvaluatedExprVisitor.
1877 void VisitMemberExpr(MemberExpr* E) {
1878 Simple = false;
1879 }
1880
1881 // Any Stmt not explicitly listed will cause the condition to be marked
1882 // complex.
1883 void VisitStmt(Stmt *S) { Simple = false; }
1884
1885 void VisitBinaryOperator(BinaryOperator *E) {
1886 Visit(E->getLHS());
1887 Visit(E->getRHS());
1888 }
1889
1890 void VisitCastExpr(CastExpr *E) {
1891 Visit(E->getSubExpr());
1892 }
1893
1894 void VisitUnaryOperator(UnaryOperator *E) {
1895 // Skip checking conditionals with derefernces.
1896 if (E->getOpcode() == UO_Deref)
1897 Simple = false;
1898 else
1899 Visit(E->getSubExpr());
1900 }
1901
1902 void VisitConditionalOperator(ConditionalOperator *E) {
1903 Visit(E->getCond());
1904 Visit(E->getTrueExpr());
1905 Visit(E->getFalseExpr());
1906 }
1907
1908 void VisitParenExpr(ParenExpr *E) {
1909 Visit(E->getSubExpr());
1910 }
1911
1912 void VisitBinaryConditionalOperator(BinaryConditionalOperator *E) {
1913 Visit(E->getOpaqueValue()->getSourceExpr());
1914 Visit(E->getFalseExpr());
1915 }
1916
1917 void VisitIntegerLiteral(IntegerLiteral *E) { }
1918 void VisitFloatingLiteral(FloatingLiteral *E) { }
1919 void VisitCXXBoolLiteralExpr(CXXBoolLiteralExpr *E) { }
1920 void VisitCharacterLiteral(CharacterLiteral *E) { }
1921 void VisitGNUNullExpr(GNUNullExpr *E) { }
1922 void VisitImaginaryLiteral(ImaginaryLiteral *E) { }
1923
1924 void VisitDeclRefExpr(DeclRefExpr *E) {
1925 VarDecl *VD = dyn_cast<VarDecl>(E->getDecl());
1926 if (!VD) {
1927 // Don't allow unhandled Decl types.
1928 Simple = false;
1929 return;
1930 }
1931
1932 Ranges.push_back(E->getSourceRange());
1933
1934 Decls.insert(VD);
1935 }
1936
1937 }; // end class DeclExtractor
1938
1939 // DeclMatcher checks to see if the decls are used in a non-evaluated
1940 // context.
1941 class DeclMatcher : public EvaluatedExprVisitor<DeclMatcher> {
1942 DeclSetVector &Decls;
1943 bool FoundDecl;
1944
1945 public:
1946 typedef EvaluatedExprVisitor<DeclMatcher> Inherited;
1947
1948 DeclMatcher(Sema &S, DeclSetVector &Decls, Stmt *Statement) :
1949 Inherited(S.Context), Decls(Decls), FoundDecl(false) {
1950 if (!Statement) return;
1951
1952 Visit(Statement);
1953 }
1954
1955 void VisitReturnStmt(ReturnStmt *S) {
1956 FoundDecl = true;
1957 }
1958
1959 void VisitBreakStmt(BreakStmt *S) {
1960 FoundDecl = true;
1961 }
1962
1963 void VisitGotoStmt(GotoStmt *S) {
1964 FoundDecl = true;
1965 }
1966
1967 void VisitCastExpr(CastExpr *E) {
1968 if (E->getCastKind() == CK_LValueToRValue)
1969 CheckLValueToRValueCast(E->getSubExpr());
1970 else
1971 Visit(E->getSubExpr());
1972 }
1973
1974 void CheckLValueToRValueCast(Expr *E) {
1975 E = E->IgnoreParenImpCasts();
1976
1977 if (isa<DeclRefExpr>(E)) {
1978 return;
1979 }
1980
1981 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
1982 Visit(CO->getCond());
1983 CheckLValueToRValueCast(CO->getTrueExpr());
1984 CheckLValueToRValueCast(CO->getFalseExpr());
1985 return;
1986 }
1987
1988 if (BinaryConditionalOperator *BCO =
1989 dyn_cast<BinaryConditionalOperator>(E)) {
1990 CheckLValueToRValueCast(BCO->getOpaqueValue()->getSourceExpr());
1991 CheckLValueToRValueCast(BCO->getFalseExpr());
1992 return;
1993 }
1994
1995 Visit(E);
1996 }
1997
1998 void VisitDeclRefExpr(DeclRefExpr *E) {
1999 if (VarDecl *VD = dyn_cast<VarDecl>(E->getDecl()))
2000 if (Decls.count(VD))
2001 FoundDecl = true;
2002 }
2003
2004 void VisitPseudoObjectExpr(PseudoObjectExpr *POE) {
2005 // Only need to visit the semantics for POE.
2006 // SyntaticForm doesn't really use the Decal.
2007 for (auto *S : POE->semantics()) {
2008 if (auto *OVE = dyn_cast<OpaqueValueExpr>(S))
2009 // Look past the OVE into the expression it binds.
2010 Visit(OVE->getSourceExpr());
2011 else
2012 Visit(S);
2013 }
2014 }
2015
2016 bool FoundDeclInUse() { return FoundDecl; }
2017
2018 }; // end class DeclMatcher
2019
2020 void CheckForLoopConditionalStatement(Sema &S, Expr *Second,
2021 Expr *Third, Stmt *Body) {
2022 // Condition is empty
2023 if (!Second) return;
2024
2025 if (S.Diags.isIgnored(diag::warn_variables_not_in_loop_body,
2026 Second->getBeginLoc()))
2027 return;
2028
2029 PartialDiagnostic PDiag = S.PDiag(diag::warn_variables_not_in_loop_body);
2030 DeclSetVector Decls;
2032 DeclExtractor DE(S, Decls, Ranges);
2033 DE.Visit(Second);
2034
2035 // Don't analyze complex conditionals.
2036 if (!DE.isSimple()) return;
2037
2038 // No decls found.
2039 if (Decls.size() == 0) return;
2040
2041 // Don't warn on volatile, static, or global variables.
2042 for (auto *VD : Decls)
2043 if (VD->getType().isVolatileQualified() || VD->hasGlobalStorage())
2044 return;
2045
2046 if (DeclMatcher(S, Decls, Second).FoundDeclInUse() ||
2047 DeclMatcher(S, Decls, Third).FoundDeclInUse() ||
2048 DeclMatcher(S, Decls, Body).FoundDeclInUse())
2049 return;
2050
2051 // Load decl names into diagnostic.
2052 if (Decls.size() > 4) {
2053 PDiag << 0;
2054 } else {
2055 PDiag << (unsigned)Decls.size();
2056 for (auto *VD : Decls)
2057 PDiag << VD->getDeclName();
2058 }
2059
2060 for (auto Range : Ranges)
2061 PDiag << Range;
2062
2063 S.Diag(Ranges.begin()->getBegin(), PDiag);
2064 }
2065
2066 // If Statement is an incemement or decrement, return true and sets the
2067 // variables Increment and DRE.
2068 bool ProcessIterationStmt(Sema &S, Stmt* Statement, bool &Increment,
2069 DeclRefExpr *&DRE) {
2070 if (auto Cleanups = dyn_cast<ExprWithCleanups>(Statement))
2071 if (!Cleanups->cleanupsHaveSideEffects())
2072 Statement = Cleanups->getSubExpr();
2073
2074 if (UnaryOperator *UO = dyn_cast<UnaryOperator>(Statement)) {
2075 switch (UO->getOpcode()) {
2076 default: return false;
2077 case UO_PostInc:
2078 case UO_PreInc:
2079 Increment = true;
2080 break;
2081 case UO_PostDec:
2082 case UO_PreDec:
2083 Increment = false;
2084 break;
2085 }
2086 DRE = dyn_cast<DeclRefExpr>(UO->getSubExpr());
2087 return DRE;
2088 }
2089
2090 if (CXXOperatorCallExpr *Call = dyn_cast<CXXOperatorCallExpr>(Statement)) {
2091 FunctionDecl *FD = Call->getDirectCallee();
2092 if (!FD || !FD->isOverloadedOperator()) return false;
2093 switch (FD->getOverloadedOperator()) {
2094 default: return false;
2095 case OO_PlusPlus:
2096 Increment = true;
2097 break;
2098 case OO_MinusMinus:
2099 Increment = false;
2100 break;
2101 }
2102 DRE = dyn_cast<DeclRefExpr>(Call->getArg(0));
2103 return DRE;
2104 }
2105
2106 return false;
2107 }
2108
2109 // A visitor to determine if a continue or break statement is a
2110 // subexpression.
2111 class BreakContinueFinder : public ConstEvaluatedExprVisitor<BreakContinueFinder> {
2112 SourceLocation BreakLoc;
2113 SourceLocation ContinueLoc;
2114 bool InSwitch = false;
2115
2116 public:
2117 BreakContinueFinder(Sema &S, const Stmt* Body) :
2118 Inherited(S.Context) {
2119 Visit(Body);
2120 }
2121
2123
2124 void VisitContinueStmt(const ContinueStmt* E) {
2125 ContinueLoc = E->getKwLoc();
2126 }
2127
2128 void VisitBreakStmt(const BreakStmt* E) {
2129 if (!InSwitch)
2130 BreakLoc = E->getKwLoc();
2131 }
2132
2133 void VisitSwitchStmt(const SwitchStmt* S) {
2134 if (const Stmt *Init = S->getInit())
2135 Visit(Init);
2136 if (const Stmt *CondVar = S->getConditionVariableDeclStmt())
2137 Visit(CondVar);
2138 if (const Stmt *Cond = S->getCond())
2139 Visit(Cond);
2140
2141 // Don't return break statements from the body of a switch.
2142 InSwitch = true;
2143 if (const Stmt *Body = S->getBody())
2144 Visit(Body);
2145 InSwitch = false;
2146 }
2147
2148 void VisitForStmt(const ForStmt *S) {
2149 // Only visit the init statement of a for loop; the body
2150 // has a different break/continue scope.
2151 if (const Stmt *Init = S->getInit())
2152 Visit(Init);
2153 }
2154
2155 void VisitWhileStmt(const WhileStmt *) {
2156 // Do nothing; the children of a while loop have a different
2157 // break/continue scope.
2158 }
2159
2160 void VisitDoStmt(const DoStmt *) {
2161 // Do nothing; the children of a while loop have a different
2162 // break/continue scope.
2163 }
2164
2165 void VisitCXXForRangeStmt(const CXXForRangeStmt *S) {
2166 // Only visit the initialization of a for loop; the body
2167 // has a different break/continue scope.
2168 if (const Stmt *Init = S->getInit())
2169 Visit(Init);
2170 if (const Stmt *Range = S->getRangeStmt())
2171 Visit(Range);
2172 if (const Stmt *Begin = S->getBeginStmt())
2173 Visit(Begin);
2174 if (const Stmt *End = S->getEndStmt())
2175 Visit(End);
2176 }
2177
2178 void VisitObjCForCollectionStmt(const ObjCForCollectionStmt *S) {
2179 // Only visit the initialization of a for loop; the body
2180 // has a different break/continue scope.
2181 if (const Stmt *Element = S->getElement())
2182 Visit(Element);
2183 if (const Stmt *Collection = S->getCollection())
2184 Visit(Collection);
2185 }
2186
2187 bool ContinueFound() { return ContinueLoc.isValid(); }
2188 bool BreakFound() { return BreakLoc.isValid(); }
2189 SourceLocation GetContinueLoc() { return ContinueLoc; }
2190 SourceLocation GetBreakLoc() { return BreakLoc; }
2191
2192 }; // end class BreakContinueFinder
2193
2194 // Emit a warning when a loop increment/decrement appears twice per loop
2195 // iteration. The conditions which trigger this warning are:
2196 // 1) The last statement in the loop body and the third expression in the
2197 // for loop are both increment or both decrement of the same variable
2198 // 2) No continue statements in the loop body.
2199 void CheckForRedundantIteration(Sema &S, Expr *Third, Stmt *Body) {
2200 // Return when there is nothing to check.
2201 if (!Body || !Third) return;
2202
2203 // Get the last statement from the loop body.
2204 CompoundStmt *CS = dyn_cast<CompoundStmt>(Body);
2205 if (!CS || CS->body_empty()) return;
2206 Stmt *LastStmt = CS->body_back();
2207 if (!LastStmt) return;
2208
2209 if (S.Diags.isIgnored(diag::warn_redundant_loop_iteration,
2210 Third->getBeginLoc()))
2211 return;
2212
2213 bool LoopIncrement, LastIncrement;
2214 DeclRefExpr *LoopDRE, *LastDRE;
2215
2216 if (!ProcessIterationStmt(S, Third, LoopIncrement, LoopDRE)) return;
2217 if (!ProcessIterationStmt(S, LastStmt, LastIncrement, LastDRE)) return;
2218
2219 // Check that the two statements are both increments or both decrements
2220 // on the same variable.
2221 if (LoopIncrement != LastIncrement ||
2222 LoopDRE->getDecl() != LastDRE->getDecl()) return;
2223
2224 if (BreakContinueFinder(S, Body).ContinueFound()) return;
2225
2226 S.Diag(LastDRE->getLocation(), diag::warn_redundant_loop_iteration)
2227 << LastDRE->getDecl() << LastIncrement;
2228 S.Diag(LoopDRE->getLocation(), diag::note_loop_iteration_here)
2229 << LoopIncrement;
2230 }
2231
2232} // end namespace
2233
2234
2235void Sema::CheckBreakContinueBinding(Expr *E) {
2236 if (!E || getLangOpts().CPlusPlus)
2237 return;
2238 BreakContinueFinder BCFinder(*this, E);
2239 Scope *BreakParent = CurScope->getBreakParent();
2240 if (BCFinder.BreakFound() && BreakParent) {
2241 if (BreakParent->getFlags() & Scope::SwitchScope) {
2242 Diag(BCFinder.GetBreakLoc(), diag::warn_break_binds_to_switch);
2243 } else {
2244 Diag(BCFinder.GetBreakLoc(), diag::warn_loop_ctrl_binds_to_inner)
2245 << "break";
2246 }
2247 } else if (BCFinder.ContinueFound() && CurScope->getContinueParent()) {
2248 Diag(BCFinder.GetContinueLoc(), diag::warn_loop_ctrl_binds_to_inner)
2249 << "continue";
2250 }
2251}
2252
2254 Stmt *First, ConditionResult Second,
2255 FullExprArg third, SourceLocation RParenLoc,
2256 Stmt *Body) {
2257 if (Second.isInvalid())
2258 return StmtError();
2259
2260 if (!getLangOpts().CPlusPlus) {
2261 if (DeclStmt *DS = dyn_cast_or_null<DeclStmt>(First)) {
2262 // C99 6.8.5p3: The declaration part of a 'for' statement shall only
2263 // declare identifiers for objects having storage class 'auto' or
2264 // 'register'.
2265 const Decl *NonVarSeen = nullptr;
2266 bool VarDeclSeen = false;
2267 for (auto *DI : DS->decls()) {
2268 if (VarDecl *VD = dyn_cast<VarDecl>(DI)) {
2269 VarDeclSeen = true;
2270 if (VD->isLocalVarDecl() && !VD->hasLocalStorage())
2271 Diag(DI->getLocation(),
2273 ? diag::warn_c17_non_local_variable_decl_in_for
2274 : diag::ext_c23_non_local_variable_decl_in_for);
2275 } else if (!NonVarSeen) {
2276 // Keep track of the first non-variable declaration we saw so that
2277 // we can diagnose if we don't see any variable declarations. This
2278 // covers a case like declaring a typedef, function, or structure
2279 // type rather than a variable.
2280 //
2281 // Note, _Static_assert is acceptable because it does not declare an
2282 // identifier at all, so "for object having" does not apply.
2283 if (!isa<StaticAssertDecl>(DI))
2284 NonVarSeen = DI;
2285 }
2286 }
2287 // Diagnose if we saw a non-variable declaration but no variable
2288 // declarations.
2289 if (NonVarSeen && !VarDeclSeen)
2290 Diag(NonVarSeen->getLocation(),
2291 getLangOpts().C23 ? diag::warn_c17_non_variable_decl_in_for
2292 : diag::ext_c23_non_variable_decl_in_for);
2293 }
2294 }
2295
2296 CheckBreakContinueBinding(Second.get().second);
2297 CheckBreakContinueBinding(third.get());
2298
2299 if (!Second.get().first)
2300 CheckForLoopConditionalStatement(*this, Second.get().second, third.get(),
2301 Body);
2302 CheckForRedundantIteration(*this, third.get(), Body);
2303
2304 if (Second.get().second &&
2305 !Diags.isIgnored(diag::warn_comma_operator,
2306 Second.get().second->getExprLoc()))
2307 CommaVisitor(*this).Visit(Second.get().second);
2308
2309 Expr *Third = third.release().getAs<Expr>();
2310 if (isa<NullStmt>(Body))
2312
2313 return new (Context)
2314 ForStmt(Context, First, Second.get().second, Second.get().first, Third,
2315 Body, ForLoc, LParenLoc, RParenLoc);
2316}
2317
2319 // Reduce placeholder expressions here. Note that this rejects the
2320 // use of pseudo-object l-values in this position.
2322 if (result.isInvalid()) return StmtError();
2323 E = result.get();
2324
2325 ExprResult FullExpr = ActOnFinishFullExpr(E, /*DiscardedValue*/ false);
2326 if (FullExpr.isInvalid())
2327 return StmtError();
2328 return StmtResult(static_cast<Stmt*>(FullExpr.get()));
2329}
2330
2331/// Finish building a variable declaration for a for-range statement.
2332/// \return true if an error occurs.
2334 SourceLocation Loc, int DiagID) {
2335 if (Decl->getType()->isUndeducedType()) {
2336 ExprResult Res = Init;
2337 if (!Res.isUsable()) {
2339 return true;
2340 }
2341 Init = Res.get();
2342 }
2343
2344 // Deduce the type for the iterator variable now rather than leaving it to
2345 // AddInitializerToDecl, so we can produce a more suitable diagnostic.
2346 QualType InitType;
2347 if (!isa<InitListExpr>(Init) && Init->getType()->isVoidType()) {
2348 SemaRef.Diag(Loc, DiagID) << Init->getType();
2349 } else {
2350 TemplateDeductionInfo Info(Init->getExprLoc());
2352 Decl->getTypeSourceInfo()->getTypeLoc(), Init, InitType, Info);
2355 SemaRef.Diag(Loc, DiagID) << Init->getType();
2356 }
2357
2358 if (InitType.isNull()) {
2360 return true;
2361 }
2362 Decl->setType(InitType);
2363
2364 // In ARC, infer lifetime.
2365 // FIXME: ARC may want to turn this into 'const __unsafe_unretained' if
2366 // we're doing the equivalent of fast iteration.
2367 if (SemaRef.getLangOpts().ObjCAutoRefCount &&
2368 SemaRef.ObjC().inferObjCARCLifetime(Decl))
2370
2371 SemaRef.AddInitializerToDecl(Decl, Init, /*DirectInit=*/false);
2372 SemaRef.FinalizeDeclaration(Decl);
2373 SemaRef.CurContext->addHiddenDecl(Decl);
2374 return false;
2375}
2376
2377namespace {
2378// An enum to represent whether something is dealing with a call to begin()
2379// or a call to end() in a range-based for loop.
2380enum BeginEndFunction {
2381 BEF_begin,
2382 BEF_end
2383};
2384
2385/// Produce a note indicating which begin/end function was implicitly called
2386/// by a C++11 for-range statement. This is often not obvious from the code,
2387/// nor from the diagnostics produced when analysing the implicit expressions
2388/// required in a for-range statement.
2389void NoteForRangeBeginEndFunction(Sema &SemaRef, Expr *E,
2390 BeginEndFunction BEF) {
2391 CallExpr *CE = dyn_cast<CallExpr>(E);
2392 if (!CE)
2393 return;
2394 FunctionDecl *D = dyn_cast<FunctionDecl>(CE->getCalleeDecl());
2395 if (!D)
2396 return;
2398
2399 std::string Description;
2400 bool IsTemplate = false;
2401 if (FunctionTemplateDecl *FunTmpl = D->getPrimaryTemplate()) {
2402 Description = SemaRef.getTemplateArgumentBindingsText(
2403 FunTmpl->getTemplateParameters(), *D->getTemplateSpecializationArgs());
2404 IsTemplate = true;
2405 }
2406
2407 SemaRef.Diag(Loc, diag::note_for_range_begin_end)
2408 << BEF << IsTemplate << Description << E->getType();
2409}
2410
2411/// Build a variable declaration for a for-range statement.
2412VarDecl *BuildForRangeVarDecl(Sema &SemaRef, SourceLocation Loc,
2413 QualType Type, StringRef Name) {
2414 DeclContext *DC = SemaRef.CurContext;
2415 IdentifierInfo *II = &SemaRef.PP.getIdentifierTable().get(Name);
2417 VarDecl *Decl = VarDecl::Create(SemaRef.Context, DC, Loc, Loc, II, Type,
2418 TInfo, SC_None);
2419 Decl->setImplicit();
2420 Decl->setCXXForRangeImplicitVar(true);
2421 return Decl;
2422}
2423
2424}
2425
2426static bool ObjCEnumerationCollection(Expr *Collection) {
2427 return !Collection->isTypeDependent()
2428 && Collection->getType()->getAs<ObjCObjectPointerType>() != nullptr;
2429}
2430
2432 Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
2433 Stmt *First, SourceLocation ColonLoc, Expr *Range, SourceLocation RParenLoc,
2434 BuildForRangeKind Kind,
2435 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps) {
2436 // FIXME: recover in order to allow the body to be parsed.
2437 if (!First)
2438 return StmtError();
2439
2441 // FIXME: Support init-statements in Objective-C++20 ranged for statement.
2442 if (InitStmt)
2443 return Diag(InitStmt->getBeginLoc(), diag::err_objc_for_range_init_stmt)
2444 << InitStmt->getSourceRange();
2445 return ObjC().ActOnObjCForCollectionStmt(ForLoc, First, Range, RParenLoc);
2446 }
2447
2448 DeclStmt *DS = dyn_cast<DeclStmt>(First);
2449 assert(DS && "first part of for range not a decl stmt");
2450
2451 if (!DS->isSingleDecl()) {
2452 Diag(DS->getBeginLoc(), diag::err_type_defined_in_for_range);
2453 return StmtError();
2454 }
2455
2456 // This function is responsible for attaching an initializer to LoopVar. We
2457 // must call ActOnInitializerError if we fail to do so.
2458 Decl *LoopVar = DS->getSingleDecl();
2459 if (LoopVar->isInvalidDecl() || !Range ||
2461 ActOnInitializerError(LoopVar);
2462 return StmtError();
2463 }
2464
2465 // Build the coroutine state immediately and not later during template
2466 // instantiation
2467 if (!CoawaitLoc.isInvalid()) {
2468 if (!ActOnCoroutineBodyStart(S, CoawaitLoc, "co_await")) {
2469 ActOnInitializerError(LoopVar);
2470 return StmtError();
2471 }
2472 }
2473
2474 // Build auto && __range = range-init
2475 // Divide by 2, since the variables are in the inner scope (loop body).
2476 const auto DepthStr = std::to_string(S->getDepth() / 2);
2477 SourceLocation RangeLoc = Range->getBeginLoc();
2478 VarDecl *RangeVar = BuildForRangeVarDecl(*this, RangeLoc,
2480 std::string("__range") + DepthStr);
2481 if (FinishForRangeVarDecl(*this, RangeVar, Range, RangeLoc,
2482 diag::err_for_range_deduction_failure)) {
2483 ActOnInitializerError(LoopVar);
2484 return StmtError();
2485 }
2486
2487 // Claim the type doesn't contain auto: we've already done the checking.
2488 DeclGroupPtrTy RangeGroup =
2490 StmtResult RangeDecl = ActOnDeclStmt(RangeGroup, RangeLoc, RangeLoc);
2491 if (RangeDecl.isInvalid()) {
2492 ActOnInitializerError(LoopVar);
2493 return StmtError();
2494 }
2495
2497 ForLoc, CoawaitLoc, InitStmt, ColonLoc, RangeDecl.get(),
2498 /*BeginStmt=*/nullptr, /*EndStmt=*/nullptr,
2499 /*Cond=*/nullptr, /*Inc=*/nullptr, DS, RParenLoc, Kind,
2500 LifetimeExtendTemps);
2501 if (R.isInvalid()) {
2502 ActOnInitializerError(LoopVar);
2503 return StmtError();
2504 }
2505
2506 return R;
2507}
2508
2509/// Create the initialization, compare, and increment steps for
2510/// the range-based for loop expression.
2511/// This function does not handle array-based for loops,
2512/// which are created in Sema::BuildCXXForRangeStmt.
2513///
2514/// \returns a ForRangeStatus indicating success or what kind of error occurred.
2515/// BeginExpr and EndExpr are set and FRS_Success is returned on success;
2516/// CandidateSet and BEF are set and some non-success value is returned on
2517/// failure.
2519BuildNonArrayForRange(Sema &SemaRef, Expr *BeginRange, Expr *EndRange,
2520 QualType RangeType, VarDecl *BeginVar, VarDecl *EndVar,
2521 SourceLocation ColonLoc, SourceLocation CoawaitLoc,
2522 OverloadCandidateSet *CandidateSet, ExprResult *BeginExpr,
2523 ExprResult *EndExpr, BeginEndFunction *BEF) {
2524 DeclarationNameInfo BeginNameInfo(
2525 &SemaRef.PP.getIdentifierTable().get("begin"), ColonLoc);
2526 DeclarationNameInfo EndNameInfo(&SemaRef.PP.getIdentifierTable().get("end"),
2527 ColonLoc);
2528
2529 LookupResult BeginMemberLookup(SemaRef, BeginNameInfo,
2531 LookupResult EndMemberLookup(SemaRef, EndNameInfo, Sema::LookupMemberName);
2532
2533 auto BuildBegin = [&] {
2534 *BEF = BEF_begin;
2535 Sema::ForRangeStatus RangeStatus =
2536 SemaRef.BuildForRangeBeginEndCall(ColonLoc, ColonLoc, BeginNameInfo,
2537 BeginMemberLookup, CandidateSet,
2538 BeginRange, BeginExpr);
2539
2540 if (RangeStatus != Sema::FRS_Success) {
2541 if (RangeStatus == Sema::FRS_DiagnosticIssued)
2542 SemaRef.Diag(BeginRange->getBeginLoc(), diag::note_in_for_range)
2543 << ColonLoc << BEF_begin << BeginRange->getType();
2544 return RangeStatus;
2545 }
2546 if (!CoawaitLoc.isInvalid()) {
2547 // FIXME: getCurScope() should not be used during template instantiation.
2548 // We should pick up the set of unqualified lookup results for operator
2549 // co_await during the initial parse.
2550 *BeginExpr = SemaRef.ActOnCoawaitExpr(SemaRef.getCurScope(), ColonLoc,
2551 BeginExpr->get());
2552 if (BeginExpr->isInvalid())
2554 }
2555 if (FinishForRangeVarDecl(SemaRef, BeginVar, BeginExpr->get(), ColonLoc,
2556 diag::err_for_range_iter_deduction_failure)) {
2557 NoteForRangeBeginEndFunction(SemaRef, BeginExpr->get(), *BEF);
2559 }
2560 return Sema::FRS_Success;
2561 };
2562
2563 auto BuildEnd = [&] {
2564 *BEF = BEF_end;
2565 Sema::ForRangeStatus RangeStatus =
2566 SemaRef.BuildForRangeBeginEndCall(ColonLoc, ColonLoc, EndNameInfo,
2567 EndMemberLookup, CandidateSet,
2568 EndRange, EndExpr);
2569 if (RangeStatus != Sema::FRS_Success) {
2570 if (RangeStatus == Sema::FRS_DiagnosticIssued)
2571 SemaRef.Diag(EndRange->getBeginLoc(), diag::note_in_for_range)
2572 << ColonLoc << BEF_end << EndRange->getType();
2573 return RangeStatus;
2574 }
2575 if (FinishForRangeVarDecl(SemaRef, EndVar, EndExpr->get(), ColonLoc,
2576 diag::err_for_range_iter_deduction_failure)) {
2577 NoteForRangeBeginEndFunction(SemaRef, EndExpr->get(), *BEF);
2579 }
2580 return Sema::FRS_Success;
2581 };
2582
2583 if (CXXRecordDecl *D = RangeType->getAsCXXRecordDecl()) {
2584 // - if _RangeT is a class type, the unqualified-ids begin and end are
2585 // looked up in the scope of class _RangeT as if by class member access
2586 // lookup (3.4.5), and if either (or both) finds at least one
2587 // declaration, begin-expr and end-expr are __range.begin() and
2588 // __range.end(), respectively;
2589 SemaRef.LookupQualifiedName(BeginMemberLookup, D);
2590 if (BeginMemberLookup.isAmbiguous())
2592
2593 SemaRef.LookupQualifiedName(EndMemberLookup, D);
2594 if (EndMemberLookup.isAmbiguous())
2596
2597 if (BeginMemberLookup.empty() != EndMemberLookup.empty()) {
2598 // Look up the non-member form of the member we didn't find, first.
2599 // This way we prefer a "no viable 'end'" diagnostic over a "i found
2600 // a 'begin' but ignored it because there was no member 'end'"
2601 // diagnostic.
2602 auto BuildNonmember = [&](
2603 BeginEndFunction BEFFound, LookupResult &Found,
2604 llvm::function_ref<Sema::ForRangeStatus()> BuildFound,
2605 llvm::function_ref<Sema::ForRangeStatus()> BuildNotFound) {
2606 LookupResult OldFound = std::move(Found);
2607 Found.clear();
2608
2609 if (Sema::ForRangeStatus Result = BuildNotFound())
2610 return Result;
2611
2612 switch (BuildFound()) {
2613 case Sema::FRS_Success:
2614 return Sema::FRS_Success;
2615
2617 CandidateSet->NoteCandidates(
2618 PartialDiagnosticAt(BeginRange->getBeginLoc(),
2619 SemaRef.PDiag(diag::err_for_range_invalid)
2620 << BeginRange->getType() << BEFFound),
2621 SemaRef, OCD_AllCandidates, BeginRange);
2622 [[fallthrough]];
2623
2625 for (NamedDecl *D : OldFound) {
2626 SemaRef.Diag(D->getLocation(),
2627 diag::note_for_range_member_begin_end_ignored)
2628 << BeginRange->getType() << BEFFound;
2629 }
2631 }
2632 llvm_unreachable("unexpected ForRangeStatus");
2633 };
2634 if (BeginMemberLookup.empty())
2635 return BuildNonmember(BEF_end, EndMemberLookup, BuildEnd, BuildBegin);
2636 return BuildNonmember(BEF_begin, BeginMemberLookup, BuildBegin, BuildEnd);
2637 }
2638 } else {
2639 // - otherwise, begin-expr and end-expr are begin(__range) and
2640 // end(__range), respectively, where begin and end are looked up with
2641 // argument-dependent lookup (3.4.2). For the purposes of this name
2642 // lookup, namespace std is an associated namespace.
2643 }
2644
2645 if (Sema::ForRangeStatus Result = BuildBegin())
2646 return Result;
2647 return BuildEnd();
2648}
2649
2650/// Speculatively attempt to dereference an invalid range expression.
2651/// If the attempt fails, this function will return a valid, null StmtResult
2652/// and emit no diagnostics.
2654 SourceLocation ForLoc,
2655 SourceLocation CoawaitLoc,
2656 Stmt *InitStmt,
2657 Stmt *LoopVarDecl,
2658 SourceLocation ColonLoc,
2659 Expr *Range,
2660 SourceLocation RangeLoc,
2661 SourceLocation RParenLoc) {
2662 // Determine whether we can rebuild the for-range statement with a
2663 // dereferenced range expression.
2664 ExprResult AdjustedRange;
2665 {
2666 Sema::SFINAETrap Trap(SemaRef);
2667
2668 AdjustedRange = SemaRef.BuildUnaryOp(S, RangeLoc, UO_Deref, Range);
2669 if (AdjustedRange.isInvalid())
2670 return StmtResult();
2671
2672 StmtResult SR = SemaRef.ActOnCXXForRangeStmt(
2673 S, ForLoc, CoawaitLoc, InitStmt, LoopVarDecl, ColonLoc,
2674 AdjustedRange.get(), RParenLoc, Sema::BFRK_Check);
2675 if (SR.isInvalid())
2676 return StmtResult();
2677 }
2678
2679 // The attempt to dereference worked well enough that it could produce a valid
2680 // loop. Produce a fixit, and rebuild the loop with diagnostics enabled, in
2681 // case there are any other (non-fatal) problems with it.
2682 SemaRef.Diag(RangeLoc, diag::err_for_range_dereference)
2683 << Range->getType() << FixItHint::CreateInsertion(RangeLoc, "*");
2684 return SemaRef.ActOnCXXForRangeStmt(
2685 S, ForLoc, CoawaitLoc, InitStmt, LoopVarDecl, ColonLoc,
2686 AdjustedRange.get(), RParenLoc, Sema::BFRK_Rebuild);
2687}
2688
2690 SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt,
2691 SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End,
2692 Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc,
2693 BuildForRangeKind Kind,
2694 ArrayRef<MaterializeTemporaryExpr *> LifetimeExtendTemps) {
2695 // FIXME: This should not be used during template instantiation. We should
2696 // pick up the set of unqualified lookup results for the != and + operators
2697 // in the initial parse.
2698 //
2699 // Testcase (accepts-invalid):
2700 // template<typename T> void f() { for (auto x : T()) {} }
2701 // namespace N { struct X { X begin(); X end(); int operator*(); }; }
2702 // bool operator!=(N::X, N::X); void operator++(N::X);
2703 // void g() { f<N::X>(); }
2704 Scope *S = getCurScope();
2705
2706 DeclStmt *RangeDS = cast<DeclStmt>(RangeDecl);
2707 VarDecl *RangeVar = cast<VarDecl>(RangeDS->getSingleDecl());
2708 QualType RangeVarType = RangeVar->getType();
2709
2710 DeclStmt *LoopVarDS = cast<DeclStmt>(LoopVarDecl);
2711 VarDecl *LoopVar = cast<VarDecl>(LoopVarDS->getSingleDecl());
2712
2713 StmtResult BeginDeclStmt = Begin;
2714 StmtResult EndDeclStmt = End;
2715 ExprResult NotEqExpr = Cond, IncrExpr = Inc;
2716
2717 if (RangeVarType->isDependentType()) {
2718 // The range is implicitly used as a placeholder when it is dependent.
2719 RangeVar->markUsed(Context);
2720
2721 // Deduce any 'auto's in the loop variable as 'DependentTy'. We'll fill
2722 // them in properly when we instantiate the loop.
2723 if (!LoopVar->isInvalidDecl() && Kind != BFRK_Check) {
2724 if (auto *DD = dyn_cast<DecompositionDecl>(LoopVar))
2725 for (auto *Binding : DD->bindings()) {
2726 if (!Binding->isParameterPack())
2727 Binding->setType(Context.DependentTy);
2728 }
2729 LoopVar->setType(SubstAutoTypeDependent(LoopVar->getType()));
2730 }
2731 } else if (!BeginDeclStmt.get()) {
2732 SourceLocation RangeLoc = RangeVar->getLocation();
2733
2734 const QualType RangeVarNonRefType = RangeVarType.getNonReferenceType();
2735
2736 ExprResult BeginRangeRef = BuildDeclRefExpr(RangeVar, RangeVarNonRefType,
2737 VK_LValue, ColonLoc);
2738 if (BeginRangeRef.isInvalid())
2739 return StmtError();
2740
2741 ExprResult EndRangeRef = BuildDeclRefExpr(RangeVar, RangeVarNonRefType,
2742 VK_LValue, ColonLoc);
2743 if (EndRangeRef.isInvalid())
2744 return StmtError();
2745
2747 Expr *Range = RangeVar->getInit();
2748 if (!Range)
2749 return StmtError();
2750 QualType RangeType = Range->getType();
2751
2752 if (RequireCompleteType(RangeLoc, RangeType,
2753 diag::err_for_range_incomplete_type))
2754 return StmtError();
2755
2756 // P2718R0 - Lifetime extension in range-based for loops.
2757 if (getLangOpts().CPlusPlus23 && !LifetimeExtendTemps.empty()) {
2758 InitializedEntity Entity =
2760 for (auto *MTE : LifetimeExtendTemps)
2761 MTE->setExtendingDecl(RangeVar, Entity.allocateManglingNumber());
2762 }
2763
2764 // Build auto __begin = begin-expr, __end = end-expr.
2765 // Divide by 2, since the variables are in the inner scope (loop body).
2766 const auto DepthStr = std::to_string(S->getDepth() / 2);
2767 VarDecl *BeginVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,
2768 std::string("__begin") + DepthStr);
2769 VarDecl *EndVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,
2770 std::string("__end") + DepthStr);
2771
2772 // Build begin-expr and end-expr and attach to __begin and __end variables.
2773 ExprResult BeginExpr, EndExpr;
2774 if (const ArrayType *UnqAT = RangeType->getAsArrayTypeUnsafe()) {
2775 // - if _RangeT is an array type, begin-expr and end-expr are __range and
2776 // __range + __bound, respectively, where __bound is the array bound. If
2777 // _RangeT is an array of unknown size or an array of incomplete type,
2778 // the program is ill-formed;
2779
2780 // begin-expr is __range.
2781 BeginExpr = BeginRangeRef;
2782 if (!CoawaitLoc.isInvalid()) {
2783 BeginExpr = ActOnCoawaitExpr(S, ColonLoc, BeginExpr.get());
2784 if (BeginExpr.isInvalid())
2785 return StmtError();
2786 }
2787 if (FinishForRangeVarDecl(*this, BeginVar, BeginRangeRef.get(), ColonLoc,
2788 diag::err_for_range_iter_deduction_failure)) {
2789 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2790 return StmtError();
2791 }
2792
2793 // Find the array bound.
2794 ExprResult BoundExpr;
2795 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(UnqAT))
2796 BoundExpr = IntegerLiteral::Create(
2797 Context, CAT->getSize(), Context.getPointerDiffType(), RangeLoc);
2798 else if (const VariableArrayType *VAT =
2799 dyn_cast<VariableArrayType>(UnqAT)) {
2800 // For a variably modified type we can't just use the expression within
2801 // the array bounds, since we don't want that to be re-evaluated here.
2802 // Rather, we need to determine what it was when the array was first
2803 // created - so we resort to using sizeof(vla)/sizeof(element).
2804 // For e.g.
2805 // void f(int b) {
2806 // int vla[b];
2807 // b = -1; <-- This should not affect the num of iterations below
2808 // for (int &c : vla) { .. }
2809 // }
2810
2811 // FIXME: This results in codegen generating IR that recalculates the
2812 // run-time number of elements (as opposed to just using the IR Value
2813 // that corresponds to the run-time value of each bound that was
2814 // generated when the array was created.) If this proves too embarrassing
2815 // even for unoptimized IR, consider passing a magic-value/cookie to
2816 // codegen that then knows to simply use that initial llvm::Value (that
2817 // corresponds to the bound at time of array creation) within
2818 // getelementptr. But be prepared to pay the price of increasing a
2819 // customized form of coupling between the two components - which could
2820 // be hard to maintain as the codebase evolves.
2821
2823 EndVar->getLocation(), UETT_SizeOf,
2824 /*IsType=*/true,
2826 VAT->desugar(), RangeLoc))
2827 .getAsOpaquePtr(),
2828 EndVar->getSourceRange());
2829 if (SizeOfVLAExprR.isInvalid())
2830 return StmtError();
2831
2832 ExprResult SizeOfEachElementExprR = ActOnUnaryExprOrTypeTraitExpr(
2833 EndVar->getLocation(), UETT_SizeOf,
2834 /*IsType=*/true,
2835 CreateParsedType(VAT->desugar(),
2837 VAT->getElementType(), RangeLoc))
2838 .getAsOpaquePtr(),
2839 EndVar->getSourceRange());
2840 if (SizeOfEachElementExprR.isInvalid())
2841 return StmtError();
2842
2843 BoundExpr =
2844 ActOnBinOp(S, EndVar->getLocation(), tok::slash,
2845 SizeOfVLAExprR.get(), SizeOfEachElementExprR.get());
2846 if (BoundExpr.isInvalid())
2847 return StmtError();
2848
2849 } else {
2850 // Can't be a DependentSizedArrayType or an IncompleteArrayType since
2851 // UnqAT is not incomplete and Range is not type-dependent.
2852 llvm_unreachable("Unexpected array type in for-range");
2853 }
2854
2855 // end-expr is __range + __bound.
2856 EndExpr = ActOnBinOp(S, ColonLoc, tok::plus, EndRangeRef.get(),
2857 BoundExpr.get());
2858 if (EndExpr.isInvalid())
2859 return StmtError();
2860 if (FinishForRangeVarDecl(*this, EndVar, EndExpr.get(), ColonLoc,
2861 diag::err_for_range_iter_deduction_failure)) {
2862 NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
2863 return StmtError();
2864 }
2865 } else {
2866 OverloadCandidateSet CandidateSet(RangeLoc,
2868 BeginEndFunction BEFFailure;
2870 *this, BeginRangeRef.get(), EndRangeRef.get(), RangeType, BeginVar,
2871 EndVar, ColonLoc, CoawaitLoc, &CandidateSet, &BeginExpr, &EndExpr,
2872 &BEFFailure);
2873
2874 if (Kind == BFRK_Build && RangeStatus == FRS_NoViableFunction &&
2875 BEFFailure == BEF_begin) {
2876 // If the range is being built from an array parameter, emit a
2877 // a diagnostic that it is being treated as a pointer.
2878 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Range)) {
2879 if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
2880 QualType ArrayTy = PVD->getOriginalType();
2881 QualType PointerTy = PVD->getType();
2882 if (PointerTy->isPointerType() && ArrayTy->isArrayType()) {
2883 Diag(Range->getBeginLoc(), diag::err_range_on_array_parameter)
2884 << RangeLoc << PVD << ArrayTy << PointerTy;
2885 Diag(PVD->getLocation(), diag::note_declared_at);
2886 return StmtError();
2887 }
2888 }
2889 }
2890
2891 // If building the range failed, try dereferencing the range expression
2892 // unless a diagnostic was issued or the end function is problematic.
2893 StmtResult SR = RebuildForRangeWithDereference(*this, S, ForLoc,
2894 CoawaitLoc, InitStmt,
2895 LoopVarDecl, ColonLoc,
2896 Range, RangeLoc,
2897 RParenLoc);
2898 if (SR.isInvalid() || SR.isUsable())
2899 return SR;
2900 }
2901
2902 // Otherwise, emit diagnostics if we haven't already.
2903 if (RangeStatus == FRS_NoViableFunction) {
2904 Expr *Range = BEFFailure ? EndRangeRef.get() : BeginRangeRef.get();
2905 CandidateSet.NoteCandidates(
2906 PartialDiagnosticAt(Range->getBeginLoc(),
2907 PDiag(diag::err_for_range_invalid)
2908 << RangeLoc << Range->getType()
2909 << BEFFailure),
2910 *this, OCD_AllCandidates, Range);
2911 }
2912 // Return an error if no fix was discovered.
2913 if (RangeStatus != FRS_Success)
2914 return StmtError();
2915 }
2916
2917 assert(!BeginExpr.isInvalid() && !EndExpr.isInvalid() &&
2918 "invalid range expression in for loop");
2919
2920 // C++11 [dcl.spec.auto]p7: BeginType and EndType must be the same.
2921 // C++1z removes this restriction.
2922 QualType BeginType = BeginVar->getType(), EndType = EndVar->getType();
2923 if (!Context.hasSameType(BeginType, EndType)) {
2924 Diag(RangeLoc, getLangOpts().CPlusPlus17
2925 ? diag::warn_for_range_begin_end_types_differ
2926 : diag::ext_for_range_begin_end_types_differ)
2927 << BeginType << EndType;
2928 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2929 NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
2930 }
2931
2932 BeginDeclStmt =
2933 ActOnDeclStmt(ConvertDeclToDeclGroup(BeginVar), ColonLoc, ColonLoc);
2934 EndDeclStmt =
2935 ActOnDeclStmt(ConvertDeclToDeclGroup(EndVar), ColonLoc, ColonLoc);
2936
2937 const QualType BeginRefNonRefType = BeginType.getNonReferenceType();
2938 ExprResult BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
2939 VK_LValue, ColonLoc);
2940 if (BeginRef.isInvalid())
2941 return StmtError();
2942
2943 ExprResult EndRef = BuildDeclRefExpr(EndVar, EndType.getNonReferenceType(),
2944 VK_LValue, ColonLoc);
2945 if (EndRef.isInvalid())
2946 return StmtError();
2947
2948 // Build and check __begin != __end expression.
2949 NotEqExpr = ActOnBinOp(S, ColonLoc, tok::exclaimequal,
2950 BeginRef.get(), EndRef.get());
2951 if (!NotEqExpr.isInvalid())
2952 NotEqExpr = CheckBooleanCondition(ColonLoc, NotEqExpr.get());
2953 if (!NotEqExpr.isInvalid())
2954 NotEqExpr =
2955 ActOnFinishFullExpr(NotEqExpr.get(), /*DiscardedValue*/ false);
2956 if (NotEqExpr.isInvalid()) {
2957 Diag(RangeLoc, diag::note_for_range_invalid_iterator)
2958 << RangeLoc << 0 << BeginRangeRef.get()->getType();
2959 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2960 if (!Context.hasSameType(BeginType, EndType))
2961 NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
2962 return StmtError();
2963 }
2964
2965 // Build and check ++__begin expression.
2966 BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
2967 VK_LValue, ColonLoc);
2968 if (BeginRef.isInvalid())
2969 return StmtError();
2970
2971 IncrExpr = ActOnUnaryOp(S, ColonLoc, tok::plusplus, BeginRef.get());
2972 if (!IncrExpr.isInvalid() && CoawaitLoc.isValid())
2973 // FIXME: getCurScope() should not be used during template instantiation.
2974 // We should pick up the set of unqualified lookup results for operator
2975 // co_await during the initial parse.
2976 IncrExpr = ActOnCoawaitExpr(S, CoawaitLoc, IncrExpr.get());
2977 if (!IncrExpr.isInvalid())
2978 IncrExpr = ActOnFinishFullExpr(IncrExpr.get(), /*DiscardedValue*/ false);
2979 if (IncrExpr.isInvalid()) {
2980 Diag(RangeLoc, diag::note_for_range_invalid_iterator)
2981 << RangeLoc << 2 << BeginRangeRef.get()->getType() ;
2982 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2983 return StmtError();
2984 }
2985
2986 // Build and check *__begin expression.
2987 BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
2988 VK_LValue, ColonLoc);
2989 if (BeginRef.isInvalid())
2990 return StmtError();
2991
2992 ExprResult DerefExpr = ActOnUnaryOp(S, ColonLoc, tok::star, BeginRef.get());
2993 if (DerefExpr.isInvalid()) {
2994 Diag(RangeLoc, diag::note_for_range_invalid_iterator)
2995 << RangeLoc << 1 << BeginRangeRef.get()->getType();
2996 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2997 return StmtError();
2998 }
2999
3000 // Attach *__begin as initializer for VD. Don't touch it if we're just
3001 // trying to determine whether this would be a valid range.
3002 if (!LoopVar->isInvalidDecl() && Kind != BFRK_Check) {
3003 AddInitializerToDecl(LoopVar, DerefExpr.get(), /*DirectInit=*/false);
3004 if (LoopVar->isInvalidDecl() ||
3005 (LoopVar->getInit() && LoopVar->getInit()->containsErrors()))
3006 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
3007 }
3008 }
3009
3010 // Don't bother to actually allocate the result if we're just trying to
3011 // determine whether it would be valid.
3012 if (Kind == BFRK_Check)
3013 return StmtResult();
3014
3015 // In OpenMP loop region loop control variable must be private. Perform
3016 // analysis of first part (if any).
3017 if (getLangOpts().OpenMP >= 50 && BeginDeclStmt.isUsable())
3018 OpenMP().ActOnOpenMPLoopInitialization(ForLoc, BeginDeclStmt.get());
3019
3020 return new (Context) CXXForRangeStmt(
3021 InitStmt, RangeDS, cast_or_null<DeclStmt>(BeginDeclStmt.get()),
3022 cast_or_null<DeclStmt>(EndDeclStmt.get()), NotEqExpr.get(),
3023 IncrExpr.get(), LoopVarDS, /*Body=*/nullptr, ForLoc, CoawaitLoc,
3024 ColonLoc, RParenLoc);
3025}
3026
3027// Warn when the loop variable is a const reference that creates a copy.
3028// Suggest using the non-reference type for copies. If a copy can be prevented
3029// suggest the const reference type that would do so.
3030// For instance, given "for (const &Foo : Range)", suggest
3031// "for (const Foo : Range)" to denote a copy is made for the loop. If
3032// possible, also suggest "for (const &Bar : Range)" if this type prevents
3033// the copy altogether.
3035 const VarDecl *VD,
3036 QualType RangeInitType) {
3037 const Expr *InitExpr = VD->getInit();
3038 if (!InitExpr)
3039 return;
3040
3041 QualType VariableType = VD->getType();
3042
3043 if (auto Cleanups = dyn_cast<ExprWithCleanups>(InitExpr))
3044 if (!Cleanups->cleanupsHaveSideEffects())
3045 InitExpr = Cleanups->getSubExpr();
3046
3047 const MaterializeTemporaryExpr *MTE =
3048 dyn_cast<MaterializeTemporaryExpr>(InitExpr);
3049
3050 // No copy made.
3051 if (!MTE)
3052 return;
3053
3054 const Expr *E = MTE->getSubExpr()->IgnoreImpCasts();
3055
3056 // Searching for either UnaryOperator for dereference of a pointer or
3057 // CXXOperatorCallExpr for handling iterators.
3058 while (!isa<CXXOperatorCallExpr>(E) && !isa<UnaryOperator>(E)) {
3059 if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(E)) {
3060 E = CCE->getArg(0);
3061 } else if (const CXXMemberCallExpr *Call = dyn_cast<CXXMemberCallExpr>(E)) {
3062 const MemberExpr *ME = cast<MemberExpr>(Call->getCallee());
3063 E = ME->getBase();
3064 } else {
3065 const MaterializeTemporaryExpr *MTE = cast<MaterializeTemporaryExpr>(E);
3066 E = MTE->getSubExpr();
3067 }
3068 E = E->IgnoreImpCasts();
3069 }
3070
3071 QualType ReferenceReturnType;
3072 if (isa<UnaryOperator>(E)) {
3073 ReferenceReturnType = SemaRef.Context.getLValueReferenceType(E->getType());
3074 } else {
3075 const CXXOperatorCallExpr *Call = cast<CXXOperatorCallExpr>(E);
3076 const FunctionDecl *FD = Call->getDirectCallee();
3077 QualType ReturnType = FD->getReturnType();
3078 if (ReturnType->isReferenceType())
3079 ReferenceReturnType = ReturnType;
3080 }
3081
3082 if (!ReferenceReturnType.isNull()) {
3083 // Loop variable creates a temporary. Suggest either to go with
3084 // non-reference loop variable to indicate a copy is made, or
3085 // the correct type to bind a const reference.
3086 SemaRef.Diag(VD->getLocation(),
3087 diag::warn_for_range_const_ref_binds_temp_built_from_ref)
3088 << VD << VariableType << ReferenceReturnType;
3089 QualType NonReferenceType = VariableType.getNonReferenceType();
3090 NonReferenceType.removeLocalConst();
3091 QualType NewReferenceType =
3093 SemaRef.Diag(VD->getBeginLoc(), diag::note_use_type_or_non_reference)
3094 << NonReferenceType << NewReferenceType << VD->getSourceRange()
3096 } else if (!VariableType->isRValueReferenceType()) {
3097 // The range always returns a copy, so a temporary is always created.
3098 // Suggest removing the reference from the loop variable.
3099 // If the type is a rvalue reference do not warn since that changes the
3100 // semantic of the code.
3101 SemaRef.Diag(VD->getLocation(), diag::warn_for_range_ref_binds_ret_temp)
3102 << VD << RangeInitType;
3103 QualType NonReferenceType = VariableType.getNonReferenceType();
3104 NonReferenceType.removeLocalConst();
3105 SemaRef.Diag(VD->getBeginLoc(), diag::note_use_non_reference_type)
3106 << NonReferenceType << VD->getSourceRange()
3108 }
3109}
3110
3111/// Determines whether the @p VariableType's declaration is a record with the
3112/// clang::trivial_abi attribute.
3113static bool hasTrivialABIAttr(QualType VariableType) {
3114 if (CXXRecordDecl *RD = VariableType->getAsCXXRecordDecl())
3115 return RD->hasAttr<TrivialABIAttr>();
3116
3117 return false;
3118}
3119
3120// Warns when the loop variable can be changed to a reference type to
3121// prevent a copy. For instance, if given "for (const Foo x : Range)" suggest
3122// "for (const Foo &x : Range)" if this form does not make a copy.
3124 const VarDecl *VD) {
3125 const Expr *InitExpr = VD->getInit();
3126 if (!InitExpr)
3127 return;
3128
3129 QualType VariableType = VD->getType();
3130
3131 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(InitExpr)) {
3132 if (!CE->getConstructor()->isCopyConstructor())
3133 return;
3134 } else if (const CastExpr *CE = dyn_cast<CastExpr>(InitExpr)) {
3135 if (CE->getCastKind() != CK_LValueToRValue)
3136 return;
3137 } else {
3138 return;
3139 }
3140
3141 // Small trivially copyable types are cheap to copy. Do not emit the
3142 // diagnostic for these instances. 64 bytes is a common size of a cache line.
3143 // (The function `getTypeSize` returns the size in bits.)
3144 ASTContext &Ctx = SemaRef.Context;
3145 if (Ctx.getTypeSize(VariableType) <= 64 * 8 &&
3146 (VariableType.isTriviallyCopyConstructibleType(Ctx) ||
3147 hasTrivialABIAttr(VariableType)))
3148 return;
3149
3150 // Suggest changing from a const variable to a const reference variable
3151 // if doing so will prevent a copy.
3152 SemaRef.Diag(VD->getLocation(), diag::warn_for_range_copy)
3153 << VD << VariableType;
3154 SemaRef.Diag(VD->getBeginLoc(), diag::note_use_reference_type)
3155 << SemaRef.Context.getLValueReferenceType(VariableType)
3156 << VD->getSourceRange()
3158}
3159
3160/// DiagnoseForRangeVariableCopies - Diagnose three cases and fixes for them.
3161/// 1) for (const foo &x : foos) where foos only returns a copy. Suggest
3162/// using "const foo x" to show that a copy is made
3163/// 2) for (const bar &x : foos) where bar is a temporary initialized by bar.
3164/// Suggest either "const bar x" to keep the copying or "const foo& x" to
3165/// prevent the copy.
3166/// 3) for (const foo x : foos) where x is constructed from a reference foo.
3167/// Suggest "const foo &x" to prevent the copy.
3169 const CXXForRangeStmt *ForStmt) {
3170 if (SemaRef.inTemplateInstantiation())
3171 return;
3172
3174 if (SemaRef.Diags.isIgnored(
3175 diag::warn_for_range_const_ref_binds_temp_built_from_ref, Loc) &&
3176 SemaRef.Diags.isIgnored(diag::warn_for_range_ref_binds_ret_temp, Loc) &&
3177 SemaRef.Diags.isIgnored(diag::warn_for_range_copy, Loc)) {
3178 return;
3179 }
3180
3181 const VarDecl *VD = ForStmt->getLoopVariable();
3182 if (!VD)
3183 return;
3184
3185 QualType VariableType = VD->getType();
3186
3187 if (VariableType->isIncompleteType())
3188 return;
3189
3190 const Expr *InitExpr = VD->getInit();
3191 if (!InitExpr)
3192 return;
3193
3194 if (InitExpr->getExprLoc().isMacroID())
3195 return;
3196
3197 if (VariableType->isReferenceType()) {
3199 ForStmt->getRangeInit()->getType());
3200 } else if (VariableType.isConstQualified()) {
3202 }
3203}
3204
3206 if (!S || !B)
3207 return StmtError();
3208
3209 if (isa<ObjCForCollectionStmt>(S))
3210 return ObjC().FinishObjCForCollectionStmt(S, B);
3211
3212 CXXForRangeStmt *ForStmt = cast<CXXForRangeStmt>(S);
3213 ForStmt->setBody(B);
3214
3216 diag::warn_empty_range_based_for_body);
3217
3219
3220 return S;
3221}
3222
3224 SourceLocation LabelLoc,
3225 LabelDecl *TheDecl) {
3227
3228 // If this goto is in a compute construct scope, we need to make sure we check
3229 // gotos in/out.
3230 if (getCurScope()->isInOpenACCComputeConstructScope())
3232
3233 TheDecl->markUsed(Context);
3234 return new (Context) GotoStmt(TheDecl, GotoLoc, LabelLoc);
3235}
3236
3239 Expr *E) {
3240 // Convert operand to void*
3241 if (!E->isTypeDependent()) {
3242 QualType ETy = E->getType();
3244 ExprResult ExprRes = E;
3245 AssignConvertType ConvTy =
3246 CheckSingleAssignmentConstraints(DestTy, ExprRes);
3247 if (ExprRes.isInvalid())
3248 return StmtError();
3249 E = ExprRes.get();
3250 if (DiagnoseAssignmentResult(ConvTy, StarLoc, DestTy, ETy, E,
3252 return StmtError();
3253 }
3254
3255 ExprResult ExprRes = ActOnFinishFullExpr(E, /*DiscardedValue*/ false);
3256 if (ExprRes.isInvalid())
3257 return StmtError();
3258 E = ExprRes.get();
3259
3261
3262 // If this goto is in a compute construct scope, we need to make sure we
3263 // check gotos in/out.
3264 if (getCurScope()->isInOpenACCComputeConstructScope())
3266
3267 return new (Context) IndirectGotoStmt(GotoLoc, StarLoc, E);
3268}
3269
3271 const Scope &DestScope) {
3272 if (!S.CurrentSEHFinally.empty() &&
3273 DestScope.Contains(*S.CurrentSEHFinally.back())) {
3274 S.Diag(Loc, diag::warn_jump_out_of_seh_finally);
3275 }
3276}
3277
3279 SourceLocation KWLoc,
3281 SourceLocation LabelLoc,
3282 bool IsContinue) {
3283 assert(Target && "not a named break/continue?");
3284 Scope *Found = nullptr;
3285 for (Scope *Scope = CurScope; Scope; Scope = Scope->getParent()) {
3286 if (Scope->isFunctionScope())
3287 break;
3288
3290 S.Diag(KWLoc, diag::err_acc_branch_in_out_compute_construct)
3291 << /*branch*/ 0 << /*out of*/ 0;
3292 return nullptr;
3293 }
3294
3297 Found = Scope;
3298 break;
3299 }
3300 }
3301
3302 if (Found) {
3303 if (IsContinue && !Found->isContinueScope()) {
3304 S.Diag(LabelLoc, diag::err_continue_switch);
3305 return nullptr;
3306 }
3307 return Found;
3308 }
3309
3310 S.Diag(LabelLoc, diag::err_break_continue_label_not_found) << IsContinue;
3311 return nullptr;
3312}
3313
3315 LabelDecl *Target, SourceLocation LabelLoc) {
3316 Scope *S;
3317 if (Target) {
3318 S = FindLabeledBreakContinueScope(*this, CurScope, ContinueLoc, Target,
3319 LabelLoc,
3320 /*IsContinue=*/true);
3321 if (!S)
3322 return StmtError();
3323 } else {
3324 S = CurScope->getContinueParent();
3325 }
3326
3327 if (!S) {
3328 // C99 6.8.6.2p1: A break shall appear only in or as a loop body.
3329 return StmtError(Diag(ContinueLoc, diag::err_continue_not_in_loop));
3330 }
3331 if (S->isConditionVarScope()) {
3332 // We cannot 'continue;' from within a statement expression in the
3333 // initializer of a condition variable because we would jump past the
3334 // initialization of that variable.
3335 return StmtError(Diag(ContinueLoc, diag::err_continue_from_cond_var_init));
3336 }
3337
3338 // A 'continue' that would normally have execution continue on a block outside
3339 // of a compute construct counts as 'branching out of' the compute construct,
3340 // so diagnose here.
3341 if (S->isOpenACCComputeConstructScope())
3342 return StmtError(
3343 Diag(ContinueLoc, diag::err_acc_branch_in_out_compute_construct)
3344 << /*branch*/ 0 << /*out of */ 0);
3345
3346 CheckJumpOutOfSEHFinally(*this, ContinueLoc, *S);
3347
3348 return new (Context) ContinueStmt(ContinueLoc, LabelLoc, Target);
3349}
3350
3352 LabelDecl *Target, SourceLocation LabelLoc) {
3353 Scope *S;
3354 if (Target) {
3355 S = FindLabeledBreakContinueScope(*this, CurScope, BreakLoc, Target,
3356 LabelLoc,
3357 /*IsContinue=*/false);
3358 if (!S)
3359 return StmtError();
3360 } else {
3361 S = CurScope->getBreakParent();
3362 }
3363
3364 if (!S) {
3365 // C99 6.8.6.3p1: A break shall appear only in or as a switch/loop body.
3366 return StmtError(Diag(BreakLoc, diag::err_break_not_in_loop_or_switch));
3367 }
3368
3369 if (S->isOpenMPLoopScope())
3370 return StmtError(Diag(BreakLoc, diag::err_omp_loop_cannot_use_stmt)
3371 << "break");
3372
3373 // OpenACC doesn't allow 'break'ing from a compute construct, so diagnose if
3374 // we are trying to do so. This can come in 2 flavors: 1-the break'able thing
3375 // (besides the compute construct) 'contains' the compute construct, at which
3376 // point the 'break' scope will be the compute construct. Else it could be a
3377 // loop of some sort that has a direct parent of the compute construct.
3378 // However, a 'break' in a 'switch' marked as a compute construct doesn't
3379 // count as 'branch out of' the compute construct.
3380 if (S->isOpenACCComputeConstructScope() ||
3381 (S->isLoopScope() && S->getParent() &&
3382 S->getParent()->isOpenACCComputeConstructScope()))
3383 return StmtError(
3384 Diag(BreakLoc, diag::err_acc_branch_in_out_compute_construct)
3385 << /*branch*/ 0 << /*out of */ 0);
3386
3387 CheckJumpOutOfSEHFinally(*this, BreakLoc, *S);
3388
3389 return new (Context) BreakStmt(BreakLoc, LabelLoc, Target);
3390}
3391
3394 if (!E)
3395 return NamedReturnInfo();
3396 // - in a return statement in a function [where] ...
3397 // ... the expression is the name of a non-volatile automatic object ...
3398 const auto *DR = dyn_cast<DeclRefExpr>(E->IgnoreParens());
3399 if (!DR || DR->refersToEnclosingVariableOrCapture())
3400 return NamedReturnInfo();
3401 const auto *VD = dyn_cast<VarDecl>(DR->getDecl());
3402 if (!VD)
3403 return NamedReturnInfo();
3404 if (VD->getInit() && VD->getInit()->containsErrors())
3405 return NamedReturnInfo();
3407 if (Res.Candidate && !E->isXValue() &&
3412 CK_NoOp, E, nullptr, VK_XValue,
3414 }
3415 return Res;
3416}
3417
3420
3421 // C++20 [class.copy.elision]p3:
3422 // - in a return statement in a function with ...
3423 // (other than a function ... parameter)
3424 if (VD->getKind() == Decl::ParmVar)
3426 else if (VD->getKind() != Decl::Var)
3427 return NamedReturnInfo();
3428
3429 // (other than ... a catch-clause parameter)
3430 if (VD->isExceptionVariable())
3432
3433 // ...automatic...
3434 if (!VD->hasLocalStorage())
3435 return NamedReturnInfo();
3436
3437 // We don't want to implicitly move out of a __block variable during a return
3438 // because we cannot assume the variable will no longer be used.
3439 if (VD->hasAttr<BlocksAttr>())
3440 return NamedReturnInfo();
3441
3442 QualType VDType = VD->getType();
3443 if (VDType->isObjectType()) {
3444 // C++17 [class.copy.elision]p3:
3445 // ...non-volatile automatic object...
3446 if (VDType.isVolatileQualified())
3447 return NamedReturnInfo();
3448 } else if (VDType->isRValueReferenceType()) {
3449 // C++20 [class.copy.elision]p3:
3450 // ...either a non-volatile object or an rvalue reference to a non-volatile
3451 // object type...
3452 QualType VDReferencedType = VDType.getNonReferenceType();
3453 if (VDReferencedType.isVolatileQualified() ||
3454 !VDReferencedType->isObjectType())
3455 return NamedReturnInfo();
3457 } else {
3458 return NamedReturnInfo();
3459 }
3460
3461 // Variables with higher required alignment than their type's ABI
3462 // alignment cannot use NRVO.
3463 if (!VD->hasDependentAlignment() && !VDType->isIncompleteType() &&
3466
3467 return Info;
3468}
3469
3471 QualType ReturnType) {
3472 if (!Info.Candidate)
3473 return nullptr;
3474
3475 auto invalidNRVO = [&] {
3476 Info = NamedReturnInfo();
3477 return nullptr;
3478 };
3479
3480 // If we got a non-deduced auto ReturnType, we are in a dependent context and
3481 // there is no point in allowing copy elision since we won't have it deduced
3482 // by the point the VardDecl is instantiated, which is the last chance we have
3483 // of deciding if the candidate is really copy elidable.
3484 if ((ReturnType->getTypeClass() == Type::TypeClass::Auto &&
3485 ReturnType->isCanonicalUnqualified()) ||
3486 ReturnType->isSpecificBuiltinType(BuiltinType::Dependent))
3487 return invalidNRVO();
3488
3489 if (!ReturnType->isDependentType()) {
3490 // - in a return statement in a function with ...
3491 // ... a class return type ...
3492 if (!ReturnType->isRecordType())
3493 return invalidNRVO();
3494
3495 QualType VDType = Info.Candidate->getType();
3496 // ... the same cv-unqualified type as the function return type ...
3497 // When considering moving this expression out, allow dissimilar types.
3498 if (!VDType->isDependentType() &&
3499 !Context.hasSameUnqualifiedType(ReturnType, VDType))
3501 }
3502 return Info.isCopyElidable() ? Info.Candidate : nullptr;
3503}
3504
3505/// Verify that the initialization sequence that was picked for the
3506/// first overload resolution is permissible under C++98.
3507///
3508/// Reject (possibly converting) constructors not taking an rvalue reference,
3509/// or user conversion operators which are not ref-qualified.
3510static bool
3512 const InitializationSequence &Seq) {
3513 const auto *Step = llvm::find_if(Seq.steps(), [](const auto &Step) {
3514 return Step.Kind == InitializationSequence::SK_ConstructorInitialization ||
3515 Step.Kind == InitializationSequence::SK_UserConversion;
3516 });
3517 if (Step != Seq.step_end()) {
3518 const auto *FD = Step->Function.Function;
3519 if (isa<CXXConstructorDecl>(FD)
3521 : cast<CXXMethodDecl>(FD)->getRefQualifier() == RQ_None)
3522 return false;
3523 }
3524 return true;
3525}
3526
3528 const InitializedEntity &Entity, const NamedReturnInfo &NRInfo, Expr *Value,
3529 bool SupressSimplerImplicitMoves) {
3530 if (getLangOpts().CPlusPlus &&
3531 (!getLangOpts().CPlusPlus23 || SupressSimplerImplicitMoves) &&
3532 NRInfo.isMoveEligible()) {
3534 CK_NoOp, Value, VK_XValue, FPOptionsOverride());
3535 Expr *InitExpr = &AsRvalue;
3536 auto Kind = InitializationKind::CreateCopy(Value->getBeginLoc(),
3537 Value->getBeginLoc());
3538 InitializationSequence Seq(*this, Entity, Kind, InitExpr);
3539 auto Res = Seq.getFailedOverloadResult();
3540 if ((Res == OR_Success || Res == OR_Deleted) &&
3543 // Promote "AsRvalue" to the heap, since we now need this
3544 // expression node to persist.
3545 Value =
3547 nullptr, VK_XValue, FPOptionsOverride());
3548 // Complete type-checking the initialization of the return type
3549 // using the constructor we found.
3550 return Seq.Perform(*this, Entity, Kind, Value);
3551 }
3552 }
3553 // Either we didn't meet the criteria for treating an lvalue as an rvalue,
3554 // above, or overload resolution failed. Either way, we need to try
3555 // (again) now with the return value expression as written.
3557}
3558
3559/// Determine whether the declared return type of the specified function
3560/// contains 'auto'.
3562 const FunctionProtoType *FPT =
3564 return FPT->getReturnType()->isUndeducedType();
3565}
3566
3568 Expr *RetValExp,
3569 NamedReturnInfo &NRInfo,
3570 bool SupressSimplerImplicitMoves) {
3571 // If this is the first return we've seen, infer the return type.
3572 // [expr.prim.lambda]p4 in C++11; block literals follow the same rules.
3573 CapturingScopeInfo *CurCap = cast<CapturingScopeInfo>(getCurFunction());
3574 QualType FnRetType = CurCap->ReturnType;
3575 LambdaScopeInfo *CurLambda = dyn_cast<LambdaScopeInfo>(CurCap);
3576 if (CurLambda && CurLambda->CallOperator->getType().isNull())
3577 return StmtError();
3578 bool HasDeducedReturnType =
3579 CurLambda && hasDeducedReturnType(CurLambda->CallOperator);
3580
3581 if (ExprEvalContexts.back().isDiscardedStatementContext() &&
3582 (HasDeducedReturnType || CurCap->HasImplicitReturnType)) {
3583 if (RetValExp) {
3584 ExprResult ER =
3585 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
3586 if (ER.isInvalid())
3587 return StmtError();
3588 RetValExp = ER.get();
3589 }
3590 return ReturnStmt::Create(Context, ReturnLoc, RetValExp,
3591 /* NRVOCandidate=*/nullptr);
3592 }
3593
3594 if (HasDeducedReturnType) {
3595 FunctionDecl *FD = CurLambda->CallOperator;
3596 // If we've already decided this lambda is invalid, e.g. because
3597 // we saw a `return` whose expression had an error, don't keep
3598 // trying to deduce its return type.
3599 if (FD->isInvalidDecl())
3600 return StmtError();
3601 // In C++1y, the return type may involve 'auto'.
3602 // FIXME: Blocks might have a return type of 'auto' explicitly specified.
3603 if (CurCap->ReturnType.isNull())
3604 CurCap->ReturnType = FD->getReturnType();
3605
3606 AutoType *AT = CurCap->ReturnType->getContainedAutoType();
3607 assert(AT && "lost auto type from lambda return type");
3608 if (DeduceFunctionTypeFromReturnExpr(FD, ReturnLoc, RetValExp, AT)) {
3609 FD->setInvalidDecl();
3610 // FIXME: preserve the ill-formed return expression.
3611 return StmtError();
3612 }
3613 CurCap->ReturnType = FnRetType = FD->getReturnType();
3614 } else if (CurCap->HasImplicitReturnType) {
3615 // For blocks/lambdas with implicit return types, we check each return
3616 // statement individually, and deduce the common return type when the block
3617 // or lambda is completed.
3618 // FIXME: Fold this into the 'auto' codepath above.
3619 if (RetValExp && !isa<InitListExpr>(RetValExp)) {
3621 if (Result.isInvalid())
3622 return StmtError();
3623 RetValExp = Result.get();
3624
3625 // DR1048: even prior to C++14, we should use the 'auto' deduction rules
3626 // when deducing a return type for a lambda-expression (or by extension
3627 // for a block). These rules differ from the stated C++11 rules only in
3628 // that they remove top-level cv-qualifiers.
3630 FnRetType = RetValExp->getType().getUnqualifiedType();
3631 else
3632 FnRetType = CurCap->ReturnType = Context.DependentTy;
3633 } else {
3634 if (RetValExp) {
3635 // C++11 [expr.lambda.prim]p4 bans inferring the result from an
3636 // initializer list, because it is not an expression (even
3637 // though we represent it as one). We still deduce 'void'.
3638 Diag(ReturnLoc, diag::err_lambda_return_init_list)
3639 << RetValExp->getSourceRange();
3640 }
3641
3642 FnRetType = Context.VoidTy;
3643 }
3644
3645 // Although we'll properly infer the type of the block once it's completed,
3646 // make sure we provide a return type now for better error recovery.
3647 if (CurCap->ReturnType.isNull())
3648 CurCap->ReturnType = FnRetType;
3649 }
3650 const VarDecl *NRVOCandidate = getCopyElisionCandidate(NRInfo, FnRetType);
3651
3652 if (auto *CurBlock = dyn_cast<BlockScopeInfo>(CurCap)) {
3653 if (CurBlock->FunctionType->castAs<FunctionType>()->getNoReturnAttr()) {
3654 Diag(ReturnLoc, diag::err_noreturn_has_return_expr)
3655 << diag::FalloffFunctionKind::Block;
3656 return StmtError();
3657 }
3658 } else if (auto *CurRegion = dyn_cast<CapturedRegionScopeInfo>(CurCap)) {
3659 Diag(ReturnLoc, diag::err_return_in_captured_stmt) << CurRegion->getRegionName();
3660 return StmtError();
3661 } else {
3662 assert(CurLambda && "unknown kind of captured scope");
3663 if (CurLambda->CallOperator->getType()
3664 ->castAs<FunctionType>()
3665 ->getNoReturnAttr()) {
3666 Diag(ReturnLoc, diag::err_noreturn_has_return_expr)
3667 << diag::FalloffFunctionKind::Lambda;
3668 return StmtError();
3669 }
3670 }
3671
3672 // Otherwise, verify that this result type matches the previous one. We are
3673 // pickier with blocks than for normal functions because we don't have GCC
3674 // compatibility to worry about here.
3675 if (FnRetType->isDependentType()) {
3676 // Delay processing for now. TODO: there are lots of dependent
3677 // types we can conclusively prove aren't void.
3678 } else if (FnRetType->isVoidType()) {
3679 if (RetValExp && !isa<InitListExpr>(RetValExp) &&
3680 !(getLangOpts().CPlusPlus &&
3681 (RetValExp->isTypeDependent() ||
3682 RetValExp->getType()->isVoidType()))) {
3683 if (!getLangOpts().CPlusPlus &&
3684 RetValExp->getType()->isVoidType())
3685 Diag(ReturnLoc, diag::ext_return_has_void_expr) << "literal" << 2;
3686 else {
3687 Diag(ReturnLoc, diag::err_return_block_has_expr);
3688 RetValExp = nullptr;
3689 }
3690 }
3691 } else if (!RetValExp) {
3692 return StmtError(Diag(ReturnLoc, diag::err_block_return_missing_expr));
3693 } else if (!RetValExp->isTypeDependent()) {
3694 // we have a non-void block with an expression, continue checking
3695
3696 // C99 6.8.6.4p3(136): The return statement is not an assignment. The
3697 // overlap restriction of subclause 6.5.16.1 does not apply to the case of
3698 // function return.
3699
3700 // In C++ the return statement is handled via a copy initialization.
3701 // the C version of which boils down to CheckSingleAssignmentConstraints.
3702 InitializedEntity Entity =
3703 InitializedEntity::InitializeResult(ReturnLoc, FnRetType);
3705 Entity, NRInfo, RetValExp, SupressSimplerImplicitMoves);
3706 if (Res.isInvalid()) {
3707 // FIXME: Cleanup temporaries here, anyway?
3708 return StmtError();
3709 }
3710 RetValExp = Res.get();
3711 CheckReturnValExpr(RetValExp, FnRetType, ReturnLoc);
3712 }
3713
3714 if (RetValExp) {
3715 ExprResult ER =
3716 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
3717 if (ER.isInvalid())
3718 return StmtError();
3719 RetValExp = ER.get();
3720 }
3721 auto *Result =
3722 ReturnStmt::Create(Context, ReturnLoc, RetValExp, NRVOCandidate);
3723
3724 // If we need to check for the named return value optimization,
3725 // or if we need to infer the return type,
3726 // save the return statement in our scope for later processing.
3727 if (CurCap->HasImplicitReturnType || NRVOCandidate)
3728 FunctionScopes.back()->Returns.push_back(Result);
3729
3730 if (FunctionScopes.back()->FirstReturnLoc.isInvalid())
3731 FunctionScopes.back()->FirstReturnLoc = ReturnLoc;
3732
3733 if (auto *CurBlock = dyn_cast<BlockScopeInfo>(CurCap);
3734 CurBlock && CurCap->HasImplicitReturnType && RetValExp &&
3735 RetValExp->containsErrors())
3736 CurBlock->TheDecl->setInvalidDecl();
3737
3738 return Result;
3739}
3740
3741namespace {
3742/// Marks all typedefs in all local classes in a type referenced.
3743///
3744/// In a function like
3745/// auto f() {
3746/// struct S { typedef int a; };
3747/// return S();
3748/// }
3749///
3750/// the local type escapes and could be referenced in some TUs but not in
3751/// others. Pretend that all local typedefs are always referenced, to not warn
3752/// on this. This isn't necessary if f has internal linkage, or the typedef
3753/// is private.
3754class LocalTypedefNameReferencer : public DynamicRecursiveASTVisitor {
3755public:
3756 LocalTypedefNameReferencer(Sema &S) : S(S) {}
3757 bool VisitRecordType(RecordType *RT) override;
3758
3759private:
3760 Sema &S;
3761};
3762bool LocalTypedefNameReferencer::VisitRecordType(RecordType *RT) {
3763 auto *R = dyn_cast<CXXRecordDecl>(RT->getOriginalDecl());
3764 if (!R || !R->isLocalClass() || !R->isLocalClass()->isExternallyVisible() ||
3765 R->isDependentType())
3766 return true;
3767 for (auto *TmpD : R->decls())
3768 if (auto *T = dyn_cast<TypedefNameDecl>(TmpD))
3769 if (T->getAccess() != AS_private || R->hasFriends())
3770 S.MarkAnyDeclReferenced(T->getLocation(), T, /*OdrUse=*/false);
3771 return true;
3772}
3773}
3774
3776 return FD->getTypeSourceInfo()
3777 ->getTypeLoc()
3779 .getReturnLoc();
3780}
3781
3783 SourceLocation ReturnLoc,
3784 Expr *RetExpr, const AutoType *AT) {
3785 // If this is the conversion function for a lambda, we choose to deduce its
3786 // type from the corresponding call operator, not from the synthesized return
3787 // statement within it. See Sema::DeduceReturnType.
3789 return false;
3790
3791 if (isa_and_nonnull<InitListExpr>(RetExpr)) {
3792 // If the deduction is for a return statement and the initializer is
3793 // a braced-init-list, the program is ill-formed.
3794 Diag(RetExpr->getExprLoc(),
3795 getCurLambda() ? diag::err_lambda_return_init_list
3796 : diag::err_auto_fn_return_init_list)
3797 << RetExpr->getSourceRange();
3798 return true;
3799 }
3800
3801 if (FD->isDependentContext()) {
3802 // C++1y [dcl.spec.auto]p12:
3803 // Return type deduction [...] occurs when the definition is
3804 // instantiated even if the function body contains a return
3805 // statement with a non-type-dependent operand.
3806 assert(AT->isDeduced() && "should have deduced to dependent type");
3807 return false;
3808 }
3809
3810 TypeLoc OrigResultType = getReturnTypeLoc(FD);
3811 // In the case of a return with no operand, the initializer is considered
3812 // to be void().
3814 if (!RetExpr) {
3815 // For a function with a deduced result type to return with omitted
3816 // expression, the result type as written must be 'auto' or
3817 // 'decltype(auto)', possibly cv-qualified or constrained, but not
3818 // ref-qualified.
3819 if (!OrigResultType.getType()->getAs<AutoType>()) {
3820 Diag(ReturnLoc, diag::err_auto_fn_return_void_but_not_auto)
3821 << OrigResultType.getType();
3822 return true;
3823 }
3824 RetExpr = &VoidVal;
3825 }
3826
3827 QualType Deduced = AT->getDeducedType();
3828 {
3829 // Otherwise, [...] deduce a value for U using the rules of template
3830 // argument deduction.
3831 auto RetExprLoc = RetExpr->getExprLoc();
3832 TemplateDeductionInfo Info(RetExprLoc);
3833 SourceLocation TemplateSpecLoc;
3834 if (RetExpr->getType() == Context.OverloadTy) {
3835 auto FindResult = OverloadExpr::find(RetExpr);
3836 if (FindResult.Expression)
3837 TemplateSpecLoc = FindResult.Expression->getNameLoc();
3838 }
3839 TemplateSpecCandidateSet FailedTSC(TemplateSpecLoc);
3841 OrigResultType, RetExpr, Deduced, Info, /*DependentDeduction=*/false,
3842 /*IgnoreConstraints=*/false, &FailedTSC);
3844 return true;
3845 switch (Res) {
3847 break;
3849 return true;
3851 // If a function with a declared return type that contains a placeholder
3852 // type has multiple return statements, the return type is deduced for
3853 // each return statement. [...] if the type deduced is not the same in
3854 // each deduction, the program is ill-formed.
3855 const LambdaScopeInfo *LambdaSI = getCurLambda();
3856 if (LambdaSI && LambdaSI->HasImplicitReturnType)
3857 Diag(ReturnLoc, diag::err_typecheck_missing_return_type_incompatible)
3858 << Info.SecondArg << Info.FirstArg << true /*IsLambda*/;
3859 else
3860 Diag(ReturnLoc, diag::err_auto_fn_different_deductions)
3861 << (AT->isDecltypeAuto() ? 1 : 0) << Info.SecondArg
3862 << Info.FirstArg;
3863 return true;
3864 }
3865 default:
3866 Diag(RetExpr->getExprLoc(), diag::err_auto_fn_deduction_failure)
3867 << OrigResultType.getType() << RetExpr->getType();
3868 FailedTSC.NoteCandidates(*this, RetExprLoc);
3869 return true;
3870 }
3871 }
3872
3873 // If a local type is part of the returned type, mark its fields as
3874 // referenced.
3875 LocalTypedefNameReferencer(*this).TraverseType(RetExpr->getType());
3876
3877 // CUDA: Kernel function must have 'void' return type.
3878 if (getLangOpts().CUDA && FD->hasAttr<CUDAGlobalAttr>() &&
3879 !Deduced->isVoidType()) {
3880 Diag(FD->getLocation(), diag::err_kern_type_not_void_return)
3881 << FD->getType() << FD->getSourceRange();
3882 return true;
3883 }
3884
3885 if (!FD->isInvalidDecl() && AT->getDeducedType() != Deduced)
3886 // Update all declarations of the function to have the deduced return type.
3888
3889 return false;
3890}
3891
3894 Scope *CurScope) {
3895 ExprResult RetVal = RetValExp;
3896 if (RetVal.isInvalid())
3897 return StmtError();
3898
3899 if (getCurScope()->isInOpenACCComputeConstructScope())
3900 return StmtError(
3901 Diag(ReturnLoc, diag::err_acc_branch_in_out_compute_construct)
3902 << /*return*/ 1 << /*out of */ 0);
3903
3904 // using plain return in a coroutine is not allowed.
3906 if (FSI->FirstReturnLoc.isInvalid() && FSI->isCoroutine()) {
3907 assert(FSI->FirstCoroutineStmtLoc.isValid() &&
3908 "first coroutine location not set");
3909 Diag(ReturnLoc, diag::err_return_in_coroutine);
3910 Diag(FSI->FirstCoroutineStmtLoc, diag::note_declared_coroutine_here)
3912 }
3913
3914 CheckInvalidBuiltinCountedByRef(RetVal.get(),
3916
3917 StmtResult R =
3918 BuildReturnStmt(ReturnLoc, RetVal.get(), /*AllowRecovery=*/true);
3919 if (R.isInvalid() || ExprEvalContexts.back().isDiscardedStatementContext())
3920 return R;
3921
3922 VarDecl *VD =
3923 const_cast<VarDecl *>(cast<ReturnStmt>(R.get())->getNRVOCandidate());
3924
3925 CurScope->updateNRVOCandidate(VD);
3926
3927 CheckJumpOutOfSEHFinally(*this, ReturnLoc, *CurScope->getFnParent());
3928
3929 return R;
3930}
3931
3933 const Expr *E) {
3934 if (!E || !S.getLangOpts().CPlusPlus23 || !S.getLangOpts().MSVCCompat)
3935 return false;
3936 const Decl *D = E->getReferencedDeclOfCallee();
3937 if (!D || !S.SourceMgr.isInSystemHeader(D->getLocation()))
3938 return false;
3939 for (const DeclContext *DC = D->getDeclContext(); DC; DC = DC->getParent()) {
3940 if (DC->isStdNamespace())
3941 return true;
3942 }
3943 return false;
3944}
3945
3947 bool AllowRecovery) {
3948 // Check for unexpanded parameter packs.
3949 if (RetValExp && DiagnoseUnexpandedParameterPack(RetValExp))
3950 return StmtError();
3951
3952 // HACK: We suppress simpler implicit move here in msvc compatibility mode
3953 // just as a temporary work around, as the MSVC STL has issues with
3954 // this change.
3955 bool SupressSimplerImplicitMoves =
3958 RetValExp, SupressSimplerImplicitMoves ? SimplerImplicitMoveMode::ForceOff
3960
3961 if (isa<CapturingScopeInfo>(getCurFunction()))
3962 return ActOnCapScopeReturnStmt(ReturnLoc, RetValExp, NRInfo,
3963 SupressSimplerImplicitMoves);
3964
3965 QualType FnRetType;
3966 QualType RelatedRetType;
3967 const AttrVec *Attrs = nullptr;
3968 bool isObjCMethod = false;
3969
3970 if (const FunctionDecl *FD = getCurFunctionDecl()) {
3971 FnRetType = FD->getReturnType();
3972 if (FD->hasAttrs())
3973 Attrs = &FD->getAttrs();
3974 if (FD->isNoReturn() && !getCurFunction()->isCoroutine())
3975 Diag(ReturnLoc, diag::warn_noreturn_function_has_return_expr) << FD;
3976 if (FD->isMain() && RetValExp)
3977 if (isa<CXXBoolLiteralExpr>(RetValExp))
3978 Diag(ReturnLoc, diag::warn_main_returns_bool_literal)
3979 << RetValExp->getSourceRange();
3980 if (FD->hasAttr<CmseNSEntryAttr>() && RetValExp) {
3981 if (const auto *RT = dyn_cast<RecordType>(FnRetType.getCanonicalType())) {
3983 Diag(RetValExp->getBeginLoc(), diag::warn_cmse_nonsecure_union) << 1;
3984 }
3985 }
3986 } else if (ObjCMethodDecl *MD = getCurMethodDecl()) {
3987 FnRetType = MD->getReturnType();
3988 isObjCMethod = true;
3989 if (MD->hasAttrs())
3990 Attrs = &MD->getAttrs();
3991 if (MD->hasRelatedResultType() && MD->getClassInterface()) {
3992 // In the implementation of a method with a related return type, the
3993 // type used to type-check the validity of return statements within the
3994 // method body is a pointer to the type of the class being implemented.
3995 RelatedRetType = Context.getObjCInterfaceType(MD->getClassInterface());
3996 RelatedRetType = Context.getObjCObjectPointerType(RelatedRetType);
3997 }
3998 } else // If we don't have a function/method context, bail.
3999 return StmtError();
4000
4001 if (RetValExp) {
4002 const auto *ATy = dyn_cast<ArrayType>(RetValExp->getType());
4003 if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {
4004 Diag(ReturnLoc, diag::err_wasm_table_art) << 1;
4005 return StmtError();
4006 }
4007 }
4008
4009 // C++1z: discarded return statements are not considered when deducing a
4010 // return type.
4011 if (ExprEvalContexts.back().isDiscardedStatementContext() &&
4012 FnRetType->getContainedAutoType()) {
4013 if (RetValExp) {
4014 ExprResult ER =
4015 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
4016 if (ER.isInvalid())
4017 return StmtError();
4018 RetValExp = ER.get();
4019 }
4020 return ReturnStmt::Create(Context, ReturnLoc, RetValExp,
4021 /* NRVOCandidate=*/nullptr);
4022 }
4023
4024 // FIXME: Add a flag to the ScopeInfo to indicate whether we're performing
4025 // deduction.
4026 if (getLangOpts().CPlusPlus14) {
4027 if (AutoType *AT = FnRetType->getContainedAutoType()) {
4028 FunctionDecl *FD = cast<FunctionDecl>(CurContext);
4029 // If we've already decided this function is invalid, e.g. because
4030 // we saw a `return` whose expression had an error, don't keep
4031 // trying to deduce its return type.
4032 // (Some return values may be needlessly wrapped in RecoveryExpr).
4033 if (FD->isInvalidDecl() ||
4034 DeduceFunctionTypeFromReturnExpr(FD, ReturnLoc, RetValExp, AT)) {
4035 FD->setInvalidDecl();
4036 if (!AllowRecovery)
4037 return StmtError();
4038 // The deduction failure is diagnosed and marked, try to recover.
4039 if (RetValExp) {
4040 // Wrap return value with a recovery expression of the previous type.
4041 // If no deduction yet, use DependentTy.
4042 auto Recovery = CreateRecoveryExpr(
4043 RetValExp->getBeginLoc(), RetValExp->getEndLoc(), RetValExp,
4044 AT->isDeduced() ? FnRetType : QualType());
4045 if (Recovery.isInvalid())
4046 return StmtError();
4047 RetValExp = Recovery.get();
4048 } else {
4049 // Nothing to do: a ReturnStmt with no value is fine recovery.
4050 }
4051 } else {
4052 FnRetType = FD->getReturnType();
4053 }
4054 }
4055 }
4056 const VarDecl *NRVOCandidate = getCopyElisionCandidate(NRInfo, FnRetType);
4057
4058 bool HasDependentReturnType = FnRetType->isDependentType();
4059
4060 ReturnStmt *Result = nullptr;
4061 if (FnRetType->isVoidType()) {
4062 if (RetValExp) {
4063 if (auto *ILE = dyn_cast<InitListExpr>(RetValExp)) {
4064 // We simply never allow init lists as the return value of void
4065 // functions. This is compatible because this was never allowed before,
4066 // so there's no legacy code to deal with.
4068 int FunctionKind = 0;
4069 if (isa<ObjCMethodDecl>(CurDecl))
4070 FunctionKind = 1;
4071 else if (isa<CXXConstructorDecl>(CurDecl))
4072 FunctionKind = 2;
4073 else if (isa<CXXDestructorDecl>(CurDecl))
4074 FunctionKind = 3;
4075
4076 Diag(ReturnLoc, diag::err_return_init_list)
4077 << CurDecl << FunctionKind << RetValExp->getSourceRange();
4078
4079 // Preserve the initializers in the AST.
4080 RetValExp = AllowRecovery
4081 ? CreateRecoveryExpr(ILE->getLBraceLoc(),
4082 ILE->getRBraceLoc(), ILE->inits())
4083 .get()
4084 : nullptr;
4085 } else if (!RetValExp->isTypeDependent()) {
4086 // C99 6.8.6.4p1 (ext_ since GCC warns)
4087 unsigned D = diag::ext_return_has_expr;
4088 if (RetValExp->getType()->isVoidType()) {
4090 if (isa<CXXConstructorDecl>(CurDecl) ||
4091 isa<CXXDestructorDecl>(CurDecl))
4092 D = diag::err_ctor_dtor_returns_void;
4093 else
4094 D = diag::ext_return_has_void_expr;
4095 }
4096 else {
4097 ExprResult Result = RetValExp;
4099 if (Result.isInvalid())
4100 return StmtError();
4101 RetValExp = Result.get();
4102 RetValExp = ImpCastExprToType(RetValExp,
4103 Context.VoidTy, CK_ToVoid).get();
4104 }
4105 // return of void in constructor/destructor is illegal in C++.
4106 if (D == diag::err_ctor_dtor_returns_void) {
4108 Diag(ReturnLoc, D) << CurDecl << isa<CXXDestructorDecl>(CurDecl)
4109 << RetValExp->getSourceRange();
4110 }
4111 // return (some void expression); is legal in C++ and C2y.
4112 else if (D != diag::ext_return_has_void_expr ||
4113 (!getLangOpts().CPlusPlus && !getLangOpts().C2y)) {
4115
4116 int FunctionKind = 0;
4117 if (isa<ObjCMethodDecl>(CurDecl))
4118 FunctionKind = 1;
4119 else if (isa<CXXConstructorDecl>(CurDecl))
4120 FunctionKind = 2;
4121 else if (isa<CXXDestructorDecl>(CurDecl))
4122 FunctionKind = 3;
4123
4124 Diag(ReturnLoc, D)
4125 << CurDecl << FunctionKind << RetValExp->getSourceRange();
4126 }
4127 }
4128
4129 if (RetValExp) {
4130 ExprResult ER =
4131 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
4132 if (ER.isInvalid())
4133 return StmtError();
4134 RetValExp = ER.get();
4135 }
4136 }
4137
4138 Result = ReturnStmt::Create(Context, ReturnLoc, RetValExp,
4139 /* NRVOCandidate=*/nullptr);
4140 } else if (!RetValExp && !HasDependentReturnType) {
4142
4143 if ((FD && FD->isInvalidDecl()) || FnRetType->containsErrors()) {
4144 // The intended return type might have been "void", so don't warn.
4145 } else if (getLangOpts().CPlusPlus11 && FD && FD->isConstexpr()) {
4146 // C++11 [stmt.return]p2
4147 Diag(ReturnLoc, diag::err_constexpr_return_missing_expr)
4148 << FD << FD->isConsteval();
4149 FD->setInvalidDecl();
4150 } else {
4151 // C99 6.8.6.4p1 (ext_ since GCC warns)
4152 // C90 6.6.6.4p4
4153 unsigned DiagID = getLangOpts().C99 ? diag::ext_return_missing_expr
4154 : diag::warn_return_missing_expr;
4155 // Note that at this point one of getCurFunctionDecl() or
4156 // getCurMethodDecl() must be non-null (see above).
4157 assert((getCurFunctionDecl() || getCurMethodDecl()) &&
4158 "Not in a FunctionDecl or ObjCMethodDecl?");
4159 bool IsMethod = FD == nullptr;
4160 const NamedDecl *ND =
4161 IsMethod ? cast<NamedDecl>(getCurMethodDecl()) : cast<NamedDecl>(FD);
4162 Diag(ReturnLoc, DiagID) << ND << IsMethod;
4163 }
4164
4165 Result = ReturnStmt::Create(Context, ReturnLoc, /* RetExpr=*/nullptr,
4166 /* NRVOCandidate=*/nullptr);
4167 } else {
4168 assert(RetValExp || HasDependentReturnType);
4169 QualType RetType = RelatedRetType.isNull() ? FnRetType : RelatedRetType;
4170
4171 // C99 6.8.6.4p3(136): The return statement is not an assignment. The
4172 // overlap restriction of subclause 6.5.16.1 does not apply to the case of
4173 // function return.
4174
4175 // In C++ the return statement is handled via a copy initialization,
4176 // the C version of which boils down to CheckSingleAssignmentConstraints.
4177 if (!HasDependentReturnType && !RetValExp->isTypeDependent()) {
4178 // we have a non-void function with an expression, continue checking
4179 InitializedEntity Entity =
4180 InitializedEntity::InitializeResult(ReturnLoc, RetType);
4182 Entity, NRInfo, RetValExp, SupressSimplerImplicitMoves);
4183 if (Res.isInvalid() && AllowRecovery)
4184 Res = CreateRecoveryExpr(RetValExp->getBeginLoc(),
4185 RetValExp->getEndLoc(), RetValExp, RetType);
4186 if (Res.isInvalid()) {
4187 // FIXME: Clean up temporaries here anyway?
4188 return StmtError();
4189 }
4190 RetValExp = Res.getAs<Expr>();
4191
4192 // If we have a related result type, we need to implicitly
4193 // convert back to the formal result type. We can't pretend to
4194 // initialize the result again --- we might end double-retaining
4195 // --- so instead we initialize a notional temporary.
4196 if (!RelatedRetType.isNull()) {
4198 FnRetType);
4199 Res = PerformCopyInitialization(Entity, ReturnLoc, RetValExp);
4200 if (Res.isInvalid()) {
4201 // FIXME: Clean up temporaries here anyway?
4202 return StmtError();
4203 }
4204 RetValExp = Res.getAs<Expr>();
4205 }
4206
4207 CheckReturnValExpr(RetValExp, FnRetType, ReturnLoc, isObjCMethod, Attrs,
4209 }
4210
4211 if (RetValExp) {
4212 ExprResult ER =
4213 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
4214 if (ER.isInvalid())
4215 return StmtError();
4216 RetValExp = ER.get();
4217 }
4218 Result = ReturnStmt::Create(Context, ReturnLoc, RetValExp, NRVOCandidate);
4219 }
4220
4221 // If we need to check for the named return value optimization, save the
4222 // return statement in our scope for later processing.
4223 if (Result->getNRVOCandidate())
4224 FunctionScopes.back()->Returns.push_back(Result);
4225
4226 if (FunctionScopes.back()->FirstReturnLoc.isInvalid())
4227 FunctionScopes.back()->FirstReturnLoc = ReturnLoc;
4228
4229 return Result;
4230}
4231
4234 Stmt *HandlerBlock) {
4235 // There's nothing to test that ActOnExceptionDecl didn't already test.
4236 return new (Context)
4237 CXXCatchStmt(CatchLoc, cast_or_null<VarDecl>(ExDecl), HandlerBlock);
4238}
4239
4240namespace {
4241class CatchHandlerType {
4242 QualType QT;
4243 LLVM_PREFERRED_TYPE(bool)
4244 unsigned IsPointer : 1;
4245
4246 // This is a special constructor to be used only with DenseMapInfo's
4247 // getEmptyKey() and getTombstoneKey() functions.
4248 friend struct llvm::DenseMapInfo<CatchHandlerType>;
4249 enum Unique { ForDenseMap };
4250 CatchHandlerType(QualType QT, Unique) : QT(QT), IsPointer(false) {}
4251
4252public:
4253 /// Used when creating a CatchHandlerType from a handler type; will determine
4254 /// whether the type is a pointer or reference and will strip off the top
4255 /// level pointer and cv-qualifiers.
4256 CatchHandlerType(QualType Q) : QT(Q), IsPointer(false) {
4257 if (QT->isPointerType())
4258 IsPointer = true;
4259
4260 QT = QT.getUnqualifiedType();
4261 if (IsPointer || QT->isReferenceType())
4262 QT = QT->getPointeeType();
4263 }
4264
4265 /// Used when creating a CatchHandlerType from a base class type; pretends the
4266 /// type passed in had the pointer qualifier, does not need to get an
4267 /// unqualified type.
4268 CatchHandlerType(QualType QT, bool IsPointer)
4269 : QT(QT), IsPointer(IsPointer) {}
4270
4271 QualType underlying() const { return QT; }
4272 bool isPointer() const { return IsPointer; }
4273
4274 friend bool operator==(const CatchHandlerType &LHS,
4275 const CatchHandlerType &RHS) {
4276 // If the pointer qualification does not match, we can return early.
4277 if (LHS.IsPointer != RHS.IsPointer)
4278 return false;
4279 // Otherwise, check the underlying type without cv-qualifiers.
4280 return LHS.QT == RHS.QT;
4281 }
4282};
4283} // namespace
4284
4285namespace llvm {
4286template <> struct DenseMapInfo<CatchHandlerType> {
4287 static CatchHandlerType getEmptyKey() {
4288 return CatchHandlerType(DenseMapInfo<QualType>::getEmptyKey(),
4289 CatchHandlerType::ForDenseMap);
4290 }
4291
4292 static CatchHandlerType getTombstoneKey() {
4293 return CatchHandlerType(DenseMapInfo<QualType>::getTombstoneKey(),
4294 CatchHandlerType::ForDenseMap);
4295 }
4296
4297 static unsigned getHashValue(const CatchHandlerType &Base) {
4298 return DenseMapInfo<QualType>::getHashValue(Base.underlying());
4299 }
4300
4301 static bool isEqual(const CatchHandlerType &LHS,
4302 const CatchHandlerType &RHS) {
4303 return LHS == RHS;
4304 }
4305};
4306}
4307
4308namespace {
4309class CatchTypePublicBases {
4310 const llvm::DenseMap<QualType, CXXCatchStmt *> &TypesToCheck;
4311
4312 CXXCatchStmt *FoundHandler;
4313 QualType FoundHandlerType;
4314 QualType TestAgainstType;
4315
4316public:
4317 CatchTypePublicBases(const llvm::DenseMap<QualType, CXXCatchStmt *> &T,
4318 QualType QT)
4319 : TypesToCheck(T), FoundHandler(nullptr), TestAgainstType(QT) {}
4320
4321 CXXCatchStmt *getFoundHandler() const { return FoundHandler; }
4322 QualType getFoundHandlerType() const { return FoundHandlerType; }
4323
4324 bool operator()(const CXXBaseSpecifier *S, CXXBasePath &) {
4325 if (S->getAccessSpecifier() == AccessSpecifier::AS_public) {
4326 QualType Check = S->getType().getCanonicalType();
4327 const auto &M = TypesToCheck;
4328 auto I = M.find(Check);
4329 if (I != M.end()) {
4330 // We're pretty sure we found what we need to find. However, we still
4331 // need to make sure that we properly compare for pointers and
4332 // references, to handle cases like:
4333 //
4334 // } catch (Base *b) {
4335 // } catch (Derived &d) {
4336 // }
4337 //
4338 // where there is a qualification mismatch that disqualifies this
4339 // handler as a potential problem.
4340 if (I->second->getCaughtType()->isPointerType() ==
4341 TestAgainstType->isPointerType()) {
4342 FoundHandler = I->second;
4343 FoundHandlerType = Check;
4344 return true;
4345 }
4346 }
4347 }
4348 return false;
4349 }
4350};
4351}
4352
4354 ArrayRef<Stmt *> Handlers) {
4355 const llvm::Triple &T = Context.getTargetInfo().getTriple();
4356 const bool IsOpenMPGPUTarget =
4357 getLangOpts().OpenMPIsTargetDevice && (T.isNVPTX() || T.isAMDGCN());
4358
4359 DiagnoseExceptionUse(TryLoc, /* IsTry= */ true);
4360
4361 // In OpenMP target regions, we assume that catch is never reached on GPU
4362 // targets.
4363 if (IsOpenMPGPUTarget)
4364 targetDiag(TryLoc, diag::warn_try_not_valid_on_target) << T.str();
4365
4366 // Exceptions aren't allowed in CUDA device code.
4367 if (getLangOpts().CUDA)
4368 CUDA().DiagIfDeviceCode(TryLoc, diag::err_cuda_device_exceptions)
4369 << "try" << CUDA().CurrentTarget();
4370
4371 if (getCurScope() && getCurScope()->isOpenMPSimdDirectiveScope())
4372 Diag(TryLoc, diag::err_omp_simd_region_cannot_use_stmt) << "try";
4373
4375
4376 // C++ try is incompatible with SEH __try.
4377 if (!getLangOpts().Borland && FSI->FirstSEHTryLoc.isValid()) {
4378 Diag(TryLoc, diag::err_mixing_cxx_try_seh_try) << 0;
4379 Diag(FSI->FirstSEHTryLoc, diag::note_conflicting_try_here) << "'__try'";
4380 }
4381
4382 const unsigned NumHandlers = Handlers.size();
4383 assert(!Handlers.empty() &&
4384 "The parser shouldn't call this if there are no handlers.");
4385
4386 llvm::DenseMap<QualType, CXXCatchStmt *> HandledBaseTypes;
4387 llvm::DenseMap<CatchHandlerType, CXXCatchStmt *> HandledTypes;
4388 for (unsigned i = 0; i < NumHandlers; ++i) {
4389 CXXCatchStmt *H = cast<CXXCatchStmt>(Handlers[i]);
4390
4391 // Diagnose when the handler is a catch-all handler, but it isn't the last
4392 // handler for the try block. [except.handle]p5. Also, skip exception
4393 // declarations that are invalid, since we can't usefully report on them.
4394 if (!H->getExceptionDecl()) {
4395 if (i < NumHandlers - 1)
4396 return StmtError(Diag(H->getBeginLoc(), diag::err_early_catch_all));
4397 continue;
4398 } else if (H->getExceptionDecl()->isInvalidDecl())
4399 continue;
4400
4401 // Walk the type hierarchy to diagnose when this type has already been
4402 // handled (duplication), or cannot be handled (derivation inversion). We
4403 // ignore top-level cv-qualifiers, per [except.handle]p3
4404 CatchHandlerType HandlerCHT = H->getCaughtType().getCanonicalType();
4405
4406 // We can ignore whether the type is a reference or a pointer; we need the
4407 // underlying declaration type in order to get at the underlying record
4408 // decl, if there is one.
4409 QualType Underlying = HandlerCHT.underlying();
4410 if (auto *RD = Underlying->getAsCXXRecordDecl()) {
4411 if (!RD->hasDefinition())
4412 continue;
4413 // Check that none of the public, unambiguous base classes are in the
4414 // map ([except.handle]p1). Give the base classes the same pointer
4415 // qualification as the original type we are basing off of. This allows
4416 // comparison against the handler type using the same top-level pointer
4417 // as the original type.
4418 CXXBasePaths Paths;
4419 Paths.setOrigin(RD);
4420 CatchTypePublicBases CTPB(HandledBaseTypes,
4422 if (RD->lookupInBases(CTPB, Paths)) {
4423 const CXXCatchStmt *Problem = CTPB.getFoundHandler();
4424 if (!Paths.isAmbiguous(
4425 CanQualType::CreateUnsafe(CTPB.getFoundHandlerType()))) {
4427 diag::warn_exception_caught_by_earlier_handler)
4428 << H->getCaughtType();
4430 diag::note_previous_exception_handler)
4431 << Problem->getCaughtType();
4432 }
4433 }
4434 // Strip the qualifiers here because we're going to be comparing this
4435 // type to the base type specifiers of a class, which are ignored in a
4436 // base specifier per [class.derived.general]p2.
4437 HandledBaseTypes[Underlying.getUnqualifiedType()] = H;
4438 }
4439
4440 // Add the type the list of ones we have handled; diagnose if we've already
4441 // handled it.
4442 auto R = HandledTypes.insert(
4443 std::make_pair(H->getCaughtType().getCanonicalType(), H));
4444 if (!R.second) {
4445 const CXXCatchStmt *Problem = R.first->second;
4447 diag::warn_exception_caught_by_earlier_handler)
4448 << H->getCaughtType();
4450 diag::note_previous_exception_handler)
4451 << Problem->getCaughtType();
4452 }
4453 }
4454
4455 FSI->setHasCXXTry(TryLoc);
4456
4457 return CXXTryStmt::Create(Context, TryLoc, cast<CompoundStmt>(TryBlock),
4458 Handlers);
4459}
4460
4462 const llvm::Triple &T = Context.getTargetInfo().getTriple();
4463 const bool IsOpenMPGPUTarget =
4464 getLangOpts().OpenMPIsTargetDevice && (T.isNVPTX() || T.isAMDGCN());
4465
4466 // Don't report an error if 'try' is used in system headers or in an OpenMP
4467 // target region compiled for a GPU architecture.
4468 if (IsOpenMPGPUTarget || getLangOpts().CUDA)
4469 // Delay error emission for the OpenMP device code.
4470 return;
4471
4472 if (!getLangOpts().CXXExceptions &&
4475 targetDiag(Loc, diag::err_exceptions_disabled) << (IsTry ? "try" : "throw");
4476}
4477
4479 Stmt *TryBlock, Stmt *Handler) {
4480 assert(TryBlock && Handler);
4481
4483
4484 // SEH __try is incompatible with C++ try. Borland appears to support this,
4485 // however.
4486 if (!getLangOpts().Borland) {
4487 if (FSI->FirstCXXOrObjCTryLoc.isValid()) {
4488 Diag(TryLoc, diag::err_mixing_cxx_try_seh_try) << FSI->FirstTryType;
4489 Diag(FSI->FirstCXXOrObjCTryLoc, diag::note_conflicting_try_here)
4491 ? "'try'"
4492 : "'@try'");
4493 }
4494 }
4495
4496 FSI->setHasSEHTry(TryLoc);
4497
4498 // Reject __try in Obj-C methods, blocks, and captured decls, since we don't
4499 // track if they use SEH.
4500 DeclContext *DC = CurContext;
4501 while (DC && !DC->isFunctionOrMethod())
4502 DC = DC->getParent();
4503 FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(DC);
4504 if (FD)
4505 FD->setUsesSEHTry(true);
4506 else
4507 Diag(TryLoc, diag::err_seh_try_outside_functions);
4508
4509 // Reject __try on unsupported targets.
4511 Diag(TryLoc, diag::err_seh_try_unsupported);
4512
4513 return SEHTryStmt::Create(Context, IsCXXTry, TryLoc, TryBlock, Handler);
4514}
4515
4517 Stmt *Block) {
4518 assert(FilterExpr && Block);
4519 QualType FTy = FilterExpr->getType();
4520 if (!FTy->isIntegerType() && !FTy->isDependentType()) {
4521 return StmtError(
4522 Diag(FilterExpr->getExprLoc(), diag::err_filter_expression_integral)
4523 << FTy);
4524 }
4525 return SEHExceptStmt::Create(Context, Loc, FilterExpr, Block);
4526}
4527
4529 CurrentSEHFinally.push_back(CurScope);
4530}
4531
4533 CurrentSEHFinally.pop_back();
4534}
4535
4537 assert(Block);
4538 CurrentSEHFinally.pop_back();
4540}
4541
4544 Scope *SEHTryParent = CurScope;
4545 while (SEHTryParent && !SEHTryParent->isSEHTryScope())
4546 SEHTryParent = SEHTryParent->getParent();
4547 if (!SEHTryParent)
4548 return StmtError(Diag(Loc, diag::err_ms___leave_not_in___try));
4549 CheckJumpOutOfSEHFinally(*this, Loc, *SEHTryParent);
4550
4551 return new (Context) SEHLeaveStmt(Loc);
4552}
4553
4555 bool IsIfExists,
4556 NestedNameSpecifierLoc QualifierLoc,
4557 DeclarationNameInfo NameInfo,
4558 Stmt *Nested)
4559{
4560 return new (Context) MSDependentExistsStmt(KeywordLoc, IsIfExists,
4561 QualifierLoc, NameInfo,
4562 cast<CompoundStmt>(Nested));
4563}
4564
4565
4567 bool IsIfExists,
4568 CXXScopeSpec &SS,
4569 UnqualifiedId &Name,
4570 Stmt *Nested) {
4571 return BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
4574 Nested);
4575}
4576
4579 unsigned NumParams) {
4580 DeclContext *DC = CurContext;
4581 while (!(DC->isFunctionOrMethod() || DC->isRecord() || DC->isFileContext()))
4582 DC = DC->getParent();
4583
4584 RecordDecl *RD = nullptr;
4585 if (getLangOpts().CPlusPlus)
4587 /*Id=*/nullptr);
4588 else
4590 /*Id=*/nullptr);
4591
4592 RD->setCapturedRecord();
4593 DC->addDecl(RD);
4594 RD->setImplicit();
4595 RD->startDefinition();
4596
4597 assert(NumParams > 0 && "CapturedStmt requires context parameter");
4598 CD = CapturedDecl::Create(Context, CurContext, NumParams);
4599 DC->addDecl(CD);
4600 return RD;
4601}
4602
4603static bool
4606 SmallVectorImpl<Expr *> &CaptureInits) {
4607 for (const sema::Capture &Cap : RSI->Captures) {
4608 if (Cap.isInvalid())
4609 continue;
4610
4611 // Form the initializer for the capture.
4613 RSI->CapRegionKind == CR_OpenMP);
4614
4615 // FIXME: Bail out now if the capture is not used and the initializer has
4616 // no side-effects.
4617
4618 // Create a field for this capture.
4619 FieldDecl *Field = S.BuildCaptureField(RSI->TheRecordDecl, Cap);
4620
4621 // Add the capture to our list of captures.
4622 if (Cap.isThisCapture()) {
4623 Captures.push_back(CapturedStmt::Capture(Cap.getLocation(),
4625 } else if (Cap.isVLATypeCapture()) {
4626 Captures.push_back(
4628 } else {
4629 assert(Cap.isVariableCapture() && "unknown kind of capture");
4630
4631 if (S.getLangOpts().OpenMP && RSI->CapRegionKind == CR_OpenMP)
4632 S.OpenMP().setOpenMPCaptureKind(Field, Cap.getVariable(),
4633 RSI->OpenMPLevel);
4634
4635 Captures.push_back(CapturedStmt::Capture(
4636 Cap.getLocation(),
4639 cast<VarDecl>(Cap.getVariable())));
4640 }
4641 CaptureInits.push_back(Init.get());
4642 }
4643 return false;
4644}
4645
4646static std::optional<int>
4648 if (!S.getLangOpts().OpenMP || Kind != CR_OpenMP)
4649 return {};
4650 if (const FunctionDecl *FD = S.getCurFunctionDecl(/*AllowLambda=*/true)) {
4651 if (IsArmStreamingFunction(FD, /*IncludeLocallyStreaming=*/true))
4652 return /* in streaming functions */ 0;
4653 if (hasArmZAState(FD))
4654 return /* in functions with ZA state */ 1;
4655 if (hasArmZT0State(FD))
4656 return /* in fuctions with ZT0 state */ 2;
4657 }
4658 return {};
4659}
4660
4662 CapturedRegionKind Kind,
4663 unsigned NumParams) {
4664 if (auto ErrorIndex = isOpenMPCapturedRegionInArmSMEFunction(*this, Kind))
4665 Diag(Loc, diag::err_sme_openmp_captured_region) << *ErrorIndex;
4666
4667 CapturedDecl *CD = nullptr;
4668 RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc, NumParams);
4669
4670 // Build the context parameter
4672 IdentifierInfo *ParamName = &Context.Idents.get("__context");
4673 CanQualType ParamType =
4675 auto *Param =
4676 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType,
4678 DC->addDecl(Param);
4679
4680 CD->setContextParam(0, Param);
4681
4682 // Enter the capturing scope for this captured region.
4683 PushCapturedRegionScope(CurScope, CD, RD, Kind);
4684
4685 if (CurScope)
4686 PushDeclContext(CurScope, CD);
4687 else
4688 CurContext = CD;
4689
4692 ExprEvalContexts.back().InImmediateEscalatingFunctionContext = false;
4693}
4694
4696 CapturedRegionKind Kind,
4698 unsigned OpenMPCaptureLevel) {
4699 if (auto ErrorIndex = isOpenMPCapturedRegionInArmSMEFunction(*this, Kind))
4700 Diag(Loc, diag::err_sme_openmp_captured_region) << *ErrorIndex;
4701
4702 CapturedDecl *CD = nullptr;
4703 RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc, Params.size());
4704
4705 // Build the context parameter
4707 bool ContextIsFound = false;
4708 unsigned ParamNum = 0;
4709 for (ArrayRef<CapturedParamNameType>::iterator I = Params.begin(),
4710 E = Params.end();
4711 I != E; ++I, ++ParamNum) {
4712 if (I->second.isNull()) {
4713 assert(!ContextIsFound &&
4714 "null type has been found already for '__context' parameter");
4715 IdentifierInfo *ParamName = &Context.Idents.get("__context");
4716 QualType ParamType =
4718 .withConst()
4719 .withRestrict();
4720 auto *Param =
4721 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType,
4723 DC->addDecl(Param);
4724 CD->setContextParam(ParamNum, Param);
4725 ContextIsFound = true;
4726 } else {
4727 IdentifierInfo *ParamName = &Context.Idents.get(I->first);
4728 auto *Param =
4729 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, I->second,
4731 DC->addDecl(Param);
4732 CD->setParam(ParamNum, Param);
4733 }
4734 }
4735 assert(ContextIsFound && "no null type for '__context' parameter");
4736 if (!ContextIsFound) {
4737 // Add __context implicitly if it is not specified.
4738 IdentifierInfo *ParamName = &Context.Idents.get("__context");
4739 CanQualType ParamType =
4741 auto *Param =
4742 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType,
4744 DC->addDecl(Param);
4745 CD->setContextParam(ParamNum, Param);
4746 }
4747 // Enter the capturing scope for this captured region.
4748 PushCapturedRegionScope(CurScope, CD, RD, Kind, OpenMPCaptureLevel);
4749
4750 if (CurScope)
4751 PushDeclContext(CurScope, CD);
4752 else
4753 CurContext = CD;
4754
4757}
4758
4764 CapturedRegionScopeInfo *RSI = cast<CapturedRegionScopeInfo>(ScopeRAII.get());
4765
4768
4769 SmallVector<Decl*, 4> Fields(Record->fields());
4770 ActOnFields(/*Scope=*/nullptr, Record->getLocation(), Record, Fields,
4772}
4773
4775 // Leave the captured scope before we start creating captures in the
4776 // enclosing scope.
4781 CapturedRegionScopeInfo *RSI = cast<CapturedRegionScopeInfo>(ScopeRAII.get());
4782
4784 SmallVector<Expr *, 4> CaptureInits;
4785 if (buildCapturedStmtCaptureList(*this, RSI, Captures, CaptureInits))
4786 return StmtError();
4787
4788 CapturedDecl *CD = RSI->TheCapturedDecl;
4789 RecordDecl *RD = RSI->TheRecordDecl;
4790
4792 getASTContext(), S, static_cast<CapturedRegionKind>(RSI->CapRegionKind),
4793 Captures, CaptureInits, CD, RD);
4794
4795 CD->setBody(Res->getCapturedStmt());
4796 RD->completeDefinition();
4797
4798 return Res;
4799}
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
const Decl * D
Expr * E
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Target Target
Definition: MachO.h:51
llvm::MachO::Record Record
Definition: MachO.h:31
Defines the clang::Preprocessor interface.
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis for CUDA constructs.
SourceRange Range
Definition: SemaObjC.cpp:753
SourceLocation Loc
Definition: SemaObjC.cpp:754
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
@ ft_different_class
@ ft_parameter_mismatch
@ ft_return_type
@ ft_parameter_arity
static bool CmpEnumVals(const std::pair< llvm::APSInt, EnumConstantDecl * > &lhs, const std::pair< llvm::APSInt, EnumConstantDecl * > &rhs)
CmpEnumVals - Comparison predicate for sorting enumeration values.
Definition: SemaStmt.cpp:1082
static bool FinishForRangeVarDecl(Sema &SemaRef, VarDecl *Decl, Expr *Init, SourceLocation Loc, int DiagID)
Finish building a variable declaration for a for-range statement.
Definition: SemaStmt.cpp:2333
static bool CmpCaseVals(const std::pair< llvm::APSInt, CaseStmt * > &lhs, const std::pair< llvm::APSInt, CaseStmt * > &rhs)
CmpCaseVals - Comparison predicate for sorting case values.
Definition: SemaStmt.cpp:1069
SmallVector< std::pair< llvm::APSInt, EnumConstantDecl * >, 64 > EnumValsTy
Definition: SemaStmt.cpp:1233
static bool ShouldDiagnoseSwitchCaseNotInEnum(const Sema &S, const EnumDecl *ED, const Expr *CaseExpr, EnumValsTy::iterator &EI, EnumValsTy::iterator &EIEnd, const llvm::APSInt &Val)
Returns true if we should emit a diagnostic about this case expression not being a part of the enum u...
Definition: SemaStmt.cpp:1237
static bool DiagnoseUnusedComparison(Sema &S, const Expr *E)
Diagnose unused comparisons, both builtin and overloaded operators.
Definition: SemaStmt.cpp:131
static Scope * FindLabeledBreakContinueScope(Sema &S, Scope *CurScope, SourceLocation KWLoc, LabelDecl *Target, SourceLocation LabelLoc, bool IsContinue)
Definition: SemaStmt.cpp:3278
static bool EqEnumVals(const std::pair< llvm::APSInt, EnumConstantDecl * > &lhs, const std::pair< llvm::APSInt, EnumConstantDecl * > &rhs)
EqEnumVals - Comparison preficate for uniqing enumeration values.
Definition: SemaStmt.cpp:1090
static std::optional< int > isOpenMPCapturedRegionInArmSMEFunction(Sema const &S, CapturedRegionKind Kind)
Definition: SemaStmt.cpp:4647
static bool hasDeducedReturnType(FunctionDecl *FD)
Determine whether the declared return type of the specified function contains 'auto'.
Definition: SemaStmt.cpp:3561
static bool ObjCEnumerationCollection(Expr *Collection)
Definition: SemaStmt.cpp:2426
static void DiagnoseForRangeConstVariableCopies(Sema &SemaRef, const VarDecl *VD)
Definition: SemaStmt.cpp:3123
static StmtResult RebuildForRangeWithDereference(Sema &SemaRef, Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, Stmt *LoopVarDecl, SourceLocation ColonLoc, Expr *Range, SourceLocation RangeLoc, SourceLocation RParenLoc)
Speculatively attempt to dereference an invalid range expression.
Definition: SemaStmt.cpp:2653
static void checkEnumTypesInSwitchStmt(Sema &S, const Expr *Cond, const Expr *Case)
Definition: SemaStmt.cpp:1269
static void DiagnoseForRangeReferenceVariableCopies(Sema &SemaRef, const VarDecl *VD, QualType RangeInitType)
Definition: SemaStmt.cpp:3034
static void DiagnoseForRangeVariableCopies(Sema &SemaRef, const CXXForRangeStmt *ForStmt)
DiagnoseForRangeVariableCopies - Diagnose three cases and fixes for them.
Definition: SemaStmt.cpp:3168
static bool CheckSimplerImplicitMovesMSVCWorkaround(const Sema &S, const Expr *E)
Definition: SemaStmt.cpp:3932
static bool VerifyInitializationSequenceCXX98(const Sema &S, const InitializationSequence &Seq)
Verify that the initialization sequence that was picked for the first overload resolution is permissi...
Definition: SemaStmt.cpp:3511
static QualType GetTypeBeforeIntegralPromotion(const Expr *&E)
GetTypeBeforeIntegralPromotion - Returns the pre-promotion type of potentially integral-promoted expr...
Definition: SemaStmt.cpp:1098
static Sema::ForRangeStatus BuildNonArrayForRange(Sema &SemaRef, Expr *BeginRange, Expr *EndRange, QualType RangeType, VarDecl *BeginVar, VarDecl *EndVar, SourceLocation ColonLoc, SourceLocation CoawaitLoc, OverloadCandidateSet *CandidateSet, ExprResult *BeginExpr, ExprResult *EndExpr, BeginEndFunction *BEF)
Create the initialization, compare, and increment steps for the range-based for loop expression.
Definition: SemaStmt.cpp:2519
static bool hasTrivialABIAttr(QualType VariableType)
Determines whether the VariableType's declaration is a record with the clang::trivial_abi attribute.
Definition: SemaStmt.cpp:3113
static void AdjustAPSInt(llvm::APSInt &Val, unsigned BitWidth, bool IsSigned)
Definition: SemaStmt.cpp:1204
static bool buildCapturedStmtCaptureList(Sema &S, CapturedRegionScopeInfo *RSI, SmallVectorImpl< CapturedStmt::Capture > &Captures, SmallVectorImpl< Expr * > &CaptureInits)
Definition: SemaStmt.cpp:4604
static bool DiagnoseNoDiscard(Sema &S, const NamedDecl *OffendingDecl, const WarnUnusedResultAttr *A, SourceLocation Loc, SourceRange R1, SourceRange R2, bool IsCtor)
Definition: SemaStmt.cpp:202
static void checkCaseValue(Sema &S, SourceLocation Loc, const llvm::APSInt &Val, unsigned UnpromotedWidth, bool UnpromotedSign)
Check the specified case value is in range for the given unpromoted switch type.
Definition: SemaStmt.cpp:1211
static void CheckJumpOutOfSEHFinally(Sema &S, SourceLocation Loc, const Scope &DestScope)
Definition: SemaStmt.cpp:3270
Defines the Objective-C statement AST node classes.
enum clang::format::@1435::AnnotatingParser::Context::@359 ContextType
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
SourceLocation Begin
std::string Label
__device__ int
a trap message and trap category.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:188
SourceManager & getSourceManager()
Definition: ASTContext.h:801
CharUnits getTypeAlignInChars(QualType T) const
Return the ABI-specified alignment of a (complete) type T, in characters.
unsigned getIntWidth(QualType T) const
QualType getObjCInterfaceType(const ObjCInterfaceDecl *Decl, ObjCInterfaceDecl *PrevDecl=nullptr) const
getObjCInterfaceType - Return the unique reference to the type for the specified ObjC interface decl.
QualType getAutoRRefDeductType() const
C++11 deduction pattern for 'auto &&' type.
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
Definition: ASTContext.h:2867
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CanQualType VoidPtrTy
Definition: ASTContext.h:1249
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
CanQualType DependentTy
Definition: ASTContext.h:1250
IdentifierTable & Idents
Definition: ASTContext.h:740
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
CanQualType OverloadTy
Definition: ASTContext.h:1250
CharUnits getDeclAlign(const Decl *D, bool ForAlignof=false) const
Return a conservative estimate of the alignment of the specified decl D.
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
Definition: ASTContext.h:2898
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
Definition: ASTContext.h:2625
CanQualType VoidTy
Definition: ASTContext.h:1222
bool hasSimilarType(QualType T1, QualType T2) const
Determine if two types are similar, according to the C++ rules.
const TargetInfo & getTargetInfo() const
Definition: ASTContext.h:859
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
CanQualType getCanonicalTagType(const TagDecl *TD) const
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
bool isUnset() const
Definition: Ownership.h:168
PtrTy get() const
Definition: Ownership.h:171
bool isInvalid() const
Definition: Ownership.h:167
bool isUsable() const
Definition: Ownership.h:169
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: TypeBase.h:3738
Attr - This represents one attribute.
Definition: Attr.h:44
SourceLocation getLocation() const
Definition: Attr.h:97
static AttributedStmt * Create(const ASTContext &C, SourceLocation Loc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Definition: Stmt.cpp:432
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Definition: TypeBase.h:7180
bool isDecltypeAuto() const
Definition: TypeBase.h:7203
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Definition: Expr.h:4389
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3974
BreakStmt - This represents a break.
Definition: Stmt.h:3135
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
Definition: Expr.h:3905
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
Represents a base class of a C++ class.
Definition: DeclCXX.h:146
Represents binding an expression to a temporary.
Definition: ExprCXX.h:1494
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition: ExprCXX.h:723
CXXCatchStmt - This represents a C++ catch block.
Definition: StmtCXX.h:28
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: StmtCXX.h:43
VarDecl * getExceptionDecl() const
Definition: StmtCXX.h:49
QualType getCaughtType() const
Definition: StmtCXX.cpp:19
Represents a call to a C++ constructor.
Definition: ExprCXX.h:1549
Represents a C++ conversion function within a class.
Definition: DeclCXX.h:2937
CXXForRangeStmt - This represents C++0x [stmt.ranged]'s ranged for statement, represented as 'for (ra...
Definition: StmtCXX.h:135
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Definition: ExprCXX.h:1833
Represents a call to a member function that may be written either with member call syntax (e....
Definition: ExprCXX.h:179
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2129
A call to an overloaded operator written using operator syntax.
Definition: ExprCXX.h:84
Represents a C++ struct/union/class.
Definition: DeclCXX.h:258
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
Definition: DeclCXX.cpp:132
An expression "T()" which creates an rvalue of a non-class type T.
Definition: ExprCXX.h:2198
Represents a C++ nested-name-specifier or a global scope specifier.
Definition: DeclSpec.h:73
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
Definition: DeclSpec.cpp:123
static CXXTryStmt * Create(const ASTContext &C, SourceLocation tryLoc, CompoundStmt *tryBlock, ArrayRef< Stmt * > handlers)
Definition: StmtCXX.cpp:25
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition: Expr.h:2879
Decl * getCalleeDecl()
Definition: Expr.h:3056
static CanQual< Type > CreateUnsafe(QualType Other)
Builds a canonical type from a QualType.
QualType withConst() const
Retrieves a version of this type with const applied.
CanProxy< U > castAs() const
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition: Decl.h:4906
void setBody(Stmt *B)
Definition: Decl.cpp:5567
static DeclContext * castToDeclContext(const CapturedDecl *D)
Definition: Decl.h:4986
void setContextParam(unsigned i, ImplicitParamDecl *P)
Definition: Decl.h:4968
void setParam(unsigned i, ImplicitParamDecl *P)
Definition: Decl.h:4950
static CapturedDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition: Decl.cpp:5554
Describes the capture of either a variable, or 'this', or variable-length array type.
Definition: Stmt.h:3899
This captures a statement into a function.
Definition: Stmt.h:3886
Stmt * getCapturedStmt()
Retrieve the statement being captured.
Definition: Stmt.h:3990
static CapturedStmt * Create(const ASTContext &Context, Stmt *S, CapturedRegionKind Kind, ArrayRef< Capture > Captures, ArrayRef< Expr * > CaptureInits, CapturedDecl *CD, RecordDecl *RD)
Definition: Stmt.cpp:1401
CaseStmt - Represent a case statement.
Definition: Stmt.h:1920
Expr * getLHS()
Definition: Stmt.h:2003
static CaseStmt * Create(const ASTContext &Ctx, Expr *lhs, Expr *rhs, SourceLocation caseLoc, SourceLocation ellipsisLoc, SourceLocation colonLoc)
Build a case statement.
Definition: Stmt.cpp:1264
Expr * getRHS()
Definition: Stmt.h:2015
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition: Expr.h:3612
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition: Stmt.h:1720
bool body_empty() const
Definition: Stmt.h:1764
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
Definition: Stmt.cpp:390
Stmt * body_back()
Definition: Stmt.h:1788
ConditionalOperator - The ?: ternary operator.
Definition: Expr.h:4327
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
Represents the canonical version of C arrays with a specified constant size.
Definition: TypeBase.h:3776
ContinueStmt - This represents a continue.
Definition: Stmt.h:3119
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1449
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition: DeclBase.h:2109
bool isFileContext() const
Definition: DeclBase.h:2180
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
Definition: DeclBase.cpp:1358
bool isRecord() const
Definition: DeclBase.h:2189
void addDecl(Decl *D)
Add the declaration D into this context.
Definition: DeclBase.cpp:1793
bool isStdNamespace() const
Definition: DeclBase.cpp:1342
bool isFunctionOrMethod() const
Definition: DeclBase.h:2161
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
Definition: DeclBase.cpp:1767
Decl * getSingleDecl()
Definition: DeclGroup.h:79
bool isSingleDecl() const
Definition: DeclGroup.h:76
bool isNull() const
Definition: DeclGroup.h:75
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1272
ValueDecl * getDecl()
Definition: Expr.h:1340
SourceLocation getLocation() const
Definition: Expr.h:1348
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition: Stmt.h:1611
bool isSingleDecl() const
isSingleDecl - This method returns true if this DeclStmt refers to a single Decl.
Definition: Stmt.h:1624
const Decl * getSingleDecl() const
Definition: Stmt.h:1626
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Stmt.h:1637
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:86
bool hasAttrs() const
Definition: DeclBase.h:518
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition: DeclBase.cpp:156
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition: DeclBase.cpp:568
static Decl * castFromDeclContext(const DeclContext *)
Definition: DeclBase.cpp:1050
bool isInvalidDecl() const
Definition: DeclBase.h:588
SourceLocation getLocation() const
Definition: DeclBase.h:439
void setImplicit(bool I=true)
Definition: DeclBase.h:594
void setLocation(SourceLocation L)
Definition: DeclBase.h:440
DeclContext * getDeclContext()
Definition: DeclBase.h:448
AttrVec & getAttrs()
Definition: DeclBase.h:524
bool hasAttr() const
Definition: DeclBase.h:577
Kind getKind() const
Definition: DeclBase.h:442
SourceLocation getTypeSpecEndLoc() const
Definition: Decl.cpp:1994
SourceLocation getTypeSpecStartLoc() const
Definition: Decl.cpp:1988
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Decl.h:830
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:808
QualType getDeducedType() const
Get the type deduced for this placeholder type, or null if it has not been deduced.
Definition: TypeBase.h:7167
bool isDeduced() const
Definition: TypeBase.h:7168
SourceLocation getDefaultLoc() const
Definition: Stmt.h:2085
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Definition: Diagnostic.h:1529
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition: Diagnostic.h:950
DoStmt - This represents a 'do/while' stmt.
Definition: Stmt.h:2832
Recursive AST visitor that supports extension via dynamic dispatch.
Represents an enum.
Definition: Decl.h:4004
bool isClosed() const
Returns true if this enum is either annotated with enum_extensibility(closed) or isn't annotated with...
Definition: Decl.cpp:4986
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Definition: TypeBase.h:6522
EnumDecl * getOriginalDecl() const
Definition: TypeBase.h:6529
EvaluatedExprVisitor - This class visits 'Expr *'s.
This represents one expression.
Definition: Expr.h:112
bool EvaluateAsInt(EvalResult &Result, const ASTContext &Ctx, SideEffectsKind AllowSideEffects=SE_NoSideEffects, bool InConstantContext=false) const
EvaluateAsInt - Return true if this is a constant which we can fold and convert to an integer,...
bool isXValue() const
Definition: Expr.h:286
bool isGLValue() const
Definition: Expr.h:287
@ SE_AllowSideEffects
Allow any unmodeled side effect.
Definition: Expr.h:674
Expr * IgnoreParenCasts() LLVM_READONLY
Skip past any parentheses and casts which might surround this expression until reaching a fixed point...
Definition: Expr.cpp:3078
bool isUnusedResultAWarning(const Expr *&WarnExpr, SourceLocation &Loc, SourceRange &R1, SourceRange &R2, ASTContext &Ctx) const
isUnusedResultAWarning - Return true if this immediate expression should be warned about if the resul...
Definition: Expr.cpp:2614
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition: Expr.h:177
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition: Expr.h:194
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, SmallVectorImpl< PartialDiagnosticAt > *Diag=nullptr) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Definition: Expr.cpp:3073
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Definition: Expr.h:246
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3069
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
Decl * getReferencedDeclOfCallee()
Definition: Expr.cpp:1542
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Definition: Expr.h:223
Expr * IgnoreImpCasts() LLVM_READONLY
Skip past any implicit casts which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3053
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition: Expr.cpp:273
QualType getType() const
Definition: Expr.h:144
bool isKnownToHaveBooleanValue(bool Semantic=true) const
isKnownToHaveBooleanValue - Return true if this is an integer expression that is known to return 0 or...
Definition: Expr.cpp:133
Represents difference between two FPOptions values.
Definition: LangOptions.h:919
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
Definition: LangOptions.h:1026
Represents a member of a struct/union/class.
Definition: Decl.h:3157
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition: Diagnostic.h:139
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
Definition: Diagnostic.h:128
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Definition: Diagnostic.h:102
ForStmt - This represents a 'for (init;cond;inc)' stmt.
Definition: Stmt.h:2888
void setBody(Stmt *S)
Definition: Stmt.h:2942
SourceLocation getRParenLoc() const
Definition: Stmt.h:2948
SourceLocation getBeginLoc() const
Definition: Stmt.h:2951
FullExpr - Represents a "full-expression" node.
Definition: Expr.h:1051
Represents a function declaration or definition.
Definition: Decl.h:1999
const ParmVarDecl * getParamDecl(unsigned i) const
Definition: Decl.h:2794
void setUsesSEHTry(bool UST)
Definition: Decl.h:2518
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
Definition: Decl.cpp:3592
QualType getReturnType() const
Definition: Decl.h:2842
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
Definition: Decl.h:2469
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
Definition: Decl.cpp:3356
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4490
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
Definition: Decl.h:2930
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition: Decl.cpp:4071
bool isConsteval() const
Definition: Decl.h:2481
Represents a prototype with parameter type info, e.g.
Definition: TypeBase.h:5282
Declaration of a template function.
Definition: DeclTemplate.h:952
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: TypeBase.h:4478
static StringRef getNameForCallConv(CallingConv CC)
Definition: Type.cpp:3613
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
Definition: TypeBase.h:4826
QualType getReturnType() const
Definition: TypeBase.h:4818
GNUNullExpr - Implements the GNU __null extension, which is a name for a null pointer constant that h...
Definition: Expr.h:4859
GotoStmt - This represents a direct goto.
Definition: Stmt.h:2969
One of these records is kept for each identifier that is lexed.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
static IfStmt * Create(const ASTContext &Ctx, SourceLocation IL, IfStatementKind Kind, Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LPL, SourceLocation RPL, Stmt *Then, SourceLocation EL=SourceLocation(), Stmt *Else=nullptr)
Create an IfStmt.
Definition: Stmt.cpp:1002
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
Definition: Expr.h:1733
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition: Expr.h:3789
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition: Expr.cpp:2068
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Definition: Decl.cpp:5470
IndirectGotoStmt - This represents an indirect goto.
Definition: Stmt.h:3008
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
Describes the sequence of initializations required to initialize a given object or reference with a s...
Describes an entity that is being initialized.
static InitializedEntity InitializeResult(SourceLocation ReturnLoc, QualType Type)
Create the initialization entity for the result of a function.
static InitializedEntity InitializeRelatedResult(ObjCMethodDecl *MD, QualType Type)
Create the initialization entity for a related result.
unsigned allocateManglingNumber() const
static InitializedEntity InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Definition: Expr.cpp:971
Represents the declaration of a label.
Definition: Decl.h:523
bool isGnuLocal() const
Definition: Decl.h:550
void setLocStart(SourceLocation L)
Definition: Decl.h:551
LabelStmt * getStmt() const
Definition: Decl.h:547
void setStmt(LabelStmt *T)
Definition: Decl.h:548
bool isMSAsmLabel() const
Definition: Decl.h:557
LabelStmt - Represents a label, which has a substatement.
Definition: Stmt.h:2146
Represents the results of name lookup.
Definition: Lookup.h:147
bool empty() const
Return true if no decls were found.
Definition: Lookup.h:362
bool isAmbiguous() const
Definition: Lookup.h:324
Representation of a Microsoft __if_exists or __if_not_exists statement with a dependent name.
Definition: StmtCXX.h:253
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition: ExprCXX.h:4914
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
Definition: ExprCXX.h:4931
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition: Expr.h:3300
Expr * getBase() const
Definition: Expr.h:3377
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition: TypeBase.h:3669
This represents a decl that may have a name.
Definition: Decl.h:273
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition: Decl.h:294
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition: Decl.h:339
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine if the declaration obeys the reserved identifier rules of the given language.
Definition: Decl.cpp:1132
A C++ nested-name-specifier augmented with source location information.
NullStmt - This is the null statement ";": C99 6.8.3p3.
Definition: Stmt.h:1683
Represents Objective-C's collection statement.
Definition: StmtObjC.h:23
An expression that sends a message to the given Objective-C object or class.
Definition: ExprObjC.h:940
ObjCMethodDecl - Represents an instance or class method declaration.
Definition: DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition: TypeBase.h:7961
Wrapper for void* pointer.
Definition: Ownership.h:51
void * getAsOpaquePtr() const
Definition: Ownership.h:91
PtrTy get() const
Definition: Ownership.h:81
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition: Overload.h:1153
@ CSK_Normal
Normal lookup.
Definition: Overload.h:1157
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
static FindResult find(Expr *E)
Finds the overloaded expression in the given expression E of OverloadTy.
Definition: ExprCXX.h:3183
ParenExpr - This represents a parenthesized expression, e.g.
Definition: Expr.h:2184
Represents a parameter to a function.
Definition: Decl.h:1789
ParsedAttributes - A collection of parsed attributes.
Definition: ParsedAttr.h:937
Wrapper for source info for pointers.
Definition: TypeLoc.h:1493
SourceLocation getStarLoc() const
Definition: TypeLoc.h:1495
IdentifierTable & getIdentifierTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition: Expr.h:6692
ArrayRef< Expr * > semantics()
Definition: Expr.h:6764
A (possibly-)qualified type.
Definition: TypeBase.h:937
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition: TypeBase.h:8427
QualType withRestrict() const
Definition: TypeBase.h:1175
QualType withConst() const
Definition: TypeBase.h:1159
bool isTriviallyCopyConstructibleType(const ASTContext &Context) const
Return true if this is a trivially copyable type.
Definition: Type.cpp:2919
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition: TypeBase.h:1004
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition: TypeBase.h:8528
QualType getCanonicalType() const
Definition: TypeBase.h:8395
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition: TypeBase.h:8437
void removeLocalConst()
Definition: TypeBase.h:8451
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition: TypeBase.h:8416
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
Definition: TypeBase.h:361
Represents a struct/union/class.
Definition: Decl.h:4309
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
Definition: Decl.cpp:5111
bool isOrContainsUnion() const
Returns whether this record is a union, or contains (at any nesting level) a union member.
Definition: Decl.cpp:5139
virtual void completeDefinition()
Note that the definition of this type is now complete.
Definition: Decl.cpp:5166
void setCapturedRecord()
Mark the record as a record for captured variables in CapturedStmt construct.
Definition: Decl.cpp:5135
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: TypeBase.h:6502
RecordDecl * getOriginalDecl() const
Definition: TypeBase.h:6509
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition: Stmt.h:3160
void setRetValue(Expr *E)
Definition: Stmt.h:3189
static ReturnStmt * Create(const ASTContext &Ctx, SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate)
Create a return statement.
Definition: Stmt.cpp:1248
Expr * getRetValue()
Definition: Stmt.h:3187
static SEHExceptStmt * Create(const ASTContext &C, SourceLocation ExceptLoc, Expr *FilterExpr, Stmt *Block)
Definition: Stmt.cpp:1311
static SEHFinallyStmt * Create(const ASTContext &C, SourceLocation FinallyLoc, Stmt *Block)
Definition: Stmt.cpp:1319
Represents a __leave statement.
Definition: Stmt.h:3847
static SEHTryStmt * Create(const ASTContext &C, bool isCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
Definition: Stmt.cpp:1291
Scope - A scope is a transient data structure that is used while parsing the program.
Definition: Scope.h:41
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
Definition: Scope.h:291
bool Contains(const Scope &rhs) const
Returns if rhs has a higher scope depth than this.
Definition: Scope.h:637
LabelDecl * getPrecedingLabel() const
Get the label that precedes this scope.
Definition: Scope.h:276
unsigned getFlags() const
getFlags - Return the flags for this scope.
Definition: Scope.h:271
Scope * getContinueParent()
getContinueParent - Return the closest scope that a continue statement would be affected by.
Definition: Scope.h:301
bool isSEHTryScope() const
Determine whether this scope is a SEH '__try' block.
Definition: Scope.h:613
Scope * getBreakParent()
getBreakParent - Return the closest scope that a break statement would be affected by.
Definition: Scope.h:322
const Scope * getParent() const
getParent - Return the scope that this is nested in.
Definition: Scope.h:287
bool isBreakOrContinueScope() const
Determine whether this is a scope which can have 'break' or 'continue' statements embedded into it.
Definition: Scope.h:600
void updateNRVOCandidate(VarDecl *VD)
Definition: Scope.cpp:137
bool isFunctionScope() const
isFunctionScope() - Return true if this scope is a function scope.
Definition: Scope.h:425
bool isOpenACCComputeConstructScope() const
Determine whether this scope is the statement associated with an OpenACC Compute construct directive.
Definition: Scope.h:564
@ SwitchScope
This is a scope that corresponds to a switch statement.
Definition: Scope.h:102
A generic diagnostic builder for errors which may or may not be deferred.
Definition: SemaBase.h:111
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
Definition: SemaBase.cpp:61
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition: SemaBase.cpp:33
CUDAFunctionTarget CurrentTarget()
Gets the CUDA target for the current context.
Definition: SemaCUDA.h:152
SemaDiagnosticBuilder DiagIfDeviceCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as device c...
Definition: SemaCUDA.cpp:836
StmtResult ActOnObjCForCollectionStmt(SourceLocation ForColLoc, Stmt *First, Expr *collection, SourceLocation RParenLoc)
Definition: SemaObjC.cpp:36
StmtResult FinishObjCForCollectionStmt(Stmt *ForCollection, Stmt *Body)
FinishObjCForCollectionStmt - Attach the body to a objective-C foreach statement.
Definition: SemaObjC.cpp:193
bool inferObjCARCLifetime(ValueDecl *decl)
void ActOnOpenMPLoopInitialization(SourceLocation ForLoc, Stmt *Init)
Check if the current region is an OpenMP loop region and if it is, mark loop control variable,...
void setOpenMPCaptureKind(FieldDecl *FD, const ValueDecl *D, unsigned Level)
Sets OpenMP capture kind (OMPC_private, OMPC_firstprivate, OMPC_map etc.) for FD based on DSA for the...
std::pair< VarDecl *, Expr * > get() const
Definition: Sema.h:7769
bool isInvalid() const
Definition: Sema.h:7768
ExprResult release()
Definition: Sema.h:7715
Expr * get() const
Definition: Sema.h:7717
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition: Sema.h:12359
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:850
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
Definition: SemaType.cpp:6383
SmallVector< Scope *, 2 > CurrentSEHFinally
Stack of active SEH __finally scopes. Can be empty.
Definition: Sema.h:10906
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition: Sema.h:12936
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition: Sema.h:1113
StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
Definition: SemaStmt.cpp:3351
void ProcessStmtAttributes(Stmt *Stmt, const ParsedAttributes &InAttrs, SmallVectorImpl< const Attr * > &OutAttrs)
Process the attributes before creating an attributed statement.
ExprResult ActOnUnaryOp(Scope *S, SourceLocation OpLoc, tok::TokenKind Op, Expr *Input, bool IsAfterAmp=false)
Unary Operators. 'Tok' is the token for the operator.
Definition: SemaExpr.cpp:16082
StmtResult BuildMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, NestedNameSpecifierLoc QualifierLoc, DeclarationNameInfo NameInfo, Stmt *Nested)
Definition: SemaStmt.cpp:4554
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition: Sema.h:9289
bool ActOnCoroutineBodyStart(Scope *S, SourceLocation KwLoc, StringRef Keyword)
StmtResult BuildAttributedStmt(SourceLocation AttrsLoc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Definition: SemaStmt.cpp:631
SemaOpenMP & OpenMP()
Definition: Sema.h:1498
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope)
Definition: SemaStmt.cpp:4543
StmtResult ActOnForEachLValueExpr(Expr *E)
In an Objective C collection iteration statement: for (x in y) x can be an arbitrary l-value expressi...
Definition: SemaStmt.cpp:2318
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl)
Definition: SemaStmt.cpp:85
SemaCUDA & CUDA()
Definition: Sema.h:1438
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
Definition: SemaExpr.cpp:17664
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
Definition: SemaExpr.cpp:20730
@ Switch
An integral condition for a 'switch' statement.
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition: Sema.h:1216
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition: Sema.cpp:2442
bool checkAndRewriteMustTailAttr(Stmt *St, const Attr &MTA)
Check whether the given statement can have musttail applied to it, issuing a diagnostic and returning...
Definition: SemaStmt.cpp:660
StmtResult ActOnContinueStmt(SourceLocation ContinueLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
Definition: SemaStmt.cpp:3314
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
Definition: SemaStmt.cpp:3223
StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, Scope *CurScope)
Definition: SemaStmt.cpp:3893
void setFunctionHasBranchIntoScope()
Definition: Sema.cpp:2492
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
Definition: SemaStmt.cpp:485
SimplerImplicitMoveMode
Definition: Sema.h:11063
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
Definition: SemaStmt.cpp:48
FieldDecl * BuildCaptureField(RecordDecl *RD, const sema::Capture &Capture)
Build a FieldDecl suitable to hold the given capture.
AssignConvertType CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &RHS, bool Diagnose=true, bool DiagnoseCFAudited=false, bool ConvertRHS=true)
Check assignment constraints for an assignment of RHS to LHSType.
Definition: SemaExpr.cpp:9764
StmtResult BuildIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition: SemaStmt.cpp:1032
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
Definition: Sema.cpp:1647
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
ExprResult UsualUnaryConversions(Expr *E)
UsualUnaryConversions - Performs various conversions that are common to most operators (C99 6....
Definition: SemaExpr.cpp:827
void DiagnoseCommaOperator(const Expr *LHS, SourceLocation Loc)
Look for instances where it is likely the comma operator is confused with another operator.
Definition: SemaExpr.cpp:14216
void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry)
Definition: SemaStmt.cpp:4461
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
Definition: SemaStmt.cpp:1108
ASTContext & Context
Definition: Sema.h:1276
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
Definition: SemaExpr.cpp:20525
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
Definition: SemaDecl.cpp:15004
void ActOnCapturedRegionError()
Definition: SemaStmt.cpp:4759
SemaObjC & ObjC()
Definition: Sema.h:1483
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition: SemaDecl.cpp:75
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
Definition: SemaExpr.cpp:748
ASTContext & getASTContext() const
Definition: Sema.h:918
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
Definition: SemaExpr.cpp:16038
void PopExpressionEvaluationContext()
Definition: SemaExpr.cpp:18155
StmtResult ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
Definition: SemaStmt.cpp:4478
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition: Sema.cpp:756
ForRangeStatus
Definition: Sema.h:10728
@ FRS_Success
Definition: Sema.h:10729
@ FRS_DiagnosticIssued
Definition: Sema.h:10731
@ FRS_NoViableFunction
Definition: Sema.h:10730
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition: Sema.cpp:1652
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
Definition: SemaExpr.cpp:2298
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
void setFunctionHasIndirectGoto()
Definition: Sema.cpp:2502
ExprResult BuildCaptureInit(const sema::Capture &Capture, SourceLocation ImplicitCaptureLoc, bool IsOpenMPMapping=false)
Initialize the given capture with a suitable expression.
StmtResult ActOnFinishSwitchStmt(SourceLocation SwitchLoc, Stmt *Switch, Stmt *Body)
Definition: SemaStmt.cpp:1296
NamedReturnInfo getNamedReturnInfo(Expr *&E, SimplerImplicitMoveMode Mode=SimplerImplicitMoveMode::Normal)
Determine whether the given expression might be move-eligible or copy-elidable in either a (co_)retur...
Definition: SemaStmt.cpp:3392
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition: Sema.h:1053
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
Definition: SemaStmt.cpp:405
FPOptions & getCurFPFeatures()
Definition: Sema.h:913
void PopCompoundScope()
Definition: Sema.cpp:2481
@ UPPC_Expression
An arbitrary expression.
Definition: Sema.h:14220
const LangOptions & getLangOpts() const
Definition: Sema.h:911
StmtResult ActOnWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, ConditionResult Cond, SourceLocation RParenLoc, Stmt *Body)
Definition: SemaStmt.cpp:1790
Preprocessor & PP
Definition: Sema.h:1275
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
const LangOptions & LangOpts
Definition: Sema.h:1274
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition: Sema.cpp:2557
void ActOnStartOfCompoundStmt(bool IsStmtExpr)
Definition: SemaStmt.cpp:416
bool DeduceFunctionTypeFromReturnExpr(FunctionDecl *FD, SourceLocation ReturnLoc, Expr *RetExpr, const AutoType *AT)
Deduce the return type for a function from a returned expression, per C++1y [dcl.spec....
Definition: SemaStmt.cpp:3782
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
Definition: SemaExpr.cpp:20409
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
Definition: SemaStmt.cpp:3775
StmtResult ActOnExprStmtError()
Definition: SemaStmt.cpp:65
const VarDecl * getCopyElisionCandidate(NamedReturnInfo &Info, QualType ReturnType)
Updates given NamedReturnInfo's move-eligible and copy-elidable statuses, considering the function re...
Definition: SemaStmt.cpp:3470
NamedDecl * getCurFunctionOrMethodDecl() const
getCurFunctionOrMethodDecl - Return the Decl for the current ObjC method or C function we're in,...
Definition: Sema.cpp:1659
StmtResult ActOnNullStmt(SourceLocation SemiLoc, bool HasLeadingEmptyMacro=false)
Definition: SemaStmt.cpp:70
RecordDecl * CreateCapturedStmtRecordDecl(CapturedDecl *&CD, SourceLocation Loc, unsigned NumParams)
Definition: SemaStmt.cpp:4578
void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope, CapturedRegionKind Kind, unsigned NumParams)
Definition: SemaStmt.cpp:4661
sema::FunctionScopeInfo * getCurFunction() const
Definition: Sema.h:1307
void PushCompoundScope(bool IsStmtExpr)
Definition: Sema.cpp:2476
DeclGroupPtrTy BuildDeclaratorGroup(MutableArrayRef< Decl * > Group)
BuildDeclaratorGroup - convert a list of declarations into a declaration group, performing any necess...
Definition: SemaDecl.cpp:15237
void DiagnoseAssignmentEnum(QualType DstType, QualType SrcType, Expr *SrcExpr)
DiagnoseAssignmentEnum - Warn if assignment to enum is a constant integer not in the range of enum va...
Definition: SemaStmt.cpp:1728
ExprResult ActOnCoawaitExpr(Scope *S, SourceLocation KwLoc, Expr *E)
std::optional< sema::TemplateDeductionInfo * > isSFINAEContext() const
Determines whether we are currently in a context where template argument substitution failures are no...
bool findMacroSpelling(SourceLocation &loc, StringRef name)
Looks through the macro-expansion chain for the given location, looking for a macro expansion with th...
Definition: Sema.cpp:2294
void DiagnoseEmptyStmtBody(SourceLocation StmtLoc, const Stmt *Body, unsigned DiagID)
Emit DiagID if statement located on StmtLoc has a suspicious null statement as a Body,...
void DiagnoseEmptyLoopBody(const Stmt *S, const Stmt *PossibleBody)
Warn if a for/while loop statement S, which is followed by PossibleBody, has a suspicious null statem...
ExprResult DefaultLvalueConversion(Expr *E)
Definition: SemaExpr.cpp:633
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition: Sema.h:1411
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Definition: SemaDecl.cpp:5948
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition: Sema.h:8122
StmtResult ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, NamedReturnInfo &NRInfo, bool SupressSimplerImplicitMoves)
ActOnCapScopeReturnStmt - Utility routine to type-check return statements for capturing scopes.
Definition: SemaStmt.cpp:3567
StmtResult ActOnCapturedRegionEnd(Stmt *S)
Definition: SemaStmt.cpp:4774
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
Definition: SemaStmt.cpp:2253
StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc, Expr *DestExp)
Definition: SemaStmt.cpp:3238
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
Definition: SemaExpr.cpp:21316
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition: Sema.h:13791
SourceManager & getSourceManager() const
Definition: Sema.h:916
ExprResult PerformMoveOrCopyInitialization(const InitializedEntity &Entity, const NamedReturnInfo &NRInfo, Expr *Value, bool SupressSimplerImplicitMoves=false)
Perform the initialization of a potentially-movable value, which is the result of return value.
Definition: SemaStmt.cpp:3527
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
Definition: SemaDecl.cpp:14172
StmtResult ActOnCXXForRangeStmt(Scope *S, SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, Stmt *LoopVar, SourceLocation ColonLoc, Expr *Collection, SourceLocation RParenLoc, BuildForRangeKind Kind, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
ActOnCXXForRangeStmt - Check and build a C++11 for-range statement.
Definition: SemaStmt.cpp:2431
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
Definition: SemaStmt.cpp:3946
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
Definition: SemaExpr.cpp:15539
void PushCapturedRegionScope(Scope *RegionScope, CapturedDecl *CD, RecordDecl *RD, CapturedRegionKind K, unsigned OpenMPCaptureLevel=0)
Definition: Sema.cpp:2872
void setFunctionHasMustTail()
Definition: Sema.cpp:2507
void setFunctionHasBranchProtectedScope()
Definition: Sema.cpp:2497
StmtResult ActOnFinishSEHFinallyBlock(SourceLocation Loc, Stmt *Block)
Definition: SemaStmt.cpp:4536
StmtResult BuildCXXForRangeStmt(SourceLocation ForLoc, SourceLocation CoawaitLoc, Stmt *InitStmt, SourceLocation ColonLoc, Stmt *RangeDecl, Stmt *Begin, Stmt *End, Expr *Cond, Expr *Inc, Stmt *LoopVarDecl, SourceLocation RParenLoc, BuildForRangeKind Kind, ArrayRef< MaterializeTemporaryExpr * > LifetimeExtendTemps={})
BuildCXXForRangeStmt - Build or instantiate a C++11 for-range statement.
Definition: SemaStmt.cpp:2689
StmtResult ActOnDoStmt(SourceLocation DoLoc, Stmt *Body, SourceLocation WhileLoc, SourceLocation CondLParen, Expr *Cond, SourceLocation CondRParen)
Definition: SemaStmt.cpp:1820
StmtResult ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc)
Definition: SemaStmt.cpp:1172
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
Definition: SemaExpr.cpp:17422
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
Definition: SemaStmt.cpp:4566
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
StmtResult ActOnSEHExceptBlock(SourceLocation Loc, Expr *FilterExpr, Stmt *Block)
Definition: SemaStmt.cpp:4516
void ActOnAfterCompoundStatementLeadingPragmas()
Definition: SemaStmt.cpp:420
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
Definition: SemaStmt.cpp:75
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
Definition: SemaType.cpp:9241
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
Definition: SemaDecl.cpp:19507
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void DiscardCleanupsInEvaluationContext()
Definition: SemaExpr.cpp:18228
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition: Sema.h:8262
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
Definition: SemaDecl.cpp:1366
StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList, Stmt *SubStmt)
Definition: SemaStmt.cpp:648
SourceManager & SourceMgr
Definition: Sema.h:1279
DiagnosticsEngine & Diags
Definition: Sema.h:1278
void ActOnStartSEHFinallyBlock()
Definition: SemaStmt.cpp:4528
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
Definition: SemaInit.cpp:9874
void ActOnAbortSEHFinallyBlock()
Definition: SemaStmt.cpp:4532
void PopDeclContext()
Definition: SemaDecl.cpp:1373
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
BuildForRangeKind
Definition: Sema.h:10996
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition: Sema.h:11004
@ BFRK_Build
Initial building of a for-range statement.
Definition: Sema.h:10998
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition: Sema.h:11001
StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl, Stmt *HandlerBlock)
ActOnCXXCatchBlock - Takes an exception declaration and a handler block and creates a proper catch ha...
Definition: SemaStmt.cpp:4233
void ActOnCaseStmtBody(Stmt *CaseStmt, Stmt *SubStmt)
ActOnCaseStmtBody - This installs a statement as the body of a case.
Definition: SemaStmt.cpp:563
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
Definition: SemaDecl.cpp:13696
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
Definition: SemaExpr.cpp:17081
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition: Sema.cpp:2096
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
Definition: SemaExpr.cpp:21528
StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition: SemaStmt.cpp:950
std::string getTemplateArgumentBindingsText(const TemplateParameterList *Params, const TemplateArgumentList &Args)
Produces a formatted string that describes the binding of template parameters to template arguments.
ExprResult ActOnUnaryExprOrTypeTraitExpr(SourceLocation OpLoc, UnaryExprOrTypeTrait ExprKind, bool IsType, void *TyOrEx, SourceRange ArgRange)
ActOnUnaryExprOrTypeTraitExpr - Handle sizeof(type) and sizeof expr and the same for alignof and __al...
Definition: SemaExpr.cpp:4762
ForRangeStatus BuildForRangeBeginEndCall(SourceLocation Loc, SourceLocation RangeLoc, const DeclarationNameInfo &NameInfo, LookupResult &MemberLookup, OverloadCandidateSet *CandidateSet, Expr *Range, ExprResult *CallExpr)
Build a call to 'begin' or 'end' for a C++11 for-range statement.
sema::CompoundScopeInfo & getCurCompoundScope() const
Definition: SemaStmt.cpp:432
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
void ActOnFinishOfCompoundStmt()
Definition: SemaStmt.cpp:428
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
Definition: SemaStmt.cpp:436
bool IsValueInFlagEnum(const EnumDecl *ED, const llvm::APInt &Val, bool AllowMask) const
IsValueInFlagEnum - Determine if a value is allowed as part of a flag enum.
Definition: SemaDecl.cpp:20483
StmtResult ActOnLabelStmt(SourceLocation IdentLoc, LabelDecl *TheDecl, SourceLocation ColonLoc, Stmt *SubStmt)
Definition: SemaStmt.cpp:588
StmtResult ActOnCXXTryBlock(SourceLocation TryLoc, Stmt *TryBlock, ArrayRef< Stmt * > Handlers)
ActOnCXXTryBlock - Takes a try compound-statement and a number of handlers and creates a try statemen...
Definition: SemaStmt.cpp:4353
StmtResult ActOnDefaultStmt(SourceLocation DefaultLoc, SourceLocation ColonLoc, Stmt *SubStmt, Scope *CurScope)
Definition: SemaStmt.cpp:568
StmtResult ActOnCaseStmt(SourceLocation CaseLoc, ExprResult LHS, SourceLocation DotDotDotLoc, ExprResult RHS, SourceLocation ColonLoc)
Definition: SemaStmt.cpp:532
StmtResult FinishCXXForRangeStmt(Stmt *ForRange, Stmt *Body)
FinishCXXForRangeStmt - Attach the body to a C++0x for-range statement.
Definition: SemaStmt.cpp:3205
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition: Sema.h:8599
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
SourceLocation getLocWithOffset(IntTy Offset) const
Return a source location with the specified offset from this SourceLocation.
bool isMacroBodyExpansion(SourceLocation Loc) const
Tests whether the given source location represents the expansion of a macro body.
bool isInSystemMacro(SourceLocation loc) const
Returns whether Loc is expanded from a macro in a system header.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
SourceLocation getBegin() const
Stmt - This represents one statement.
Definition: Stmt.h:85
SourceLocation getEndLoc() const LLVM_READONLY
Definition: Stmt.cpp:358
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:334
static std::tuple< bool, const Attr *, const Attr * > determineLikelihoodConflict(const Stmt *Then, const Stmt *Else)
Definition: Stmt.cpp:193
static const Attr * getLikelihoodAttr(const Stmt *S)
Definition: Stmt.cpp:171
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Stmt.cpp:346
const SwitchCase * getNextSwitchCase() const
Definition: Stmt.h:1893
SwitchStmt - This represents a 'switch' stmt.
Definition: Stmt.h:2509
void setBody(Stmt *Body)
Definition: Stmt.h:2587
static SwitchStmt * Create(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a switch statement.
Definition: Stmt.cpp:1125
Expr * getCond()
Definition: Stmt.h:2572
SwitchCase * getSwitchCaseList()
Definition: Stmt.h:2640
void setAllEnumCasesCovered()
Set a flag in the SwitchStmt indicating that if the 'switch (X)' is a switch over an enum value then ...
Definition: Stmt.h:2665
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3714
TypedefNameDecl * getTypedefNameForAnonDecl() const
Definition: Decl.h:3945
void startDefinition()
Starts the definition of this tag declaration.
Definition: Decl.cpp:4847
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Definition: TargetInfo.h:1288
bool isSEHTrySupported() const
Whether the target supports SEH __try.
Definition: TargetInfo.h:1630
TemplateSpecCandidateSet - A set of generalized overload candidates, used in template specializations...
void NoteCandidates(Sema &S, SourceLocation Loc)
NoteCandidates - When no template specialization match is found, prints diagnostic messages containin...
Base wrapper for a particular "section" of type source info.
Definition: TypeLoc.h:59
QualType getType() const
Get the type for which this source info wrapper provides information.
Definition: TypeLoc.h:133
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
Definition: TypeLoc.h:78
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition: TypeLoc.h:2843
A container of type source information.
Definition: TypeBase.h:8314
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition: TypeLoc.h:272
QualType getType() const
Return the type wrapped by this type source info.
Definition: TypeBase.h:8325
The base class of the type hierarchy.
Definition: TypeBase.h:1833
bool isVoidType() const
Definition: TypeBase.h:8936
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
Definition: Type.cpp:2229
bool isRValueReferenceType() const
Definition: TypeBase.h:8612
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.h:26
bool isArrayType() const
Definition: TypeBase.h:8679
bool isPointerType() const
Definition: TypeBase.h:8580
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition: TypeBase.h:8980
const T * castAs() const
Member-template castAs<specific type>.
Definition: TypeBase.h:9226
bool isReferenceType() const
Definition: TypeBase.h:8604
bool isEnumeralType() const
Definition: TypeBase.h:8711
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition: Type.cpp:752
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
Definition: TypeBase.h:9054
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition: TypeBase.h:2917
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
Definition: TypeBase.h:8905
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: TypeBase.h:2800
bool containsErrors() const
Whether this type is an error type.
Definition: TypeBase.h:2794
EnumDecl * castAsEnumDecl() const
Definition: Type.h:59
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
Definition: TypeBase.h:9212
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition: TypeBase.h:9072
bool isObjectType() const
Determine whether this type is an object type.
Definition: TypeBase.h:2528
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition: Type.cpp:2440
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition: TypeBase.h:2939
TypeClass getTypeClass() const
Definition: TypeBase.h:2403
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
Definition: TypeBase.h:2429
const T * getAs() const
Member-template getAs<specific type>'.
Definition: TypeBase.h:9159
bool isRecordType() const
Definition: TypeBase.h:8707
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2246
Represents a C++ unqualified-id that has been parsed.
Definition: DeclSpec.h:998
void setType(QualType newType)
Definition: Decl.h:723
QualType getType() const
Definition: Decl.h:722
QualType getType() const
Definition: Value.cpp:237
Represents a variable declaration or definition.
Definition: Decl.h:925
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition: Decl.cpp:2151
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:2190
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition: Decl.h:1225
bool isExceptionVariable() const
Determine whether this variable is the exception variable in a C++ catch statememt or an Objective-C ...
Definition: Decl.h:1493
const Expr * getInit() const
Definition: Decl.h:1367
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
Definition: Decl.h:1183
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
Definition: Decl.h:1252
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
Definition: Decl.cpp:2706
Represents a C array with a specified size that is not an integer-constant-expression.
Definition: TypeBase.h:3982
WhileStmt - This represents a 'while' stmt.
Definition: Stmt.h:2697
static WhileStmt * Create(const ASTContext &Ctx, VarDecl *Var, Expr *Cond, Stmt *Body, SourceLocation WL, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a while statement.
Definition: Stmt.cpp:1187
ValueDecl * getVariable() const
Definition: ScopeInfo.h:675
bool isVariableCapture() const
Definition: ScopeInfo.h:650
SourceLocation getLocation() const
Retrieve the location at which this variable was captured.
Definition: ScopeInfo.h:686
bool isInvalid() const
Definition: ScopeInfo.h:661
bool isVLATypeCapture() const
Definition: ScopeInfo.h:657
bool isThisCapture() const
Definition: ScopeInfo.h:649
bool isReferenceCapture() const
Definition: ScopeInfo.h:655
Retains information about a captured region.
Definition: ScopeInfo.h:816
unsigned short CapRegionKind
The kind of captured region.
Definition: ScopeInfo.h:831
RecordDecl * TheRecordDecl
The captured record type.
Definition: ScopeInfo.h:822
CapturedDecl * TheCapturedDecl
The CapturedDecl for this statement.
Definition: ScopeInfo.h:819
QualType ReturnType
ReturnType - The target type of return statements in this context, or null if unknown.
Definition: ScopeInfo.h:732
SmallVector< Capture, 4 > Captures
Captures - The captures.
Definition: ScopeInfo.h:721
Contains information about the compound statement currently being parsed.
Definition: ScopeInfo.h:67
FPOptions InitialFPFeatures
FP options at the beginning of the compound statement, prior to any pragma.
Definition: ScopeInfo.h:79
Retains information about a function, method, or block that is currently being parsed.
Definition: ScopeInfo.h:104
llvm::PointerIntPair< SwitchStmt *, 1, bool > SwitchInfo
A SwitchStmt, along with a flag indicating if its list of case statements is incomplete (because we d...
Definition: ScopeInfo.h:205
SourceLocation FirstCXXOrObjCTryLoc
First C++ 'try' or ObjC @try statement in the current function.
Definition: ScopeInfo.h:189
enum clang::sema::FunctionScopeInfo::@233 FirstTryType
SourceLocation FirstCoroutineStmtLoc
First coroutine statement in the current function.
Definition: ScopeInfo.h:183
StringRef getFirstCoroutineStmtKeyword() const
Definition: ScopeInfo.h:518
SourceLocation FirstReturnLoc
First 'return' statement in the current function.
Definition: ScopeInfo.h:186
SourceLocation FirstSEHTryLoc
First SEH '__try' statement in the current function.
Definition: ScopeInfo.h:193
void setHasCXXTry(SourceLocation TryLoc)
Definition: ScopeInfo.h:465
SmallVector< CompoundScopeInfo, 4 > CompoundScopes
The stack of currently active compound statement scopes in the function.
Definition: ScopeInfo.h:228
void setHasSEHTry(SourceLocation TryLoc)
Definition: ScopeInfo.h:477
SmallVector< SwitchInfo, 8 > SwitchStack
SwitchStack - This is the current set of active switch statements in the block.
Definition: ScopeInfo.h:209
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
Definition: ScopeInfo.h:874
Provides information about an attempted template argument deduction, whose success or failure was des...
TemplateArgument SecondArg
The second template argument to which the template argument deduction failure refers.
TemplateArgument FirstArg
The first template argument to which the template argument deduction failure refers.
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
bool Cast(InterpState &S, CodePtr OpPC)
Definition: Interp.h:2490
void checkExprLifetimeMustTailArg(Sema &SemaRef, const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the given expr (and its subobjects) is sufficient, assuming that it is pas...
The JSON file list parser is used to communicate input to InstallAPI.
@ CPlusPlus23
Definition: LangStandard.h:60
@ CPlusPlus
Definition: LangStandard.h:55
@ CPlusPlus11
Definition: LangStandard.h:56
@ CPlusPlus14
Definition: LangStandard.h:57
@ CPlusPlus17
Definition: LangStandard.h:58
Expr * IgnoreElidableImplicitConstructorSingleStep(Expr *E)
Definition: IgnoreExpr.h:125
@ OR_Deleted
Succeeded, but refers to a deleted function.
Definition: Overload.h:61
@ OR_Success
Overload resolution succeeded.
Definition: Overload.h:52
bool isReservedInAllContexts(ReservedIdentifierStatus Status)
Determine whether an identifier is reserved in all contexts.
IfStatementKind
In an if statement, this denotes whether the statement is a constexpr or consteval if statement.
Definition: Specifiers.h:39
Expr * IgnoreExprNodes(Expr *E, FnTys &&... Fns)
Given an expression E and functions Fn_1,...,Fn_n : Expr * -> Expr *, Recursively apply each of the f...
Definition: IgnoreExpr.h:34
@ RQ_None
No ref-qualifier was provided.
Definition: TypeBase.h:1782
@ OCD_AllCandidates
Requests that all candidates be shown.
Definition: Overload.h:67
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
bool operator==(const CallGraphNode::CallRecord &LHS, const CallGraphNode::CallRecord &RHS)
Definition: CallGraph.h:204
@ AS_private
Definition: Specifiers.h:126
CapturedRegionKind
The different kinds of captured statement.
Definition: CapturedStmt.h:16
@ CR_OpenMP
Definition: CapturedStmt.h:19
@ SC_None
Definition: Specifiers.h:250
StmtResult StmtError()
Definition: Ownership.h:266
@ Result
The result type of a method or function.
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
Definition: Sema.h:687
bool hasArmZT0State(const FunctionDecl *FD)
Returns whether the given FunctionDecl has Arm ZT0 state.
Definition: Decl.cpp:5988
ActionResult< Expr * > ExprResult
Definition: Ownership.h:249
@ Struct
The "struct" keyword.
ExprResult ExprError()
Definition: Ownership.h:265
@ AR_NotYetIntroduced
Definition: DeclBase.h:74
@ AR_Available
Definition: DeclBase.h:73
@ AR_Deprecated
Definition: DeclBase.h:75
@ AR_Unavailable
Definition: DeclBase.h:76
bool isLambdaConversionOperator(CXXConversionDecl *C)
Definition: ASTLambda.h:69
ActionResult< Stmt * > StmtResult
Definition: Ownership.h:250
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition: Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition: Specifiers.h:139
Expr * IgnoreParensSingleStep(Expr *E)
Definition: IgnoreExpr.h:150
const FunctionProtoType * T
Expr * IgnoreImplicitAsWrittenSingleStep(Expr *E)
Definition: IgnoreExpr.h:137
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
TemplateDeductionResult
Describes the result of template argument deduction.
Definition: Sema.h:366
@ Success
Template argument deduction was successful.
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
@ AlreadyDiagnosed
Some error which was already diagnosed.
@ CaseValue
Expression in a case label.
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition: Decl.cpp:5967
ReservedIdentifierStatus
@ CapturedContext
Parameter for captured context.
bool hasArmZAState(const FunctionDecl *FD)
Returns whether the given FunctionDecl has Arm ZA state.
Definition: Decl.cpp:5981
Diagnostic wrappers for TextAPI types for error reporting.
Definition: Dominators.h:30
#define true
Definition: stdbool.h:25
#define false
Definition: stdbool.h:26
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
EvalResult is a struct with detailed info about an evaluated expression.
Definition: Expr.h:645
bool isMoveEligible() const
Definition: Sema.h:11060
bool isCopyElidable() const
Definition: Sema.h:11061
const VarDecl * Candidate
Definition: Sema.h:11055
static CatchHandlerType getEmptyKey()
Definition: SemaStmt.cpp:4287
static CatchHandlerType getTombstoneKey()
Definition: SemaStmt.cpp:4292
static unsigned getHashValue(const CatchHandlerType &Base)
Definition: SemaStmt.cpp:4297
static bool isEqual(const CatchHandlerType &LHS, const CatchHandlerType &RHS)
Definition: SemaStmt.cpp:4301