clang 23.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->getDecl()->getIdentifier() &&
1281 !CondEnumType->getDecl()->getTypedefNameForAnonDecl())
1282 return;
1283 if (!CaseEnumType->getDecl()->getIdentifier() &&
1284 !CaseEnumType->getDecl()->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 // Build auto __begin = begin-expr, __end = end-expr.
2757 // Divide by 2, since the variables are in the inner scope (loop body).
2758 const auto DepthStr = std::to_string(S->getDepth() / 2);
2759 VarDecl *BeginVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,
2760 std::string("__begin") + DepthStr);
2761 VarDecl *EndVar = BuildForRangeVarDecl(*this, ColonLoc, AutoType,
2762 std::string("__end") + DepthStr);
2763
2764 // Build begin-expr and end-expr and attach to __begin and __end variables.
2765 ExprResult BeginExpr, EndExpr;
2766 if (const ArrayType *UnqAT = RangeType->getAsArrayTypeUnsafe()) {
2767 // - if _RangeT is an array type, begin-expr and end-expr are __range and
2768 // __range + __bound, respectively, where __bound is the array bound. If
2769 // _RangeT is an array of unknown size or an array of incomplete type,
2770 // the program is ill-formed;
2771
2772 // begin-expr is __range.
2773 BeginExpr = BeginRangeRef;
2774 if (!CoawaitLoc.isInvalid()) {
2775 BeginExpr = ActOnCoawaitExpr(S, ColonLoc, BeginExpr.get());
2776 if (BeginExpr.isInvalid())
2777 return StmtError();
2778 }
2779 if (FinishForRangeVarDecl(*this, BeginVar, BeginRangeRef.get(), ColonLoc,
2780 diag::err_for_range_iter_deduction_failure)) {
2781 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2782 return StmtError();
2783 }
2784
2785 // Find the array bound.
2786 ExprResult BoundExpr;
2787 if (const ConstantArrayType *CAT = dyn_cast<ConstantArrayType>(UnqAT))
2788 BoundExpr = IntegerLiteral::Create(
2789 Context, CAT->getSize(), Context.getPointerDiffType(), RangeLoc);
2790 else if (const VariableArrayType *VAT =
2791 dyn_cast<VariableArrayType>(UnqAT)) {
2792 // For a variably modified type we can't just use the expression within
2793 // the array bounds, since we don't want that to be re-evaluated here.
2794 // Rather, we need to determine what it was when the array was first
2795 // created - so we resort to using sizeof(vla)/sizeof(element).
2796 // For e.g.
2797 // void f(int b) {
2798 // int vla[b];
2799 // b = -1; <-- This should not affect the num of iterations below
2800 // for (int &c : vla) { .. }
2801 // }
2802
2803 // FIXME: This results in codegen generating IR that recalculates the
2804 // run-time number of elements (as opposed to just using the IR Value
2805 // that corresponds to the run-time value of each bound that was
2806 // generated when the array was created.) If this proves too embarrassing
2807 // even for unoptimized IR, consider passing a magic-value/cookie to
2808 // codegen that then knows to simply use that initial llvm::Value (that
2809 // corresponds to the bound at time of array creation) within
2810 // getelementptr. But be prepared to pay the price of increasing a
2811 // customized form of coupling between the two components - which could
2812 // be hard to maintain as the codebase evolves.
2813
2815 EndVar->getLocation(), UETT_SizeOf,
2816 /*IsType=*/true,
2817 CreateParsedType(VAT->desugar(), Context.getTrivialTypeSourceInfo(
2818 VAT->desugar(), RangeLoc))
2819 .getAsOpaquePtr(),
2820 EndVar->getSourceRange());
2821 if (SizeOfVLAExprR.isInvalid())
2822 return StmtError();
2823
2824 ExprResult SizeOfEachElementExprR = ActOnUnaryExprOrTypeTraitExpr(
2825 EndVar->getLocation(), UETT_SizeOf,
2826 /*IsType=*/true,
2827 CreateParsedType(VAT->desugar(),
2828 Context.getTrivialTypeSourceInfo(
2829 VAT->getElementType(), RangeLoc))
2830 .getAsOpaquePtr(),
2831 EndVar->getSourceRange());
2832 if (SizeOfEachElementExprR.isInvalid())
2833 return StmtError();
2834
2835 BoundExpr =
2836 ActOnBinOp(S, EndVar->getLocation(), tok::slash,
2837 SizeOfVLAExprR.get(), SizeOfEachElementExprR.get());
2838 if (BoundExpr.isInvalid())
2839 return StmtError();
2840
2841 } else {
2842 // Can't be a DependentSizedArrayType or an IncompleteArrayType since
2843 // UnqAT is not incomplete and Range is not type-dependent.
2844 llvm_unreachable("Unexpected array type in for-range");
2845 }
2846
2847 // end-expr is __range + __bound.
2848 EndExpr = ActOnBinOp(S, ColonLoc, tok::plus, EndRangeRef.get(),
2849 BoundExpr.get());
2850 if (EndExpr.isInvalid())
2851 return StmtError();
2852 if (FinishForRangeVarDecl(*this, EndVar, EndExpr.get(), ColonLoc,
2853 diag::err_for_range_iter_deduction_failure)) {
2854 NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
2855 return StmtError();
2856 }
2857 } else {
2858 OverloadCandidateSet CandidateSet(RangeLoc,
2860 BeginEndFunction BEFFailure;
2862 *this, BeginRangeRef.get(), EndRangeRef.get(), RangeType, BeginVar,
2863 EndVar, ColonLoc, CoawaitLoc, &CandidateSet, &BeginExpr, &EndExpr,
2864 &BEFFailure);
2865
2866 if (Kind == BFRK_Build && RangeStatus == FRS_NoViableFunction &&
2867 BEFFailure == BEF_begin) {
2868 // If the range is being built from an array parameter, emit a
2869 // a diagnostic that it is being treated as a pointer.
2870 if (DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(Range)) {
2871 if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(DRE->getDecl())) {
2872 QualType ArrayTy = PVD->getOriginalType();
2873 QualType PointerTy = PVD->getType();
2874 if (PointerTy->isPointerType() && ArrayTy->isArrayType()) {
2875 Diag(Range->getBeginLoc(), diag::err_range_on_array_parameter)
2876 << RangeLoc << PVD << ArrayTy << PointerTy;
2877 Diag(PVD->getLocation(), diag::note_declared_at);
2878 return StmtError();
2879 }
2880 }
2881 }
2882
2883 // If building the range failed, try dereferencing the range expression
2884 // unless a diagnostic was issued or the end function is problematic.
2885 StmtResult SR = RebuildForRangeWithDereference(*this, S, ForLoc,
2886 CoawaitLoc, InitStmt,
2887 LoopVarDecl, ColonLoc,
2888 Range, RangeLoc,
2889 RParenLoc);
2890 if (SR.isInvalid() || SR.isUsable())
2891 return SR;
2892 }
2893
2894 // Otherwise, emit diagnostics if we haven't already.
2895 if (RangeStatus == FRS_NoViableFunction) {
2896 Expr *Range = BEFFailure ? EndRangeRef.get() : BeginRangeRef.get();
2897 CandidateSet.NoteCandidates(
2898 PartialDiagnosticAt(Range->getBeginLoc(),
2899 PDiag(diag::err_for_range_invalid)
2900 << RangeLoc << Range->getType()
2901 << BEFFailure),
2902 *this, OCD_AllCandidates, Range);
2903 }
2904 // Return an error if no fix was discovered.
2905 if (RangeStatus != FRS_Success)
2906 return StmtError();
2907 }
2908
2909 assert(!BeginExpr.isInvalid() && !EndExpr.isInvalid() &&
2910 "invalid range expression in for loop");
2911
2912 // C++11 [dcl.spec.auto]p7: BeginType and EndType must be the same.
2913 // C++1z removes this restriction.
2914 QualType BeginType = BeginVar->getType(), EndType = EndVar->getType();
2915 if (!Context.hasSameType(BeginType, EndType)) {
2916 Diag(RangeLoc, getLangOpts().CPlusPlus17
2917 ? diag::warn_for_range_begin_end_types_differ
2918 : diag::ext_for_range_begin_end_types_differ)
2919 << BeginType << EndType;
2920 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2921 NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
2922 }
2923
2924 BeginDeclStmt =
2925 ActOnDeclStmt(ConvertDeclToDeclGroup(BeginVar), ColonLoc, ColonLoc);
2926 EndDeclStmt =
2927 ActOnDeclStmt(ConvertDeclToDeclGroup(EndVar), ColonLoc, ColonLoc);
2928
2929 const QualType BeginRefNonRefType = BeginType.getNonReferenceType();
2930 ExprResult BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
2931 VK_LValue, ColonLoc);
2932 if (BeginRef.isInvalid())
2933 return StmtError();
2934
2935 ExprResult EndRef = BuildDeclRefExpr(EndVar, EndType.getNonReferenceType(),
2936 VK_LValue, ColonLoc);
2937 if (EndRef.isInvalid())
2938 return StmtError();
2939
2940 // Build and check __begin != __end expression.
2941 NotEqExpr = ActOnBinOp(S, ColonLoc, tok::exclaimequal,
2942 BeginRef.get(), EndRef.get());
2943 if (!NotEqExpr.isInvalid())
2944 NotEqExpr = CheckBooleanCondition(ColonLoc, NotEqExpr.get());
2945 if (!NotEqExpr.isInvalid())
2946 NotEqExpr =
2947 ActOnFinishFullExpr(NotEqExpr.get(), /*DiscardedValue*/ false);
2948 if (NotEqExpr.isInvalid()) {
2949 Diag(RangeLoc, diag::note_for_range_invalid_iterator)
2950 << RangeLoc << 0 << BeginRangeRef.get()->getType();
2951 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2952 if (!Context.hasSameType(BeginType, EndType))
2953 NoteForRangeBeginEndFunction(*this, EndExpr.get(), BEF_end);
2954 return StmtError();
2955 }
2956
2957 // Build and check ++__begin expression.
2958 BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
2959 VK_LValue, ColonLoc);
2960 if (BeginRef.isInvalid())
2961 return StmtError();
2962
2963 IncrExpr = ActOnUnaryOp(S, ColonLoc, tok::plusplus, BeginRef.get());
2964 if (!IncrExpr.isInvalid() && CoawaitLoc.isValid())
2965 // FIXME: getCurScope() should not be used during template instantiation.
2966 // We should pick up the set of unqualified lookup results for operator
2967 // co_await during the initial parse.
2968 IncrExpr = ActOnCoawaitExpr(S, CoawaitLoc, IncrExpr.get());
2969 if (!IncrExpr.isInvalid())
2970 IncrExpr = ActOnFinishFullExpr(IncrExpr.get(), /*DiscardedValue*/ false);
2971 if (IncrExpr.isInvalid()) {
2972 Diag(RangeLoc, diag::note_for_range_invalid_iterator)
2973 << RangeLoc << 2 << BeginRangeRef.get()->getType() ;
2974 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2975 return StmtError();
2976 }
2977
2978 // Build and check *__begin expression.
2979 BeginRef = BuildDeclRefExpr(BeginVar, BeginRefNonRefType,
2980 VK_LValue, ColonLoc);
2981 if (BeginRef.isInvalid())
2982 return StmtError();
2983
2984 ExprResult DerefExpr = ActOnUnaryOp(S, ColonLoc, tok::star, BeginRef.get());
2985 if (DerefExpr.isInvalid()) {
2986 Diag(RangeLoc, diag::note_for_range_invalid_iterator)
2987 << RangeLoc << 1 << BeginRangeRef.get()->getType();
2988 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2989 return StmtError();
2990 }
2991
2992 // Attach *__begin as initializer for VD. Don't touch it if we're just
2993 // trying to determine whether this would be a valid range.
2994 if (!LoopVar->isInvalidDecl() && Kind != BFRK_Check) {
2995 AddInitializerToDecl(LoopVar, DerefExpr.get(), /*DirectInit=*/false);
2996 if (LoopVar->isInvalidDecl() ||
2997 (LoopVar->getInit() && LoopVar->getInit()->containsErrors()))
2998 NoteForRangeBeginEndFunction(*this, BeginExpr.get(), BEF_begin);
2999 }
3000 }
3001
3002 // Don't bother to actually allocate the result if we're just trying to
3003 // determine whether it would be valid.
3004 if (Kind == BFRK_Check)
3005 return StmtResult();
3006
3007 // In OpenMP loop region loop control variable must be private. Perform
3008 // analysis of first part (if any).
3009 if (getLangOpts().OpenMP >= 50 && BeginDeclStmt.isUsable())
3010 OpenMP().ActOnOpenMPLoopInitialization(ForLoc, BeginDeclStmt.get());
3011
3012 // P2718R0 - Lifetime extension in range-based for loops.
3013 if (getLangOpts().CPlusPlus23 && !LifetimeExtendTemps.empty()) {
3015 for (auto *MTE : LifetimeExtendTemps)
3016 MTE->setExtendingDecl(RangeVar, Entity.allocateManglingNumber());
3017 }
3018
3019 return new (Context) CXXForRangeStmt(
3020 InitStmt, RangeDS, cast_or_null<DeclStmt>(BeginDeclStmt.get()),
3021 cast_or_null<DeclStmt>(EndDeclStmt.get()), NotEqExpr.get(),
3022 IncrExpr.get(), LoopVarDS, /*Body=*/nullptr, ForLoc, CoawaitLoc,
3023 ColonLoc, RParenLoc);
3024}
3025
3026// Warn when the loop variable is a const reference that creates a copy.
3027// Suggest using the non-reference type for copies. If a copy can be prevented
3028// suggest the const reference type that would do so.
3029// For instance, given "for (const &Foo : Range)", suggest
3030// "for (const Foo : Range)" to denote a copy is made for the loop. If
3031// possible, also suggest "for (const &Bar : Range)" if this type prevents
3032// the copy altogether.
3034 const VarDecl *VD,
3035 QualType RangeInitType) {
3036 const Expr *InitExpr = VD->getInit();
3037 if (!InitExpr)
3038 return;
3039
3040 QualType VariableType = VD->getType();
3041
3042 if (auto Cleanups = dyn_cast<ExprWithCleanups>(InitExpr))
3043 if (!Cleanups->cleanupsHaveSideEffects())
3044 InitExpr = Cleanups->getSubExpr();
3045
3046 const MaterializeTemporaryExpr *MTE =
3047 dyn_cast<MaterializeTemporaryExpr>(InitExpr);
3048
3049 // No copy made.
3050 if (!MTE)
3051 return;
3052
3053 const Expr *E = MTE->getSubExpr()->IgnoreImpCasts();
3054
3055 // Searching for either UnaryOperator for dereference of a pointer or
3056 // CXXOperatorCallExpr for handling iterators.
3057 while (!isa<CXXOperatorCallExpr>(E) && !isa<UnaryOperator>(E)) {
3058 if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(E)) {
3059 E = CCE->getArg(0);
3060 } else if (const CXXMemberCallExpr *Call = dyn_cast<CXXMemberCallExpr>(E)) {
3061 const MemberExpr *ME = cast<MemberExpr>(Call->getCallee());
3062 E = ME->getBase();
3063 } else {
3065 E = MTE->getSubExpr();
3066 }
3067 E = E->IgnoreImpCasts();
3068 }
3069
3070 QualType ReferenceReturnType;
3071 if (isa<UnaryOperator>(E)) {
3072 ReferenceReturnType = SemaRef.Context.getLValueReferenceType(E->getType());
3073 } else {
3075 const FunctionDecl *FD = Call->getDirectCallee();
3076 QualType ReturnType = FD->getReturnType();
3077 if (ReturnType->isReferenceType())
3078 ReferenceReturnType = ReturnType;
3079 }
3080
3081 if (!ReferenceReturnType.isNull()) {
3082 // Loop variable creates a temporary. Suggest either to go with
3083 // non-reference loop variable to indicate a copy is made, or
3084 // the correct type to bind a const reference.
3085 SemaRef.Diag(VD->getLocation(),
3086 diag::warn_for_range_const_ref_binds_temp_built_from_ref)
3087 << VD << VariableType << ReferenceReturnType;
3088 QualType NonReferenceType = VariableType.getNonReferenceType();
3089 NonReferenceType.removeLocalConst();
3090 QualType NewReferenceType =
3092 SemaRef.Diag(VD->getBeginLoc(), diag::note_use_type_or_non_reference)
3093 << NonReferenceType << NewReferenceType << VD->getSourceRange()
3095 } else if (!VariableType->isRValueReferenceType()) {
3096 // The range always returns a copy, so a temporary is always created.
3097 // Suggest removing the reference from the loop variable.
3098 // If the type is a rvalue reference do not warn since that changes the
3099 // semantic of the code.
3100 SemaRef.Diag(VD->getLocation(), diag::warn_for_range_ref_binds_ret_temp)
3101 << VD << RangeInitType;
3102 QualType NonReferenceType = VariableType.getNonReferenceType();
3103 NonReferenceType.removeLocalConst();
3104 SemaRef.Diag(VD->getBeginLoc(), diag::note_use_non_reference_type)
3105 << NonReferenceType << VD->getSourceRange()
3107 }
3108}
3109
3110/// Determines whether the @p VariableType's declaration is a record with the
3111/// clang::trivial_abi attribute.
3112static bool hasTrivialABIAttr(QualType VariableType) {
3113 if (CXXRecordDecl *RD = VariableType->getAsCXXRecordDecl())
3114 return RD->hasAttr<TrivialABIAttr>();
3115
3116 return false;
3117}
3118
3119// Warns when the loop variable can be changed to a reference type to
3120// prevent a copy. For instance, if given "for (const Foo x : Range)" suggest
3121// "for (const Foo &x : Range)" if this form does not make a copy.
3123 const VarDecl *VD) {
3124 const Expr *InitExpr = VD->getInit();
3125 if (!InitExpr)
3126 return;
3127
3128 QualType VariableType = VD->getType();
3129
3130 if (const CXXConstructExpr *CE = dyn_cast<CXXConstructExpr>(InitExpr)) {
3131 if (!CE->getConstructor()->isCopyConstructor())
3132 return;
3133 } else if (const CastExpr *CE = dyn_cast<CastExpr>(InitExpr)) {
3134 if (CE->getCastKind() != CK_LValueToRValue)
3135 return;
3136 } else {
3137 return;
3138 }
3139
3140 // Small trivially copyable types are cheap to copy. Do not emit the
3141 // diagnostic for these instances. 64 bytes is a common size of a cache line.
3142 // (The function `getTypeSize` returns the size in bits.)
3143 ASTContext &Ctx = SemaRef.Context;
3144 if (Ctx.getTypeSize(VariableType) <= 64 * 8 &&
3145 (VariableType.isTriviallyCopyConstructibleType(Ctx) ||
3146 hasTrivialABIAttr(VariableType)))
3147 return;
3148
3149 // Suggest changing from a const variable to a const reference variable
3150 // if doing so will prevent a copy.
3151 SemaRef.Diag(VD->getLocation(), diag::warn_for_range_copy)
3152 << VD << VariableType;
3153 SemaRef.Diag(VD->getBeginLoc(), diag::note_use_reference_type)
3154 << SemaRef.Context.getLValueReferenceType(VariableType)
3155 << VD->getSourceRange()
3157}
3158
3159/// DiagnoseForRangeVariableCopies - Diagnose three cases and fixes for them.
3160/// 1) for (const foo &x : foos) where foos only returns a copy. Suggest
3161/// using "const foo x" to show that a copy is made
3162/// 2) for (const bar &x : foos) where bar is a temporary initialized by bar.
3163/// Suggest either "const bar x" to keep the copying or "const foo& x" to
3164/// prevent the copy.
3165/// 3) for (const foo x : foos) where x is constructed from a reference foo.
3166/// Suggest "const foo &x" to prevent the copy.
3168 const CXXForRangeStmt *ForStmt) {
3169 if (SemaRef.inTemplateInstantiation())
3170 return;
3171
3173 if (SemaRef.Diags.isIgnored(
3174 diag::warn_for_range_const_ref_binds_temp_built_from_ref, Loc) &&
3175 SemaRef.Diags.isIgnored(diag::warn_for_range_ref_binds_ret_temp, Loc) &&
3176 SemaRef.Diags.isIgnored(diag::warn_for_range_copy, Loc)) {
3177 return;
3178 }
3179
3180 const VarDecl *VD = ForStmt->getLoopVariable();
3181 if (!VD)
3182 return;
3183
3184 QualType VariableType = VD->getType();
3185
3186 if (VariableType->isIncompleteType())
3187 return;
3188
3189 const Expr *InitExpr = VD->getInit();
3190 if (!InitExpr)
3191 return;
3192
3193 if (InitExpr->getExprLoc().isMacroID())
3194 return;
3195
3196 if (VariableType->isReferenceType()) {
3198 ForStmt->getRangeInit()->getType());
3199 } else if (VariableType.isConstQualified()) {
3201 }
3202}
3203
3205 if (!S || !B)
3206 return StmtError();
3207
3209 return ObjC().FinishObjCForCollectionStmt(S, B);
3210
3212 ForStmt->setBody(B);
3213
3215 diag::warn_empty_range_based_for_body);
3216
3218
3219 return S;
3220}
3221
3223 SourceLocation LabelLoc,
3224 LabelDecl *TheDecl) {
3226
3227 // If this goto is in a compute construct scope, we need to make sure we check
3228 // gotos in/out.
3229 if (getCurScope()->isInOpenACCComputeConstructScope())
3231
3232 TheDecl->markUsed(Context);
3233 return new (Context) GotoStmt(TheDecl, GotoLoc, LabelLoc);
3234}
3235
3238 Expr *E) {
3239 // Convert operand to void*
3240 if (!E->isTypeDependent()) {
3241 QualType ETy = E->getType();
3242 QualType DestTy = Context.getPointerType(Context.VoidTy.withConst());
3243 ExprResult ExprRes = E;
3244 AssignConvertType ConvTy =
3245 CheckSingleAssignmentConstraints(DestTy, ExprRes);
3246 if (ExprRes.isInvalid())
3247 return StmtError();
3248 E = ExprRes.get();
3249 if (DiagnoseAssignmentResult(ConvTy, StarLoc, DestTy, ETy, E,
3251 return StmtError();
3252 }
3253
3254 ExprResult ExprRes = ActOnFinishFullExpr(E, /*DiscardedValue*/ false);
3255 if (ExprRes.isInvalid())
3256 return StmtError();
3257 E = ExprRes.get();
3258
3260
3261 // If this goto is in a compute construct scope, we need to make sure we
3262 // check gotos in/out.
3263 if (getCurScope()->isInOpenACCComputeConstructScope())
3265
3266 return new (Context) IndirectGotoStmt(GotoLoc, StarLoc, E);
3267}
3268
3270 const Scope &DestScope,
3271 unsigned DeferJumpKind) {
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 if (!S.CurrentDefer.empty()) {
3278 Scope *Parent = S.CurrentDefer.back().first;
3279 assert(Parent);
3280
3281 // Note: We don't create a new scope for defer statements, so 'Parent'
3282 // is actually the scope that contains the '_Defer'.
3283 if (DestScope.Contains(*Parent) || &DestScope == Parent)
3284 S.Diag(Loc, diag::err_jump_out_of_defer_stmt) << DeferJumpKind;
3285 }
3286}
3287
3289 SourceLocation KWLoc,
3291 SourceLocation LabelLoc,
3292 bool IsContinue) {
3293 assert(Target && "not a named break/continue?");
3294
3295 Target->markUsed(S.Context);
3296
3297 Scope *Found = nullptr;
3298 for (Scope *Scope = CurScope; Scope; Scope = Scope->getParent()) {
3299 if (Scope->isFunctionScope())
3300 break;
3301
3303 S.Diag(KWLoc, diag::err_acc_branch_in_out_compute_construct)
3304 << /*branch*/ 0 << /*out of*/ 0;
3305 return nullptr;
3306 }
3307
3310 Found = Scope;
3311 break;
3312 }
3313 }
3314
3315 if (Found) {
3316 if (IsContinue && !Found->isContinueScope()) {
3317 S.Diag(LabelLoc, diag::err_continue_switch);
3318 return nullptr;
3319 }
3320 return Found;
3321 }
3322
3323 S.Diag(LabelLoc, diag::err_break_continue_label_not_found) << IsContinue;
3324 return nullptr;
3325}
3326
3328 LabelDecl *Target, SourceLocation LabelLoc) {
3329 Scope *S;
3330 if (Target) {
3331 S = FindLabeledBreakContinueScope(*this, CurScope, ContinueLoc, Target,
3332 LabelLoc,
3333 /*IsContinue=*/true);
3334 if (!S)
3335 return StmtError();
3336 } else {
3337 S = CurScope->getContinueParent();
3338 }
3339
3340 if (!S) {
3341 // C99 6.8.6.2p1: A break shall appear only in or as a loop body.
3342 return StmtError(Diag(ContinueLoc, diag::err_continue_not_in_loop));
3343 }
3344 if (S->isConditionVarScope()) {
3345 // We cannot 'continue;' from within a statement expression in the
3346 // initializer of a condition variable because we would jump past the
3347 // initialization of that variable.
3348 return StmtError(Diag(ContinueLoc, diag::err_continue_from_cond_var_init));
3349 }
3350
3351 // A 'continue' that would normally have execution continue on a block outside
3352 // of a compute construct counts as 'branching out of' the compute construct,
3353 // so diagnose here.
3355 return StmtError(
3356 Diag(ContinueLoc, diag::err_acc_branch_in_out_compute_construct)
3357 << /*branch*/ 0 << /*out of */ 0);
3358
3359 CheckJumpOutOfSEHFinallyOrDefer(*this, ContinueLoc, *S,
3360 diag::DeferJumpKind::Continue);
3361
3362 return new (Context) ContinueStmt(ContinueLoc, LabelLoc, Target);
3363}
3364
3366 LabelDecl *Target, SourceLocation LabelLoc) {
3367 Scope *S;
3368 if (Target) {
3369 S = FindLabeledBreakContinueScope(*this, CurScope, BreakLoc, Target,
3370 LabelLoc,
3371 /*IsContinue=*/false);
3372 if (!S)
3373 return StmtError();
3374 } else {
3375 S = CurScope->getBreakParent();
3376 }
3377
3378 if (!S) {
3379 // C99 6.8.6.3p1: A break shall appear only in or as a switch/loop body.
3380 return StmtError(Diag(BreakLoc, diag::err_break_not_in_loop_or_switch));
3381 }
3382
3383 if (S->isOpenMPLoopScope())
3384 return StmtError(Diag(BreakLoc, diag::err_omp_loop_cannot_use_stmt)
3385 << "break");
3386
3387 // OpenACC doesn't allow 'break'ing from a compute construct, so diagnose if
3388 // we are trying to do so. This can come in 2 flavors: 1-the break'able thing
3389 // (besides the compute construct) 'contains' the compute construct, at which
3390 // point the 'break' scope will be the compute construct. Else it could be a
3391 // loop of some sort that has a direct parent of the compute construct.
3392 // However, a 'break' in a 'switch' marked as a compute construct doesn't
3393 // count as 'branch out of' the compute construct.
3395 (S->isLoopScope() && S->getParent() &&
3397 return StmtError(
3398 Diag(BreakLoc, diag::err_acc_branch_in_out_compute_construct)
3399 << /*branch*/ 0 << /*out of */ 0);
3400
3401 CheckJumpOutOfSEHFinallyOrDefer(*this, BreakLoc, *S,
3402 diag::DeferJumpKind::Break);
3403
3404 return new (Context) BreakStmt(BreakLoc, LabelLoc, Target);
3405}
3406
3409 if (!E)
3410 return NamedReturnInfo();
3411 // - in a return statement in a function [where] ...
3412 // ... the expression is the name of a non-volatile automatic object ...
3413 const auto *DR = dyn_cast<DeclRefExpr>(E->IgnoreParens());
3414 if (!DR || DR->refersToEnclosingVariableOrCapture())
3415 return NamedReturnInfo();
3416 const auto *VD = dyn_cast<VarDecl>(DR->getDecl());
3417 if (!VD)
3418 return NamedReturnInfo();
3419 if (VD->getInit() && VD->getInit()->containsErrors())
3420 return NamedReturnInfo();
3422 if (Res.Candidate && !E->isXValue() &&
3427 CK_NoOp, E, nullptr, VK_XValue,
3429 }
3430 return Res;
3431}
3432
3435
3436 // C++20 [class.copy.elision]p3:
3437 // - in a return statement in a function with ...
3438 // (other than a function ... parameter)
3439 if (VD->getKind() == Decl::ParmVar)
3441 else if (VD->getKind() != Decl::Var)
3442 return NamedReturnInfo();
3443
3444 // (other than ... a catch-clause parameter)
3445 if (VD->isExceptionVariable())
3447
3448 // ...automatic...
3449 if (!VD->hasLocalStorage())
3450 return NamedReturnInfo();
3451
3452 // We don't want to implicitly move out of a __block variable during a return
3453 // because we cannot assume the variable will no longer be used.
3454 if (VD->hasAttr<BlocksAttr>())
3455 return NamedReturnInfo();
3456
3457 QualType VDType = VD->getType();
3458 if (VDType->isObjectType()) {
3459 // C++17 [class.copy.elision]p3:
3460 // ...non-volatile automatic object...
3461 if (VDType.isVolatileQualified())
3462 return NamedReturnInfo();
3463 } else if (VDType->isRValueReferenceType()) {
3464 // C++20 [class.copy.elision]p3:
3465 // ...either a non-volatile object or an rvalue reference to a non-volatile
3466 // object type...
3467 QualType VDReferencedType = VDType.getNonReferenceType();
3468 if (VDReferencedType.isVolatileQualified() ||
3469 !VDReferencedType->isObjectType())
3470 return NamedReturnInfo();
3472 } else {
3473 return NamedReturnInfo();
3474 }
3475
3476 // Variables with higher required alignment than their type's ABI
3477 // alignment cannot use NRVO.
3478 if (!VD->hasDependentAlignment() && !VDType->isIncompleteType() &&
3479 Context.getDeclAlign(VD) > Context.getTypeAlignInChars(VDType))
3481
3482 return Info;
3483}
3484
3486 QualType ReturnType) {
3487 if (!Info.Candidate)
3488 return nullptr;
3489
3490 auto invalidNRVO = [&] {
3491 Info = NamedReturnInfo();
3492 return nullptr;
3493 };
3494
3495 // If we got a non-deduced auto ReturnType, we are in a dependent context and
3496 // there is no point in allowing copy elision since we won't have it deduced
3497 // by the point the VardDecl is instantiated, which is the last chance we have
3498 // of deciding if the candidate is really copy elidable.
3499 if ((ReturnType->getTypeClass() == Type::TypeClass::Auto &&
3500 ReturnType->isCanonicalUnqualified()) ||
3501 ReturnType->isSpecificBuiltinType(BuiltinType::Dependent))
3502 return invalidNRVO();
3503
3504 if (!ReturnType->isDependentType()) {
3505 // - in a return statement in a function with ...
3506 // ... a class return type ...
3507 if (!ReturnType->isRecordType())
3508 return invalidNRVO();
3509
3510 QualType VDType = Info.Candidate->getType();
3511 // ... the same cv-unqualified type as the function return type ...
3512 // When considering moving this expression out, allow dissimilar types.
3513 if (!VDType->isDependentType() &&
3514 !Context.hasSameUnqualifiedType(ReturnType, VDType))
3516 }
3517 return Info.isCopyElidable() ? Info.Candidate : nullptr;
3518}
3519
3520/// Verify that the initialization sequence that was picked for the
3521/// first overload resolution is permissible under C++98.
3522///
3523/// Reject (possibly converting) constructors not taking an rvalue reference,
3524/// or user conversion operators which are not ref-qualified.
3525static bool
3527 const InitializationSequence &Seq) {
3528 const auto *Step = llvm::find_if(Seq.steps(), [](const auto &Step) {
3529 return Step.Kind == InitializationSequence::SK_ConstructorInitialization ||
3530 Step.Kind == InitializationSequence::SK_UserConversion;
3531 });
3532 if (Step != Seq.step_end()) {
3533 const auto *FD = Step->Function.Function;
3536 : cast<CXXMethodDecl>(FD)->getRefQualifier() == RQ_None)
3537 return false;
3538 }
3539 return true;
3540}
3541
3543 const InitializedEntity &Entity, const NamedReturnInfo &NRInfo, Expr *Value,
3544 bool SupressSimplerImplicitMoves) {
3545 if (getLangOpts().CPlusPlus &&
3546 (!getLangOpts().CPlusPlus23 || SupressSimplerImplicitMoves) &&
3547 NRInfo.isMoveEligible()) {
3549 CK_NoOp, Value, VK_XValue, FPOptionsOverride());
3550 Expr *InitExpr = &AsRvalue;
3551 auto Kind = InitializationKind::CreateCopy(Value->getBeginLoc(),
3552 Value->getBeginLoc());
3553 InitializationSequence Seq(*this, Entity, Kind, InitExpr);
3554 auto Res = Seq.getFailedOverloadResult();
3555 if ((Res == OR_Success || Res == OR_Deleted) &&
3558 // Promote "AsRvalue" to the heap, since we now need this
3559 // expression node to persist.
3560 Value =
3562 nullptr, VK_XValue, FPOptionsOverride());
3563 // Complete type-checking the initialization of the return type
3564 // using the constructor we found.
3565 return Seq.Perform(*this, Entity, Kind, Value);
3566 }
3567 }
3568 // Either we didn't meet the criteria for treating an lvalue as an rvalue,
3569 // above, or overload resolution failed. Either way, we need to try
3570 // (again) now with the return value expression as written.
3572}
3573
3574/// Determine whether the declared return type of the specified function
3575/// contains 'auto'.
3577 const FunctionProtoType *FPT =
3579 return FPT->getReturnType()->isUndeducedType();
3580}
3581
3583 Expr *RetValExp,
3584 NamedReturnInfo &NRInfo,
3585 bool SupressSimplerImplicitMoves) {
3586 // If this is the first return we've seen, infer the return type.
3587 // [expr.prim.lambda]p4 in C++11; block literals follow the same rules.
3589 QualType FnRetType = CurCap->ReturnType;
3590 LambdaScopeInfo *CurLambda = dyn_cast<LambdaScopeInfo>(CurCap);
3591 if (CurLambda && CurLambda->CallOperator->getType().isNull())
3592 return StmtError();
3593 bool HasDeducedReturnType =
3594 CurLambda && hasDeducedReturnType(CurLambda->CallOperator);
3595
3596 if (ExprEvalContexts.back().isDiscardedStatementContext() &&
3597 (HasDeducedReturnType || CurCap->HasImplicitReturnType)) {
3598 if (RetValExp) {
3599 ExprResult ER =
3600 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
3601 if (ER.isInvalid())
3602 return StmtError();
3603 RetValExp = ER.get();
3604 }
3605 return ReturnStmt::Create(Context, ReturnLoc, RetValExp,
3606 /* NRVOCandidate=*/nullptr);
3607 }
3608
3609 if (HasDeducedReturnType) {
3610 FunctionDecl *FD = CurLambda->CallOperator;
3611 // If we've already decided this lambda is invalid, e.g. because
3612 // we saw a `return` whose expression had an error, don't keep
3613 // trying to deduce its return type.
3614 if (FD->isInvalidDecl())
3615 return StmtError();
3616 // In C++1y, the return type may involve 'auto'.
3617 // FIXME: Blocks might have a return type of 'auto' explicitly specified.
3618 if (CurCap->ReturnType.isNull())
3619 CurCap->ReturnType = FD->getReturnType();
3620
3621 AutoType *AT = CurCap->ReturnType->getContainedAutoType();
3622 assert(AT && "lost auto type from lambda return type");
3623 if (DeduceFunctionTypeFromReturnExpr(FD, ReturnLoc, RetValExp, AT)) {
3624 FD->setInvalidDecl();
3625 // FIXME: preserve the ill-formed return expression.
3626 return StmtError();
3627 }
3628 CurCap->ReturnType = FnRetType = FD->getReturnType();
3629 } else if (CurCap->HasImplicitReturnType) {
3630 // For blocks/lambdas with implicit return types, we check each return
3631 // statement individually, and deduce the common return type when the block
3632 // or lambda is completed.
3633 // FIXME: Fold this into the 'auto' codepath above.
3634 if (RetValExp && !isa<InitListExpr>(RetValExp)) {
3636 if (Result.isInvalid())
3637 return StmtError();
3638 RetValExp = Result.get();
3639
3640 // DR1048: even prior to C++14, we should use the 'auto' deduction rules
3641 // when deducing a return type for a lambda-expression (or by extension
3642 // for a block). These rules differ from the stated C++11 rules only in
3643 // that they remove top-level cv-qualifiers.
3644 if (!CurContext->isDependentContext())
3645 FnRetType = RetValExp->getType().getUnqualifiedType();
3646 else
3647 FnRetType = CurCap->ReturnType = Context.DependentTy;
3648 } else {
3649 if (RetValExp) {
3650 // C++11 [expr.lambda.prim]p4 bans inferring the result from an
3651 // initializer list, because it is not an expression (even
3652 // though we represent it as one). We still deduce 'void'.
3653 Diag(ReturnLoc, diag::err_lambda_return_init_list)
3654 << RetValExp->getSourceRange();
3655 }
3656
3657 FnRetType = Context.VoidTy;
3658 }
3659
3660 // Although we'll properly infer the type of the block once it's completed,
3661 // make sure we provide a return type now for better error recovery.
3662 if (CurCap->ReturnType.isNull())
3663 CurCap->ReturnType = FnRetType;
3664 }
3665 const VarDecl *NRVOCandidate = getCopyElisionCandidate(NRInfo, FnRetType);
3666
3667 if (auto *CurBlock = dyn_cast<BlockScopeInfo>(CurCap)) {
3668 if (CurBlock->FunctionType->castAs<FunctionType>()->getNoReturnAttr()) {
3669 Diag(ReturnLoc, diag::err_noreturn_has_return_expr)
3670 << diag::FalloffFunctionKind::Block;
3671 return StmtError();
3672 }
3673 } else if (auto *CurRegion = dyn_cast<CapturedRegionScopeInfo>(CurCap)) {
3674 Diag(ReturnLoc, diag::err_return_in_captured_stmt) << CurRegion->getRegionName();
3675 return StmtError();
3676 } else {
3677 assert(CurLambda && "unknown kind of captured scope");
3678 if (CurLambda->CallOperator->getType()
3679 ->castAs<FunctionType>()
3680 ->getNoReturnAttr()) {
3681 Diag(ReturnLoc, diag::err_noreturn_has_return_expr)
3682 << diag::FalloffFunctionKind::Lambda;
3683 return StmtError();
3684 }
3685 }
3686
3687 // Otherwise, verify that this result type matches the previous one. We are
3688 // pickier with blocks than for normal functions because we don't have GCC
3689 // compatibility to worry about here.
3690 if (FnRetType->isDependentType()) {
3691 // Delay processing for now. TODO: there are lots of dependent
3692 // types we can conclusively prove aren't void.
3693 } else if (FnRetType->isVoidType()) {
3694 if (RetValExp && !isa<InitListExpr>(RetValExp) &&
3695 !(getLangOpts().CPlusPlus &&
3696 (RetValExp->isTypeDependent() ||
3697 RetValExp->getType()->isVoidType()))) {
3698 if (!getLangOpts().CPlusPlus &&
3699 RetValExp->getType()->isVoidType())
3700 Diag(ReturnLoc, diag::ext_return_has_void_expr) << "literal" << 2;
3701 else {
3702 Diag(ReturnLoc, diag::err_return_block_has_expr);
3703 RetValExp = nullptr;
3704 }
3705 }
3706 } else if (!RetValExp) {
3707 return StmtError(Diag(ReturnLoc, diag::err_block_return_missing_expr));
3708 } else if (!RetValExp->isTypeDependent()) {
3709 // we have a non-void block with an expression, continue checking
3710
3711 // C99 6.8.6.4p3(136): The return statement is not an assignment. The
3712 // overlap restriction of subclause 6.5.16.1 does not apply to the case of
3713 // function return.
3714
3715 // In C++ the return statement is handled via a copy initialization.
3716 // the C version of which boils down to CheckSingleAssignmentConstraints.
3717 InitializedEntity Entity =
3718 InitializedEntity::InitializeResult(ReturnLoc, FnRetType);
3720 Entity, NRInfo, RetValExp, SupressSimplerImplicitMoves);
3721 if (Res.isInvalid()) {
3722 // FIXME: Cleanup temporaries here, anyway?
3723 return StmtError();
3724 }
3725 RetValExp = Res.get();
3726 CheckReturnValExpr(RetValExp, FnRetType, ReturnLoc);
3727 }
3728
3729 if (RetValExp) {
3730 ExprResult ER =
3731 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
3732 if (ER.isInvalid())
3733 return StmtError();
3734 RetValExp = ER.get();
3735 }
3736 auto *Result =
3737 ReturnStmt::Create(Context, ReturnLoc, RetValExp, NRVOCandidate);
3738
3739 // If we need to check for the named return value optimization,
3740 // or if we need to infer the return type,
3741 // save the return statement in our scope for later processing.
3742 if (CurCap->HasImplicitReturnType || NRVOCandidate)
3743 FunctionScopes.back()->Returns.push_back(Result);
3744
3745 if (FunctionScopes.back()->FirstReturnLoc.isInvalid())
3746 FunctionScopes.back()->FirstReturnLoc = ReturnLoc;
3747
3748 if (auto *CurBlock = dyn_cast<BlockScopeInfo>(CurCap);
3749 CurBlock && CurCap->HasImplicitReturnType && RetValExp &&
3750 RetValExp->containsErrors())
3751 CurBlock->TheDecl->setInvalidDecl();
3752
3753 return Result;
3754}
3755
3756namespace {
3757/// Marks all typedefs in all local classes in a type referenced.
3758///
3759/// In a function like
3760/// auto f() {
3761/// struct S { typedef int a; };
3762/// return S();
3763/// }
3764///
3765/// the local type escapes and could be referenced in some TUs but not in
3766/// others. Pretend that all local typedefs are always referenced, to not warn
3767/// on this. This isn't necessary if f has internal linkage, or the typedef
3768/// is private.
3769class LocalTypedefNameReferencer : public DynamicRecursiveASTVisitor {
3770public:
3771 LocalTypedefNameReferencer(Sema &S) : S(S) {}
3772 bool VisitRecordType(RecordType *RT) override;
3773
3774private:
3775 Sema &S;
3776};
3777bool LocalTypedefNameReferencer::VisitRecordType(RecordType *RT) {
3778 auto *R = dyn_cast<CXXRecordDecl>(RT->getDecl());
3779 if (!R || !R->isLocalClass() || !R->isLocalClass()->isExternallyVisible() ||
3780 R->isDependentType())
3781 return true;
3782 for (auto *TmpD : R->decls())
3783 if (auto *T = dyn_cast<TypedefNameDecl>(TmpD))
3784 if (T->getAccess() != AS_private || R->hasFriends())
3785 S.MarkAnyDeclReferenced(T->getLocation(), T, /*OdrUse=*/false);
3786 return true;
3787}
3788}
3789
3791 return FD->getTypeSourceInfo()
3792 ->getTypeLoc()
3794 .getReturnLoc();
3795}
3796
3798 SourceLocation ReturnLoc,
3799 Expr *RetExpr, const AutoType *AT) {
3800 // If this is the conversion function for a lambda, we choose to deduce its
3801 // type from the corresponding call operator, not from the synthesized return
3802 // statement within it. See Sema::DeduceReturnType.
3804 return false;
3805
3806 if (isa_and_nonnull<InitListExpr>(RetExpr)) {
3807 // If the deduction is for a return statement and the initializer is
3808 // a braced-init-list, the program is ill-formed.
3809 Diag(RetExpr->getExprLoc(),
3810 getCurLambda() ? diag::err_lambda_return_init_list
3811 : diag::err_auto_fn_return_init_list)
3812 << RetExpr->getSourceRange();
3813 return true;
3814 }
3815
3816 if (FD->isDependentContext()) {
3817 // C++1y [dcl.spec.auto]p12:
3818 // Return type deduction [...] occurs when the definition is
3819 // instantiated even if the function body contains a return
3820 // statement with a non-type-dependent operand.
3821 assert(AT->isDeduced() && "should have deduced to dependent type");
3822 return false;
3823 }
3824
3825 TypeLoc OrigResultType = getReturnTypeLoc(FD);
3826 // In the case of a return with no operand, the initializer is considered
3827 // to be void().
3828 CXXScalarValueInitExpr VoidVal(Context.VoidTy, nullptr, SourceLocation());
3829 if (!RetExpr) {
3830 // For a function with a deduced result type to return with omitted
3831 // expression, the result type as written must be 'auto' or
3832 // 'decltype(auto)', possibly cv-qualified or constrained, but not
3833 // ref-qualified.
3834 if (!OrigResultType.getType()->getAs<AutoType>()) {
3835 Diag(ReturnLoc, diag::err_auto_fn_return_void_but_not_auto)
3836 << OrigResultType.getType();
3837 return true;
3838 }
3839 RetExpr = &VoidVal;
3840 }
3841
3842 QualType Deduced = AT->getDeducedType();
3843 {
3844 // Otherwise, [...] deduce a value for U using the rules of template
3845 // argument deduction.
3846 auto RetExprLoc = RetExpr->getExprLoc();
3847 TemplateDeductionInfo Info(RetExprLoc);
3848 SourceLocation TemplateSpecLoc;
3849 if (RetExpr->getType() == Context.OverloadTy) {
3850 auto FindResult = OverloadExpr::find(RetExpr);
3851 if (FindResult.Expression)
3852 TemplateSpecLoc = FindResult.Expression->getNameLoc();
3853 }
3854 TemplateSpecCandidateSet FailedTSC(TemplateSpecLoc);
3856 OrigResultType, RetExpr, Deduced, Info, /*DependentDeduction=*/false,
3857 /*IgnoreConstraints=*/false, &FailedTSC);
3859 return true;
3860 switch (Res) {
3862 break;
3864 return true;
3866 // If a function with a declared return type that contains a placeholder
3867 // type has multiple return statements, the return type is deduced for
3868 // each return statement. [...] if the type deduced is not the same in
3869 // each deduction, the program is ill-formed.
3870 const LambdaScopeInfo *LambdaSI = getCurLambda();
3871 if (LambdaSI && LambdaSI->HasImplicitReturnType)
3872 Diag(ReturnLoc, diag::err_typecheck_missing_return_type_incompatible)
3873 << Info.SecondArg << Info.FirstArg << true /*IsLambda*/;
3874 else
3875 Diag(ReturnLoc, diag::err_auto_fn_different_deductions)
3876 << (AT->isDecltypeAuto() ? 1 : 0) << Info.SecondArg
3877 << Info.FirstArg;
3878 return true;
3879 }
3880 default:
3881 Diag(RetExpr->getExprLoc(), diag::err_auto_fn_deduction_failure)
3882 << OrigResultType.getType() << RetExpr->getType();
3883 FailedTSC.NoteCandidates(*this, RetExprLoc);
3884 return true;
3885 }
3886 }
3887
3888 // If a local type is part of the returned type, mark its fields as
3889 // referenced.
3890 LocalTypedefNameReferencer(*this).TraverseType(RetExpr->getType());
3891
3892 // CUDA: Kernel function must have 'void' return type.
3893 if (getLangOpts().CUDA && FD->hasAttr<CUDAGlobalAttr>() &&
3894 !Deduced->isVoidType()) {
3895 Diag(FD->getLocation(), diag::err_kern_type_not_void_return)
3896 << FD->getType() << FD->getSourceRange();
3897 return true;
3898 }
3899
3900 if (!FD->isInvalidDecl() && AT->getDeducedType() != Deduced)
3901 // Update all declarations of the function to have the deduced return type.
3902 Context.adjustDeducedFunctionResultType(FD, Deduced);
3903
3904 if (!Deduced->isDependentType() && !Deduced->isRecordType() &&
3907 diag::warn_qual_return_type,
3909 return false;
3910}
3911
3914 Scope *CurScope) {
3915 ExprResult RetVal = RetValExp;
3916 if (RetVal.isInvalid())
3917 return StmtError();
3918
3919 if (getCurScope()->isInOpenACCComputeConstructScope())
3920 return StmtError(
3921 Diag(ReturnLoc, diag::err_acc_branch_in_out_compute_construct)
3922 << /*return*/ 1 << /*out of */ 0);
3923
3924 // using plain return in a coroutine is not allowed.
3926 if (FSI->FirstReturnLoc.isInvalid() && FSI->isCoroutine()) {
3927 assert(FSI->FirstCoroutineStmtLoc.isValid() &&
3928 "first coroutine location not set");
3929 Diag(ReturnLoc, diag::err_return_in_coroutine);
3930 Diag(FSI->FirstCoroutineStmtLoc, diag::note_declared_coroutine_here)
3932 }
3933
3934 CheckInvalidBuiltinCountedByRef(RetVal.get(),
3936
3937 StmtResult R =
3938 BuildReturnStmt(ReturnLoc, RetVal.get(), /*AllowRecovery=*/true);
3939 if (R.isInvalid() || ExprEvalContexts.back().isDiscardedStatementContext())
3940 return R;
3941
3942 VarDecl *VD =
3943 const_cast<VarDecl *>(cast<ReturnStmt>(R.get())->getNRVOCandidate());
3944
3945 CurScope->updateNRVOCandidate(VD);
3946
3947 CheckJumpOutOfSEHFinallyOrDefer(*this, ReturnLoc, *CurScope->getFnParent(),
3948 diag::DeferJumpKind::Return);
3949
3950 return R;
3951}
3952
3954 CurrentDefer.emplace_back(CurScope, DeferLoc);
3955}
3956
3957void Sema::ActOnDeferStmtError([[maybe_unused]] Scope *CurScope) {
3958 assert(!CurrentDefer.empty() && CurrentDefer.back().first == CurScope);
3959 CurrentDefer.pop_back();
3960}
3961
3963 [[maybe_unused]] Scope *CurScope) {
3964 assert(!CurrentDefer.empty() && CurrentDefer.back().first == CurScope);
3965 SourceLocation DeferLoc = CurrentDefer.pop_back_val().second;
3966 DiagnoseEmptyStmtBody(DeferLoc, Body, diag::warn_empty_defer_body);
3968 return DeferStmt::Create(Context, DeferLoc, Body);
3969}
3970
3972 const Expr *E) {
3973 if (!E || !S.getLangOpts().CPlusPlus23 || !S.getLangOpts().MSVCCompat)
3974 return false;
3975 const Decl *D = E->getReferencedDeclOfCallee();
3976 if (!D || !S.SourceMgr.isInSystemHeader(D->getLocation()))
3977 return false;
3978 for (const DeclContext *DC = D->getDeclContext(); DC; DC = DC->getParent()) {
3979 if (DC->isStdNamespace())
3980 return true;
3981 }
3982 return false;
3983}
3984
3986 bool AllowRecovery) {
3987 // Check for unexpanded parameter packs.
3988 if (RetValExp && DiagnoseUnexpandedParameterPack(RetValExp))
3989 return StmtError();
3990
3991 // HACK: We suppress simpler implicit move here in msvc compatibility mode
3992 // just as a temporary work around, as the MSVC STL has issues with
3993 // this change.
3994 bool SupressSimplerImplicitMoves =
3997 RetValExp, SupressSimplerImplicitMoves ? SimplerImplicitMoveMode::ForceOff
3999
4001 return ActOnCapScopeReturnStmt(ReturnLoc, RetValExp, NRInfo,
4002 SupressSimplerImplicitMoves);
4003
4004 QualType FnRetType;
4005 QualType RelatedRetType;
4006 const AttrVec *Attrs = nullptr;
4007 bool isObjCMethod = false;
4008
4009 if (const FunctionDecl *FD = getCurFunctionDecl()) {
4010 FnRetType = FD->getReturnType();
4011 if (FD->hasAttrs())
4012 Attrs = &FD->getAttrs();
4013 if (FD->isNoReturn() && !getCurFunction()->isCoroutine())
4014 Diag(ReturnLoc, diag::warn_noreturn_function_has_return_expr) << FD;
4015 if (FD->isMain() && RetValExp)
4016 if (isa<CXXBoolLiteralExpr>(RetValExp))
4017 Diag(ReturnLoc, diag::warn_main_returns_bool_literal)
4018 << RetValExp->getSourceRange();
4019 if (FD->hasAttr<CmseNSEntryAttr>() && RetValExp) {
4020 if (const auto *RT = dyn_cast<RecordType>(FnRetType.getCanonicalType())) {
4021 if (RT->getDecl()->isOrContainsUnion())
4022 Diag(RetValExp->getBeginLoc(), diag::warn_cmse_nonsecure_union) << 1;
4023 }
4024 }
4025 } else if (ObjCMethodDecl *MD = getCurMethodDecl()) {
4026 FnRetType = MD->getReturnType();
4027 isObjCMethod = true;
4028 if (MD->hasAttrs())
4029 Attrs = &MD->getAttrs();
4030 if (MD->hasRelatedResultType() && MD->getClassInterface()) {
4031 // In the implementation of a method with a related return type, the
4032 // type used to type-check the validity of return statements within the
4033 // method body is a pointer to the type of the class being implemented.
4034 RelatedRetType = Context.getObjCInterfaceType(MD->getClassInterface());
4035 RelatedRetType = Context.getObjCObjectPointerType(RelatedRetType);
4036 }
4037 } else // If we don't have a function/method context, bail.
4038 return StmtError();
4039
4040 if (RetValExp) {
4041 const auto *ATy = dyn_cast<ArrayType>(RetValExp->getType());
4042 if (ATy && ATy->getElementType().isWebAssemblyReferenceType()) {
4043 Diag(ReturnLoc, diag::err_wasm_table_art) << 1;
4044 return StmtError();
4045 }
4046 }
4047
4048 // C++1z: discarded return statements are not considered when deducing a
4049 // return type.
4050 if (ExprEvalContexts.back().isDiscardedStatementContext() &&
4051 FnRetType->getContainedAutoType()) {
4052 if (RetValExp) {
4053 ExprResult ER =
4054 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
4055 if (ER.isInvalid())
4056 return StmtError();
4057 RetValExp = ER.get();
4058 }
4059 return ReturnStmt::Create(Context, ReturnLoc, RetValExp,
4060 /* NRVOCandidate=*/nullptr);
4061 }
4062
4063 // FIXME: Add a flag to the ScopeInfo to indicate whether we're performing
4064 // deduction.
4065 if (getLangOpts().CPlusPlus14) {
4066 if (AutoType *AT = FnRetType->getContainedAutoType()) {
4068 // If we've already decided this function is invalid, e.g. because
4069 // we saw a `return` whose expression had an error, don't keep
4070 // trying to deduce its return type.
4071 // (Some return values may be needlessly wrapped in RecoveryExpr).
4072 if (FD->isInvalidDecl() ||
4073 DeduceFunctionTypeFromReturnExpr(FD, ReturnLoc, RetValExp, AT)) {
4074 FD->setInvalidDecl();
4075 if (!AllowRecovery)
4076 return StmtError();
4077 // The deduction failure is diagnosed and marked, try to recover.
4078 if (RetValExp) {
4079 // Wrap return value with a recovery expression of the previous type.
4080 // If no deduction yet, use DependentTy.
4081 auto Recovery = CreateRecoveryExpr(
4082 RetValExp->getBeginLoc(), RetValExp->getEndLoc(), RetValExp,
4083 AT->isDeduced() ? FnRetType : QualType());
4084 if (Recovery.isInvalid())
4085 return StmtError();
4086 RetValExp = Recovery.get();
4087 } else {
4088 // Nothing to do: a ReturnStmt with no value is fine recovery.
4089 }
4090 } else {
4091 FnRetType = FD->getReturnType();
4092 }
4093 }
4094 }
4095 const VarDecl *NRVOCandidate = getCopyElisionCandidate(NRInfo, FnRetType);
4096
4097 bool HasDependentReturnType = FnRetType->isDependentType();
4098
4099 ReturnStmt *Result = nullptr;
4100 if (FnRetType->isVoidType()) {
4101 if (RetValExp) {
4102 if (auto *ILE = dyn_cast<InitListExpr>(RetValExp)) {
4103 // We simply never allow init lists as the return value of void
4104 // functions. This is compatible because this was never allowed before,
4105 // so there's no legacy code to deal with.
4107 int FunctionKind = 0;
4108 if (isa<ObjCMethodDecl>(CurDecl))
4109 FunctionKind = 1;
4110 else if (isa<CXXConstructorDecl>(CurDecl))
4111 FunctionKind = 2;
4112 else if (isa<CXXDestructorDecl>(CurDecl))
4113 FunctionKind = 3;
4114
4115 Diag(ReturnLoc, diag::err_return_init_list)
4116 << CurDecl << FunctionKind << RetValExp->getSourceRange();
4117
4118 // Preserve the initializers in the AST.
4119 RetValExp = AllowRecovery
4120 ? CreateRecoveryExpr(ILE->getLBraceLoc(),
4121 ILE->getRBraceLoc(), ILE->inits())
4122 .get()
4123 : nullptr;
4124 } else if (!RetValExp->isTypeDependent()) {
4125 // C99 6.8.6.4p1 (ext_ since GCC warns)
4126 unsigned D = diag::ext_return_has_expr;
4127 if (RetValExp->getType()->isVoidType()) {
4129 if (isa<CXXConstructorDecl>(CurDecl) ||
4130 isa<CXXDestructorDecl>(CurDecl))
4131 D = diag::err_ctor_dtor_returns_void;
4132 else
4133 D = diag::ext_return_has_void_expr;
4134 }
4135 else {
4136 ExprResult Result = RetValExp;
4138 if (Result.isInvalid())
4139 return StmtError();
4140 RetValExp = Result.get();
4141 RetValExp = ImpCastExprToType(RetValExp,
4142 Context.VoidTy, CK_ToVoid).get();
4143 }
4144 // return of void in constructor/destructor is illegal in C++.
4145 if (D == diag::err_ctor_dtor_returns_void) {
4147 Diag(ReturnLoc, D) << CurDecl << isa<CXXDestructorDecl>(CurDecl)
4148 << RetValExp->getSourceRange();
4149 }
4150 // return (some void expression); is legal in C++ and C2y.
4151 else if (D != diag::ext_return_has_void_expr ||
4152 (!getLangOpts().CPlusPlus && !getLangOpts().C2y)) {
4154
4155 int FunctionKind = 0;
4156 if (isa<ObjCMethodDecl>(CurDecl))
4157 FunctionKind = 1;
4158 else if (isa<CXXConstructorDecl>(CurDecl))
4159 FunctionKind = 2;
4160 else if (isa<CXXDestructorDecl>(CurDecl))
4161 FunctionKind = 3;
4162
4163 Diag(ReturnLoc, D)
4164 << CurDecl << FunctionKind << RetValExp->getSourceRange();
4165 }
4166 }
4167
4168 if (RetValExp) {
4169 ExprResult ER =
4170 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
4171 if (ER.isInvalid())
4172 return StmtError();
4173 RetValExp = ER.get();
4174 }
4175 }
4176
4177 Result = ReturnStmt::Create(Context, ReturnLoc, RetValExp,
4178 /* NRVOCandidate=*/nullptr);
4179 } else if (!RetValExp && !HasDependentReturnType) {
4181
4182 if ((FD && FD->isInvalidDecl()) || FnRetType->containsErrors()) {
4183 // The intended return type might have been "void", so don't warn.
4184 } else if (getLangOpts().CPlusPlus11 && FD && FD->isConstexpr()) {
4185 // C++11 [stmt.return]p2
4186 Diag(ReturnLoc, diag::err_constexpr_return_missing_expr)
4187 << FD << FD->isConsteval();
4188 FD->setInvalidDecl();
4189 } else {
4190 // C99 6.8.6.4p1 (ext_ since GCC warns)
4191 // C90 6.6.6.4p4
4192 unsigned DiagID = getLangOpts().C99 ? diag::ext_return_missing_expr
4193 : diag::warn_return_missing_expr;
4194 // Note that at this point one of getCurFunctionDecl() or
4195 // getCurMethodDecl() must be non-null (see above).
4196 assert((getCurFunctionDecl() || getCurMethodDecl()) &&
4197 "Not in a FunctionDecl or ObjCMethodDecl?");
4198 bool IsMethod = FD == nullptr;
4199 const NamedDecl *ND =
4201 Diag(ReturnLoc, DiagID) << ND << IsMethod;
4202 }
4203
4204 Result = ReturnStmt::Create(Context, ReturnLoc, /* RetExpr=*/nullptr,
4205 /* NRVOCandidate=*/nullptr);
4206 } else {
4207 assert(RetValExp || HasDependentReturnType);
4208 QualType RetType = RelatedRetType.isNull() ? FnRetType : RelatedRetType;
4209
4210 // C99 6.8.6.4p3(136): The return statement is not an assignment. The
4211 // overlap restriction of subclause 6.5.16.1 does not apply to the case of
4212 // function return.
4213
4214 // In C++ the return statement is handled via a copy initialization,
4215 // the C version of which boils down to CheckSingleAssignmentConstraints.
4216 if (!HasDependentReturnType && !RetValExp->isTypeDependent()) {
4217 // we have a non-void function with an expression, continue checking
4218 InitializedEntity Entity =
4219 InitializedEntity::InitializeResult(ReturnLoc, RetType);
4221 Entity, NRInfo, RetValExp, SupressSimplerImplicitMoves);
4222 if (Res.isInvalid() && AllowRecovery)
4223 Res = CreateRecoveryExpr(RetValExp->getBeginLoc(),
4224 RetValExp->getEndLoc(), RetValExp, RetType);
4225 if (Res.isInvalid()) {
4226 // FIXME: Clean up temporaries here anyway?
4227 return StmtError();
4228 }
4229 RetValExp = Res.getAs<Expr>();
4230
4231 // If we have a related result type, we need to implicitly
4232 // convert back to the formal result type. We can't pretend to
4233 // initialize the result again --- we might end double-retaining
4234 // --- so instead we initialize a notional temporary.
4235 if (!RelatedRetType.isNull()) {
4237 FnRetType);
4238 Res = PerformCopyInitialization(Entity, ReturnLoc, RetValExp);
4239 if (Res.isInvalid()) {
4240 // FIXME: Clean up temporaries here anyway?
4241 return StmtError();
4242 }
4243 RetValExp = Res.getAs<Expr>();
4244 }
4245
4246 CheckReturnValExpr(RetValExp, FnRetType, ReturnLoc, isObjCMethod, Attrs,
4248 }
4249
4250 if (RetValExp) {
4251 ExprResult ER =
4252 ActOnFinishFullExpr(RetValExp, ReturnLoc, /*DiscardedValue*/ false);
4253 if (ER.isInvalid())
4254 return StmtError();
4255 RetValExp = ER.get();
4256 }
4257 Result = ReturnStmt::Create(Context, ReturnLoc, RetValExp, NRVOCandidate);
4258 }
4259
4260 // If we need to check for the named return value optimization, save the
4261 // return statement in our scope for later processing.
4262 if (Result->getNRVOCandidate())
4263 FunctionScopes.back()->Returns.push_back(Result);
4264
4265 if (FunctionScopes.back()->FirstReturnLoc.isInvalid())
4266 FunctionScopes.back()->FirstReturnLoc = ReturnLoc;
4267
4268 return Result;
4269}
4270
4273 Stmt *HandlerBlock) {
4274 // There's nothing to test that ActOnExceptionDecl didn't already test.
4275 return new (Context)
4276 CXXCatchStmt(CatchLoc, cast_or_null<VarDecl>(ExDecl), HandlerBlock);
4277}
4278
4279namespace {
4280class CatchHandlerType {
4281 QualType QT;
4282 LLVM_PREFERRED_TYPE(bool)
4283 unsigned IsPointer : 1;
4284
4285 // This is a special constructor to be used only with DenseMapInfo's
4286 // getEmptyKey() and getTombstoneKey() functions.
4287 friend struct llvm::DenseMapInfo<CatchHandlerType>;
4288 enum Unique { ForDenseMap };
4289 CatchHandlerType(QualType QT, Unique) : QT(QT), IsPointer(false) {}
4290
4291public:
4292 /// Used when creating a CatchHandlerType from a handler type; will determine
4293 /// whether the type is a pointer or reference and will strip off the top
4294 /// level pointer and cv-qualifiers.
4295 CatchHandlerType(QualType Q) : QT(Q), IsPointer(false) {
4296 if (QT->isPointerType())
4297 IsPointer = true;
4298
4299 QT = QT.getUnqualifiedType();
4300 if (IsPointer || QT->isReferenceType())
4301 QT = QT->getPointeeType();
4302 }
4303
4304 /// Used when creating a CatchHandlerType from a base class type; pretends the
4305 /// type passed in had the pointer qualifier, does not need to get an
4306 /// unqualified type.
4307 CatchHandlerType(QualType QT, bool IsPointer)
4308 : QT(QT), IsPointer(IsPointer) {}
4309
4310 QualType underlying() const { return QT; }
4311 bool isPointer() const { return IsPointer; }
4312
4313 friend bool operator==(const CatchHandlerType &LHS,
4314 const CatchHandlerType &RHS) {
4315 // If the pointer qualification does not match, we can return early.
4316 if (LHS.IsPointer != RHS.IsPointer)
4317 return false;
4318 // Otherwise, check the underlying type without cv-qualifiers.
4319 return LHS.QT == RHS.QT;
4320 }
4321};
4322} // namespace
4323
4324namespace llvm {
4325template <> struct DenseMapInfo<CatchHandlerType> {
4326 static CatchHandlerType getEmptyKey() {
4327 return CatchHandlerType(DenseMapInfo<QualType>::getEmptyKey(),
4328 CatchHandlerType::ForDenseMap);
4329 }
4330
4331 static CatchHandlerType getTombstoneKey() {
4332 return CatchHandlerType(DenseMapInfo<QualType>::getTombstoneKey(),
4333 CatchHandlerType::ForDenseMap);
4334 }
4335
4336 static unsigned getHashValue(const CatchHandlerType &Base) {
4337 return DenseMapInfo<QualType>::getHashValue(Base.underlying());
4338 }
4339
4340 static bool isEqual(const CatchHandlerType &LHS,
4341 const CatchHandlerType &RHS) {
4342 return LHS == RHS;
4343 }
4344};
4345}
4346
4347namespace {
4348class CatchTypePublicBases {
4349 const llvm::DenseMap<QualType, CXXCatchStmt *> &TypesToCheck;
4350
4351 CXXCatchStmt *FoundHandler;
4352 QualType FoundHandlerType;
4353 QualType TestAgainstType;
4354
4355public:
4356 CatchTypePublicBases(const llvm::DenseMap<QualType, CXXCatchStmt *> &T,
4357 QualType QT)
4358 : TypesToCheck(T), FoundHandler(nullptr), TestAgainstType(QT) {}
4359
4360 CXXCatchStmt *getFoundHandler() const { return FoundHandler; }
4361 QualType getFoundHandlerType() const { return FoundHandlerType; }
4362
4363 bool operator()(const CXXBaseSpecifier *S, CXXBasePath &) {
4364 if (S->getAccessSpecifier() == AccessSpecifier::AS_public) {
4365 QualType Check = S->getType().getCanonicalType();
4366 const auto &M = TypesToCheck;
4367 auto I = M.find(Check);
4368 if (I != M.end()) {
4369 // We're pretty sure we found what we need to find. However, we still
4370 // need to make sure that we properly compare for pointers and
4371 // references, to handle cases like:
4372 //
4373 // } catch (Base *b) {
4374 // } catch (Derived &d) {
4375 // }
4376 //
4377 // where there is a qualification mismatch that disqualifies this
4378 // handler as a potential problem.
4379 if (I->second->getCaughtType()->isPointerType() ==
4380 TestAgainstType->isPointerType()) {
4381 FoundHandler = I->second;
4382 FoundHandlerType = Check;
4383 return true;
4384 }
4385 }
4386 }
4387 return false;
4388 }
4389};
4390}
4391
4393 ArrayRef<Stmt *> Handlers) {
4394 const llvm::Triple &T = Context.getTargetInfo().getTriple();
4395 const bool IsOpenMPGPUTarget =
4396 getLangOpts().OpenMPIsTargetDevice && T.isGPU();
4397
4398 DiagnoseExceptionUse(TryLoc, /* IsTry= */ true);
4399
4400 // In OpenMP target regions, we assume that catch is never reached on GPU
4401 // targets.
4402 if (IsOpenMPGPUTarget)
4403 targetDiag(TryLoc, diag::warn_try_not_valid_on_target) << T.str();
4404
4405 // Exceptions aren't allowed in CUDA device code.
4406 if (getLangOpts().CUDA)
4407 CUDA().DiagIfDeviceCode(TryLoc, diag::err_cuda_device_exceptions)
4408 << "try" << CUDA().CurrentTarget();
4409
4410 if (getCurScope() && getCurScope()->isOpenMPSimdDirectiveScope())
4411 Diag(TryLoc, diag::err_omp_simd_region_cannot_use_stmt) << "try";
4412
4414
4415 // C++ try is incompatible with SEH __try.
4416 if (!getLangOpts().Borland && FSI->FirstSEHTryLoc.isValid()) {
4417 Diag(TryLoc, diag::err_mixing_cxx_try_seh_try) << 0;
4418 Diag(FSI->FirstSEHTryLoc, diag::note_conflicting_try_here) << "'__try'";
4419 }
4420
4421 const unsigned NumHandlers = Handlers.size();
4422 assert(!Handlers.empty() &&
4423 "The parser shouldn't call this if there are no handlers.");
4424
4425 llvm::DenseMap<QualType, CXXCatchStmt *> HandledBaseTypes;
4426 llvm::DenseMap<CatchHandlerType, CXXCatchStmt *> HandledTypes;
4427 for (unsigned i = 0; i < NumHandlers; ++i) {
4428 CXXCatchStmt *H = cast<CXXCatchStmt>(Handlers[i]);
4429
4430 // Diagnose when the handler is a catch-all handler, but it isn't the last
4431 // handler for the try block. [except.handle]p5. Also, skip exception
4432 // declarations that are invalid, since we can't usefully report on them.
4433 if (!H->getExceptionDecl()) {
4434 if (i < NumHandlers - 1)
4435 return StmtError(Diag(H->getBeginLoc(), diag::err_early_catch_all));
4436 continue;
4437 } else if (H->getExceptionDecl()->isInvalidDecl())
4438 continue;
4439
4440 // Walk the type hierarchy to diagnose when this type has already been
4441 // handled (duplication), or cannot be handled (derivation inversion). We
4442 // ignore top-level cv-qualifiers, per [except.handle]p3
4443 CatchHandlerType HandlerCHT = H->getCaughtType().getCanonicalType();
4444
4445 // We can ignore whether the type is a reference or a pointer; we need the
4446 // underlying declaration type in order to get at the underlying record
4447 // decl, if there is one.
4448 QualType Underlying = HandlerCHT.underlying();
4449 if (auto *RD = Underlying->getAsCXXRecordDecl()) {
4450 if (!RD->hasDefinition())
4451 continue;
4452 // Check that none of the public, unambiguous base classes are in the
4453 // map ([except.handle]p1). Give the base classes the same pointer
4454 // qualification as the original type we are basing off of. This allows
4455 // comparison against the handler type using the same top-level pointer
4456 // as the original type.
4457 CXXBasePaths Paths;
4458 Paths.setOrigin(RD);
4459 CatchTypePublicBases CTPB(HandledBaseTypes,
4461 if (RD->lookupInBases(CTPB, Paths)) {
4462 const CXXCatchStmt *Problem = CTPB.getFoundHandler();
4463 if (!Paths.isAmbiguous(
4464 CanQualType::CreateUnsafe(CTPB.getFoundHandlerType()))) {
4466 diag::warn_exception_caught_by_earlier_handler)
4467 << H->getCaughtType();
4469 diag::note_previous_exception_handler)
4470 << Problem->getCaughtType();
4471 }
4472 }
4473 // Strip the qualifiers here because we're going to be comparing this
4474 // type to the base type specifiers of a class, which are ignored in a
4475 // base specifier per [class.derived.general]p2.
4476 HandledBaseTypes[Underlying.getUnqualifiedType()] = H;
4477 }
4478
4479 // Add the type the list of ones we have handled; diagnose if we've already
4480 // handled it.
4481 auto R = HandledTypes.insert(
4482 std::make_pair(H->getCaughtType().getCanonicalType(), H));
4483 if (!R.second) {
4484 const CXXCatchStmt *Problem = R.first->second;
4486 diag::warn_exception_caught_by_earlier_handler)
4487 << H->getCaughtType();
4489 diag::note_previous_exception_handler)
4490 << Problem->getCaughtType();
4491 }
4492 }
4493
4494 FSI->setHasCXXTry(TryLoc);
4495
4496 return CXXTryStmt::Create(Context, TryLoc, cast<CompoundStmt>(TryBlock),
4497 Handlers);
4498}
4499
4501 const llvm::Triple &T = Context.getTargetInfo().getTriple();
4502 const bool IsOpenMPGPUTarget =
4503 getLangOpts().OpenMPIsTargetDevice && T.isGPU();
4504
4505 // Don't report an error if 'try' is used in system headers or in an OpenMP
4506 // target region compiled for a GPU architecture.
4507 if (IsOpenMPGPUTarget || getLangOpts().CUDA)
4508 // Delay error emission for the OpenMP device code.
4509 return;
4510
4511 if (!getLangOpts().CXXExceptions &&
4512 !getSourceManager().isInSystemHeader(Loc) &&
4513 !CurContext->isDependentContext())
4514 targetDiag(Loc, diag::err_exceptions_disabled) << (IsTry ? "try" : "throw");
4515}
4516
4518 Stmt *TryBlock, Stmt *Handler) {
4519 assert(TryBlock && Handler);
4520
4522
4523 // SEH __try is incompatible with C++ try. Borland appears to support this,
4524 // however.
4525 if (!getLangOpts().Borland) {
4526 if (FSI->FirstCXXOrObjCTryLoc.isValid()) {
4527 Diag(TryLoc, diag::err_mixing_cxx_try_seh_try) << FSI->FirstTryType;
4528 Diag(FSI->FirstCXXOrObjCTryLoc, diag::note_conflicting_try_here)
4530 ? "'try'"
4531 : "'@try'");
4532 }
4533 }
4534
4535 FSI->setHasSEHTry(TryLoc);
4536
4537 // Reject __try in Obj-C methods, blocks, and captured decls, since we don't
4538 // track if they use SEH.
4539 DeclContext *DC = CurContext;
4540 while (DC && !DC->isFunctionOrMethod())
4541 DC = DC->getParent();
4542 FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(DC);
4543 if (FD)
4544 FD->setUsesSEHTry(true);
4545 else
4546 Diag(TryLoc, diag::err_seh_try_outside_functions);
4547
4548 // Reject __try on unsupported targets.
4549 if (!Context.getTargetInfo().isSEHTrySupported())
4550 Diag(TryLoc, diag::err_seh_try_unsupported);
4551
4552 return SEHTryStmt::Create(Context, IsCXXTry, TryLoc, TryBlock, Handler);
4553}
4554
4556 Stmt *Block) {
4557 assert(FilterExpr && Block);
4558 QualType FTy = FilterExpr->getType();
4559 if (!FTy->isIntegerType() && !FTy->isDependentType()) {
4560 return StmtError(
4561 Diag(FilterExpr->getExprLoc(), diag::err_filter_expression_integral)
4562 << FTy);
4563 }
4564 return SEHExceptStmt::Create(Context, Loc, FilterExpr, Block);
4565}
4566
4568 CurrentSEHFinally.push_back(CurScope);
4569}
4570
4574
4580
4583 Scope *SEHTryParent = CurScope;
4584 while (SEHTryParent && !SEHTryParent->isSEHTryScope())
4585 SEHTryParent = SEHTryParent->getParent();
4586 if (!SEHTryParent)
4587 return StmtError(Diag(Loc, diag::err_ms___leave_not_in___try));
4588 CheckJumpOutOfSEHFinallyOrDefer(*this, Loc, *SEHTryParent,
4589 diag::DeferJumpKind::SEHLeave);
4590
4591 return new (Context) SEHLeaveStmt(Loc);
4592}
4593
4595 bool IsIfExists,
4596 NestedNameSpecifierLoc QualifierLoc,
4597 DeclarationNameInfo NameInfo,
4598 Stmt *Nested)
4599{
4600 return new (Context) MSDependentExistsStmt(KeywordLoc, IsIfExists,
4601 QualifierLoc, NameInfo,
4602 cast<CompoundStmt>(Nested));
4603}
4604
4605
4607 bool IsIfExists,
4608 CXXScopeSpec &SS,
4609 UnqualifiedId &Name,
4610 Stmt *Nested) {
4611 return BuildMSDependentExistsStmt(KeywordLoc, IsIfExists,
4614 Nested);
4615}
4616
4619 unsigned NumParams) {
4620 DeclContext *DC = CurContext;
4621 while (!(DC->isFunctionOrMethod() || DC->isRecord() || DC->isFileContext()))
4622 DC = DC->getParent();
4623
4624 RecordDecl *RD = nullptr;
4625 if (getLangOpts().CPlusPlus)
4627 /*Id=*/nullptr);
4628 else
4630 /*Id=*/nullptr);
4631
4632 RD->setCapturedRecord();
4633 DC->addDecl(RD);
4634 RD->setImplicit();
4635 RD->startDefinition();
4636
4637 assert(NumParams > 0 && "CapturedStmt requires context parameter");
4638 CD = CapturedDecl::Create(Context, CurContext, NumParams);
4639 DC->addDecl(CD);
4640 return RD;
4641}
4642
4643static bool
4646 SmallVectorImpl<Expr *> &CaptureInits) {
4647 for (const sema::Capture &Cap : RSI->Captures) {
4648 if (Cap.isInvalid())
4649 continue;
4650
4651 // Form the initializer for the capture.
4653 RSI->CapRegionKind == CR_OpenMP);
4654
4655 // FIXME: Bail out now if the capture is not used and the initializer has
4656 // no side-effects.
4657
4658 // Create a field for this capture.
4659 FieldDecl *Field = S.BuildCaptureField(RSI->TheRecordDecl, Cap);
4660
4661 // Add the capture to our list of captures.
4662 if (Cap.isThisCapture()) {
4663 Captures.push_back(CapturedStmt::Capture(Cap.getLocation(),
4665 } else if (Cap.isVLATypeCapture()) {
4666 Captures.push_back(
4668 } else {
4669 assert(Cap.isVariableCapture() && "unknown kind of capture");
4670
4671 if (S.getLangOpts().OpenMP && RSI->CapRegionKind == CR_OpenMP)
4672 S.OpenMP().setOpenMPCaptureKind(Field, Cap.getVariable(),
4673 RSI->OpenMPLevel);
4674
4675 Captures.push_back(CapturedStmt::Capture(
4676 Cap.getLocation(),
4679 cast<VarDecl>(Cap.getVariable())));
4680 }
4681 CaptureInits.push_back(Init.get());
4682 }
4683 return false;
4684}
4685
4686static std::optional<int>
4688 if (!S.getLangOpts().OpenMP || Kind != CR_OpenMP)
4689 return {};
4690 if (const FunctionDecl *FD = S.getCurFunctionDecl(/*AllowLambda=*/true)) {
4691 if (IsArmStreamingFunction(FD, /*IncludeLocallyStreaming=*/true))
4692 return /* in streaming functions */ 0;
4693 if (hasArmZAState(FD))
4694 return /* in functions with ZA state */ 1;
4695 if (hasArmZT0State(FD))
4696 return /* in fuctions with ZT0 state */ 2;
4697 }
4698 return {};
4699}
4700
4702 CapturedRegionKind Kind,
4703 unsigned NumParams) {
4704 if (auto ErrorIndex = isOpenMPCapturedRegionInArmSMEFunction(*this, Kind))
4705 Diag(Loc, diag::err_sme_openmp_captured_region) << *ErrorIndex;
4706
4707 CapturedDecl *CD = nullptr;
4708 RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc, NumParams);
4709
4710 // Build the context parameter
4712 IdentifierInfo *ParamName = &Context.Idents.get("__context");
4713 CanQualType ParamType =
4714 Context.getPointerType(Context.getCanonicalTagType(RD));
4715 auto *Param =
4716 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType,
4718 DC->addDecl(Param);
4719
4720 CD->setContextParam(0, Param);
4721
4722 // Enter the capturing scope for this captured region.
4723 PushCapturedRegionScope(CurScope, CD, RD, Kind);
4724
4725 if (CurScope)
4726 PushDeclContext(CurScope, CD);
4727 else
4728 CurContext = CD;
4729
4732 ExprEvalContexts.back().InImmediateEscalatingFunctionContext = false;
4733}
4734
4736 CapturedRegionKind Kind,
4738 unsigned OpenMPCaptureLevel) {
4739 if (auto ErrorIndex = isOpenMPCapturedRegionInArmSMEFunction(*this, Kind))
4740 Diag(Loc, diag::err_sme_openmp_captured_region) << *ErrorIndex;
4741
4742 CapturedDecl *CD = nullptr;
4743 RecordDecl *RD = CreateCapturedStmtRecordDecl(CD, Loc, Params.size());
4744
4745 // Build the context parameter
4747 bool ContextIsFound = false;
4748 unsigned ParamNum = 0;
4749 for (ArrayRef<CapturedParamNameType>::iterator I = Params.begin(),
4750 E = Params.end();
4751 I != E; ++I, ++ParamNum) {
4752 if (I->second.isNull()) {
4753 assert(!ContextIsFound &&
4754 "null type has been found already for '__context' parameter");
4755 IdentifierInfo *ParamName = &Context.Idents.get("__context");
4756 QualType ParamType =
4757 Context.getPointerType(Context.getCanonicalTagType(RD))
4758 .withConst()
4759 .withRestrict();
4760 auto *Param =
4761 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType,
4763 DC->addDecl(Param);
4764 CD->setContextParam(ParamNum, Param);
4765 ContextIsFound = true;
4766 } else {
4767 IdentifierInfo *ParamName = &Context.Idents.get(I->first);
4768 auto *Param =
4769 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, I->second,
4771 DC->addDecl(Param);
4772 CD->setParam(ParamNum, Param);
4773 }
4774 }
4775 assert(ContextIsFound && "no null type for '__context' parameter");
4776 if (!ContextIsFound) {
4777 // Add __context implicitly if it is not specified.
4778 IdentifierInfo *ParamName = &Context.Idents.get("__context");
4779 CanQualType ParamType =
4780 Context.getPointerType(Context.getCanonicalTagType(RD));
4781 auto *Param =
4782 ImplicitParamDecl::Create(Context, DC, Loc, ParamName, ParamType,
4784 DC->addDecl(Param);
4785 CD->setContextParam(ParamNum, Param);
4786 }
4787 // Enter the capturing scope for this captured region.
4788 PushCapturedRegionScope(CurScope, CD, RD, Kind, OpenMPCaptureLevel);
4789
4790 if (CurScope)
4791 PushDeclContext(CurScope, CD);
4792 else
4793 CurContext = CD;
4794
4797}
4798
4805
4807 Record->setInvalidDecl();
4808
4809 SmallVector<Decl*, 4> Fields(Record->fields());
4810 ActOnFields(/*Scope=*/nullptr, Record->getLocation(), Record, Fields,
4812}
4813
4815 // Leave the captured scope before we start creating captures in the
4816 // enclosing scope.
4822
4824 SmallVector<Expr *, 4> CaptureInits;
4825 if (buildCapturedStmtCaptureList(*this, RSI, Captures, CaptureInits))
4826 return StmtError();
4827
4828 CapturedDecl *CD = RSI->TheCapturedDecl;
4829 RecordDecl *RD = RSI->TheRecordDecl;
4830
4832 getASTContext(), S, static_cast<CapturedRegionKind>(RSI->CapRegionKind),
4833 Captures, CaptureInits, CD, RD);
4834
4835 CD->setBody(Res->getCapturedStmt());
4836 RD->completeDefinition();
4837
4838 return Res;
4839}
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 CheckJumpOutOfSEHFinallyOrDefer(Sema &S, SourceLocation Loc, const Scope &DestScope, unsigned DeferJumpKind)
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.
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:220
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,...
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
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:3723
Attr - This represents one attribute.
Definition Attr.h:46
SourceLocation getLocation() const
Definition Attr.h:99
static AttributedStmt * Create(const ASTContext &C, SourceLocation Loc, ArrayRef< const Attr * > Attrs, Stmt *SubStmt)
Definition Stmt.cpp:436
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression which will be evaluated if the condition evaluates to false; ...
Definition Expr.h:4507
OpaqueValueExpr * getOpaqueValue() const
getOpaqueValue - Return the opaque value placeholder.
Definition Expr.h:4491
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4038
Expr * getLHS() const
Definition Expr.h:4088
SourceLocation getExprLoc() const
Definition Expr.h:4079
Expr * getRHS() const
Definition Expr.h:4090
Opcode getOpcode() const
Definition Expr.h:4083
BreakStmt - This represents a break.
Definition Stmt.h:3127
CStyleCastExpr - An explicit cast in C (C99 6.5.4) or a C-style cast in C++ (C++ [expr....
Definition Expr.h:3969
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) const
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:1493
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:1548
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2939
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:1831
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:2196
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:2943
Decl * getCalleeDecl()
Definition Expr.h:3120
static CanQual< Type > CreateUnsafe(QualType Other)
Represents the body of a CapturedStmt, and serves as its DeclContext.
Definition Decl.h:4943
void setBody(Stmt *B)
Definition Decl.cpp:5694
static DeclContext * castToDeclContext(const CapturedDecl *D)
Definition Decl.h:5023
void setContextParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:5005
void setParam(unsigned i, ImplicitParamDecl *P)
Definition Decl.h:4987
static CapturedDecl * Create(ASTContext &C, DeclContext *DC, unsigned NumParams)
Definition Decl.cpp:5681
Describes the capture of either a variable, or 'this', or variable-length array type.
Definition Stmt.h:3942
This captures a statement into a function.
Definition Stmt.h:3929
Stmt * getCapturedStmt()
Retrieve the statement being captured.
Definition Stmt.h:4033
static CapturedStmt * Create(const ASTContext &Context, Stmt *S, CapturedRegionKind Kind, ArrayRef< Capture > Captures, ArrayRef< Expr * > CaptureInits, CapturedDecl *CD, RecordDecl *RD)
Definition Stmt.cpp:1438
CaseStmt - Represent a case statement.
Definition Stmt.h:1912
Expr * getLHS()
Definition Stmt.h:1995
static CaseStmt * Create(const ASTContext &Ctx, Expr *lhs, Expr *rhs, SourceLocation caseLoc, SourceLocation ellipsisLoc, SourceLocation colonLoc)
Build a case statement.
Definition Stmt.cpp:1301
Expr * getRHS()
Definition Stmt.h:2007
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3676
CastKind getCastKind() const
Definition Expr.h:3720
Expr * getSubExpr()
Definition Expr.h:3726
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1732
bool body_empty() const
Definition Stmt.h:1776
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
Definition Stmt.cpp:394
Stmt * body_back()
Definition Stmt.h:1800
Expr * getFalseExpr() const
getFalseExpr - Return the subexpression representing the value of the expression if the condition eva...
Definition Expr.h:4423
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
Definition Expr.h:4414
Expr * getTrueExpr() const
getTrueExpr - Return the subexpression representing the value of the expression if the condition eval...
Definition Expr.h:4418
ConstEvaluatedExprVisitor - This class visits 'const Expr *'s.
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3761
ContinueStmt - This represents a continue.
Definition Stmt.h:3111
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:1270
ValueDecl * getDecl()
Definition Expr.h:1338
SourceLocation getLocation() const
Definition Expr.h:1346
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition Stmt.h:1623
bool isSingleDecl() const
isSingleDecl - This method returns true if this DeclStmt refers to a single Decl.
Definition Stmt.h:1636
const Decl * getSingleDecl() const
Definition Stmt.h:1638
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.h:1649
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:178
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition DeclBase.cpp:590
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:2005
SourceLocation getTypeSpecStartLoc() const
Definition Decl.cpp:1999
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:831
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
SourceLocation getDefaultLoc() const
Definition Stmt.h:2077
static DeferStmt * Create(ASTContext &Context, SourceLocation DeferLoc, Stmt *Body)
Definition Stmt.cpp:1547
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition Diagnostic.h:951
DoStmt - This represents a 'do/while' stmt.
Definition Stmt.h:2824
Represents an enum.
Definition Decl.h:4010
bool isClosed() const
Returns true if this enum is either annotated with enum_extensibility(closed) or isn't annotated with...
Definition Decl.cpp:5102
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:3094
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:2630
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) 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:3089
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:3085
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:1545
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:3069
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:276
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:136
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:3160
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:140
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
Definition Diagnostic.h:129
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:103
ForStmt - This represents a 'for (init;cond;inc)' stmt.
Definition Stmt.h:2880
Stmt * getInit()
Definition Stmt.h:2895
void setBody(Stmt *S)
Definition Stmt.h:2934
SourceLocation getRParenLoc() const
Definition Stmt.h:2940
SourceLocation getBeginLoc() const
Definition Stmt.h:2943
FullExpr - Represents a "full-expression" node.
Definition Expr.h:1049
Represents a function declaration or definition.
Definition Decl.h:2000
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2797
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition Decl.cpp:4205
void setUsesSEHTry(bool UST)
Definition Decl.h:2519
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
Definition Decl.cpp:3651
QualType getReturnType() const
Definition Decl.h:2845
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition Decl.cpp:4313
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition Decl.cpp:4329
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
Definition Decl.h:2470
bool isMain() const
Determines whether this function is "main", which is the entry point into an executable program.
Definition Decl.cpp:3368
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4549
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
Definition Decl.h:2933
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition Decl.cpp:4130
bool isConsteval() const
Definition Decl.h:2482
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
Definition Decl.h:2862
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5269
Declaration of a template function.
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4465
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:4813
QualType getReturnType() const
Definition TypeBase.h:4805
GotoStmt - This represents a direct goto.
Definition Stmt.h:2961
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:1039
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3853
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition Expr.cpp:2072
static ImplicitParamDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T, ImplicitParamKind ParamKind)
Create implicit parameter.
Definition Decl.cpp:5597
IndirectGotoStmt - This represents an indirect goto.
Definition Stmt.h:3000
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:974
Represents the declaration of a label.
Definition Decl.h:524
bool isGnuLocal() const
Definition Decl.h:551
void setLocStart(SourceLocation L)
Definition Decl.h:552
LabelStmt * getStmt() const
Definition Decl.h:548
void setStmt(LabelStmt *T)
Definition Decl.h:549
bool isMSAsmLabel() const
Definition Decl.h:558
LabelStmt - Represents a label, which has a substatement.
Definition Stmt.h:2138
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:3074
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:4920
Expr * getSubExpr() const
Retrieve the temporary-generating subexpression whose value will be materialized into a glvalue.
Definition ExprCXX.h:4937
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3364
Expr * getBase() const
Definition Expr.h:3441
This represents a decl that may have a name.
Definition Decl.h:274
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
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:1695
An expression that sends a message to the given Objective-C object or class.
Definition ExprObjC.h:937
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
Represents a pointer to an Objective C object.
Definition TypeBase.h:7910
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:1228
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition Overload.h:1160
@ CSK_Normal
Normal lookup.
Definition Overload.h:1164
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:3189
const Expr * getSubExpr() const
Definition Expr.h:2199
Represents a parameter to a function.
Definition Decl.h:1790
ParsedAttributes - A collection of parsed attributes.
Definition ParsedAttr.h:937
Wrapper for source info for pointers.
Definition TypeLoc.h:1484
SourceLocation getStarLoc() const
Definition TypeLoc.h:1486
IdentifierTable & getIdentifierTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition Expr.h:6756
ArrayRef< Expr * > semantics()
Definition Expr.h:6828
A (possibly-)qualified type.
Definition TypeBase.h:937
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8376
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:8477
QualType getCanonicalType() const
Definition TypeBase.h:8344
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8386
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
Definition TypeBase.h:1089
void removeLocalConst()
Definition TypeBase.h:8400
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8365
@ 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:4324
static RecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, RecordDecl *PrevDecl=nullptr)
Definition Decl.cpp:5227
virtual void completeDefinition()
Note that the definition of this type is now complete.
Definition Decl.cpp:5286
void setCapturedRecord()
Mark the record as a record for captured variables in CapturedStmt construct.
Definition Decl.cpp:5251
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition Stmt.h:3152
void setRetValue(Expr *E)
Definition Stmt.h:3181
static ReturnStmt * Create(const ASTContext &Ctx, SourceLocation RL, Expr *E, const VarDecl *NRVOCandidate)
Create a return statement.
Definition Stmt.cpp:1285
Expr * getRetValue()
Definition Stmt.h:3179
static SEHExceptStmt * Create(const ASTContext &C, SourceLocation ExceptLoc, Expr *FilterExpr, Stmt *Block)
Definition Stmt.cpp:1348
static SEHFinallyStmt * Create(const ASTContext &C, SourceLocation FinallyLoc, Stmt *Block)
Definition Stmt.cpp:1356
Represents a __leave statement.
Definition Stmt.h:3890
static SEHTryStmt * Create(const ASTContext &C, bool isCXXTry, SourceLocation TryLoc, Stmt *TryBlock, Stmt *Handler)
Definition Stmt.cpp:1328
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
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition SemaBase.cpp:33
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
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:924
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:7840
ExprResult release()
Definition Sema.h:7786
Expr * get() const
Definition Sema.h:7788
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12476
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:856
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:10977
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13073
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1121
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:9361
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:1508
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:1448
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:7862
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1224
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:2499
ExprResult ActOnCaseExpr(SourceLocation CaseLoc, ExprResult Val)
Definition SemaStmt.cpp:485
SimplerImplicitMoveMode
Definition Sema.h:11142
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:1660
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:834
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:1288
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:1493
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
Definition SemaDecl.cpp:79
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
Definition SemaExpr.cpp:755
ASTContext & getASTContext() const
Definition Sema.h:927
std::unique_ptr< sema::FunctionScopeInfo, PoppedFunctionScopeDeleter > PoppedFunctionScopePtr
Definition Sema.h:1061
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:10800
@ FRS_DiagnosticIssued
Definition Sema.h:10802
@ FRS_NoViableFunction
Definition Sema.h:10801
ObjCMethodDecl * getCurMethodDecl()
getCurMethodDecl - If inside of a method body, this returns a pointer to the method decl for the meth...
Definition Sema.cpp:1665
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:2509
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:922
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
void PopCompoundScope()
Definition Sema.cpp:2488
@ UPPC_Expression
An arbitrary expression.
Definition Sema.h:14411
const LangOptions & getLangOpts() const
Definition Sema.h:920
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2449
StmtResult ActOnWhileStmt(SourceLocation WhileLoc, SourceLocation LParenLoc, ConditionResult Cond, SourceLocation RParenLoc, Stmt *Body)
Preprocessor & PP
Definition Sema.h:1287
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:1286
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2564
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:1672
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:1321
void PushCompoundScope(bool IsStmtExpr)
Definition Sema.cpp:2483
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...
StmtResult ActOnEndOfDeferStmt(Stmt *Body, Scope *CurScope)
ExprResult ActOnCoawaitExpr(Scope *S, SourceLocation KwLoc, Expr *E)
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:2301
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:640
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1421
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
void ActOnStartOfDeferStmt(SourceLocation DeferLoc, Scope *CurScope)
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8199
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:13963
SourceManager & getSourceManager() const
Definition Sema.h:925
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.
bool isSFINAEContext() const
Definition Sema.h:13696
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:2879
void setFunctionHasMustTail()
Definition Sema.cpp:2514
void setFunctionHasBranchProtectedScope()
Definition Sema.cpp:2504
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:6761
@ ImmediateFunctionContext
In addition of being constant evaluated, the current expression occurs in an immediate function conte...
Definition Sema.h:6756
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:8339
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:1291
DiagnosticsEngine & Diags
Definition Sema.h:1290
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:1563
void PopDeclContext()
void diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, SourceLocation FallbackLoc, SourceLocation ConstQualLoc=SourceLocation(), SourceLocation VolatileQualLoc=SourceLocation(), SourceLocation RestrictQualLoc=SourceLocation(), SourceLocation AtomicQualLoc=SourceLocation(), SourceLocation UnalignedQualLoc=SourceLocation())
void ActOnDeferStmtError(Scope *CurScope)
QualType SubstAutoTypeDependent(QualType TypeWithAuto)
BuildForRangeKind
Definition Sema.h:11071
@ BFRK_Check
Determining whether a for-range statement could be built.
Definition Sema.h:11079
@ BFRK_Build
Initial building of a for-range statement.
Definition Sema.h:11073
@ BFRK_Rebuild
Instantiation or recovery rebuild of a for-range statement.
Definition Sema.h:11076
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:2110
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:1279
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
SmallVector< std::pair< Scope *, SourceLocation >, 2 > CurrentDefer
Stack of '_Defer' statements that are currently being parsed, as well as the locations of their '_Def...
Definition Sema.h:10981
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:8681
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:86
SourceLocation getEndLoc() const LLVM_READONLY
Definition Stmt.cpp:362
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:338
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:350
SwitchStmt - This represents a 'switch' stmt.
Definition Stmt.h:2501
void setBody(Stmt *Body)
Definition Stmt.h:2579
static SwitchStmt * Create(const ASTContext &Ctx, Stmt *Init, VarDecl *Var, Expr *Cond, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a switch statement.
Definition Stmt.cpp:1162
Expr * getCond()
Definition Stmt.h:2564
Stmt * getBody()
Definition Stmt.h:2576
Stmt * getInit()
Definition Stmt.h:2581
SwitchCase * getSwitchCaseList()
Definition Stmt.h:2632
DeclStmt * getConditionVariableDeclStmt()
If this SwitchStmt has a condition variable, return the faux DeclStmt associated with the creation of...
Definition Stmt.h:2615
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:2657
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
void startDefinition()
Starts the definition of this tag declaration.
Definition Decl.cpp:4906
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:2706
A container of type source information.
Definition TypeBase.h:8263
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8274
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isVoidType() const
Definition TypeBase.h:8891
bool isSignedIntegerOrEnumerationType() const
Determines whether this is an integer type that is signed or an enumeration types whose underlying ty...
Definition Type.cpp:2226
bool isRValueReferenceType() const
Definition TypeBase.h:8561
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:8628
bool isPointerType() const
Definition TypeBase.h:8529
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:8935
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9178
bool isReferenceType() const
Definition TypeBase.h:8553
bool isEnumeralType() const
Definition TypeBase.h:8660
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:753
bool isIntegralOrEnumerationType() const
Determine whether this type is an integral or enumeration type.
Definition TypeBase.h:9009
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
Definition TypeBase.h:2900
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
Definition TypeBase.h:8860
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2783
bool containsErrors() const
Whether this type is an error type.
Definition TypeBase.h:2777
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:9164
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition TypeBase.h:9027
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:2922
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:9111
bool isRecordType() const
Definition TypeBase.h:8656
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2244
Expr * getSubExpr() const
Definition Expr.h:2285
Opcode getOpcode() const
Definition Expr.h:2280
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:998
void setType(QualType newType)
Definition Decl.h:724
QualType getType() const
Definition Decl.h:723
QualType getType() const
Definition Value.cpp:237
Represents a variable declaration or definition.
Definition Decl.h:926
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition Decl.cpp:2162
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2201
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition Decl.h:1226
bool isExceptionVariable() const
Determine whether this variable is the exception variable in a C++ catch statememt or an Objective-C ...
Definition Decl.h:1494
const Expr * getInit() const
Definition Decl.h:1368
bool hasLocalStorage() const
Returns true if a variable with function scope is a non-static local variable.
Definition Decl.h:1184
bool isLocalVarDecl() const
Returns true for local variable declarations other than parameters.
Definition Decl.h:1253
bool hasDependentAlignment() const
Determines if this variable's alignment is dependent.
Definition Decl.cpp:2717
Represents a C array with a specified size that is not an integer-constant-expression.
Definition TypeBase.h:3967
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:1224
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:2830
bool Cast(InterpState &S, CodePtr OpPC)
Definition Interp.h:2518
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:115
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:24
@ 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:206
@ 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:689
bool hasArmZT0State(const FunctionDecl *FD)
Returns whether the given FunctionDecl has Arm ZT0 state.
Definition Decl.cpp:6115
@ Struct
The "struct" keyword.
Definition TypeBase.h:5895
ExprResult ExprError()
Definition Ownership.h:265
@ Type
The name was classified as a type.
Definition Sema.h:564
@ 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:157
Expr * IgnoreImplicitAsWrittenSingleStep(Expr *E)
Definition IgnoreExpr.h:144
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:369
@ Success
Template argument deduction was successful.
Definition Sema.h:371
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:385
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:423
U cast(CodeGen::Address addr)
Definition Address.h:327
@ CaseValue
Expression in a case label.
Definition Sema.h:827
bool IsArmStreamingFunction(const FunctionDecl *FD, bool IncludeLocallyStreaming)
Returns whether the given FunctionDecl has an __arm[_locally]_streaming attribute.
Definition Decl.cpp:6094
ReservedIdentifierStatus
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ CapturedContext
Parameter for captured context.
Definition Decl.h:1740
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
bool hasArmZAState(const FunctionDecl *FD)
Returns whether the given FunctionDecl has Arm ZA state.
Definition Decl.cpp:6108
#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:11139
bool isCopyElidable() const
Definition Sema.h:11140
const VarDecl * Candidate
Definition Sema.h:11134
static CatchHandlerType getEmptyKey()
static CatchHandlerType getTombstoneKey()
static unsigned getHashValue(const CatchHandlerType &Base)
static bool isEqual(const CatchHandlerType &LHS, const CatchHandlerType &RHS)