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
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) {
132 SourceLocation Loc;
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)
193 << FixItHint::CreateReplacement(Loc, "|=");
194 else if (Kind == Equality)
195 S.Diag(Loc, diag::note_equality_comparison_to_assign)
196 << FixItHint::CreateReplacement(Loc, "=");
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;
252 SourceLocation Loc;
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
283 if (DiagnoseUnusedComparison(S, E))
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();
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
431
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) &&
599 !Context.getSourceManager().isInSystemHeader(IdentLoc))
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
662 Expr *E = R->getRetValue();
663
664 if (CurContext->isDependentContext() || (E && E->isInstantiationDependent()))
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
728 QualType This;
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 {
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)
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;
760 ContextType = 0;
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()) {
928 InitializedEntity Entity = InitializedEntity::InitializeParameter(
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());
945 EvaluatedExprVisitor<CommaVisitor>::VisitBinaryOperator(E);
946 }
947};
948}
949
951 IfStatementKind StatementKind,
952 SourceLocation LParenLoc, Stmt *InitStmt,
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 ==
1009 if (CurContext->isFunctionOrMethod()) {
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,
1036 Stmt *thenStmt, SourceLocation ElseLoc,
1037 Stmt *elseStmt) {
1038 if (Cond.isInvalid())
1039 return StmtError();
1040
1041 if (StatementKind != IfStatementKind::Ordinary ||
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() &&
1165 !Cond->getType()->isIntegralOrEnumerationType())
1166 return ExprError();
1167
1168 // C99 6.8.4.2p5 - Integer promotions are performed on the controlling expr.
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();
1250 CanQualType EnumType = S.Context.getCanonicalTagType(ED);
1251 if (VD->hasGlobalStorage() && VarType.isConstQualified() &&
1252 S.Context.hasSameUnqualifiedType(EnumType, VarType))
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
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) {
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
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
2122 typedef ConstEvaluatedExprVisitor<BreakContinueFinder> Inherited;
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.
2321 ExprResult result = CheckPlaceholderExpr(E);
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());
2351 TemplateDeductionResult Result = SemaRef.DeduceAutoType(
2352 Decl->getTypeSourceInfo()->getTypeLoc(), Init, InitType, Info);
2353 if (Result != TemplateDeductionResult::Success &&
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;
2397 SourceLocation Loc = D->getLocation();
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);
2416 TypeSourceInfo *TInfo = SemaRef.Context.getTrivialTypeSourceInfo(Type, Loc);
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
2440 if (Range && ObjCEnumerationCollection(Range)) {
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,
2479 Context.getAutoRRefDeductType(),
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.
2653static StmtResult RebuildForRangeWithDereference(Sema &SemaRef, Scope *S,
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
2746 QualType AutoType = Context.getAutoDeductType();
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,
2825 CreateParsedType(VAT->desugar(), Context.getTrivialTypeSourceInfo(
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(),
2836 Context.getTrivialTypeSourceInfo(
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 {
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 {
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
3210 return ObjC().FinishObjCForCollectionStmt(S, B);
3211
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();
3243 QualType DestTy = Context.getPointerType(Context.VoidTy.withConst());
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.
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.
3381 (S->isLoopScope() && S->getParent() &&
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() &&
3464 Context.getDeclAlign(VD) > Context.getTypeAlignInChars(VDType))
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;
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.
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.
3629 if (!CurContext->isDependentContext())
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().
3813 CXXScalarValueInitExpr VoidVal(Context.VoidTy, nullptr, SourceLocation());
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.
3887 Context.adjustDeducedFunctionResultType(FD, Deduced);
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
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())) {
3982 if (RT->getOriginalDecl()->isOrContainsUnion())
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()) {
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 =
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 &&
4473 !getSourceManager().isInSystemHeader(Loc) &&
4474 !CurContext->isDependentContext())
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.
4510 if (!Context.getTargetInfo().isSEHTrySupported())
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
4535
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 =
4674 Context.getPointerType(Context.getCanonicalTagType(RD));
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 =
4717 Context.getPointerType(Context.getCanonicalTagType(RD))
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 =
4740 Context.getPointerType(Context.getCanonicalTagType(RD));
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
4765
4767 Record->setInvalidDecl();
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.
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.
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.
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.
static bool FinishForRangeVarDecl(Sema &SemaRef, VarDecl *Decl, Expr *Init, SourceLocation Loc, int DiagID)
Finish building a variable declaration for a for-range statement.
static bool CmpCaseVals(const std::pair< llvm::APSInt, CaseStmt * > &lhs, const std::pair< llvm::APSInt, CaseStmt * > &rhs)
CmpCaseVals - Comparison predicate for sorting case values.
SmallVector< std::pair< llvm::APSInt, EnumConstantDecl * >, 64 > EnumValsTy
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...
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)
static bool EqEnumVals(const std::pair< llvm::APSInt, EnumConstantDecl * > &lhs, const std::pair< llvm::APSInt, EnumConstantDecl * > &rhs)
EqEnumVals - Comparison preficate for uniqing enumeration values.
static std::optional< int > isOpenMPCapturedRegionInArmSMEFunction(Sema const &S, CapturedRegionKind Kind)
static bool hasDeducedReturnType(FunctionDecl *FD)
Determine whether the declared return type of the specified function contains 'auto'.
static bool ObjCEnumerationCollection(Expr *Collection)
static void DiagnoseForRangeConstVariableCopies(Sema &SemaRef, const VarDecl *VD)
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.
static void checkEnumTypesInSwitchStmt(Sema &S, const Expr *Cond, const Expr *Case)
static void DiagnoseForRangeReferenceVariableCopies(Sema &SemaRef, const VarDecl *VD, QualType RangeInitType)
static void DiagnoseForRangeVariableCopies(Sema &SemaRef, const CXXForRangeStmt *ForStmt)
DiagnoseForRangeVariableCopies - Diagnose three cases and fixes for them.
static bool CheckSimplerImplicitMovesMSVCWorkaround(const Sema &S, const Expr *E)
static bool VerifyInitializationSequenceCXX98(const Sema &S, const InitializationSequence &Seq)
Verify that the initialization sequence that was picked for the first overload resolution is permissi...
static QualType GetTypeBeforeIntegralPromotion(const Expr *&E)
GetTypeBeforeIntegralPromotion - Returns the pre-promotion type of potentially integral-promoted expr...
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.
static bool hasTrivialABIAttr(QualType VariableType)
Determines whether the VariableType's declaration is a record with the clang::trivial_abi attribute.
static void AdjustAPSInt(llvm::APSInt &Val, unsigned BitWidth, bool IsSigned)
static bool buildCapturedStmtCaptureList(Sema &S, CapturedRegionScopeInfo *RSI, SmallVectorImpl< CapturedStmt::Capture > &Captures, SmallVectorImpl< Expr * > &CaptureInits)
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.
static void CheckJumpOutOfSEHFinally(Sema &S, SourceLocation Loc, const Scope &DestScope)
Defines the Objective-C statement AST node classes.
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:188
CanQualType VoidPtrTy
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType getCanonicalTagType(const TagDecl *TD) const
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:3720
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
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
Definition Expr.h:4443
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Definition Expr.h:4427
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:3974
Expr * getLHS() const
Definition Expr.h:4024
SourceLocation getExprLoc() const
Definition Expr.h:4015
Expr * getRHS() const
Definition Expr.h:4026
Opcode getOpcode() const
Definition Expr.h:4019
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
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
void setOrigin(const CXXRecordDecl *Rec)
bool isAmbiguous(CanQualType BaseType)
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
QualType getType() const
Retrieves the type of the base class.
Definition DeclCXX.h:249
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
Definition DeclCXX.h:230
Represents binding an expression to a temporary.
Definition ExprCXX.h:1494
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
DeclStmt * getBeginStmt()
Definition StmtCXX.h:163
DeclStmt * getEndStmt()
Definition StmtCXX.h:166
DeclStmt * getRangeStmt()
Definition StmtCXX.h:162
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
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)
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
CastKind getCastKind() const
Definition Expr.h:3656
Expr * getSubExpr()
Definition Expr.h:3662
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
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression representing the value of the expression if the condition eva...
Definition Expr.h:4359
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
Definition Expr.h:4350
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression representing the value of the expression if the condition eval...
Definition Expr.h:4354
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3758
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.
bool isRecord() const
Definition DeclBase.h:2189
void addDecl(Decl *D)
Add the declaration D into this context.
bool isStdNamespace() const
bool isFunctionOrMethod() const
Definition DeclBase.h:2161
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
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 *)
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
SourceLocation getDefaultLoc() const
Definition Stmt.h:2085
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
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
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.
FPOptionsOverride getChangesFrom(const FPOptions &Base) const
Return difference with the given option set.
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
Stmt * getInit()
Definition Stmt.h:2903
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
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition Decl.cpp:4254
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition Decl.cpp:4270
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:5264
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4460
static StringRef getNameForCallConv(CallingConv CC)
Definition Type.cpp:3578
bool getNoReturnAttr() const
Determine whether this function type includes the GNU noreturn attribute.
Definition TypeBase.h:4808
QualType getReturnType() const
Definition TypeBase.h:4800
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
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
SourceLocation getKwLoc() const
Definition Stmt.h:3082
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
This represents a decl that may have a name.
Definition Decl.h:273
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
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:7903
PtrTy get() const
Definition Ownership.h:81
Expr * getSourceExpr() const
The source expression of an opaque value expression is the expression which originally generated the ...
Definition Expr.h:1230
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
const Expr * getSubExpr() const
Definition Expr.h:2201
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:8369
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:2915
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:8470
QualType getCanonicalType() const
Definition TypeBase.h:8337
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8379
void removeLocalConst()
Definition TypeBase.h:8393
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8358
@ 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
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
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
unsigned getDepth() const
Returns the depth of this scope. The translation-unit has scope depth 0.
Definition Scope.h:339
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 isLoopScope() const
Return true if this scope is a loop.
Definition Scope.h:520
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
bool isConditionVarScope() const
Definition Scope.h:316
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
bool isOpenMPLoopScope() const
Determine whether this scope is a loop having OpenMP loop directive attached.
Definition Scope.h:551
@ 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:7776
ExprResult release()
Definition Sema.h:7722
Expr * get() const
Definition Sema.h:7724
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12364
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:854
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
SmallVector< Scope *, 2 > CurrentSEHFinally
Stack of active SEH __finally scopes. Can be empty.
Definition Sema.h:10913
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:12941
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1120
StmtResult ActOnBreakStmt(SourceLocation BreakLoc, Scope *CurScope, LabelDecl *Label, SourceLocation LabelLoc)
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.
StmtResult BuildMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, NestedNameSpecifierLoc QualifierLoc, DeclarationNameInfo NameInfo, Stmt *Nested)
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:9296
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:1505
StmtResult ActOnSEHLeaveStmt(SourceLocation Loc, Scope *CurScope)
StmtResult ActOnForEachLValueExpr(Expr *E)
In an Objective C collection iteration statement: for (x in y) x can be an arbitrary l-value expressi...
void ActOnForEachDeclStmt(DeclGroupPtrTy Decl)
Definition SemaStmt.cpp:85
SemaCUDA & CUDA()
Definition Sema.h:1445
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7798
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1223
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)
StmtResult ActOnGotoStmt(SourceLocation GotoLoc, SourceLocation LabelLoc, LabelDecl *TheDecl)
StmtResult ActOnReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, Scope *CurScope)
void setFunctionHasBranchIntoScope()
Definition Sema.cpp:2492
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
Definition SemaStmt.cpp:485
SimplerImplicitMoveMode
Definition Sema.h:11070
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.
StmtResult BuildIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
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.
void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry)
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
ASTContext & Context
Definition Sema.h:1283
bool DiagIfReachable(SourceLocation Loc, ArrayRef< const Stmt * > Stmts, const PartialDiagnostic &PD)
Conditionally issue a diagnostic based on the statements's reachability analysis.
void FinalizeDeclaration(Decl *D)
FinalizeDeclaration - called by ParseDeclarationAfterDeclarator to perform any semantic actions neces...
void ActOnCapturedRegionError()
SemaObjC & ObjC()
Definition Sema.h:1490
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:925
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1059
ExprResult BuildUnaryOp(Scope *S, SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *Input, bool IsAfterAmp=false)
void PopExpressionEvaluationContext()
StmtResult ActOnSEHTryBlock(bool IsCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
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
@ FRS_Success
Definition Sema.h:10736
@ FRS_DiagnosticIssued
Definition Sema.h:10738
@ FRS_NoViableFunction
Definition Sema.h:10737
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)
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)
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...
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:920
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
void PopCompoundScope()
Definition Sema.cpp:2481
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14224
const LangOptions & getLangOpts() const
Definition Sema.h:918
StmtResult ActOnWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, ConditionResult Cond, SourceLocation RParenLoc, Stmt *Body)
Preprocessor & PP
Definition Sema.h:1282
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:1281
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....
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
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...
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)
void ActOnCapturedRegionStart(SourceLocation Loc, Scope *CurScope, CapturedRegionKind Kind, unsigned NumParams)
sema::FunctionScopeInfo * getCurFunction() const
Definition Sema.h:1314
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...
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...
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:1418
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8129
StmtResult ActOnCapScopeReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, NamedReturnInfo &NRInfo, bool SupressSimplerImplicitMoves)
ActOnCapScopeReturnStmt - Utility routine to type-check return statements for capturing scopes.
StmtResult ActOnCapturedRegionEnd(Stmt *S)
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
StmtResult ActOnIndirectGotoStmt(SourceLocation GotoLoc, SourceLocation StarLoc, Expr *DestExp)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:13796
SourceManager & getSourceManager() const
Definition Sema.h:923
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.
void ActOnInitializerError(Decl *Dcl)
ActOnInitializerError - Given that there was an error parsing an initializer for the given declaratio...
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.
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
ExprResult ActOnBinOp(Scope *S, SourceLocation TokLoc, tok::TokenKind Kind, Expr *LHSExpr, Expr *RHSExpr)
Binary Operators. 'Tok' is the token for the operator.
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)
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.
StmtResult ActOnDoStmt(SourceLocation DoLoc, Stmt *Body, SourceLocation WhileLoc, SourceLocation CondLParen, Expr *Cond, SourceLocation CondRParen)
StmtResult ActOnStartOfSwitchStmt(SourceLocation SwitchLoc, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc)
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 ...
StmtResult ActOnMSDependentExistsStmt(SourceLocation KeywordLoc, bool IsIfExists, CXXScopeSpec &SS, UnqualifiedId &Name, Stmt *Nested)
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6705
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6700
StmtResult ActOnSEHExceptBlock(SourceLocation Loc, Expr *FilterExpr, Stmt *Block)
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.
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void DiscardCleanupsInEvaluationContext()
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8269
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
StmtResult ActOnAttributedStmt(const ParsedAttributes &AttrList, Stmt *SubStmt)
Definition SemaStmt.cpp:648
SourceManager & SourceMgr
Definition Sema.h:1286
DiagnosticsEngine & Diags
Definition Sema.h:1285
void ActOnStartSEHFinallyBlock()
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
void ActOnAbortSEHFinallyBlock()
friend class InitializationSequence
Definition Sema.h:1560
void PopDeclContext()
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
BuildForRangeKind
Definition Sema.h:11003
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11011
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11005
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11008
StmtResult ActOnCXXCatchBlock(SourceLocation CatchLoc, Decl *ExDecl, Stmt *HandlerBlock)
ActOnCXXCatchBlock - Takes an exception declaration and a handler block and creates a proper catch ha...
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.
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...
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.
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...
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.
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...
OpaquePtr< DeclGroupRef > DeclGroupPtrTy
Definition Sema.h:1274
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.
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition Sema.h:8606
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
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
Stmt * getBody()
Definition Stmt.h:2584
Stmt * getInit()
Definition Stmt.h:2589
SwitchCase * getSwitchCaseList()
Definition Stmt.h:2640
DeclStmt * getConditionVariableDeclStmt()
If this SwitchStmt has a condition variable, return the faux DeclStmt associated with the creation of...
Definition Stmt.h:2623
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
void startDefinition()
Starts the definition of this tag declaration.
Definition Decl.cpp:4847
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:2715
A container of type source information.
Definition TypeBase.h:8256
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:8267
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isVoidType() const
Definition TypeBase.h:8878
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
Definition Type.cpp:2225
bool isRValueReferenceType() const
Definition TypeBase.h:8554
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:8621
bool isPointerType() const
Definition TypeBase.h:8522
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:8922
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9168
bool isReferenceType() const
Definition TypeBase.h:8546
bool isEnumeralType() const
Definition TypeBase.h:8653
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:8996
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition TypeBase.h:2899
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
Definition TypeBase.h:8847
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2782
bool containsErrors() const
Whether this type is an error type.
Definition TypeBase.h:2776
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:9154
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition TypeBase.h:9014
bool isObjectType() const
Determine whether this type is an object type.
Definition TypeBase.h:2510
bool isIncompleteType(NamedDecl **Def=nullptr) const
Types are partitioned into 3 broad categories (C99 6.2.5p1): object types, function types,...
Definition Type.cpp:2436
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2921
TypeClass getTypeClass() const
Definition TypeBase.h:2385
bool isCanonicalUnqualified() const
Determines if this type would be canonical if it had no further qualification.
Definition TypeBase.h:2411
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9101
bool isRecordType() const
Definition TypeBase.h:8649
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2246
Expr * getSubExpr() const
Definition Expr.h:2287
Opcode getOpcode() const
Definition Expr.h:2282
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:3964
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
SourceLocation FirstCoroutineStmtLoc
First coroutine statement in the current function.
Definition ScopeInfo.h:183
enum clang::sema::FunctionScopeInfo::@340304006310276167163023075110222134352007243353 FirstTryType
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 This(InterpState &S, CodePtr OpPC)
Definition Interp.h:2795
bool Cast(InterpState &S, CodePtr OpPC)
Definition Interp.h:2481
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.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus23
@ CPlusPlus
@ CPlusPlus11
@ CPlusPlus14
@ CPlusPlus17
Expr * IgnoreElidableImplicitConstructorSingleStep(Expr *E)
Definition IgnoreExpr.h:125
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ 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
SmallVector< Attr *, 4 > AttrVec
AttrVec - A vector of Attr, which is how they are stored on the AST.
nullptr
This class represents a compute construct, representing a 'Kind' of β€˜parallel’, 'serial',...
CapturedRegionKind
The different kinds of captured statement.
@ CR_OpenMP
@ SC_None
Definition Specifiers.h:250
Expr * Cond
};
StmtResult StmtError()
Definition Ownership.h:266
@ Result
The result type of a method or function.
Definition TypeBase.h:905
const FunctionProtoType * T
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
@ Struct
The "struct" keyword.
Definition TypeBase.h:5890
ExprResult ExprError()
Definition Ownership.h:265
@ Type
The name was classified as a type.
Definition Sema.h:562
@ 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
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
@ 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
Expr * IgnoreImplicitAsWrittenSingleStep(Expr *E)
Definition IgnoreExpr.h:137
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:366
@ Success
Template argument deduction was successful.
Definition Sema.h:368
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:382
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:420
U cast(CodeGen::Address addr)
Definition Address.h:327
@ CaseValue
Expression in a case label.
Definition Sema.h:825
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition Decl.cpp:5967
ReservedIdentifierStatus
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ CapturedContext
Parameter for captured context.
Definition Decl.h:1739
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
bool hasArmZAState(const FunctionDecl *FD)
Returns whether the given FunctionDecl has Arm ZA state.
Definition Decl.cpp:5981
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
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:11067
bool isCopyElidable() const
Definition Sema.h:11068
const VarDecl * Candidate
Definition Sema.h:11062
static CatchHandlerType getEmptyKey()
static CatchHandlerType getTombstoneKey()
static unsigned getHashValue(const CatchHandlerType &Base)
static bool isEqual(const CatchHandlerType &LHS, const CatchHandlerType &RHS)