72  if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
 
   73    if (MD->isImplicitObjectMemberFunction()) {
 
   81      QualType T = MD->getFunctionObjectParameterType();
 
   98                            diag::err_coroutine_type_missing_specialization))
 
  102  assert(RD && 
"specialization of class template is not a class?");
 
  111           diag::err_implied_std_coroutine_traits_promise_type_not_found)
 
  122           diag::err_implied_std_coroutine_traits_promise_type_not_class)
 
  127                            diag::err_coroutine_promise_type_incomplete))
 
 
  140  assert(CoroNamespace && 
"Should already be diagnosed");
 
  145    S.
Diag(Loc, diag::err_implied_coroutine_type_not_found)
 
  146        << 
"std::coroutine_handle";
 
  152    Result.suppressDiagnostics();
 
  155    S.
Diag(
Found->getLocation(), diag::err_malformed_std_coroutine_handle);
 
  169  if (CoroHandleType.
isNull())
 
  172                            diag::err_coroutine_type_missing_specialization))
 
  175  return CoroHandleType;
 
 
  186  auto *FD = dyn_cast<FunctionDecl>(S.
CurContext);
 
  189                    ? diag::err_coroutine_objc_method
 
  190                    : diag::err_coroutine_outside_function) << 
Keyword;
 
  196  enum InvalidFuncDiag {
 
  205  bool Diagnosed = 
false;
 
  206  auto DiagInvalid = [&](InvalidFuncDiag ID) {
 
  207    S.
Diag(Loc, diag::err_coroutine_invalid_func_context) << ID << 
Keyword;
 
  214  auto *MD = dyn_cast<CXXMethodDecl>(FD);
 
  217    return DiagInvalid(DiagCtor);
 
  220    return DiagInvalid(DiagDtor);
 
  222  else if (FD->isMain())
 
  223    return DiagInvalid(DiagMain);
 
  229  if (FD->isConstexpr())
 
  230    DiagInvalid(FD->isConsteval() ? DiagConsteval : DiagConstexpr);
 
  233  if (FD->getReturnType()->isUndeducedType())
 
  234    DiagInvalid(DiagAutoRet);
 
  238  if (FD->isVariadic())
 
  239    DiagInvalid(DiagVarargs);
 
 
  265  if (CoroHandleType.
isNull())
 
  272    S.
Diag(Loc, diag::err_coroutine_handle_missing_member)
 
 
  303      Base, 
Base->getType(), Loc, 
false, SS,
 
  306  if (Result.isInvalid())
 
  309  auto EndLoc = Args.empty() ? Loc : Args.back()->getEndLoc();
 
  310  return S.
BuildCallExpr(
nullptr, Result.get(), Loc, Args, EndLoc, 
nullptr);
 
 
  322  if (!
T->isClassType() && !
T->isStructureType())
 
  333  Expr *JustAddress = AddressExpr.
get();
 
  338           diag::warn_coroutine_handle_address_invalid_return_type)
 
 
  369  auto BuildSubExpr = [&](ACT CallType, StringRef 
Func,
 
  372    if (Result.isInvalid()) {
 
  376    Calls.
Results[CallType] = Result.get();
 
  381      cast_or_null<CallExpr>(BuildSubExpr(ACT::ACT_Ready, 
"await_ready", {}));
 
  391             diag::note_await_ready_no_bool_conversion);
 
  392      S.
Diag(Loc, diag::note_coroutine_promise_call_implicitly_required)
 
  405  Expr *CoroHandle = CoroHandleRes.
get();
 
  406  CallExpr *AwaitSuspend = cast_or_null<CallExpr>(
 
  407      BuildSubExpr(ACT::ACT_Suspend, 
"await_suspend", CoroHandle));
 
  418    if (
Expr *TailCallSuspend =
 
  425      Calls.
Results[ACT::ACT_Suspend] = TailCallSuspend;
 
  431               diag::err_await_suspend_invalid_return_type)
 
  433        S.
Diag(Loc, diag::note_coroutine_promise_call_implicitly_required)
 
  437        Calls.
Results[ACT::ACT_Suspend] =
 
  442  BuildSubExpr(ACT::ACT_Resume, 
"await_resume", {});
 
 
  466  bool IsThisDependentType = [&] {
 
  467    if (
const auto *MD = dyn_cast_if_present<CXXMethodDecl>(FD))
 
  468      return MD->isImplicitObjectMemberFunction() &&
 
  469             MD->getThisType()->isDependentType();
 
  473  QualType T = FD->getType()->isDependentType() || IsThisDependentType
 
  480                             &
PP.getIdentifierTable().get(
"__promise"), 
T,
 
  484  if (VD->isInvalidDecl())
 
  494  if (
auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
 
  502      CtorArgExprs.push_back(ThisExpr.
get());
 
  507  auto &Moves = ScopeInfo->CoroutineParameterMoves;
 
  508  for (
auto *PD : FD->parameters()) {
 
  509    if (PD->getType()->isDependentType())
 
  513    auto Move = Moves.find(PD);
 
  514    assert(Move != Moves.end() &&
 
  515           "Coroutine function parameter not inserted into move map");
 
  523    if (RefExpr.isInvalid())
 
  525    CtorArgExprs.push_back(RefExpr.get());
 
  530  if (!CtorArgExprs.empty()) {
 
  534                                      CtorArgExprs, FD->getLocation());
 
  537        VD->getLocation(), 
true, PLE);
 
  551        VD->setInvalidDecl();
 
  552      } 
else if (
Result.get()) {
 
 
  569                                                bool IsImplicit = 
false) {
 
  576  assert(ScopeInfo && 
"missing function scope for function");
 
  578  if (ScopeInfo->FirstCoroutineStmtLoc.isInvalid() && !IsImplicit)
 
  579    ScopeInfo->setFirstCoroutineStmt(Loc, 
Keyword);
 
  581  if (ScopeInfo->CoroutinePromise)
 
  588  if (!ScopeInfo->CoroutinePromise)
 
 
  598                         llvm::SmallPtrSetImpl<const Decl *> &ThrowingDecls) {
 
  599  auto checkDeclNoexcept = [&](
const Decl *D, 
bool IsDtor = 
false) {
 
  603      if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
 
  611        if (FD->getBuiltinID() == Builtin::BI__builtin_coro_resume)
 
  614      if (ThrowingDecls.empty()) {
 
  621               diag::err_coroutine_promise_final_suspend_requires_nothrow);
 
  623      ThrowingDecls.insert(D);
 
  627  if (
auto *CE = dyn_cast<CXXConstructExpr>(E)) {
 
  629    checkDeclNoexcept(Ctor);
 
  632  } 
else if (
auto *CE = dyn_cast<CallExpr>(E)) {
 
  633    if (CE->isTypeDependent())
 
  636    checkDeclNoexcept(CE->getCalleeDecl());
 
  648    for (
const auto *Child : E->
children()) {
 
 
  663                                                        ThrowingDecls.end()};
 
  664  sort(SortedDecls, [](
const Decl *A, 
const Decl *B) {
 
  667  for (
const auto *D : SortedDecls) {
 
  668    Diag(D->getEndLoc(), diag::note_coroutine_function_declare_noexcept);
 
  670  return ThrowingDecls.empty();
 
 
  676  assert(FSI && 
"FunctionScopeInfo is null");
 
  678         "first coroutine location not set");
 
 
  696  assert(ScopeInfo->CoroutinePromise);
 
  699  if (ScopeInfo->FirstCoroutineStmtLoc == KWLoc)
 
  704  if (!ScopeInfo->NeedsCoroutineSuspends)
 
  707  ScopeInfo->setNeedsCoroutineSuspends(
false);
 
  712  auto buildSuspends = [&](StringRef Name) 
mutable -> 
StmtResult {
 
  715    if (Operand.isInvalid())
 
  725      Diag(Loc, diag::note_coroutine_promise_suspend_implicitly_required)
 
  726          << ((Name == 
"initial_suspend") ? 0 : 1);
 
  727      Diag(KWLoc, diag::note_declared_coroutine_here) << 
Keyword;
 
  733  StmtResult InitSuspend = buildSuspends(
"initial_suspend");
 
  737  StmtResult FinalSuspend = buildSuspends(
"final_suspend");
 
  741  ScopeInfo->setCoroutineSuspends(InitSuspend.
get(), FinalSuspend.
get());
 
 
  782  const bool BadContext =
 
  787    S.
Diag(Loc, diag::err_coroutine_unevaluated_context) << 
Keyword;
 
  793    S.
Diag(Loc, diag::err_coroutine_within_handler) << 
Keyword;
 
 
  822      Context.DeclarationNames.getCXXOperatorName(OO_Coawait);
 
  827  assert(!Operators.
isAmbiguous() && 
"Operator lookup cannot be ambiguous");
 
  832      Functions.end(), 
false,
 
 
  840  return Record && 
Record->hasAttr<CoroAwaitElidableAttr>();
 
 
  844  auto *
Call = dyn_cast<CallExpr>(Operand->IgnoreImplicit());
 
  851  Call->setCoroElideSafe();
 
  854  auto *Fn = llvm::dyn_cast_if_present<FunctionDecl>(
Call->getCalleeDecl());
 
  860    if (PD->hasAttr<CoroAwaitElidableArgumentAttr>())
 
 
  875  if (Operand->hasPlaceholderType()) {
 
  882  auto *Promise = FSI->CoroutinePromise;
 
  883  if (Promise->getType()->isDependentType()) {
 
  889  auto *RD = Promise->getType()->getAsCXXRecordDecl();
 
  894  if (CurFnAwaitElidable)
 
  897  Expr *Transformed = Operand;
 
  903           diag::note_coroutine_promise_implicit_await_transform_required_here)
 
  904          << Operand->getSourceRange();
 
  907    Transformed = R.
get();
 
 
  917                                          Expr *Awaiter, 
bool IsImplicit) {
 
 
  967      *
this, 
getCurFunction()->CoroutinePromise, Loc, 
"yield_value", E);
 
 
 1003      *
this, Coroutine->CoroutinePromise, Loc, E);
 
 
 1034  VarDecl *Promise = FSI->CoroutinePromise;
 
 
 1055  assert(Std && 
"Should already be diagnosed");
 
 1062    S.
Diag(Loc, diag::err_implicit_coroutine_std_nothrow_type_not_found);
 
 1066  auto *VD = Result.getAsSingle<
VarDecl>();
 
 1068    Result.suppressDiagnostics();
 
 1071    S.
Diag(
Found->getLocation(), diag::err_malformed_std_nothrow);
 
 
 1092                                        unsigned DiagnosticID,
 
 1099  bool HaveIssuedWarning = 
false;
 
 1100  for (
auto Decl : R) {
 
 1103    if (!HaveIssuedWarning) {
 
 1104      S.
Diag(Loc, DiagnosticID) << Name;
 
 1105      HaveIssuedWarning = 
true;
 
 1111  return HaveIssuedWarning;
 
 
 1120                              diag::warn_coroutine_type_aware_allocator_ignored,
 
 1121                              DeleteName, PromiseType);
 
 1123  assert(PointeeRD && 
"PromiseType must be a CxxRecordDecl type");
 
 1125  const bool Overaligned = S.
getLangOpts().CoroAlignedAllocation;
 
 1143  if (!OperatorDelete) {
 
 1152    if (!OperatorDelete)
 
 1156  assert(!OperatorDelete->isTypeAwareOperatorNewOrDelete());
 
 
 1164  assert(Fn && Fn->isCoroutine() && 
"not a coroutine");
 
 1167           "a null body is only allowed for invalid declarations");
 
 1172  if (!Fn->CoroutinePromise)
 
 1185  if (FD->
hasAttr<AlwaysInlineAttr>())
 
 1190  if (Fn->FirstVLALoc.isValid())
 
 1191    Diag(Fn->FirstVLALoc, diag::err_vla_in_coroutine_unsupported);
 
 1203  if (Builder.isInvalid() || !Builder.buildStatements())
 
 
 1211  if (
auto *CS = dyn_cast<CompoundStmt>(Body))
 
 
 1225    : S(S), FD(FD), Fn(Fn), Loc(FD.getLocation()),
 
 1226      IsPromiseDependentType(
 
 1227          !Fn.CoroutinePromise ||
 
 1228          Fn.CoroutinePromise->
getType()->isDependentType()) {
 
 1231  for (
auto KV : Fn.CoroutineParameterMoves)
 
 1232    this->ParamMovesVector.push_back(KV.second);
 
 1235  if (!IsPromiseDependentType) {
 
 1236    PromiseRecordDecl = Fn.CoroutinePromise->getType()->getAsCXXRecordDecl();
 
 1237    assert(PromiseRecordDecl && 
"Type should have already been checked");
 
 1239  this->IsValid = makePromiseStmt() && makeInitialAndFinalSuspend();
 
 
 1243  assert(this->IsValid && 
"coroutine already invalid");
 
 1244  this->IsValid = makeReturnObject();
 
 1245  if (this->IsValid && !IsPromiseDependentType)
 
 1247  return this->IsValid;
 
 
 1251  assert(this->IsValid && 
"coroutine already invalid");
 
 1252  assert(!this->IsPromiseDependentType &&
 
 1253         "coroutine cannot have a dependent promise type");
 
 1254  this->IsValid = makeOnException() && makeOnFallthrough() &&
 
 1255                  makeGroDeclAndReturnStmt() && makeReturnOnAllocFailure() &&
 
 1256                  makeNewAndDeleteExpr();
 
 1257  return this->IsValid;
 
 
 1260bool CoroutineStmtBuilder::makePromiseStmt() {
 
 1272bool CoroutineStmtBuilder::makeInitialAndFinalSuspend() {
 
 1284  if (
auto *DeclRef = dyn_cast_or_null<DeclRefExpr>(E)) {
 
 1285    auto *
Decl = DeclRef->getDecl();
 
 1287      if (Method->isStatic())
 
 1296      diag::err_coroutine_promise_get_return_object_on_allocation_failure)
 
 1297      << PromiseRecordDecl;
 
 1298  S.
Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here)
 
 1299      << Fn.getFirstCoroutineStmtKeyword();
 
 
 1303bool CoroutineStmtBuilder::makeReturnOnAllocFailure() {
 
 1304  assert(!IsPromiseDependentType &&
 
 1305         "cannot make statement while the promise type is dependent");
 
 1316  DeclarationName DN =
 
 1317      S.PP.getIdentifierInfo(
"get_return_object_on_allocation_failure");
 
 1319  if (!S.LookupQualifiedName(
Found, PromiseRecordDecl))
 
 1324      S.BuildDeclarationNameExpr(SS, 
Found, 
false);
 
 1332      S.BuildCallExpr(
nullptr, DeclNameExpr.
get(), Loc, {}, Loc);
 
 1333  if (ReturnObjectOnAllocationFailure.
isInvalid())
 
 1337      S.BuildReturnStmt(Loc, ReturnObjectOnAllocationFailure.
get());
 
 1339    S.Diag(
Found.getFoundDecl()->getLocation(), diag::note_member_declared_here)
 
 1341    S.Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here)
 
 1342        << Fn.getFirstCoroutineStmtKeyword();
 
 1355  if (
auto *MD = dyn_cast<CXXMethodDecl>(&FD)) {
 
 1363      PlacementArgs.push_back(ThisExpr.
get());
 
 1368    if (PD->getType()->isDependentType())
 
 1372    auto PDLoc = PD->getLocation();
 
 1379    PlacementArgs.push_back(PDRefExpr.
get());
 
 
 1385bool CoroutineStmtBuilder::makeNewAndDeleteExpr() {
 
 1387  assert(!IsPromiseDependentType &&
 
 1388         "cannot make statement while the promise type is dependent");
 
 1389  QualType PromiseType = Fn.CoroutinePromise->getType();
 
 1391  if (S.RequireCompleteType(Loc, PromiseType, diag::err_incomplete_type))
 
 1429  FunctionDecl *OperatorNew = 
nullptr;
 
 1430  SmallVector<Expr *, 1> PlacementArgs;
 
 1431  DeclarationName NewName =
 
 1432      S.getASTContext().DeclarationNames.getCXXOperatorName(OO_New);
 
 1434  const bool PromiseContainsNew = [
this, &PromiseType, NewName]() -> 
bool {
 
 1440    return !R.empty() && !R.isAmbiguous();
 
 1445  ImplicitAllocationParameters IAP(
 
 1449                                      bool WithoutPlacementArgs = 
false,
 
 1450                                      bool ForceNonAligned = 
false) {
 
 1461    bool ShouldUseAlignedAlloc =
 
 1462        !ForceNonAligned && S.getLangOpts().CoroAlignedAllocation;
 
 1463    IAP = ImplicitAllocationParameters(
 
 1466    FunctionDecl *UnusedResult = 
nullptr;
 
 1467    S.FindAllocationFunctions(
 
 1468        Loc, SourceRange(), NewScope,
 
 1471        WithoutPlacementArgs ? 
MultiExprArg{} : PlacementArgs, OperatorNew,
 
 1472        UnusedResult, 
false);
 
 1473    assert(!OperatorNew || !OperatorNew->isTypeAwareOperatorNewOrDelete());
 
 1482  LookupAllocationFunction();
 
 1484  if (PromiseContainsNew && !PlacementArgs.empty()) {
 
 1497    if (!OperatorNew || (S.getLangOpts().CoroAlignedAllocation &&
 
 1521  bool FoundNonAlignedInPromise = 
false;
 
 1522  if (PromiseContainsNew && S.getLangOpts().CoroAlignedAllocation)
 
 1524      FoundNonAlignedInPromise = OperatorNew;
 
 1530      if (!OperatorNew && !PlacementArgs.empty())
 
 1536  bool IsGlobalOverload =
 
 1541  if (RequiresNoThrowAlloc && (!OperatorNew || IsGlobalOverload)) {
 
 1545    PlacementArgs = {StdNoThrow};
 
 1546    OperatorNew = 
nullptr;
 
 1553  if (FoundNonAlignedInPromise) {
 
 1554    S.Diag(OperatorNew->getLocation(),
 
 1555           diag::warn_non_aligned_allocation_function)
 
 1560    if (PromiseContainsNew) {
 
 1561      S.Diag(Loc, diag::err_coroutine_unusable_new) << PromiseType << &FD;
 
 1563          S, Loc, diag::note_coroutine_unusable_type_aware_allocators, NewName,
 
 1565    } 
else if (RequiresNoThrowAlloc)
 
 1566      S.Diag(Loc, diag::err_coroutine_unfound_nothrow_new)
 
 1567          << &FD << S.getLangOpts().CoroAlignedAllocation;
 
 1571  assert(!OperatorNew->isTypeAwareOperatorNewOrDelete());
 
 1574                              diag::warn_coroutine_type_aware_allocator_ignored,
 
 1575                              NewName, PromiseType);
 
 1577  if (RequiresNoThrowAlloc) {
 
 1578    const auto *FT = OperatorNew->getType()->castAs<FunctionProtoType>();
 
 1579    if (!FT->isNothrow( 
false)) {
 
 1580      S.Diag(OperatorNew->getLocation(),
 
 1581             diag::err_coroutine_promise_new_requires_nothrow)
 
 1583      S.Diag(Loc, diag::note_coroutine_promise_call_implicitly_required)
 
 1589  FunctionDecl *OperatorDelete = 
nullptr;
 
 1597  assert(!OperatorDelete->isTypeAwareOperatorNewOrDelete());
 
 1600      S.BuildBuiltinCallExpr(Loc, Builtin::BI__builtin_coro_frame, {});
 
 1603      S.BuildBuiltinCallExpr(Loc, Builtin::BI__builtin_coro_size, {});
 
 1605  Expr *FrameAlignment = 
nullptr;
 
 1607  if (S.getLangOpts().CoroAlignedAllocation) {
 
 1609        S.BuildBuiltinCallExpr(Loc, Builtin::BI__builtin_coro_align, {});
 
 1615    FrameAlignment = S.BuildCXXNamedCast(Loc, tok::kw_static_cast, AlignValTy,
 
 1616                                         FrameAlignment, SourceRange(Loc, Loc),
 
 1617                                         SourceRange(Loc, Loc))
 
 1623      S.BuildDeclRefExpr(OperatorNew, OperatorNew->getType(), 
VK_LValue, Loc);
 
 1627  SmallVector<Expr *, 2> NewArgs(1, FrameSize);
 
 1628  if (S.getLangOpts().CoroAlignedAllocation &&
 
 1630    NewArgs.push_back(FrameAlignment);
 
 1632  if (OperatorNew->getNumParams() > NewArgs.size())
 
 1633    llvm::append_range(NewArgs, PlacementArgs);
 
 1636      S.BuildCallExpr(S.getCurScope(), NewRef.
get(), Loc, NewArgs, Loc);
 
 1637  NewExpr = S.ActOnFinishFullExpr(NewExpr.
get(),  
false);
 
 1643  QualType OpDeleteQualType = OperatorDelete->getType();
 
 1646      S.BuildDeclRefExpr(OperatorDelete, OpDeleteQualType, 
VK_LValue, Loc);
 
 1651      S.BuildBuiltinCallExpr(Loc, Builtin::BI__builtin_coro_free, {FramePtr});
 
 1653  SmallVector<Expr *, 2> DeleteArgs{CoroFree};
 
 1660  const auto *OpDeleteType =
 
 1662  if (OpDeleteType->getNumParams() > DeleteArgs.size() &&
 
 1663      S.getASTContext().hasSameUnqualifiedType(
 
 1664          OpDeleteType->getParamType(DeleteArgs.size()), FrameSize->
getType()))
 
 1665    DeleteArgs.push_back(FrameSize);
 
 1678  if (S.getLangOpts().CoroAlignedAllocation &&
 
 1679      OpDeleteType->getNumParams() > DeleteArgs.size() &&
 
 1680      S.getASTContext().hasSameUnqualifiedType(
 
 1681          OpDeleteType->getParamType(DeleteArgs.size()),
 
 1683    DeleteArgs.push_back(FrameAlignment);
 
 1686      S.BuildCallExpr(S.getCurScope(), DeleteRef.
get(), Loc, DeleteArgs, Loc);
 
 1688      S.ActOnFinishFullExpr(DeleteExpr.
get(),  
false);
 
 1698bool CoroutineStmtBuilder::makeOnFallthrough() {
 
 1699  assert(!IsPromiseDependentType &&
 
 1700         "cannot make statement while the promise type is dependent");
 
 1709  bool HasRVoid, HasRValue;
 
 1710  LookupResult LRVoid =
 
 1711      lookupMember(S, 
"return_void", PromiseRecordDecl, Loc, HasRVoid);
 
 1712  LookupResult LRValue =
 
 1713      lookupMember(S, 
"return_value", PromiseRecordDecl, Loc, HasRValue);
 
 1716  if (HasRVoid && HasRValue) {
 
 1718    S.Diag(FD.getLocation(),
 
 1719           diag::err_coroutine_promise_incompatible_return_functions)
 
 1720        << PromiseRecordDecl;
 
 1722           diag::note_member_first_declared_here)
 
 1725           diag::note_member_first_declared_here)
 
 1728  } 
else if (!HasRVoid && !HasRValue) {
 
 1739    Fallthrough = S.ActOnNullStmt(PromiseRecordDecl->getLocation());
 
 1740    if (Fallthrough.isInvalid())
 
 1742  } 
else if (HasRVoid) {
 
 1743    Fallthrough = S.BuildCoreturnStmt(FD.getLocation(), 
nullptr,
 
 1745    Fallthrough = S.ActOnFinishFullStmt(Fallthrough.get());
 
 1746    if (Fallthrough.isInvalid())
 
 1754bool CoroutineStmtBuilder::makeOnException() {
 
 1756  assert(!IsPromiseDependentType &&
 
 1757         "cannot make statement while the promise type is dependent");
 
 1759  const bool RequireUnhandledException = S.getLangOpts().CXXExceptions;
 
 1761  if (!
lookupMember(S, 
"unhandled_exception", PromiseRecordDecl, Loc)) {
 
 1763        RequireUnhandledException
 
 1764            ? diag::err_coroutine_promise_unhandled_exception_required
 
 1766                  warn_coroutine_promise_unhandled_exception_required_with_exceptions;
 
 1767    S.Diag(Loc, DiagID) << PromiseRecordDecl;
 
 1768    S.Diag(PromiseRecordDecl->getLocation(), diag::note_defined_here)
 
 1769        << PromiseRecordDecl;
 
 1770    return !RequireUnhandledException;
 
 1774  if (!S.getLangOpts().CXXExceptions)
 
 1779  UnhandledException = S.ActOnFinishFullExpr(UnhandledException.
get(), Loc,
 
 1786  if (!S.getLangOpts().Borland && Fn.FirstSEHTryLoc.isValid()) {
 
 1787    S.Diag(Fn.FirstSEHTryLoc, diag::err_seh_in_a_coroutine_with_cxx_exceptions);
 
 1788    S.Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here)
 
 1789        << Fn.getFirstCoroutineStmtKeyword();
 
 1797bool CoroutineStmtBuilder::makeReturnObject() {
 
 1811  if (
auto *MbrRef = dyn_cast<CXXMemberCallExpr>(E)) {
 
 1812    auto *MethodDecl = MbrRef->getMethodDecl();
 
 1813    S.
Diag(MethodDecl->getLocation(), diag::note_member_declared_here)
 
 1816  S.
Diag(Fn.FirstCoroutineStmtLoc, diag::note_declared_coroutine_here)
 
 1817      << Fn.getFirstCoroutineStmtKeyword();
 
 
 1820bool CoroutineStmtBuilder::makeGroDeclAndReturnStmt() {
 
 1821  assert(!IsPromiseDependentType &&
 
 1822         "cannot make statement while the promise type is dependent");
 
 1823  assert(this->
ReturnValue && 
"ReturnValue must be already formed");
 
 1825  QualType 
const GroType = this->
ReturnValue->getType();
 
 1827         "get_return_object type must no longer be dependent");
 
 1829  QualType 
const FnRetType = FD.getReturnType();
 
 1831         "get_return_object type must no longer be dependent");
 
 1839  bool GroMatchesRetType = S.getASTContext().hasSameType(GroType, FnRetType);
 
 1843        S.ActOnFinishFullExpr(this->
ReturnValue, Loc,  
false);
 
 1847    if (!GroMatchesRetType)
 
 1854    InitializedEntity Entity =
 
 1856    S.PerformCopyInitialization(Entity, SourceLocation(), 
ReturnValue);
 
 1862  clang::VarDecl *GroDecl = 
nullptr;
 
 1863  if (GroMatchesRetType) {
 
 1867        S.Context, &FD, FD.getLocation(), FD.getLocation(),
 
 1868        &S.PP.getIdentifierTable().get(
"__coro_gro"), GroType,
 
 1869        S.Context.getTrivialTypeSourceInfo(GroType, Loc), 
SC_None);
 
 1872    S.CheckVariableDeclarationType(GroDecl);
 
 1878        S.PerformCopyInitialization(Entity, SourceLocation(), 
ReturnValue);
 
 1882    Res = S.ActOnFinishFullExpr(Res.
get(),  
false);
 
 1886    S.AddInitializerToDecl(GroDecl, Res.
get(),
 
 1889    S.FinalizeDeclaration(GroDecl);
 
 1894        S.ActOnDeclStmt(S.ConvertDeclToDeclGroup(GroDecl), Loc, Loc);
 
 1895    if (GroDeclStmt.isInvalid())
 
 1912  if (!GroMatchesRetType &&
 
 1953  if (!ScopeInfo->CoroutineParameterMoves.empty())
 
 1962  for (
auto *PD : FD->parameters()) {
 
 1963    if (PD->getType()->isDependentType())
 
 1967    bool DeclReferenced = PD->isReferenced();
 
 1973    PD->setReferenced(DeclReferenced);
 
 1978    Expr *CExpr = 
nullptr;
 
 1979    if (PD->getType()->getAsCXXRecordDecl() ||
 
 1980        PD->getType()->isRValueReferenceType())
 
 1983      CExpr = PDRefExpr.
get();
 
 1987    auto *D = 
buildVarDecl(*
this, Loc, PD->getType(), PD->getIdentifier());
 
 1992    if (
Stmt.isInvalid())
 
 1995    ScopeInfo->CoroutineParameterMoves.insert(std::make_pair(PD, 
Stmt.get()));
 
 
 2013      PP.getIdentifierTable().get(
"coroutine_traits");
 
 2021    Diag(KwLoc, diag::err_implied_coroutine_type_not_found)
 
 2022        << 
"std::coroutine_traits";
 
 2029    Result.suppressDiagnostics();
 
 2031    Diag(
Found->getLocation(), diag::err_malformed_std_coroutine_traits);
 
 
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines enum values for all the target-independent builtin functions.
Defines the clang::Expr interface and subclasses for C++ expressions.
llvm::MachO::Record Record
Defines the clang::Preprocessor interface.
static ExprResult buildCoroutineHandle(Sema &S, QualType PromiseType, SourceLocation Loc)
static bool DiagnoseTypeAwareAllocators(Sema &S, SourceLocation Loc, unsigned DiagnosticID, DeclarationName Name, QualType PromiseType)
static void noteMemberDeclaredHere(Sema &S, Expr *E, FunctionScopeInfo &Fn)
static void checkReturnStmtInCoroutine(Sema &S, FunctionScopeInfo *FSI)
static bool isValidCoroutineContext(Sema &S, SourceLocation Loc, StringRef Keyword)
static void applySafeElideContext(Expr *Operand)
static Expr * buildStdNoThrowDeclRef(Sema &S, SourceLocation Loc)
Look up the std::nothrow object.
static ExprResult buildOperatorCoawaitCall(Sema &SemaRef, Scope *S, SourceLocation Loc, Expr *E)
static bool diagReturnOnAllocFailure(Sema &S, Expr *E, CXXRecordDecl *PromiseRecordDecl, FunctionScopeInfo &Fn)
static ExprResult buildPromiseCall(Sema &S, VarDecl *Promise, SourceLocation Loc, StringRef Name, MultiExprArg Args)
static Expr * castForMoving(Sema &S, Expr *E, QualType T=QualType())
static Expr * maybeTailCall(Sema &S, QualType RetType, Expr *E, SourceLocation Loc)
static ExprResult buildMemberCall(Sema &S, Expr *Base, SourceLocation Loc, StringRef Name, MultiExprArg Args)
static LookupResult lookupMember(Sema &S, const char *Name, CXXRecordDecl *RD, SourceLocation Loc, bool &Res)
static TypeSourceInfo * getTypeSourceInfoForStdAlignValT(Sema &S, SourceLocation Loc)
static bool isWithinCatchScope(Scope *S)
static bool findDeleteForPromise(Sema &S, SourceLocation Loc, QualType PromiseType, FunctionDecl *&OperatorDelete)
static VarDecl * buildVarDecl(Sema &S, SourceLocation Loc, QualType Type, IdentifierInfo *II)
Build a variable declaration for move parameter.
static void checkNoThrow(Sema &S, const Stmt *E, llvm::SmallPtrSetImpl< const Decl * > &ThrowingDecls)
Recursively check E and all its children to see if any call target (including constructor call) is de...
static ReadySuspendResumeResult buildCoawaitCalls(Sema &S, VarDecl *CoroPromise, SourceLocation Loc, Expr *E)
Build calls to await_ready, await_suspend, and await_resume for a co_await expression.
static bool checkSuspensionContext(Sema &S, SourceLocation Loc, StringRef Keyword)
static QualType lookupCoroutineHandleType(Sema &S, QualType PromiseType, SourceLocation Loc)
Look up the std::coroutine_handle<PromiseType>.
static bool collectPlacementArgs(Sema &S, FunctionDecl &FD, SourceLocation Loc, SmallVectorImpl< Expr * > &PlacementArgs)
static CompoundStmt * buildCoroutineBody(Stmt *Body, ASTContext &Context)
static QualType lookupPromiseType(Sema &S, const FunctionDecl *FD, SourceLocation KwLoc)
Look up the std::coroutine_traits<...>::promise_type for the given function type.
static bool isAttributedCoroAwaitElidable(const QualType &QT)
static FunctionScopeInfo * checkCoroutineContext(Sema &S, SourceLocation Loc, StringRef Keyword, bool IsImplicit=false)
Check that this is a context in which a coroutine suspension can appear.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
DeclarationNameTable DeclarationNames
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,...
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
CanQualType getCanonicalTagType(const TagDecl *TD) const
AddrLabelExpr - The GNU address of label extension, representing &&label.
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a C++ constructor within a class.
Represents a static or instance method of a struct/union/class.
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Represents a C++ struct/union/class.
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
Represents a C++ nested-name-specifier or a global scope specifier.
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
QualType getCallReturnType(const ASTContext &Ctx) const
getCallReturnType - Get the return type of the call expr.
Declaration of a class template.
void setExprNeedsCleanups(bool SideEffects)
Represents a 'co_await' expression.
CompoundStmt - This represents a group of statements like { stmt stmt }.
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
Represents a 'co_return' statement in the C++ Coroutines TS.
Represents the body of a coroutine.
static CoroutineBodyStmt * Create(const ASTContext &C, CtorArgs const &Args)
CoroutineStmtBuilder(Sema &S, FunctionDecl &FD, sema::FunctionScopeInfo &Fn, Stmt *Body)
Construct a CoroutineStmtBuilder and initialize the promise statement and initial/final suspends from...
bool buildDependentStatements()
Build the coroutine body statements that require a non-dependent promise type in order to construct.
bool buildStatements()
Build the coroutine body statements, including the "promise dependent" statements when the promise ty...
Represents a 'co_yield' expression.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Decl - This represents one declaration (or definition), e.g.
SourceLocation getEndLoc() const LLVM_READONLY
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
bool isInvalidDecl() const
SourceLocation getLocation() const
void setImplicit(bool I=true)
DeclContext * getDeclContext()
The name of a declaration.
SourceLocation getBeginLoc() const LLVM_READONLY
Represents a 'co_await' expression while the type of the promise is dependent.
RAII object that enters a new function expression evaluation context.
This represents one expression.
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
Represents difference between two FPOptions values.
Represents a function declaration or definition.
bool isNoReturn() const
Determines whether this function is known to be 'noreturn', through an attribute on its declaration o...
ArrayRef< ParmVarDecl * > parameters() const
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
Represents a prototype with parameter type info, e.g.
ArrayRef< QualType > getParamTypes() const
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
QualType getReturnType() const
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.
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateForInit(SourceLocation Loc, bool DirectInit, Expr *Init)
Create an initialization from an initializer (which, for direct initialization from a parenthesized l...
ExprResult Perform(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Args, QualType *ResultType=nullptr)
Perform the actual initialization of the given entity based on the computed initialization sequence.
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 InitializeVariable(VarDecl *Var)
Create the initialization entity for a variable.
Represents the results of name lookup.
DeclClass * getAsSingle() const
const UnresolvedSetImpl & asUnresolvedSet() const
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
DeclarationName getLookupName() const
Gets the name to look up.
This represents a decl that may have a name.
Represent a C++ namespace.
A C++ nested-name-specifier augmented with source location information.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
decls_iterator decls_begin() const
decls_iterator decls_end() const
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
Represents a parameter to a function.
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
IdentifierTable & getIdentifierTable()
A (possibly-)qualified type.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
QualType getCanonicalType() const
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Scope - A scope is a transient data structure that is used while parsing the program.
bool isCatchScope() const
isCatchScope - Return true if this scope is a C++ catch statement.
const Scope * getParent() const
getParent - Return the scope that this is nested in.
bool isFunctionScope() const
isFunctionScope() - Return true if this scope is a function scope.
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Sema - This implements semantic analysis and AST building for C.
FunctionDecl * FindUsualDeallocationFunction(SourceLocation StartLoc, ImplicitDeallocationParameters, DeclarationName Name, bool Diagnose=true)
ExprResult BuildOperatorCoawaitCall(SourceLocation Loc, Expr *E, UnresolvedLookupExpr *Lookup)
Build a call to 'operator co_await' if there is a suitable operator for the given expression.
Scope * getCurScope() const
Retrieve the parser's current scope.
ExprResult BuildMemberReferenceExpr(Expr *Base, QualType BaseType, SourceLocation OpLoc, bool IsArrow, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, NamedDecl *FirstQualifierInScope, const DeclarationNameInfo &NameInfo, const TemplateArgumentListInfo *TemplateArgs, const Scope *S, ActOnMemberAccessExtraArgs *ExtraArgs=nullptr)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
@ LookupOperatorName
Look up of an operator name (e.g., operator+) for use with operator overloading.
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
bool checkFinalSuspendNoThrow(const Stmt *FinalSuspend)
Check that the expression co_await promise.final_suspend() shall not be potentially-throwing.
StmtResult BuildCoroutineBodyStmt(CoroutineBodyStmt::CtorArgs)
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, ImplicitDeallocationParameters, bool Diagnose=true)
ExprResult BuildCoyieldExpr(SourceLocation KwLoc, Expr *E)
void CheckCompletedCoroutineBody(FunctionDecl *FD, Stmt *&Body)
bool ActOnCoroutineBodyStart(Scope *S, SourceLocation KwLoc, StringRef Keyword)
VarDecl * buildCoroutinePromise(SourceLocation Loc)
const ExpressionEvaluationContextRecord & currentEvaluationContext() const
StmtResult BuildCoreturnStmt(SourceLocation KwLoc, Expr *E, bool IsImplicit=false)
Expr * BuildBuiltinCallExpr(SourceLocation Loc, Builtin::ID Id, MultiExprArg CallArgs)
BuildBuiltinCallExpr - Create a call to a builtin function specified by Id.
ExprResult BuildResolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, Expr *Awaiter, bool IsImplicit=false)
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
ExprResult ActOnCoyieldExpr(Scope *S, SourceLocation KwLoc, Expr *E)
DeclGroupPtrTy ConvertDeclToDeclGroup(Decl *Ptr, Decl *OwnedType=nullptr)
ClassTemplateDecl * StdCoroutineTraitsCache
The C++ "std::coroutine_traits" template, which is defined in <coroutine_traits>
ASTContext & getASTContext() const
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
EnumDecl * getStdAlignValT() const
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...
StmtResult ActOnCoreturnStmt(Scope *S, SourceLocation KwLoc, Expr *E)
const LangOptions & getLangOpts() const
ExprResult BuildCallExpr(Scope *S, Expr *Fn, SourceLocation LParenLoc, MultiExprArg ArgExprs, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallExpr - Handle a call to Fn with the specified array of arguments.
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
ExprResult BuildUnresolvedCoawaitExpr(SourceLocation KwLoc, Expr *Operand, UnresolvedLookupExpr *Lookup)
bool buildCoroutineParameterMoves(SourceLocation Loc)
sema::FunctionScopeInfo * getCurFunction() const
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
ExprResult CreateOverloadedUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *input, bool RequiresADL=true)
Create a unary operation that may resolve to an overloaded operator.
ExprResult ActOnCoawaitExpr(Scope *S, SourceLocation KwLoc, Expr *E)
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
MaterializeTemporaryExpr * CreateMaterializeTemporaryExpr(QualType T, Expr *Temporary, bool BoundToLvalueReference)
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ClassTemplateDecl * lookupCoroutineTraits(SourceLocation KwLoc, SourceLocation FuncLoc)
Lookup 'coroutine_traits' in std namespace and std::experimental namespace.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
void CheckCompleteVariableDeclaration(VarDecl *VD)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
ExprResult BuildOperatorCoawaitLookupExpr(Scope *S, SourceLocation Loc)
StmtResult ActOnDeclStmt(DeclGroupPtrTy Decl, SourceLocation StartLoc, SourceLocation EndLoc)
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
NamespaceDecl * getStdNamespace() const
friend class InitializationSequence
void ActOnUninitializedDecl(Decl *dcl)
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
void MarkFunctionReferenced(SourceLocation Loc, FunctionDecl *Func, bool MightBeOdrUse=true)
Mark a function referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void CheckVariableDeclarationType(VarDecl *NewVD)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
ExprResult ActOnCXXThis(SourceLocation Loc)
static CanThrowResult canCalleeThrow(Sema &S, const Expr *E, const Decl *D, SourceLocation Loc=SourceLocation())
Determine whether the callee of a particular function call can throw.
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
Stmt - This represents one statement.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
SourceLocation getBeginLoc() const LLVM_READONLY
A convenient class for passing around template argument information.
void addArgument(const TemplateArgumentLoc &Loc)
Location wrapper for a TemplateArgument.
Represents a template argument.
Represents a declaration of a type.
A container of type source information.
The base class of the type hierarchy.
bool isBooleanType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isVoidPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
bool isRecordType() const
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
void append(iterator I, iterator E)
A set of unresolved declarations.
Represents a variable declaration or definition.
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
@ CallInit
Call-style initialization (C++98)
void setNRVOVariable(bool NRVO)
Retains information about a function, method, or block that is currently being parsed.
SourceLocation FirstCoroutineStmtLoc
First coroutine statement in the current function.
std::pair< Stmt *, Stmt * > CoroutineSuspends
The initial and final coroutine suspend points.
VarDecl * CoroutinePromise
The promise object for this coroutine, if any.
bool hasInvalidCoroutineSuspends() const
StringRef getFirstCoroutineStmtKeyword() const
SourceLocation FirstReturnLoc
First 'return' statement in the current function.
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)
AllocationFunctionScope
The scope in which to find allocation functions.
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
@ Global
Only look for allocation functions in the global scope.
@ Class
Only look for allocation functions in the scope of the allocated class.
AlignedAllocationMode alignedAllocationModeFromBool(bool IsAligned)
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
bool isAlignedAllocation(AlignedAllocationMode Mode)
MutableArrayRef< Expr * > MultiExprArg
bool isLambdaCallOperator(const CXXMethodDecl *MD)
@ Result
The result type of a method or function.
const FunctionProtoType * T
@ Keyword
The name has been typo-corrected to a keyword.
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
U cast(CodeGen::Address addr)
@ None
No keyword precedes the qualified type name.
ActionResult< Expr * > ExprResult
ActionResult< Stmt * > StmtResult
OpaqueValueExpr * OpaqueValue
Stmt * ReturnStmtOnAllocFailure
ArrayRef< Stmt * > ParamMoves
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SizedDeallocationMode PassSize
enum clang::Sema::ExpressionEvaluationContextRecord::ExpressionKind ExprContext