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