clang 22.0.0git
SemaDeclCXX.cpp
Go to the documentation of this file.
1//===------ SemaDeclCXX.cpp - Semantic Analysis for C++ Declarations ------===//
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 C++ declarations.
10//
11//===----------------------------------------------------------------------===//
12
13#include "TypeLocBuilder.h"
18#include "clang/AST/CharUnits.h"
20#include "clang/AST/DeclCXX.h"
24#include "clang/AST/Expr.h"
25#include "clang/AST/ExprCXX.h"
28#include "clang/AST/TypeLoc.h"
37#include "clang/Sema/DeclSpec.h"
40#include "clang/Sema/Lookup.h"
43#include "clang/Sema/Scope.h"
45#include "clang/Sema/SemaCUDA.h"
47#include "clang/Sema/SemaObjC.h"
49#include "clang/Sema/Template.h"
51#include "llvm/ADT/ArrayRef.h"
52#include "llvm/ADT/STLExtras.h"
53#include "llvm/ADT/StringExtras.h"
54#include "llvm/Support/ConvertUTF.h"
55#include "llvm/Support/SaveAndRestore.h"
56#include <map>
57#include <optional>
58#include <set>
59
60using namespace clang;
61
62//===----------------------------------------------------------------------===//
63// CheckDefaultArgumentVisitor
64//===----------------------------------------------------------------------===//
65
66namespace {
67/// CheckDefaultArgumentVisitor - C++ [dcl.fct.default] Traverses
68/// the default argument of a parameter to determine whether it
69/// contains any ill-formed subexpressions. For example, this will
70/// diagnose the use of local variables or parameters within the
71/// default argument expression.
72class CheckDefaultArgumentVisitor
73 : public ConstStmtVisitor<CheckDefaultArgumentVisitor, bool> {
74 Sema &S;
75 const Expr *DefaultArg;
76
77public:
78 CheckDefaultArgumentVisitor(Sema &S, const Expr *DefaultArg)
79 : S(S), DefaultArg(DefaultArg) {}
80
81 bool VisitExpr(const Expr *Node);
82 bool VisitDeclRefExpr(const DeclRefExpr *DRE);
83 bool VisitCXXThisExpr(const CXXThisExpr *ThisE);
84 bool VisitLambdaExpr(const LambdaExpr *Lambda);
85 bool VisitPseudoObjectExpr(const PseudoObjectExpr *POE);
86};
87
88/// VisitExpr - Visit all of the children of this expression.
89bool CheckDefaultArgumentVisitor::VisitExpr(const Expr *Node) {
90 bool IsInvalid = false;
91 for (const Stmt *SubStmt : Node->children())
92 if (SubStmt)
93 IsInvalid |= Visit(SubStmt);
94 return IsInvalid;
95}
96
97/// VisitDeclRefExpr - Visit a reference to a declaration, to
98/// determine whether this declaration can be used in the default
99/// argument expression.
100bool CheckDefaultArgumentVisitor::VisitDeclRefExpr(const DeclRefExpr *DRE) {
101 const ValueDecl *Decl = dyn_cast<ValueDecl>(DRE->getDecl());
102
103 if (!isa<VarDecl, BindingDecl>(Decl))
104 return false;
105
106 if (const auto *Param = dyn_cast<ParmVarDecl>(Decl)) {
107 // C++ [dcl.fct.default]p9:
108 // [...] parameters of a function shall not be used in default
109 // argument expressions, even if they are not evaluated. [...]
110 //
111 // C++17 [dcl.fct.default]p9 (by CWG 2082):
112 // [...] A parameter shall not appear as a potentially-evaluated
113 // expression in a default argument. [...]
114 //
115 if (DRE->isNonOdrUse() != NOUR_Unevaluated)
116 return S.Diag(DRE->getBeginLoc(),
117 diag::err_param_default_argument_references_param)
118 << Param->getDeclName() << DefaultArg->getSourceRange();
119 } else if (auto *VD = Decl->getPotentiallyDecomposedVarDecl()) {
120 // C++ [dcl.fct.default]p7:
121 // Local variables shall not be used in default argument
122 // expressions.
123 //
124 // C++17 [dcl.fct.default]p7 (by CWG 2082):
125 // A local variable shall not appear as a potentially-evaluated
126 // expression in a default argument.
127 //
128 // C++20 [dcl.fct.default]p7 (DR as part of P0588R1, see also CWG 2346):
129 // Note: A local variable cannot be odr-used (6.3) in a default
130 // argument.
131 //
132 if (VD->isLocalVarDecl() && !DRE->isNonOdrUse())
133 return S.Diag(DRE->getBeginLoc(),
134 diag::err_param_default_argument_references_local)
135 << Decl << DefaultArg->getSourceRange();
136 }
137 return false;
138}
139
140/// VisitCXXThisExpr - Visit a C++ "this" expression.
141bool CheckDefaultArgumentVisitor::VisitCXXThisExpr(const CXXThisExpr *ThisE) {
142 // C++ [dcl.fct.default]p8:
143 // The keyword this shall not be used in a default argument of a
144 // member function.
145 return S.Diag(ThisE->getBeginLoc(),
146 diag::err_param_default_argument_references_this)
147 << ThisE->getSourceRange();
148}
149
150bool CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(
151 const PseudoObjectExpr *POE) {
152 bool Invalid = false;
153 for (const Expr *E : POE->semantics()) {
154 // Look through bindings.
155 if (const auto *OVE = dyn_cast<OpaqueValueExpr>(E)) {
156 E = OVE->getSourceExpr();
157 assert(E && "pseudo-object binding without source expression?");
158 }
159
160 Invalid |= Visit(E);
161 }
162 return Invalid;
163}
164
165bool CheckDefaultArgumentVisitor::VisitLambdaExpr(const LambdaExpr *Lambda) {
166 // [expr.prim.lambda.capture]p9
167 // a lambda-expression appearing in a default argument cannot implicitly or
168 // explicitly capture any local entity. Such a lambda-expression can still
169 // have an init-capture if any full-expression in its initializer satisfies
170 // the constraints of an expression appearing in a default argument.
171 bool Invalid = false;
172 for (const LambdaCapture &LC : Lambda->captures()) {
173 if (!Lambda->isInitCapture(&LC))
174 return S.Diag(LC.getLocation(), diag::err_lambda_capture_default_arg);
175 // Init captures are always VarDecl.
176 auto *D = cast<VarDecl>(LC.getCapturedVar());
177 Invalid |= Visit(D->getInit());
178 }
179 return Invalid;
180}
181} // namespace
182
183void
185 const CXXMethodDecl *Method) {
186 // If we have an MSAny spec already, don't bother.
187 if (!Method || ComputedEST == EST_MSAny)
188 return;
189
190 const FunctionProtoType *Proto
191 = Method->getType()->getAs<FunctionProtoType>();
192 Proto = Self->ResolveExceptionSpec(CallLoc, Proto);
193 if (!Proto)
194 return;
195
197
198 // If we have a throw-all spec at this point, ignore the function.
199 if (ComputedEST == EST_None)
200 return;
201
202 if (EST == EST_None && Method->hasAttr<NoThrowAttr>())
203 EST = EST_BasicNoexcept;
204
205 switch (EST) {
206 case EST_Unparsed:
208 case EST_Unevaluated:
209 llvm_unreachable("should not see unresolved exception specs here");
210
211 // If this function can throw any exceptions, make a note of that.
212 case EST_MSAny:
213 case EST_None:
214 // FIXME: Whichever we see last of MSAny and None determines our result.
215 // We should make a consistent, order-independent choice here.
216 ClearExceptions();
217 ComputedEST = EST;
218 return;
220 ClearExceptions();
221 ComputedEST = EST_None;
222 return;
223 // FIXME: If the call to this decl is using any of its default arguments, we
224 // need to search them for potentially-throwing calls.
225 // If this function has a basic noexcept, it doesn't affect the outcome.
227 case EST_NoexceptTrue:
228 case EST_NoThrow:
229 return;
230 // If we're still at noexcept(true) and there's a throw() callee,
231 // change to that specification.
232 case EST_DynamicNone:
233 if (ComputedEST == EST_BasicNoexcept)
234 ComputedEST = EST_DynamicNone;
235 return;
237 llvm_unreachable(
238 "should not generate implicit declarations for dependent cases");
239 case EST_Dynamic:
240 break;
241 }
242 assert(EST == EST_Dynamic && "EST case not considered earlier.");
243 assert(ComputedEST != EST_None &&
244 "Shouldn't collect exceptions when throw-all is guaranteed.");
245 ComputedEST = EST_Dynamic;
246 // Record the exceptions in this function's exception specification.
247 for (const auto &E : Proto->exceptions())
248 if (ExceptionsSeen.insert(Self->Context.getCanonicalType(E)).second)
249 Exceptions.push_back(E);
250}
251
253 if (!S || ComputedEST == EST_MSAny)
254 return;
255
256 // FIXME:
257 //
258 // C++0x [except.spec]p14:
259 // [An] implicit exception-specification specifies the type-id T if and
260 // only if T is allowed by the exception-specification of a function directly
261 // invoked by f's implicit definition; f shall allow all exceptions if any
262 // function it directly invokes allows all exceptions, and f shall allow no
263 // exceptions if every function it directly invokes allows no exceptions.
264 //
265 // Note in particular that if an implicit exception-specification is generated
266 // for a function containing a throw-expression, that specification can still
267 // be noexcept(true).
268 //
269 // Note also that 'directly invoked' is not defined in the standard, and there
270 // is no indication that we should only consider potentially-evaluated calls.
271 //
272 // Ultimately we should implement the intent of the standard: the exception
273 // specification should be the set of exceptions which can be thrown by the
274 // implicit definition. For now, we assume that any non-nothrow expression can
275 // throw any exception.
276
277 if (Self->canThrow(S))
278 ComputedEST = EST_None;
279}
280
282 SourceLocation EqualLoc) {
283 if (RequireCompleteType(Param->getLocation(), Param->getType(),
284 diag::err_typecheck_decl_incomplete_type))
285 return true;
286
287 // C++ [dcl.fct.default]p5
288 // A default argument expression is implicitly converted (clause
289 // 4) to the parameter type. The default argument expression has
290 // the same semantic constraints as the initializer expression in
291 // a declaration of a variable of the parameter type, using the
292 // copy-initialization semantics (8.5).
294 Param);
295 InitializationKind Kind = InitializationKind::CreateCopy(Param->getLocation(),
296 EqualLoc);
297 InitializationSequence InitSeq(*this, Entity, Kind, Arg);
298 ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Arg);
299 if (Result.isInvalid())
300 return true;
301 Arg = Result.getAs<Expr>();
302
303 CheckCompletedExpr(Arg, EqualLoc);
305
306 return Arg;
307}
308
310 SourceLocation EqualLoc) {
311 // Add the default argument to the parameter
312 Param->setDefaultArg(Arg);
313
314 // We have already instantiated this parameter; provide each of the
315 // instantiations with the uninstantiated default argument.
316 UnparsedDefaultArgInstantiationsMap::iterator InstPos
318 if (InstPos != UnparsedDefaultArgInstantiations.end()) {
319 for (unsigned I = 0, N = InstPos->second.size(); I != N; ++I)
320 InstPos->second[I]->setUninstantiatedDefaultArg(Arg);
321
322 // We're done tracking this parameter's instantiations.
324 }
325}
326
327void
329 Expr *DefaultArg) {
330 if (!param || !DefaultArg)
331 return;
332
333 ParmVarDecl *Param = cast<ParmVarDecl>(param);
334 UnparsedDefaultArgLocs.erase(Param);
335
336 // Default arguments are only permitted in C++
337 if (!getLangOpts().CPlusPlus) {
338 Diag(EqualLoc, diag::err_param_default_argument)
339 << DefaultArg->getSourceRange();
340 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
341 }
342
343 // Check for unexpanded parameter packs.
345 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
346
347 // C++11 [dcl.fct.default]p3
348 // A default argument expression [...] shall not be specified for a
349 // parameter pack.
350 if (Param->isParameterPack()) {
351 Diag(EqualLoc, diag::err_param_default_argument_on_parameter_pack)
352 << DefaultArg->getSourceRange();
353 // Recover by discarding the default argument.
354 Param->setDefaultArg(nullptr);
355 return;
356 }
357
358 ExprResult Result = ConvertParamDefaultArgument(Param, DefaultArg, EqualLoc);
359 if (Result.isInvalid())
360 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
361
362 DefaultArg = Result.getAs<Expr>();
363
364 // Check that the default argument is well-formed
365 CheckDefaultArgumentVisitor DefaultArgChecker(*this, DefaultArg);
366 if (DefaultArgChecker.Visit(DefaultArg))
367 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
368
369 SetParamDefaultArgument(Param, DefaultArg, EqualLoc);
370}
371
373 SourceLocation EqualLoc,
374 SourceLocation ArgLoc) {
375 if (!param)
376 return;
377
378 ParmVarDecl *Param = cast<ParmVarDecl>(param);
379 Param->setUnparsedDefaultArg();
380 UnparsedDefaultArgLocs[Param] = ArgLoc;
381}
382
384 Expr *DefaultArg) {
385 if (!param)
386 return;
387
388 ParmVarDecl *Param = cast<ParmVarDecl>(param);
389 Param->setInvalidDecl();
390 UnparsedDefaultArgLocs.erase(Param);
391 ExprResult RE;
392 if (DefaultArg) {
393 RE = CreateRecoveryExpr(EqualLoc, DefaultArg->getEndLoc(), {DefaultArg},
394 Param->getType().getNonReferenceType());
395 } else {
396 RE = CreateRecoveryExpr(EqualLoc, EqualLoc, {},
397 Param->getType().getNonReferenceType());
398 }
399 Param->setDefaultArg(RE.get());
400}
401
403 // C++ [dcl.fct.default]p3
404 // A default argument expression shall be specified only in the
405 // parameter-declaration-clause of a function declaration or in a
406 // template-parameter (14.1). It shall not be specified for a
407 // parameter pack. If it is specified in a
408 // parameter-declaration-clause, it shall not occur within a
409 // declarator or abstract-declarator of a parameter-declaration.
410 bool MightBeFunction = D.isFunctionDeclarationContext();
411 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
412 DeclaratorChunk &chunk = D.getTypeObject(i);
413 if (chunk.Kind == DeclaratorChunk::Function) {
414 if (MightBeFunction) {
415 // This is a function declaration. It can have default arguments, but
416 // keep looking in case its return type is a function type with default
417 // arguments.
418 MightBeFunction = false;
419 continue;
420 }
421 for (unsigned argIdx = 0, e = chunk.Fun.NumParams; argIdx != e;
422 ++argIdx) {
423 ParmVarDecl *Param = cast<ParmVarDecl>(chunk.Fun.Params[argIdx].Param);
424 if (Param->hasUnparsedDefaultArg()) {
425 std::unique_ptr<CachedTokens> Toks =
426 std::move(chunk.Fun.Params[argIdx].DefaultArgTokens);
427 SourceRange SR;
428 if (Toks->size() > 1)
429 SR = SourceRange((*Toks)[1].getLocation(),
430 Toks->back().getLocation());
431 else
432 SR = UnparsedDefaultArgLocs[Param];
433 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
434 << SR;
435 } else if (Param->getDefaultArg()) {
436 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
437 << Param->getDefaultArg()->getSourceRange();
438 Param->setDefaultArg(nullptr);
439 }
440 }
441 } else if (chunk.Kind != DeclaratorChunk::Paren) {
442 MightBeFunction = false;
443 }
444 }
445}
446
448 return llvm::any_of(FD->parameters(), [](ParmVarDecl *P) {
449 return P->hasDefaultArg() && !P->hasInheritedDefaultArg();
450 });
451}
452
454 Scope *S) {
455 bool Invalid = false;
456
457 // The declaration context corresponding to the scope is the semantic
458 // parent, unless this is a local function declaration, in which case
459 // it is that surrounding function.
460 DeclContext *ScopeDC = New->isLocalExternDecl()
461 ? New->getLexicalDeclContext()
462 : New->getDeclContext();
463
464 // Find the previous declaration for the purpose of default arguments.
465 FunctionDecl *PrevForDefaultArgs = Old;
466 for (/**/; PrevForDefaultArgs;
467 // Don't bother looking back past the latest decl if this is a local
468 // extern declaration; nothing else could work.
469 PrevForDefaultArgs = New->isLocalExternDecl()
470 ? nullptr
471 : PrevForDefaultArgs->getPreviousDecl()) {
472 // Ignore hidden declarations.
473 if (!LookupResult::isVisible(*this, PrevForDefaultArgs))
474 continue;
475
476 if (S && !isDeclInScope(PrevForDefaultArgs, ScopeDC, S) &&
477 !New->isCXXClassMember()) {
478 // Ignore default arguments of old decl if they are not in
479 // the same scope and this is not an out-of-line definition of
480 // a member function.
481 continue;
482 }
483
484 if (PrevForDefaultArgs->isLocalExternDecl() != New->isLocalExternDecl()) {
485 // If only one of these is a local function declaration, then they are
486 // declared in different scopes, even though isDeclInScope may think
487 // they're in the same scope. (If both are local, the scope check is
488 // sufficient, and if neither is local, then they are in the same scope.)
489 continue;
490 }
491
492 // We found the right previous declaration.
493 break;
494 }
495
496 // C++ [dcl.fct.default]p4:
497 // For non-template functions, default arguments can be added in
498 // later declarations of a function in the same
499 // scope. Declarations in different scopes have completely
500 // distinct sets of default arguments. That is, declarations in
501 // inner scopes do not acquire default arguments from
502 // declarations in outer scopes, and vice versa. In a given
503 // function declaration, all parameters subsequent to a
504 // parameter with a default argument shall have default
505 // arguments supplied in this or previous declarations. A
506 // default argument shall not be redefined by a later
507 // declaration (not even to the same value).
508 //
509 // C++ [dcl.fct.default]p6:
510 // Except for member functions of class templates, the default arguments
511 // in a member function definition that appears outside of the class
512 // definition are added to the set of default arguments provided by the
513 // member function declaration in the class definition.
514 for (unsigned p = 0, NumParams = PrevForDefaultArgs
515 ? PrevForDefaultArgs->getNumParams()
516 : 0;
517 p < NumParams; ++p) {
518 ParmVarDecl *OldParam = PrevForDefaultArgs->getParamDecl(p);
519 ParmVarDecl *NewParam = New->getParamDecl(p);
520
521 bool OldParamHasDfl = OldParam ? OldParam->hasDefaultArg() : false;
522 bool NewParamHasDfl = NewParam->hasDefaultArg();
523
524 if (OldParamHasDfl && NewParamHasDfl) {
525 unsigned DiagDefaultParamID =
526 diag::err_param_default_argument_redefinition;
527
528 // MSVC accepts that default parameters be redefined for member functions
529 // of template class. The new default parameter's value is ignored.
530 Invalid = true;
531 if (getLangOpts().MicrosoftExt) {
532 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(New);
533 if (MD && MD->getParent()->getDescribedClassTemplate()) {
534 // Merge the old default argument into the new parameter.
535 NewParam->setHasInheritedDefaultArg();
536 if (OldParam->hasUninstantiatedDefaultArg())
538 OldParam->getUninstantiatedDefaultArg());
539 else
540 NewParam->setDefaultArg(OldParam->getInit());
541 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
542 Invalid = false;
543 }
544 }
545
546 // FIXME: If we knew where the '=' was, we could easily provide a fix-it
547 // hint here. Alternatively, we could walk the type-source information
548 // for NewParam to find the last source location in the type... but it
549 // isn't worth the effort right now. This is the kind of test case that
550 // is hard to get right:
551 // int f(int);
552 // void g(int (*fp)(int) = f);
553 // void g(int (*fp)(int) = &f);
554 Diag(NewParam->getLocation(), DiagDefaultParamID)
555 << NewParam->getDefaultArgRange();
556
557 // Look for the function declaration where the default argument was
558 // actually written, which may be a declaration prior to Old.
559 for (auto Older = PrevForDefaultArgs;
560 OldParam->hasInheritedDefaultArg(); /**/) {
561 Older = Older->getPreviousDecl();
562 OldParam = Older->getParamDecl(p);
563 }
564
565 Diag(OldParam->getLocation(), diag::note_previous_definition)
566 << OldParam->getDefaultArgRange();
567 } else if (OldParamHasDfl) {
568 // Merge the old default argument into the new parameter unless the new
569 // function is a friend declaration in a template class. In the latter
570 // case the default arguments will be inherited when the friend
571 // declaration will be instantiated.
572 if (New->getFriendObjectKind() == Decl::FOK_None ||
573 !New->getLexicalDeclContext()->isDependentContext()) {
574 // It's important to use getInit() here; getDefaultArg()
575 // strips off any top-level ExprWithCleanups.
576 NewParam->setHasInheritedDefaultArg();
577 if (OldParam->hasUnparsedDefaultArg())
578 NewParam->setUnparsedDefaultArg();
579 else if (OldParam->hasUninstantiatedDefaultArg())
581 OldParam->getUninstantiatedDefaultArg());
582 else
583 NewParam->setDefaultArg(OldParam->getInit());
584 }
585 } else if (NewParamHasDfl) {
586 if (New->getDescribedFunctionTemplate()) {
587 // Paragraph 4, quoted above, only applies to non-template functions.
588 Diag(NewParam->getLocation(),
589 diag::err_param_default_argument_template_redecl)
590 << NewParam->getDefaultArgRange();
591 Diag(PrevForDefaultArgs->getLocation(),
592 diag::note_template_prev_declaration)
593 << false;
594 } else if (New->getTemplateSpecializationKind()
596 New->getTemplateSpecializationKind() != TSK_Undeclared) {
597 // C++ [temp.expr.spec]p21:
598 // Default function arguments shall not be specified in a declaration
599 // or a definition for one of the following explicit specializations:
600 // - the explicit specialization of a function template;
601 // - the explicit specialization of a member function template;
602 // - the explicit specialization of a member function of a class
603 // template where the class template specialization to which the
604 // member function specialization belongs is implicitly
605 // instantiated.
606 Diag(NewParam->getLocation(), diag::err_template_spec_default_arg)
607 << (New->getTemplateSpecializationKind() ==TSK_ExplicitSpecialization)
608 << New->getDeclName()
609 << NewParam->getDefaultArgRange();
610 } else if (New->getDeclContext()->isDependentContext()) {
611 // C++ [dcl.fct.default]p6 (DR217):
612 // Default arguments for a member function of a class template shall
613 // be specified on the initial declaration of the member function
614 // within the class template.
615 //
616 // Reading the tea leaves a bit in DR217 and its reference to DR205
617 // leads me to the conclusion that one cannot add default function
618 // arguments for an out-of-line definition of a member function of a
619 // dependent type.
620 int WhichKind = 2;
622 = dyn_cast<CXXRecordDecl>(New->getDeclContext())) {
623 if (Record->getDescribedClassTemplate())
624 WhichKind = 0;
626 WhichKind = 1;
627 else
628 WhichKind = 2;
629 }
630
631 Diag(NewParam->getLocation(),
632 diag::err_param_default_argument_member_template_redecl)
633 << WhichKind
634 << NewParam->getDefaultArgRange();
635 }
636 }
637 }
638
639 // DR1344: If a default argument is added outside a class definition and that
640 // default argument makes the function a special member function, the program
641 // is ill-formed. This can only happen for constructors.
643 New->getMinRequiredArguments() < Old->getMinRequiredArguments()) {
646 if (NewSM != OldSM) {
647 ParmVarDecl *NewParam = New->getParamDecl(New->getMinRequiredArguments());
648 assert(NewParam->hasDefaultArg());
649 Diag(NewParam->getLocation(), diag::err_default_arg_makes_ctor_special)
650 << NewParam->getDefaultArgRange() << NewSM;
651 Diag(Old->getLocation(), diag::note_previous_declaration);
652 }
653 }
654
655 const FunctionDecl *Def;
656 // C++11 [dcl.constexpr]p1: If any declaration of a function or function
657 // template has a constexpr specifier then all its declarations shall
658 // contain the constexpr specifier.
659 if (New->getConstexprKind() != Old->getConstexprKind()) {
660 Diag(New->getLocation(), diag::err_constexpr_redecl_mismatch)
661 << New << static_cast<int>(New->getConstexprKind())
662 << static_cast<int>(Old->getConstexprKind());
663 Diag(Old->getLocation(), diag::note_previous_declaration);
664 Invalid = true;
665 } else if (!Old->getMostRecentDecl()->isInlined() && New->isInlined() &&
666 Old->isDefined(Def) &&
667 // If a friend function is inlined but does not have 'inline'
668 // specifier, it is a definition. Do not report attribute conflict
669 // in this case, redefinition will be diagnosed later.
670 (New->isInlineSpecified() ||
671 New->getFriendObjectKind() == Decl::FOK_None)) {
672 // C++11 [dcl.fcn.spec]p4:
673 // If the definition of a function appears in a translation unit before its
674 // first declaration as inline, the program is ill-formed.
675 Diag(New->getLocation(), diag::err_inline_decl_follows_def) << New;
676 Diag(Def->getLocation(), diag::note_previous_definition);
677 Invalid = true;
678 }
679
680 // C++17 [temp.deduct.guide]p3:
681 // Two deduction guide declarations in the same translation unit
682 // for the same class template shall not have equivalent
683 // parameter-declaration-clauses.
685 !New->isFunctionTemplateSpecialization() && isVisible(Old)) {
686 Diag(New->getLocation(), diag::err_deduction_guide_redeclared);
687 Diag(Old->getLocation(), diag::note_previous_declaration);
688 }
689
690 // C++11 [dcl.fct.default]p4: If a friend declaration specifies a default
691 // argument expression, that declaration shall be a definition and shall be
692 // the only declaration of the function or function template in the
693 // translation unit.
696 Diag(New->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
697 Diag(Old->getLocation(), diag::note_previous_declaration);
698 Invalid = true;
699 }
700
701 // C++11 [temp.friend]p4 (DR329):
702 // When a function is defined in a friend function declaration in a class
703 // template, the function is instantiated when the function is odr-used.
704 // The same restrictions on multiple declarations and definitions that
705 // apply to non-template function declarations and definitions also apply
706 // to these implicit definitions.
707 const FunctionDecl *OldDefinition = nullptr;
708 if (New->isThisDeclarationInstantiatedFromAFriendDefinition() &&
709 Old->isDefined(OldDefinition, true))
710 CheckForFunctionRedefinition(New, OldDefinition);
711
712 return Invalid;
713}
714
717 ? diag::warn_cxx23_placeholder_var_definition
718 : diag::ext_placeholder_var_definition);
719}
720
721NamedDecl *
723 MultiTemplateParamsArg TemplateParamLists) {
724 assert(D.isDecompositionDeclarator());
726
727 // The syntax only allows a decomposition declarator as a simple-declaration,
728 // a for-range-declaration, or a condition in Clang, but we parse it in more
729 // cases than that.
731 Diag(Decomp.getLSquareLoc(), diag::err_decomp_decl_context)
732 << Decomp.getSourceRange();
733 return nullptr;
734 }
735
736 if (!TemplateParamLists.empty()) {
737 // C++17 [temp]/1:
738 // A template defines a family of class, functions, or variables, or an
739 // alias for a family of types.
740 //
741 // Structured bindings are not included.
742 Diag(TemplateParamLists.front()->getTemplateLoc(),
743 diag::err_decomp_decl_template);
744 return nullptr;
745 }
746
747 unsigned DiagID;
749 DiagID = diag::compat_pre_cxx17_decomp_decl;
751 DiagID = getLangOpts().CPlusPlus26
752 ? diag::compat_cxx26_decomp_decl_cond
753 : diag::compat_pre_cxx26_decomp_decl_cond;
754 else
755 DiagID = diag::compat_cxx17_decomp_decl;
756
757 Diag(Decomp.getLSquareLoc(), DiagID) << Decomp.getSourceRange();
758
759 // The semantic context is always just the current context.
760 DeclContext *const DC = CurContext;
761
762 // C++17 [dcl.dcl]/8:
763 // The decl-specifier-seq shall contain only the type-specifier auto
764 // and cv-qualifiers.
765 // C++20 [dcl.dcl]/8:
766 // If decl-specifier-seq contains any decl-specifier other than static,
767 // thread_local, auto, or cv-qualifiers, the program is ill-formed.
768 // C++23 [dcl.pre]/6:
769 // Each decl-specifier in the decl-specifier-seq shall be static,
770 // thread_local, auto (9.2.9.6 [dcl.spec.auto]), or a cv-qualifier.
771 // C++23 [dcl.pre]/7:
772 // Each decl-specifier in the decl-specifier-seq shall be constexpr,
773 // constinit, static, thread_local, auto, or a cv-qualifier
774 auto &DS = D.getDeclSpec();
775 auto DiagBadSpecifier = [&](StringRef Name, SourceLocation Loc) {
776 Diag(Loc, diag::err_decomp_decl_spec) << Name;
777 };
778
779 auto DiagCpp20Specifier = [&](StringRef Name, SourceLocation Loc) {
780 DiagCompat(Loc, diag_compat::decomp_decl_spec) << Name;
781 };
782
783 if (auto SCS = DS.getStorageClassSpec()) {
784 if (SCS == DeclSpec::SCS_static)
785 DiagCpp20Specifier(DeclSpec::getSpecifierName(SCS),
786 DS.getStorageClassSpecLoc());
787 else
788 DiagBadSpecifier(DeclSpec::getSpecifierName(SCS),
789 DS.getStorageClassSpecLoc());
790 }
791 if (auto TSCS = DS.getThreadStorageClassSpec())
792 DiagCpp20Specifier(DeclSpec::getSpecifierName(TSCS),
793 DS.getThreadStorageClassSpecLoc());
794
795 if (DS.isInlineSpecified())
796 DiagBadSpecifier("inline", DS.getInlineSpecLoc());
797
798 if (ConstexprSpecKind ConstexprSpec = DS.getConstexprSpecifier();
799 ConstexprSpec != ConstexprSpecKind::Unspecified) {
800 if (ConstexprSpec == ConstexprSpecKind::Consteval ||
802 DiagBadSpecifier(DeclSpec::getSpecifierName(ConstexprSpec),
803 DS.getConstexprSpecLoc());
804 }
805
806 // We can't recover from it being declared as a typedef.
807 if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef)
808 return nullptr;
809
810 // C++2a [dcl.struct.bind]p1:
811 // A cv that includes volatile is deprecated
812 if ((DS.getTypeQualifiers() & DeclSpec::TQ_volatile) &&
814 Diag(DS.getVolatileSpecLoc(),
815 diag::warn_deprecated_volatile_structured_binding);
816
818 QualType R = TInfo->getType();
819
822 D.setInvalidType();
823
824 // The syntax only allows a single ref-qualifier prior to the decomposition
825 // declarator. No other declarator chunks are permitted. Also check the type
826 // specifier here.
827 if (DS.getTypeSpecType() != DeclSpec::TST_auto ||
828 D.hasGroupingParens() || D.getNumTypeObjects() > 1 ||
829 (D.getNumTypeObjects() == 1 &&
831 Diag(Decomp.getLSquareLoc(),
832 (D.hasGroupingParens() ||
833 (D.getNumTypeObjects() &&
835 ? diag::err_decomp_decl_parens
836 : diag::err_decomp_decl_type)
837 << R;
838
839 // In most cases, there's no actual problem with an explicitly-specified
840 // type, but a function type won't work here, and ActOnVariableDeclarator
841 // shouldn't be called for such a type.
842 if (R->isFunctionType())
843 D.setInvalidType();
844 }
845
846 // Constrained auto is prohibited by [decl.pre]p6, so check that here.
847 if (DS.isConstrainedAuto()) {
848 TemplateIdAnnotation *TemplRep = DS.getRepAsTemplateId();
849 assert(TemplRep->Kind == TNK_Concept_template &&
850 "No other template kind should be possible for a constrained auto");
851
852 SourceRange TemplRange{TemplRep->TemplateNameLoc,
853 TemplRep->RAngleLoc.isValid()
854 ? TemplRep->RAngleLoc
855 : TemplRep->TemplateNameLoc};
856 Diag(TemplRep->TemplateNameLoc, diag::err_decomp_decl_constraint)
857 << TemplRange << FixItHint::CreateRemoval(TemplRange);
858 }
859
860 // Build the BindingDecls.
862
863 // Build the BindingDecls.
864 for (auto &B : D.getDecompositionDeclarator().bindings()) {
865 // Check for name conflicts.
866 DeclarationNameInfo NameInfo(B.Name, B.NameLoc);
867 IdentifierInfo *VarName = B.Name;
868 assert(VarName && "Cannot have an unnamed binding declaration");
869
873 /*CreateBuiltins*/DC->getRedeclContext()->isTranslationUnit());
874
875 // It's not permitted to shadow a template parameter name.
876 if (Previous.isSingleResult() &&
877 Previous.getFoundDecl()->isTemplateParameter()) {
878 DiagnoseTemplateParameterShadow(B.NameLoc, Previous.getFoundDecl());
879 Previous.clear();
880 }
881
882 QualType QT;
883 if (B.EllipsisLoc.isValid()) {
884 if (!cast<Decl>(DC)->isTemplated())
885 Diag(B.EllipsisLoc, diag::err_pack_outside_template);
886 QT = Context.getPackExpansionType(Context.DependentTy, std::nullopt,
887 /*ExpectsPackInType=*/false);
888 }
889
890 auto *BD = BindingDecl::Create(Context, DC, B.NameLoc, B.Name, QT);
891
892 ProcessDeclAttributeList(S, BD, *B.Attrs);
893
894 // Find the shadowed declaration before filtering for scope.
895 NamedDecl *ShadowedDecl = D.getCXXScopeSpec().isEmpty()
897 : nullptr;
898
899 bool ConsiderLinkage = DC->isFunctionOrMethod() &&
900 DS.getStorageClassSpec() == DeclSpec::SCS_extern;
901 FilterLookupForScope(Previous, DC, S, ConsiderLinkage,
902 /*AllowInlineNamespace*/false);
903
904 bool IsPlaceholder = DS.getStorageClassSpec() != DeclSpec::SCS_static &&
905 DC->isFunctionOrMethod() && VarName->isPlaceholder();
906 if (!Previous.empty()) {
907 if (IsPlaceholder) {
908 bool sameDC = (Previous.end() - 1)
909 ->getDeclContext()
910 ->getRedeclContext()
911 ->Equals(DC->getRedeclContext());
912 if (sameDC &&
913 isDeclInScope(*(Previous.end() - 1), CurContext, S, false)) {
914 Previous.clear();
916 }
917 } else {
918 auto *Old = Previous.getRepresentativeDecl();
919 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
920 Diag(Old->getLocation(), diag::note_previous_definition);
921 }
922 } else if (ShadowedDecl && !D.isRedeclaration()) {
923 CheckShadow(BD, ShadowedDecl, Previous);
924 }
925 PushOnScopeChains(BD, S, true);
926 Bindings.push_back(BD);
927 ParsingInitForAutoVars.insert(BD);
928 }
929
930 // There are no prior lookup results for the variable itself, because it
931 // is unnamed.
932 DeclarationNameInfo NameInfo((IdentifierInfo *)nullptr,
933 Decomp.getLSquareLoc());
936
937 // Build the variable that holds the non-decomposed object.
938 bool AddToScope = true;
939 NamedDecl *New =
940 ActOnVariableDeclarator(S, D, DC, TInfo, Previous,
941 MultiTemplateParamsArg(), AddToScope, Bindings);
942 if (AddToScope) {
943 S->AddDecl(New);
944 CurContext->addHiddenDecl(New);
945 }
946
947 if (OpenMP().isInOpenMPDeclareTargetContext())
948 OpenMP().checkDeclIsAllowedInOpenMPTarget(nullptr, New);
949
950 return New;
951}
952
953// Check the arity of the structured bindings.
954// Create the resolved pack expr if needed.
956 QualType DecompType,
958 unsigned MemberCount) {
959 auto BindingWithPackItr = llvm::find_if(
960 Bindings, [](BindingDecl *D) -> bool { return D->isParameterPack(); });
961 bool HasPack = BindingWithPackItr != Bindings.end();
962 bool IsValid;
963 if (!HasPack) {
964 IsValid = Bindings.size() == MemberCount;
965 } else {
966 // There may not be more members than non-pack bindings.
967 IsValid = MemberCount >= Bindings.size() - 1;
968 }
969
970 if (IsValid && HasPack) {
971 // Create the pack expr and assign it to the binding.
972 unsigned PackSize = MemberCount - Bindings.size() + 1;
973
974 BindingDecl *BPack = *BindingWithPackItr;
975 BPack->setDecomposedDecl(DD);
976 SmallVector<ValueDecl *, 8> NestedBDs(PackSize);
977 // Create the nested BindingDecls.
978 for (unsigned I = 0; I < PackSize; ++I) {
980 S.Context, BPack->getDeclContext(), BPack->getLocation(),
981 BPack->getIdentifier(), QualType());
982 NestedBD->setDecomposedDecl(DD);
983 NestedBDs[I] = NestedBD;
984 }
985
987 S.Context.DependentTy, PackSize, /*ExpectsPackInType=*/false);
988 auto *PackExpr = FunctionParmPackExpr::Create(
989 S.Context, PackType, BPack, BPack->getBeginLoc(), NestedBDs);
990 BPack->setBinding(PackType, PackExpr);
991 }
992
993 if (IsValid)
994 return false;
995
996 S.Diag(DD->getLocation(), diag::err_decomp_decl_wrong_number_bindings)
997 << DecompType << (unsigned)Bindings.size() << MemberCount << MemberCount
998 << (MemberCount < Bindings.size());
999 return true;
1000}
1001
1004 QualType DecompType, const llvm::APSInt &NumElemsAPS, QualType ElemType,
1005 llvm::function_ref<ExprResult(SourceLocation, Expr *, unsigned)> GetInit) {
1006 unsigned NumElems = (unsigned)NumElemsAPS.getLimitedValue(UINT_MAX);
1007 auto *DD = cast<DecompositionDecl>(Src);
1008
1009 if (CheckBindingsCount(S, DD, DecompType, Bindings, NumElems))
1010 return true;
1011
1012 unsigned I = 0;
1013 for (auto *B : DD->flat_bindings()) {
1014 SourceLocation Loc = B->getLocation();
1015 ExprResult E = S.BuildDeclRefExpr(Src, DecompType, VK_LValue, Loc);
1016 if (E.isInvalid())
1017 return true;
1018 E = GetInit(Loc, E.get(), I++);
1019 if (E.isInvalid())
1020 return true;
1021 B->setBinding(ElemType, E.get());
1022 }
1023
1024 return false;
1025}
1026
1029 ValueDecl *Src, QualType DecompType,
1030 const llvm::APSInt &NumElems,
1031 QualType ElemType) {
1033 S, Bindings, Src, DecompType, NumElems, ElemType,
1034 [&](SourceLocation Loc, Expr *Base, unsigned I) -> ExprResult {
1035 ExprResult E = S.ActOnIntegerConstant(Loc, I);
1036 if (E.isInvalid())
1037 return ExprError();
1038 return S.CreateBuiltinArraySubscriptExpr(Base, Loc, E.get(), Loc);
1039 });
1040}
1041
1043 ValueDecl *Src, QualType DecompType,
1044 const ConstantArrayType *CAT) {
1045 return checkArrayLikeDecomposition(S, Bindings, Src, DecompType,
1046 llvm::APSInt(CAT->getSize()),
1047 CAT->getElementType());
1048}
1049
1051 ValueDecl *Src, QualType DecompType,
1052 const VectorType *VT) {
1054 S, Bindings, Src, DecompType, llvm::APSInt::get(VT->getNumElements()),
1056 DecompType.getQualifiers()));
1057}
1058
1061 ValueDecl *Src, QualType DecompType,
1062 const ComplexType *CT) {
1064 S, Bindings, Src, DecompType, llvm::APSInt::get(2),
1066 DecompType.getQualifiers()),
1067 [&](SourceLocation Loc, Expr *Base, unsigned I) -> ExprResult {
1068 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1069 });
1070}
1071
1074 const TemplateParameterList *Params) {
1076 llvm::raw_svector_ostream OS(SS);
1077 bool First = true;
1078 unsigned I = 0;
1079 for (auto &Arg : Args.arguments()) {
1080 if (!First)
1081 OS << ", ";
1082 Arg.getArgument().print(PrintingPolicy, OS,
1084 PrintingPolicy, Params, I));
1085 First = false;
1086 I++;
1087 }
1088 return std::string(OS.str());
1089}
1090
1091static QualType getStdTrait(Sema &S, SourceLocation Loc, StringRef Trait,
1092 TemplateArgumentListInfo &Args, unsigned DiagID) {
1093 auto DiagnoseMissing = [&] {
1094 if (DiagID)
1095 S.Diag(Loc, DiagID) << printTemplateArgs(S.Context.getPrintingPolicy(),
1096 Args, /*Params*/ nullptr);
1097 return QualType();
1098 };
1099
1100 // FIXME: Factor out duplication with lookupPromiseType in SemaCoroutine.
1101 NamespaceDecl *Std = S.getStdNamespace();
1102 if (!Std)
1103 return DiagnoseMissing();
1104
1105 // Look up the trait itself, within namespace std. We can diagnose various
1106 // problems with this lookup even if we've been asked to not diagnose a
1107 // missing specialization, because this can only fail if the user has been
1108 // declaring their own names in namespace std or we don't support the
1109 // standard library implementation in use.
1110 LookupResult Result(S, &S.PP.getIdentifierTable().get(Trait), Loc,
1112 if (!S.LookupQualifiedName(Result, Std))
1113 return DiagnoseMissing();
1114 if (Result.isAmbiguous())
1115 return QualType();
1116
1117 ClassTemplateDecl *TraitTD = Result.getAsSingle<ClassTemplateDecl>();
1118 if (!TraitTD) {
1119 Result.suppressDiagnostics();
1120 NamedDecl *Found = *Result.begin();
1121 S.Diag(Loc, diag::err_std_type_trait_not_class_template) << Trait;
1122 S.Diag(Found->getLocation(), diag::note_declared_at);
1123 return QualType();
1124 }
1125
1126 // Build the template-id.
1127 QualType TraitTy = S.CheckTemplateIdType(
1128 ElaboratedTypeKeyword::None, TemplateName(TraitTD), Loc, Args,
1129 /*Scope=*/nullptr, /*ForNestedNameSpecifier=*/false);
1130 if (TraitTy.isNull())
1131 return QualType();
1132
1133 if (!S.isCompleteType(Loc, TraitTy)) {
1134 if (DiagID)
1136 Loc, TraitTy, DiagID,
1138 TraitTD->getTemplateParameters()));
1139 return QualType();
1140 }
1141 return TraitTy;
1142}
1143
1144static bool lookupMember(Sema &S, CXXRecordDecl *RD,
1145 LookupResult &MemberLookup) {
1146 assert(RD && "specialization of class template is not a class?");
1147 S.LookupQualifiedName(MemberLookup, RD);
1148 return MemberLookup.isAmbiguous();
1149}
1150
1151static TemplateArgumentLoc
1153 uint64_t I) {
1155 return S.getTrivialTemplateArgumentLoc(Arg, T, Loc);
1156}
1157
1158static TemplateArgumentLoc
1162
1163namespace { enum class IsTupleLike { TupleLike, NotTupleLike, Error }; }
1164
1165static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T,
1166 unsigned &OutSize) {
1169
1170 // Form template argument list for tuple_size<T>.
1171 TemplateArgumentListInfo Args(Loc, Loc);
1173
1174 QualType TraitTy = getStdTrait(S, Loc, "tuple_size", Args, /*DiagID=*/0);
1175 if (TraitTy.isNull())
1176 return IsTupleLike::NotTupleLike;
1177
1180
1181 // If there's no tuple_size specialization or the lookup of 'value' is empty,
1182 // it's not tuple-like.
1183 if (lookupMember(S, TraitTy->getAsCXXRecordDecl(), R) || R.empty())
1184 return IsTupleLike::NotTupleLike;
1185
1186 // If we get this far, we've committed to the tuple interpretation, but
1187 // we can still fail if there actually isn't a usable ::value.
1188
1189 struct ICEDiagnoser : Sema::VerifyICEDiagnoser {
1190 LookupResult &R;
1192 ICEDiagnoser(LookupResult &R, TemplateArgumentListInfo &Args)
1193 : R(R), Args(Args) {}
1194 Sema::SemaDiagnosticBuilder diagnoseNotICE(Sema &S,
1195 SourceLocation Loc) override {
1196 return S.Diag(Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1198 /*Params*/ nullptr);
1199 }
1200 } Diagnoser(R, Args);
1201
1202 ExprResult E =
1203 S.BuildDeclarationNameExpr(CXXScopeSpec(), R, /*NeedsADL*/false);
1204 if (E.isInvalid())
1205 return IsTupleLike::Error;
1206
1207 llvm::APSInt Size;
1208 E = S.VerifyIntegerConstantExpression(E.get(), &Size, Diagnoser);
1209 if (E.isInvalid())
1210 return IsTupleLike::Error;
1211
1212 // The implementation limit is UINT_MAX-1, to allow this to be passed down on
1213 // an UnsignedOrNone.
1214 if (Size < 0 || Size >= UINT_MAX) {
1216 Size.toString(Str);
1217 S.Diag(Loc, diag::err_decomp_decl_std_tuple_size_invalid)
1219 /*Params=*/nullptr)
1220 << StringRef(Str.data(), Str.size());
1221 return IsTupleLike::Error;
1222 }
1223
1224 OutSize = Size.getExtValue();
1225 return IsTupleLike::TupleLike;
1226}
1227
1228/// \return std::tuple_element<I, T>::type.
1230 unsigned I, QualType T) {
1231 // Form template argument list for tuple_element<I, T>.
1232 TemplateArgumentListInfo Args(Loc, Loc);
1233 Args.addArgument(
1236
1237 QualType TraitTy =
1238 getStdTrait(S, Loc, "tuple_element", Args,
1239 diag::err_decomp_decl_std_tuple_element_not_specialized);
1240 if (TraitTy.isNull())
1241 return QualType();
1242
1243 DeclarationName TypeDN = S.PP.getIdentifierInfo("type");
1244 LookupResult R(S, TypeDN, Loc, Sema::LookupOrdinaryName);
1245 if (lookupMember(S, TraitTy->getAsCXXRecordDecl(), R))
1246 return QualType();
1247
1248 auto *TD = R.getAsSingle<TypeDecl>();
1249 if (!TD) {
1251 S.Diag(Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1253 /*Params*/ nullptr);
1254 if (!R.empty())
1255 S.Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);
1256 return QualType();
1257 }
1258
1259 NestedNameSpecifier Qualifier(TraitTy.getTypePtr());
1260 return S.Context.getTypeDeclType(ElaboratedTypeKeyword::None, Qualifier, TD);
1261}
1262
1263namespace {
1264struct InitializingBinding {
1265 Sema &S;
1266 InitializingBinding(Sema &S, BindingDecl *BD) : S(S) {
1267 Sema::CodeSynthesisContext Ctx;
1270 Ctx.Entity = BD;
1272 }
1273 ~InitializingBinding() {
1275 }
1276};
1277}
1278
1281 VarDecl *Src, QualType DecompType,
1282 unsigned NumElems) {
1283 auto *DD = cast<DecompositionDecl>(Src);
1284 if (CheckBindingsCount(S, DD, DecompType, Bindings, NumElems))
1285 return true;
1286
1287 if (Bindings.empty())
1288 return false;
1289
1290 DeclarationName GetDN = S.PP.getIdentifierInfo("get");
1291
1292 // [dcl.decomp]p3:
1293 // The unqualified-id get is looked up in the scope of E by class member
1294 // access lookup ...
1295 LookupResult MemberGet(S, GetDN, Src->getLocation(), Sema::LookupMemberName);
1296 bool UseMemberGet = false;
1297 if (S.isCompleteType(Src->getLocation(), DecompType)) {
1298 if (auto *RD = DecompType->getAsCXXRecordDecl())
1299 S.LookupQualifiedName(MemberGet, RD);
1300 if (MemberGet.isAmbiguous())
1301 return true;
1302 // ... and if that finds at least one declaration that is a function
1303 // template whose first template parameter is a non-type parameter ...
1304 for (NamedDecl *D : MemberGet) {
1305 if (FunctionTemplateDecl *FTD =
1306 dyn_cast<FunctionTemplateDecl>(D->getUnderlyingDecl())) {
1307 TemplateParameterList *TPL = FTD->getTemplateParameters();
1308 if (TPL->size() != 0 &&
1310 // ... the initializer is e.get<i>().
1311 UseMemberGet = true;
1312 break;
1313 }
1314 }
1315 }
1316 }
1317
1318 unsigned I = 0;
1319 for (auto *B : DD->flat_bindings()) {
1320 InitializingBinding InitContext(S, B);
1321 SourceLocation Loc = B->getLocation();
1322
1323 ExprResult E = S.BuildDeclRefExpr(Src, DecompType, VK_LValue, Loc);
1324 if (E.isInvalid())
1325 return true;
1326
1327 // e is an lvalue if the type of the entity is an lvalue reference and
1328 // an xvalue otherwise
1329 if (!Src->getType()->isLValueReferenceType())
1330 E = ImplicitCastExpr::Create(S.Context, E.get()->getType(), CK_NoOp,
1331 E.get(), nullptr, VK_XValue,
1333
1334 TemplateArgumentListInfo Args(Loc, Loc);
1335 Args.addArgument(
1337
1338 if (UseMemberGet) {
1339 // if [lookup of member get] finds at least one declaration, the
1340 // initializer is e.get<i-1>().
1341 E = S.BuildMemberReferenceExpr(E.get(), DecompType, Loc, false,
1342 CXXScopeSpec(), SourceLocation(), nullptr,
1343 MemberGet, &Args, nullptr);
1344 if (E.isInvalid())
1345 return true;
1346
1347 E = S.BuildCallExpr(nullptr, E.get(), Loc, {}, Loc);
1348 } else {
1349 // Otherwise, the initializer is get<i-1>(e), where get is looked up
1350 // in the associated namespaces.
1353 DeclarationNameInfo(GetDN, Loc), /*RequiresADL=*/true, &Args,
1355 /*KnownDependent=*/false, /*KnownInstantiationDependent=*/false);
1356
1357 Expr *Arg = E.get();
1358 E = S.BuildCallExpr(nullptr, Get, Loc, Arg, Loc);
1359 }
1360 if (E.isInvalid())
1361 return true;
1362 Expr *Init = E.get();
1363
1364 // Given the type T designated by std::tuple_element<i - 1, E>::type,
1365 QualType T = getTupleLikeElementType(S, Loc, I, DecompType);
1366 if (T.isNull())
1367 return true;
1368
1369 // each vi is a variable of type "reference to T" initialized with the
1370 // initializer, where the reference is an lvalue reference if the
1371 // initializer is an lvalue and an rvalue reference otherwise
1372 QualType RefType =
1373 S.BuildReferenceType(T, E.get()->isLValue(), Loc, B->getDeclName());
1374 if (RefType.isNull())
1375 return true;
1376
1377 // Don't give this VarDecl a TypeSourceInfo, since this is a synthesized
1378 // entity and this type was never written in source code.
1379 auto *RefVD =
1380 VarDecl::Create(S.Context, Src->getDeclContext(), Loc, Loc,
1381 B->getDeclName().getAsIdentifierInfo(), RefType,
1382 /*TInfo=*/nullptr, Src->getStorageClass());
1383 RefVD->setLexicalDeclContext(Src->getLexicalDeclContext());
1384 RefVD->setTSCSpec(Src->getTSCSpec());
1385 RefVD->setImplicit();
1386 if (Src->isInlineSpecified())
1387 RefVD->setInlineSpecified();
1388 RefVD->getLexicalDeclContext()->addHiddenDecl(RefVD);
1389
1392 InitializationSequence Seq(S, Entity, Kind, Init);
1393 E = Seq.Perform(S, Entity, Kind, Init);
1394 if (E.isInvalid())
1395 return true;
1396 E = S.ActOnFinishFullExpr(E.get(), Loc, /*DiscardedValue*/ false);
1397 if (E.isInvalid())
1398 return true;
1399 RefVD->setInit(E.get());
1401
1403 DeclarationNameInfo(B->getDeclName(), Loc),
1404 RefVD);
1405 if (E.isInvalid())
1406 return true;
1407
1408 B->setBinding(T, E.get());
1409 I++;
1410 }
1411
1412 return false;
1413}
1414
1415/// Find the base class to decompose in a built-in decomposition of a class type.
1416/// This base class search is, unfortunately, not quite like any other that we
1417/// perform anywhere else in C++.
1419 const CXXRecordDecl *RD,
1420 CXXCastPath &BasePath) {
1421 auto BaseHasFields = [](const CXXBaseSpecifier *Specifier,
1422 CXXBasePath &Path) {
1423 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1424 };
1425
1426 const CXXRecordDecl *ClassWithFields = nullptr;
1428 if (RD->hasDirectFields())
1429 // [dcl.decomp]p4:
1430 // Otherwise, all of E's non-static data members shall be public direct
1431 // members of E ...
1432 ClassWithFields = RD;
1433 else {
1434 // ... or of ...
1435 CXXBasePaths Paths;
1436 Paths.setOrigin(const_cast<CXXRecordDecl*>(RD));
1437 if (!RD->lookupInBases(BaseHasFields, Paths)) {
1438 // If no classes have fields, just decompose RD itself. (This will work
1439 // if and only if zero bindings were provided.)
1440 return DeclAccessPair::make(const_cast<CXXRecordDecl*>(RD), AS_public);
1441 }
1442
1443 CXXBasePath *BestPath = nullptr;
1444 for (auto &P : Paths) {
1445 if (!BestPath)
1446 BestPath = &P;
1447 else if (!S.Context.hasSameType(P.back().Base->getType(),
1448 BestPath->back().Base->getType())) {
1449 // ... the same ...
1450 S.Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1451 << false << RD << BestPath->back().Base->getType()
1452 << P.back().Base->getType();
1453 return DeclAccessPair();
1454 } else if (P.Access < BestPath->Access) {
1455 BestPath = &P;
1456 }
1457 }
1458
1459 // ... unambiguous ...
1460 QualType BaseType = BestPath->back().Base->getType();
1461 if (Paths.isAmbiguous(S.Context.getCanonicalType(BaseType))) {
1462 S.Diag(Loc, diag::err_decomp_decl_ambiguous_base)
1463 << RD << BaseType << S.getAmbiguousPathsDisplayString(Paths);
1464 return DeclAccessPair();
1465 }
1466
1467 // ... [accessible, implied by other rules] base class of E.
1468 S.CheckBaseClassAccess(Loc, BaseType, S.Context.getCanonicalTagType(RD),
1469 *BestPath, diag::err_decomp_decl_inaccessible_base);
1470 AS = BestPath->Access;
1471
1472 ClassWithFields = BaseType->getAsCXXRecordDecl();
1473 S.BuildBasePathArray(Paths, BasePath);
1474 }
1475
1476 // The above search did not check whether the selected class itself has base
1477 // classes with fields, so check that now.
1478 CXXBasePaths Paths;
1479 if (ClassWithFields->lookupInBases(BaseHasFields, Paths)) {
1480 S.Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1481 << (ClassWithFields == RD) << RD << ClassWithFields
1482 << Paths.front().back().Base->getType();
1483 return DeclAccessPair();
1484 }
1485
1486 return DeclAccessPair::make(const_cast<CXXRecordDecl*>(ClassWithFields), AS);
1487}
1488
1490 const CXXRecordDecl *OrigRD,
1491 QualType DecompType,
1492 DeclAccessPair BasePair) {
1493 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.getDecl());
1494 if (!RD)
1495 return true;
1496
1497 for (auto *FD : RD->fields()) {
1498 if (FD->isUnnamedBitField())
1499 continue;
1500
1501 // All the non-static data members are required to be nameable, so they
1502 // must all have names.
1503 if (!FD->getDeclName()) {
1504 if (RD->isLambda()) {
1505 S.Diag(Loc, diag::err_decomp_decl_lambda);
1506 S.Diag(RD->getLocation(), diag::note_lambda_decl);
1507 return true;
1508 }
1509
1510 if (FD->isAnonymousStructOrUnion()) {
1511 S.Diag(Loc, diag::err_decomp_decl_anon_union_member)
1512 << DecompType << FD->getType()->isUnionType();
1513 S.Diag(FD->getLocation(), diag::note_declared_at);
1514 return true;
1515 }
1516
1517 // FIXME: Are there any other ways we could have an anonymous member?
1518 }
1519 // The field must be accessible in the context of the structured binding.
1520 // We already checked that the base class is accessible.
1521 // FIXME: Add 'const' to AccessedEntity's classes so we can remove the
1522 // const_cast here.
1524 Loc, const_cast<CXXRecordDecl *>(OrigRD),
1526 BasePair.getAccess(), FD->getAccess())));
1527 }
1528 return false;
1529}
1530
1532 ValueDecl *Src, QualType DecompType,
1533 const CXXRecordDecl *OrigRD) {
1534 if (S.RequireCompleteType(Src->getLocation(), DecompType,
1535 diag::err_incomplete_type))
1536 return true;
1537
1538 CXXCastPath BasePath;
1539 DeclAccessPair BasePair =
1540 findDecomposableBaseClass(S, Src->getLocation(), OrigRD, BasePath);
1541 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.getDecl());
1542 if (!RD)
1543 return true;
1544 QualType BaseType = S.Context.getQualifiedType(
1545 S.Context.getCanonicalTagType(RD), DecompType.getQualifiers());
1546
1547 auto *DD = cast<DecompositionDecl>(Src);
1548 unsigned NumFields = llvm::count_if(
1549 RD->fields(), [](FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1550 if (CheckBindingsCount(S, DD, DecompType, Bindings, NumFields))
1551 return true;
1552
1553 // all of E's non-static data members shall be [...] well-formed
1554 // when named as e.name in the context of the structured binding,
1555 // E shall not have an anonymous union member, ...
1556 auto FlatBindings = DD->flat_bindings();
1557 assert(llvm::range_size(FlatBindings) == NumFields);
1558 auto FlatBindingsItr = FlatBindings.begin();
1559
1560 if (CheckMemberDecompositionFields(S, Src->getLocation(), OrigRD, DecompType,
1561 BasePair))
1562 return true;
1563
1564 for (auto *FD : RD->fields()) {
1565 if (FD->isUnnamedBitField())
1566 continue;
1567
1568 // We have a real field to bind.
1569 assert(FlatBindingsItr != FlatBindings.end());
1570 BindingDecl *B = *(FlatBindingsItr++);
1571 SourceLocation Loc = B->getLocation();
1572
1573 // Initialize the binding to Src.FD.
1574 ExprResult E = S.BuildDeclRefExpr(Src, DecompType, VK_LValue, Loc);
1575 if (E.isInvalid())
1576 return true;
1577 E = S.ImpCastExprToType(E.get(), BaseType, CK_UncheckedDerivedToBase,
1578 VK_LValue, &BasePath);
1579 if (E.isInvalid())
1580 return true;
1581 E = S.BuildFieldReferenceExpr(E.get(), /*IsArrow*/ false, Loc,
1582 CXXScopeSpec(), FD,
1584 DeclarationNameInfo(FD->getDeclName(), Loc));
1585 if (E.isInvalid())
1586 return true;
1587
1588 // If the type of the member is T, the referenced type is cv T, where cv is
1589 // the cv-qualification of the decomposition expression.
1590 //
1591 // FIXME: We resolve a defect here: if the field is mutable, we do not add
1592 // 'const' to the type of the field.
1593 Qualifiers Q = DecompType.getQualifiers();
1594 if (FD->isMutable())
1595 Q.removeConst();
1596 B->setBinding(S.BuildQualifiedType(FD->getType(), Loc, Q), E.get());
1597 }
1598
1599 return false;
1600}
1601
1603 QualType DecompType = DD->getType();
1604
1605 // If the type of the decomposition is dependent, then so is the type of
1606 // each binding.
1607 if (DecompType->isDependentType()) {
1608 // Note that all of the types are still Null or PackExpansionType.
1609 for (auto *B : DD->bindings()) {
1610 // Do not overwrite any pack type.
1611 if (B->getType().isNull())
1612 B->setType(Context.DependentTy);
1613 }
1614 return;
1615 }
1616
1617 DecompType = DecompType.getNonReferenceType();
1619
1620 // C++1z [dcl.decomp]/2:
1621 // If E is an array type [...]
1622 // As an extension, we also support decomposition of built-in complex and
1623 // vector types.
1624 if (auto *CAT = Context.getAsConstantArrayType(DecompType)) {
1625 if (checkArrayDecomposition(*this, Bindings, DD, DecompType, CAT))
1626 DD->setInvalidDecl();
1627 return;
1628 }
1629 if (auto *VT = DecompType->getAs<VectorType>()) {
1630 if (checkVectorDecomposition(*this, Bindings, DD, DecompType, VT))
1631 DD->setInvalidDecl();
1632 return;
1633 }
1634 if (auto *CT = DecompType->getAs<ComplexType>()) {
1635 if (checkComplexDecomposition(*this, Bindings, DD, DecompType, CT))
1636 DD->setInvalidDecl();
1637 return;
1638 }
1639
1640 // C++1z [dcl.decomp]/3:
1641 // if the expression std::tuple_size<E>::value is a well-formed integral
1642 // constant expression, [...]
1643 unsigned TupleSize;
1644 switch (isTupleLike(*this, DD->getLocation(), DecompType, TupleSize)) {
1645 case IsTupleLike::Error:
1646 DD->setInvalidDecl();
1647 return;
1648
1649 case IsTupleLike::TupleLike:
1650 if (checkTupleLikeDecomposition(*this, Bindings, DD, DecompType, TupleSize))
1651 DD->setInvalidDecl();
1652 return;
1653
1654 case IsTupleLike::NotTupleLike:
1655 break;
1656 }
1657
1658 // C++1z [dcl.dcl]/8:
1659 // [E shall be of array or non-union class type]
1660 CXXRecordDecl *RD = DecompType->getAsCXXRecordDecl();
1661 if (!RD || RD->isUnion()) {
1662 Diag(DD->getLocation(), diag::err_decomp_decl_unbindable_type)
1663 << DD << !RD << DecompType;
1664 DD->setInvalidDecl();
1665 return;
1666 }
1667
1668 // C++1z [dcl.decomp]/4:
1669 // all of E's non-static data members shall be [...] direct members of
1670 // E or of the same unambiguous public base class of E, ...
1671 if (checkMemberDecomposition(*this, Bindings, DD, DecompType, RD))
1672 DD->setInvalidDecl();
1673}
1674
1676 SourceLocation Loc) {
1677 const ASTContext &Ctx = getASTContext();
1678 assert(!T->isDependentType());
1679
1680 Qualifiers Quals;
1681 QualType Unqual = Context.getUnqualifiedArrayType(T, Quals);
1682 Quals.removeCVRQualifiers();
1683 T = Context.getQualifiedType(Unqual, Quals);
1684
1685 if (auto *CAT = Ctx.getAsConstantArrayType(T))
1686 return static_cast<unsigned>(CAT->getSize().getZExtValue());
1687 if (auto *VT = T->getAs<VectorType>())
1688 return VT->getNumElements();
1689 if (T->getAs<ComplexType>())
1690 return 2u;
1691
1692 unsigned TupleSize;
1693 switch (isTupleLike(*this, Loc, T, TupleSize)) {
1694 case IsTupleLike::Error:
1695 return std::nullopt;
1696 case IsTupleLike::TupleLike:
1697 return TupleSize;
1698 case IsTupleLike::NotTupleLike:
1699 break;
1700 }
1701
1702 const CXXRecordDecl *OrigRD = T->getAsCXXRecordDecl();
1703 if (!OrigRD || OrigRD->isUnion())
1704 return std::nullopt;
1705
1706 if (RequireCompleteType(Loc, T, diag::err_incomplete_type))
1707 return std::nullopt;
1708
1709 CXXCastPath BasePath;
1710 DeclAccessPair BasePair =
1711 findDecomposableBaseClass(*this, Loc, OrigRD, BasePath);
1712 const auto *RD = cast_or_null<CXXRecordDecl>(BasePair.getDecl());
1713 if (!RD)
1714 return std::nullopt;
1715
1716 unsigned NumFields = llvm::count_if(
1717 RD->fields(), [](FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1718
1719 if (CheckMemberDecompositionFields(*this, Loc, OrigRD, T, BasePair))
1720 return std::nullopt;
1721
1722 return NumFields;
1723}
1724
1726 // Shortcut if exceptions are disabled.
1727 if (!getLangOpts().CXXExceptions)
1728 return;
1729
1730 assert(Context.hasSameType(New->getType(), Old->getType()) &&
1731 "Should only be called if types are otherwise the same.");
1732
1733 QualType NewType = New->getType();
1734 QualType OldType = Old->getType();
1735
1736 // We're only interested in pointers and references to functions, as well
1737 // as pointers to member functions.
1738 if (const ReferenceType *R = NewType->getAs<ReferenceType>()) {
1739 NewType = R->getPointeeType();
1740 OldType = OldType->castAs<ReferenceType>()->getPointeeType();
1741 } else if (const PointerType *P = NewType->getAs<PointerType>()) {
1742 NewType = P->getPointeeType();
1743 OldType = OldType->castAs<PointerType>()->getPointeeType();
1744 } else if (const MemberPointerType *M = NewType->getAs<MemberPointerType>()) {
1745 NewType = M->getPointeeType();
1746 OldType = OldType->castAs<MemberPointerType>()->getPointeeType();
1747 }
1748
1749 if (!NewType->isFunctionProtoType())
1750 return;
1751
1752 // There's lots of special cases for functions. For function pointers, system
1753 // libraries are hopefully not as broken so that we don't need these
1754 // workarounds.
1756 OldType->getAs<FunctionProtoType>(), Old->getLocation(),
1757 NewType->getAs<FunctionProtoType>(), New->getLocation())) {
1758 New->setInvalidDecl();
1759 }
1760}
1761
1762/// CheckCXXDefaultArguments - Verify that the default arguments for a
1763/// function declaration are well-formed according to C++
1764/// [dcl.fct.default].
1766 // This checking doesn't make sense for explicit specializations; their
1767 // default arguments are determined by the declaration we're specializing,
1768 // not by FD.
1770 return;
1771 if (auto *FTD = FD->getDescribedFunctionTemplate())
1772 if (FTD->isMemberSpecialization())
1773 return;
1774
1775 unsigned NumParams = FD->getNumParams();
1776 unsigned ParamIdx = 0;
1777
1778 // Find first parameter with a default argument
1779 for (; ParamIdx < NumParams; ++ParamIdx) {
1780 ParmVarDecl *Param = FD->getParamDecl(ParamIdx);
1781 if (Param->hasDefaultArg())
1782 break;
1783 }
1784
1785 // C++20 [dcl.fct.default]p4:
1786 // In a given function declaration, each parameter subsequent to a parameter
1787 // with a default argument shall have a default argument supplied in this or
1788 // a previous declaration, unless the parameter was expanded from a
1789 // parameter pack, or shall be a function parameter pack.
1790 for (++ParamIdx; ParamIdx < NumParams; ++ParamIdx) {
1791 ParmVarDecl *Param = FD->getParamDecl(ParamIdx);
1792 if (Param->hasDefaultArg() || Param->isParameterPack() ||
1794 CurrentInstantiationScope->isLocalPackExpansion(Param)))
1795 continue;
1796 if (Param->isInvalidDecl())
1797 /* We already complained about this parameter. */;
1798 else if (Param->getIdentifier())
1799 Diag(Param->getLocation(), diag::err_param_default_argument_missing_name)
1800 << Param->getIdentifier();
1801 else
1802 Diag(Param->getLocation(), diag::err_param_default_argument_missing);
1803 }
1804}
1805
1806/// Check that the given type is a literal type. Issue a diagnostic if not,
1807/// if Kind is Diagnose.
1808/// \return \c true if a problem has been found (and optionally diagnosed).
1809template <typename... Ts>
1811 SourceLocation Loc, QualType T, unsigned DiagID,
1812 Ts &&...DiagArgs) {
1813 if (T->isDependentType())
1814 return false;
1815
1816 switch (Kind) {
1818 return SemaRef.RequireLiteralType(Loc, T, DiagID,
1819 std::forward<Ts>(DiagArgs)...);
1820
1822 return !T->isLiteralType(SemaRef.Context);
1823 }
1824
1825 llvm_unreachable("unknown CheckConstexprKind");
1826}
1827
1828/// Determine whether a destructor cannot be constexpr due to
1830 const CXXDestructorDecl *DD,
1832 assert(!SemaRef.getLangOpts().CPlusPlus23 &&
1833 "this check is obsolete for C++23");
1834 auto Check = [&](SourceLocation Loc, QualType T, const FieldDecl *FD) {
1835 const CXXRecordDecl *RD =
1836 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
1837 if (!RD || RD->hasConstexprDestructor())
1838 return true;
1839
1841 SemaRef.Diag(DD->getLocation(), diag::err_constexpr_dtor_subobject)
1842 << static_cast<int>(DD->getConstexprKind()) << !FD
1843 << (FD ? FD->getDeclName() : DeclarationName()) << T;
1844 SemaRef.Diag(Loc, diag::note_constexpr_dtor_subobject)
1845 << !FD << (FD ? FD->getDeclName() : DeclarationName()) << T;
1846 }
1847 return false;
1848 };
1849
1850 const CXXRecordDecl *RD = DD->getParent();
1851 for (const CXXBaseSpecifier &B : RD->bases())
1852 if (!Check(B.getBaseTypeLoc(), B.getType(), nullptr))
1853 return false;
1854 for (const FieldDecl *FD : RD->fields())
1855 if (!Check(FD->getLocation(), FD->getType(), FD))
1856 return false;
1857 return true;
1858}
1859
1860/// Check whether a function's parameter types are all literal types. If so,
1861/// return true. If not, produce a suitable diagnostic and return false.
1863 const FunctionDecl *FD,
1865 assert(!SemaRef.getLangOpts().CPlusPlus23 &&
1866 "this check is obsolete for C++23");
1867 unsigned ArgIndex = 0;
1868 const auto *FT = FD->getType()->castAs<FunctionProtoType>();
1869 for (FunctionProtoType::param_type_iterator i = FT->param_type_begin(),
1870 e = FT->param_type_end();
1871 i != e; ++i, ++ArgIndex) {
1872 const ParmVarDecl *PD = FD->getParamDecl(ArgIndex);
1873 assert(PD && "null in a parameter list");
1874 SourceLocation ParamLoc = PD->getLocation();
1875 if (CheckLiteralType(SemaRef, Kind, ParamLoc, *i,
1876 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1878 FD->isConsteval()))
1879 return false;
1880 }
1881 return true;
1882}
1883
1884/// Check whether a function's return type is a literal type. If so, return
1885/// true. If not, produce a suitable diagnostic and return false.
1886static bool CheckConstexprReturnType(Sema &SemaRef, const FunctionDecl *FD,
1888 assert(!SemaRef.getLangOpts().CPlusPlus23 &&
1889 "this check is obsolete for C++23");
1890 if (CheckLiteralType(SemaRef, Kind, FD->getLocation(), FD->getReturnType(),
1891 diag::err_constexpr_non_literal_return,
1892 FD->isConsteval()))
1893 return false;
1894 return true;
1895}
1896
1897/// Get diagnostic %select index for tag kind for
1898/// record diagnostic message.
1899/// WARNING: Indexes apply to particular diagnostics only!
1900///
1901/// \returns diagnostic %select index.
1903 switch (Tag) {
1905 return 0;
1907 return 1;
1908 case TagTypeKind::Class:
1909 return 2;
1910 default: llvm_unreachable("Invalid tag kind for record diagnostic!");
1911 }
1912}
1913
1914static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
1915 Stmt *Body,
1917static bool CheckConstexprMissingReturn(Sema &SemaRef, const FunctionDecl *Dcl);
1918
1920 CheckConstexprKind Kind) {
1921 const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD);
1922 if (MD && MD->isInstance()) {
1923 // C++11 [dcl.constexpr]p4:
1924 // The definition of a constexpr constructor shall satisfy the following
1925 // constraints:
1926 // - the class shall not have any virtual base classes;
1927 //
1928 // FIXME: This only applies to constructors and destructors, not arbitrary
1929 // member functions.
1930 const CXXRecordDecl *RD = MD->getParent();
1931 if (RD->getNumVBases()) {
1933 return false;
1934
1935 Diag(NewFD->getLocation(), diag::err_constexpr_virtual_base)
1936 << isa<CXXConstructorDecl>(NewFD)
1938 for (const auto &I : RD->vbases())
1939 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
1940 << I.getSourceRange();
1941 return false;
1942 }
1943 }
1944
1945 if (!isa<CXXConstructorDecl>(NewFD)) {
1946 // C++11 [dcl.constexpr]p3:
1947 // The definition of a constexpr function shall satisfy the following
1948 // constraints:
1949 // - it shall not be virtual; (removed in C++20)
1950 const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(NewFD);
1951 if (Method && Method->isVirtual()) {
1952 if (getLangOpts().CPlusPlus20) {
1953 if (Kind == CheckConstexprKind::Diagnose)
1954 Diag(Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
1955 } else {
1957 return false;
1958
1959 Method = Method->getCanonicalDecl();
1960 Diag(Method->getLocation(), diag::err_constexpr_virtual);
1961
1962 // If it's not obvious why this function is virtual, find an overridden
1963 // function which uses the 'virtual' keyword.
1964 const CXXMethodDecl *WrittenVirtual = Method;
1965 while (!WrittenVirtual->isVirtualAsWritten())
1966 WrittenVirtual = *WrittenVirtual->begin_overridden_methods();
1967 if (WrittenVirtual != Method)
1968 Diag(WrittenVirtual->getLocation(),
1969 diag::note_overridden_virtual_function);
1970 return false;
1971 }
1972 }
1973
1974 // - its return type shall be a literal type; (removed in C++23)
1975 if (!getLangOpts().CPlusPlus23 &&
1976 !CheckConstexprReturnType(*this, NewFD, Kind))
1977 return false;
1978 }
1979
1980 if (auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
1981 // A destructor can be constexpr only if the defaulted destructor could be;
1982 // we don't need to check the members and bases if we already know they all
1983 // have constexpr destructors. (removed in C++23)
1984 if (!getLangOpts().CPlusPlus23 &&
1985 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
1987 return false;
1988 if (!CheckConstexprDestructorSubobjects(*this, Dtor, Kind))
1989 return false;
1990 }
1991 }
1992
1993 // - each of its parameter types shall be a literal type; (removed in C++23)
1994 if (!getLangOpts().CPlusPlus23 &&
1995 !CheckConstexprParameterTypes(*this, NewFD, Kind))
1996 return false;
1997
1998 Stmt *Body = NewFD->getBody();
1999 assert(Body &&
2000 "CheckConstexprFunctionDefinition called on function with no body");
2001 return CheckConstexprFunctionBody(*this, NewFD, Body, Kind);
2002}
2003
2004/// Check the given declaration statement is legal within a constexpr function
2005/// body. C++11 [dcl.constexpr]p3,p4, and C++1y [dcl.constexpr]p3.
2006///
2007/// \return true if the body is OK (maybe only as an extension), false if we
2008/// have diagnosed a problem.
2009static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl,
2010 DeclStmt *DS, SourceLocation &Cxx1yLoc,
2012 // C++11 [dcl.constexpr]p3 and p4:
2013 // The definition of a constexpr function(p3) or constructor(p4) [...] shall
2014 // contain only
2015 for (const auto *DclIt : DS->decls()) {
2016 switch (DclIt->getKind()) {
2017 case Decl::StaticAssert:
2018 case Decl::Using:
2019 case Decl::UsingShadow:
2020 case Decl::UsingDirective:
2021 case Decl::UnresolvedUsingTypename:
2022 case Decl::UnresolvedUsingValue:
2023 case Decl::UsingEnum:
2024 // - static_assert-declarations
2025 // - using-declarations,
2026 // - using-directives,
2027 // - using-enum-declaration
2028 continue;
2029
2030 case Decl::Typedef:
2031 case Decl::TypeAlias: {
2032 // - typedef declarations and alias-declarations that do not define
2033 // classes or enumerations,
2034 const auto *TN = cast<TypedefNameDecl>(DclIt);
2035 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
2036 // Don't allow variably-modified types in constexpr functions.
2038 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
2039 SemaRef.Diag(TL.getBeginLoc(), diag::err_constexpr_vla)
2040 << TL.getSourceRange() << TL.getType()
2042 }
2043 return false;
2044 }
2045 continue;
2046 }
2047
2048 case Decl::Enum:
2049 case Decl::CXXRecord:
2050 // C++1y allows types to be defined, not just declared.
2051 if (cast<TagDecl>(DclIt)->isThisDeclarationADefinition()) {
2053 SemaRef.DiagCompat(DS->getBeginLoc(),
2054 diag_compat::constexpr_type_definition)
2056 } else if (!SemaRef.getLangOpts().CPlusPlus14) {
2057 return false;
2058 }
2059 }
2060 continue;
2061
2062 case Decl::EnumConstant:
2063 case Decl::IndirectField:
2064 case Decl::ParmVar:
2065 // These can only appear with other declarations which are banned in
2066 // C++11 and permitted in C++1y, so ignore them.
2067 continue;
2068
2069 case Decl::Var:
2070 case Decl::Decomposition: {
2071 // C++1y [dcl.constexpr]p3 allows anything except:
2072 // a definition of a variable of non-literal type or of static or
2073 // thread storage duration or [before C++2a] for which no
2074 // initialization is performed.
2075 const auto *VD = cast<VarDecl>(DclIt);
2076 if (VD->isThisDeclarationADefinition()) {
2077 if (VD->isStaticLocal()) {
2079 SemaRef.DiagCompat(VD->getLocation(),
2080 diag_compat::constexpr_static_var)
2082 << (VD->getTLSKind() == VarDecl::TLS_Dynamic);
2083 } else if (!SemaRef.getLangOpts().CPlusPlus23) {
2084 return false;
2085 }
2086 }
2087 if (SemaRef.LangOpts.CPlusPlus23) {
2088 CheckLiteralType(SemaRef, Kind, VD->getLocation(), VD->getType(),
2089 diag::warn_cxx20_compat_constexpr_var,
2091 } else if (CheckLiteralType(
2092 SemaRef, Kind, VD->getLocation(), VD->getType(),
2093 diag::err_constexpr_local_var_non_literal_type,
2095 return false;
2096 }
2097 if (!VD->getType()->isDependentType() &&
2098 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
2100 SemaRef.DiagCompat(VD->getLocation(),
2101 diag_compat::constexpr_local_var_no_init)
2103 } else if (!SemaRef.getLangOpts().CPlusPlus20) {
2104 return false;
2105 }
2106 continue;
2107 }
2108 }
2110 SemaRef.DiagCompat(VD->getLocation(), diag_compat::constexpr_local_var)
2112 } else if (!SemaRef.getLangOpts().CPlusPlus14) {
2113 return false;
2114 }
2115 continue;
2116 }
2117
2118 case Decl::NamespaceAlias:
2119 case Decl::Function:
2120 // These are disallowed in C++11 and permitted in C++1y. Allow them
2121 // everywhere as an extension.
2122 if (!Cxx1yLoc.isValid())
2123 Cxx1yLoc = DS->getBeginLoc();
2124 continue;
2125
2126 default:
2128 SemaRef.Diag(DS->getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2129 << isa<CXXConstructorDecl>(Dcl) << Dcl->isConsteval();
2130 }
2131 return false;
2132 }
2133 }
2134
2135 return true;
2136}
2137
2138/// Check that the given field is initialized within a constexpr constructor.
2139///
2140/// \param Dcl The constexpr constructor being checked.
2141/// \param Field The field being checked. This may be a member of an anonymous
2142/// struct or union nested within the class being checked.
2143/// \param Inits All declarations, including anonymous struct/union members and
2144/// indirect members, for which any initialization was provided.
2145/// \param Diagnosed Whether we've emitted the error message yet. Used to attach
2146/// multiple notes for different members to the same error.
2147/// \param Kind Whether we're diagnosing a constructor as written or determining
2148/// whether the formal requirements are satisfied.
2149/// \return \c false if we're checking for validity and the constructor does
2150/// not satisfy the requirements on a constexpr constructor.
2152 const FunctionDecl *Dcl,
2153 FieldDecl *Field,
2155 bool &Diagnosed,
2157 // In C++20 onwards, there's nothing to check for validity.
2159 SemaRef.getLangOpts().CPlusPlus20)
2160 return true;
2161
2162 if (Field->isInvalidDecl())
2163 return true;
2164
2165 if (Field->isUnnamedBitField())
2166 return true;
2167
2168 // Anonymous unions with no variant members and empty anonymous structs do not
2169 // need to be explicitly initialized. FIXME: Anonymous structs that contain no
2170 // indirect fields don't need initializing.
2171 if (Field->isAnonymousStructOrUnion() &&
2172 (Field->getType()->isUnionType()
2173 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2174 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2175 return true;
2176
2177 if (!Inits.count(Field)) {
2179 if (!Diagnosed) {
2180 SemaRef.DiagCompat(Dcl->getLocation(),
2181 diag_compat::constexpr_ctor_missing_init);
2182 Diagnosed = true;
2183 }
2184 SemaRef.Diag(Field->getLocation(),
2185 diag::note_constexpr_ctor_missing_init);
2186 } else if (!SemaRef.getLangOpts().CPlusPlus20) {
2187 return false;
2188 }
2189 } else if (Field->isAnonymousStructOrUnion()) {
2190 const auto *RD = Field->getType()->castAsRecordDecl();
2191 for (auto *I : RD->fields())
2192 // If an anonymous union contains an anonymous struct of which any member
2193 // is initialized, all members must be initialized.
2194 if (!RD->isUnion() || Inits.count(I))
2195 if (!CheckConstexprCtorInitializer(SemaRef, Dcl, I, Inits, Diagnosed,
2196 Kind))
2197 return false;
2198 }
2199 return true;
2200}
2201
2202/// Check the provided statement is allowed in a constexpr function
2203/// definition.
2204static bool
2207 SourceLocation &Cxx1yLoc, SourceLocation &Cxx2aLoc,
2208 SourceLocation &Cxx2bLoc,
2210 // - its function-body shall be [...] a compound-statement that contains only
2211 switch (S->getStmtClass()) {
2212 case Stmt::NullStmtClass:
2213 // - null statements,
2214 return true;
2215
2216 case Stmt::DeclStmtClass:
2217 // - static_assert-declarations
2218 // - using-declarations,
2219 // - using-directives,
2220 // - typedef declarations and alias-declarations that do not define
2221 // classes or enumerations,
2222 if (!CheckConstexprDeclStmt(SemaRef, Dcl, cast<DeclStmt>(S), Cxx1yLoc, Kind))
2223 return false;
2224 return true;
2225
2226 case Stmt::ReturnStmtClass:
2227 // - and exactly one return statement;
2228 if (isa<CXXConstructorDecl>(Dcl)) {
2229 // C++1y allows return statements in constexpr constructors.
2230 if (!Cxx1yLoc.isValid())
2231 Cxx1yLoc = S->getBeginLoc();
2232 return true;
2233 }
2234
2235 ReturnStmts.push_back(S->getBeginLoc());
2236 return true;
2237
2238 case Stmt::AttributedStmtClass:
2239 // Attributes on a statement don't affect its formal kind and hence don't
2240 // affect its validity in a constexpr function.
2242 SemaRef, Dcl, cast<AttributedStmt>(S)->getSubStmt(), ReturnStmts,
2243 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2244
2245 case Stmt::CompoundStmtClass: {
2246 // C++1y allows compound-statements.
2247 if (!Cxx1yLoc.isValid())
2248 Cxx1yLoc = S->getBeginLoc();
2249
2250 CompoundStmt *CompStmt = cast<CompoundStmt>(S);
2251 for (auto *BodyIt : CompStmt->body()) {
2252 if (!CheckConstexprFunctionStmt(SemaRef, Dcl, BodyIt, ReturnStmts,
2253 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2254 return false;
2255 }
2256 return true;
2257 }
2258
2259 case Stmt::IfStmtClass: {
2260 // C++1y allows if-statements.
2261 if (!Cxx1yLoc.isValid())
2262 Cxx1yLoc = S->getBeginLoc();
2263
2264 IfStmt *If = cast<IfStmt>(S);
2265 if (!CheckConstexprFunctionStmt(SemaRef, Dcl, If->getThen(), ReturnStmts,
2266 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2267 return false;
2268 if (If->getElse() &&
2269 !CheckConstexprFunctionStmt(SemaRef, Dcl, If->getElse(), ReturnStmts,
2270 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2271 return false;
2272 return true;
2273 }
2274
2275 case Stmt::WhileStmtClass:
2276 case Stmt::DoStmtClass:
2277 case Stmt::ForStmtClass:
2278 case Stmt::CXXForRangeStmtClass:
2279 case Stmt::ContinueStmtClass:
2280 // C++1y allows all of these. We don't allow them as extensions in C++11,
2281 // because they don't make sense without variable mutation.
2282 if (!SemaRef.getLangOpts().CPlusPlus14)
2283 break;
2284 if (!Cxx1yLoc.isValid())
2285 Cxx1yLoc = S->getBeginLoc();
2286 for (Stmt *SubStmt : S->children()) {
2287 if (SubStmt &&
2288 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2289 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2290 return false;
2291 }
2292 return true;
2293
2294 case Stmt::SwitchStmtClass:
2295 case Stmt::CaseStmtClass:
2296 case Stmt::DefaultStmtClass:
2297 case Stmt::BreakStmtClass:
2298 // C++1y allows switch-statements, and since they don't need variable
2299 // mutation, we can reasonably allow them in C++11 as an extension.
2300 if (!Cxx1yLoc.isValid())
2301 Cxx1yLoc = S->getBeginLoc();
2302 for (Stmt *SubStmt : S->children()) {
2303 if (SubStmt &&
2304 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2305 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2306 return false;
2307 }
2308 return true;
2309
2310 case Stmt::LabelStmtClass:
2311 case Stmt::GotoStmtClass:
2312 if (Cxx2bLoc.isInvalid())
2313 Cxx2bLoc = S->getBeginLoc();
2314 for (Stmt *SubStmt : S->children()) {
2315 if (SubStmt &&
2316 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2317 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2318 return false;
2319 }
2320 return true;
2321
2322 case Stmt::GCCAsmStmtClass:
2323 case Stmt::MSAsmStmtClass:
2324 // C++2a allows inline assembly statements.
2325 case Stmt::CXXTryStmtClass:
2326 if (Cxx2aLoc.isInvalid())
2327 Cxx2aLoc = S->getBeginLoc();
2328 for (Stmt *SubStmt : S->children()) {
2329 if (SubStmt &&
2330 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2331 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2332 return false;
2333 }
2334 return true;
2335
2336 case Stmt::CXXCatchStmtClass:
2337 // Do not bother checking the language mode (already covered by the
2338 // try block check).
2340 SemaRef, Dcl, cast<CXXCatchStmt>(S)->getHandlerBlock(), ReturnStmts,
2341 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2342 return false;
2343 return true;
2344
2345 default:
2346 if (!isa<Expr>(S))
2347 break;
2348
2349 // C++1y allows expression-statements.
2350 if (!Cxx1yLoc.isValid())
2351 Cxx1yLoc = S->getBeginLoc();
2352 return true;
2353 }
2354
2356 SemaRef.Diag(S->getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2357 << isa<CXXConstructorDecl>(Dcl) << Dcl->isConsteval();
2358 }
2359 return false;
2360}
2361
2362/// Check the body for the given constexpr function declaration only contains
2363/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.
2364///
2365/// \return true if the body is OK, false if we have found or diagnosed a
2366/// problem.
2367static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
2368 Stmt *Body,
2371
2372 if (isa<CXXTryStmt>(Body)) {
2373 // C++11 [dcl.constexpr]p3:
2374 // The definition of a constexpr function shall satisfy the following
2375 // constraints: [...]
2376 // - its function-body shall be = delete, = default, or a
2377 // compound-statement
2378 //
2379 // C++11 [dcl.constexpr]p4:
2380 // In the definition of a constexpr constructor, [...]
2381 // - its function-body shall not be a function-try-block;
2382 //
2383 // This restriction is lifted in C++2a, as long as inner statements also
2384 // apply the general constexpr rules.
2385 switch (Kind) {
2387 if (!SemaRef.getLangOpts().CPlusPlus20)
2388 return false;
2389 break;
2390
2392 SemaRef.DiagCompat(Body->getBeginLoc(),
2393 diag_compat::constexpr_function_try_block)
2395 break;
2396 }
2397 }
2398
2399 // - its function-body shall be [...] a compound-statement that contains only
2400 // [... list of cases ...]
2401 //
2402 // Note that walking the children here is enough to properly check for
2403 // CompoundStmt and CXXTryStmt body.
2404 SourceLocation Cxx1yLoc, Cxx2aLoc, Cxx2bLoc;
2405 for (Stmt *SubStmt : Body->children()) {
2406 if (SubStmt &&
2407 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2408 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2409 return false;
2410 }
2411
2413 // If this is only valid as an extension, report that we don't satisfy the
2414 // constraints of the current language.
2415 if ((Cxx2bLoc.isValid() && !SemaRef.getLangOpts().CPlusPlus23) ||
2416 (Cxx2aLoc.isValid() && !SemaRef.getLangOpts().CPlusPlus20) ||
2417 (Cxx1yLoc.isValid() && !SemaRef.getLangOpts().CPlusPlus17))
2418 return false;
2419 } else if (Cxx2bLoc.isValid()) {
2420 SemaRef.DiagCompat(Cxx2bLoc, diag_compat::cxx23_constexpr_body_invalid_stmt)
2422 } else if (Cxx2aLoc.isValid()) {
2423 SemaRef.DiagCompat(Cxx2aLoc, diag_compat::cxx20_constexpr_body_invalid_stmt)
2425 } else if (Cxx1yLoc.isValid()) {
2426 SemaRef.DiagCompat(Cxx1yLoc, diag_compat::cxx14_constexpr_body_invalid_stmt)
2428 }
2429
2431 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2432 const CXXRecordDecl *RD = Constructor->getParent();
2433 // DR1359:
2434 // - every non-variant non-static data member and base class sub-object
2435 // shall be initialized;
2436 // DR1460:
2437 // - if the class is a union having variant members, exactly one of them
2438 // shall be initialized;
2439 if (RD->isUnion()) {
2440 if (Constructor->getNumCtorInitializers() == 0 &&
2441 RD->hasVariantMembers()) {
2443 SemaRef.DiagCompat(Dcl->getLocation(),
2444 diag_compat::constexpr_union_ctor_no_init);
2445 } else if (!SemaRef.getLangOpts().CPlusPlus20) {
2446 return false;
2447 }
2448 }
2449 } else if (!Constructor->isDependentContext() &&
2450 !Constructor->isDelegatingConstructor()) {
2451 assert(RD->getNumVBases() == 0 && "constexpr ctor with virtual bases");
2452
2453 // Skip detailed checking if we have enough initializers, and we would
2454 // allow at most one initializer per member.
2455 bool AnyAnonStructUnionMembers = false;
2456 unsigned Fields = 0;
2458 E = RD->field_end(); I != E; ++I, ++Fields) {
2459 if (I->isAnonymousStructOrUnion()) {
2460 AnyAnonStructUnionMembers = true;
2461 break;
2462 }
2463 }
2464 // DR1460:
2465 // - if the class is a union-like class, but is not a union, for each of
2466 // its anonymous union members having variant members, exactly one of
2467 // them shall be initialized;
2468 if (AnyAnonStructUnionMembers ||
2469 Constructor->getNumCtorInitializers() != RD->getNumBases() + Fields) {
2470 // Check initialization of non-static data members. Base classes are
2471 // always initialized so do not need to be checked. Dependent bases
2472 // might not have initializers in the member initializer list.
2474 for (const auto *I: Constructor->inits()) {
2475 if (FieldDecl *FD = I->getMember())
2476 Inits.insert(FD);
2477 else if (IndirectFieldDecl *ID = I->getIndirectMember())
2478 Inits.insert(ID->chain_begin(), ID->chain_end());
2479 }
2480
2481 bool Diagnosed = false;
2482 for (auto *I : RD->fields())
2483 if (!CheckConstexprCtorInitializer(SemaRef, Dcl, I, Inits, Diagnosed,
2484 Kind))
2485 return false;
2486 }
2487 }
2488 } else {
2489 if (ReturnStmts.empty()) {
2490 switch (Kind) {
2492 if (!CheckConstexprMissingReturn(SemaRef, Dcl))
2493 return false;
2494 break;
2495
2497 // The formal requirements don't include this rule in C++14, even
2498 // though the "must be able to produce a constant expression" rules
2499 // still imply it in some cases.
2500 if (!SemaRef.getLangOpts().CPlusPlus14)
2501 return false;
2502 break;
2503 }
2504 } else if (ReturnStmts.size() > 1) {
2505 switch (Kind) {
2507 SemaRef.DiagCompat(ReturnStmts.back(),
2508 diag_compat::constexpr_body_multiple_return);
2509 for (unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2510 SemaRef.Diag(ReturnStmts[I],
2511 diag::note_constexpr_body_previous_return);
2512 break;
2513
2515 if (!SemaRef.getLangOpts().CPlusPlus14)
2516 return false;
2517 break;
2518 }
2519 }
2520 }
2521
2522 // C++11 [dcl.constexpr]p5:
2523 // if no function argument values exist such that the function invocation
2524 // substitution would produce a constant expression, the program is
2525 // ill-formed; no diagnostic required.
2526 // C++11 [dcl.constexpr]p3:
2527 // - every constructor call and implicit conversion used in initializing the
2528 // return value shall be one of those allowed in a constant expression.
2529 // C++11 [dcl.constexpr]p4:
2530 // - every constructor involved in initializing non-static data members and
2531 // base class sub-objects shall be a constexpr constructor.
2532 //
2533 // Note that this rule is distinct from the "requirements for a constexpr
2534 // function", so is not checked in CheckValid mode. Because the check for
2535 // constexpr potential is expensive, skip the check if the diagnostic is
2536 // disabled, the function is declared in a system header, or we're in C++23
2537 // or later mode (see https://wg21.link/P2448).
2538 bool SkipCheck =
2539 !SemaRef.getLangOpts().CheckConstexprFunctionBodies ||
2540 SemaRef.getSourceManager().isInSystemHeader(Dcl->getLocation()) ||
2541 SemaRef.getDiagnostics().isIgnored(
2542 diag::ext_constexpr_function_never_constant_expr, Dcl->getLocation());
2544 if (Kind == Sema::CheckConstexprKind::Diagnose && !SkipCheck &&
2545 !Expr::isPotentialConstantExpr(Dcl, Diags)) {
2546 SemaRef.Diag(Dcl->getLocation(),
2547 diag::ext_constexpr_function_never_constant_expr)
2548 << isa<CXXConstructorDecl>(Dcl) << Dcl->isConsteval()
2549 << Dcl->getNameInfo().getSourceRange();
2550 for (size_t I = 0, N = Diags.size(); I != N; ++I)
2551 SemaRef.Diag(Diags[I].first, Diags[I].second);
2552 // Don't return false here: we allow this for compatibility in
2553 // system headers.
2554 }
2555
2556 return true;
2557}
2558
2560 const FunctionDecl *Dcl) {
2561 bool IsVoidOrDependentType = Dcl->getReturnType()->isVoidType() ||
2563 // Skip emitting a missing return error diagnostic for non-void functions
2564 // since C++23 no longer mandates constexpr functions to yield constant
2565 // expressions.
2566 if (SemaRef.getLangOpts().CPlusPlus23 && !IsVoidOrDependentType)
2567 return true;
2568
2569 // C++14 doesn't require constexpr functions to contain a 'return'
2570 // statement. We still do, unless the return type might be void, because
2571 // otherwise if there's no return statement, the function cannot
2572 // be used in a core constant expression.
2573 bool OK = SemaRef.getLangOpts().CPlusPlus14 && IsVoidOrDependentType;
2574 SemaRef.Diag(Dcl->getLocation(),
2575 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2576 : diag::err_constexpr_body_no_return)
2577 << Dcl->isConsteval();
2578 return OK;
2579}
2580
2582 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI) {
2584 return true;
2588 auto it = UndefinedButUsed.find(FD->getCanonicalDecl());
2589 if (it != UndefinedButUsed.end()) {
2590 Diag(it->second, diag::err_immediate_function_used_before_definition)
2591 << it->first;
2592 Diag(FD->getLocation(), diag::note_defined_here) << FD;
2593 if (FD->isImmediateFunction() && !FD->isConsteval())
2595 return false;
2596 }
2597 }
2598 return true;
2599}
2600
2602 assert(FD->isImmediateEscalating() && !FD->isConsteval() &&
2603 "expected an immediate function");
2604 assert(FD->hasBody() && "expected the function to have a body");
2605 struct ImmediateEscalatingExpressionsVisitor : DynamicRecursiveASTVisitor {
2606 Sema &SemaRef;
2607
2608 const FunctionDecl *ImmediateFn;
2609 bool ImmediateFnIsConstructor;
2610 CXXConstructorDecl *CurrentConstructor = nullptr;
2611 CXXCtorInitializer *CurrentInit = nullptr;
2612
2613 ImmediateEscalatingExpressionsVisitor(Sema &SemaRef, FunctionDecl *FD)
2614 : SemaRef(SemaRef), ImmediateFn(FD),
2615 ImmediateFnIsConstructor(isa<CXXConstructorDecl>(FD)) {
2616 ShouldVisitImplicitCode = true;
2617 ShouldVisitLambdaBody = false;
2618 }
2619
2620 void Diag(const Expr *E, const FunctionDecl *Fn, bool IsCall) {
2621 SourceLocation Loc = E->getBeginLoc();
2622 SourceRange Range = E->getSourceRange();
2623 if (CurrentConstructor && CurrentInit) {
2624 Loc = CurrentConstructor->getLocation();
2625 Range = CurrentInit->isWritten() ? CurrentInit->getSourceRange()
2626 : SourceRange();
2627 }
2628
2629 FieldDecl* InitializedField = CurrentInit ? CurrentInit->getAnyMember() : nullptr;
2630
2631 SemaRef.Diag(Loc, diag::note_immediate_function_reason)
2632 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2633 << isa<CXXConstructorDecl>(Fn) << ImmediateFnIsConstructor
2634 << (InitializedField != nullptr)
2635 << (CurrentInit && !CurrentInit->isWritten())
2636 << InitializedField << Range;
2637 }
2638 bool TraverseCallExpr(CallExpr *E) override {
2639 if (const auto *DR =
2640 dyn_cast<DeclRefExpr>(E->getCallee()->IgnoreImplicit());
2641 DR && DR->isImmediateEscalating()) {
2642 Diag(E, E->getDirectCallee(), /*IsCall=*/true);
2643 return false;
2644 }
2645
2646 for (Expr *A : E->arguments())
2647 if (!TraverseStmt(A))
2648 return false;
2649
2650 return true;
2651 }
2652
2653 bool VisitDeclRefExpr(DeclRefExpr *E) override {
2654 if (const auto *ReferencedFn = dyn_cast<FunctionDecl>(E->getDecl());
2655 ReferencedFn && E->isImmediateEscalating()) {
2656 Diag(E, ReferencedFn, /*IsCall=*/false);
2657 return false;
2658 }
2659
2660 return true;
2661 }
2662
2663 bool VisitCXXConstructExpr(CXXConstructExpr *E) override {
2665 if (E->isImmediateEscalating()) {
2666 Diag(E, D, /*IsCall=*/true);
2667 return false;
2668 }
2669 return true;
2670 }
2671
2672 bool TraverseConstructorInitializer(CXXCtorInitializer *Init) override {
2673 llvm::SaveAndRestore RAII(CurrentInit, Init);
2675 }
2676
2677 bool TraverseCXXConstructorDecl(CXXConstructorDecl *Ctr) override {
2678 llvm::SaveAndRestore RAII(CurrentConstructor, Ctr);
2679 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2680 }
2681
2682 bool TraverseType(QualType T, bool TraverseQualifier) override {
2683 return true;
2684 }
2685 bool VisitBlockExpr(BlockExpr *T) override { return true; }
2686
2687 } Visitor(*this, FD);
2688 Visitor.TraverseDecl(FD);
2689}
2690
2692 assert(getLangOpts().CPlusPlus && "No class names in C!");
2693
2694 if (SS && SS->isInvalid())
2695 return nullptr;
2696
2697 if (SS && SS->isNotEmpty()) {
2698 DeclContext *DC = computeDeclContext(*SS, true);
2699 return dyn_cast_or_null<CXXRecordDecl>(DC);
2700 }
2701
2702 return dyn_cast_or_null<CXXRecordDecl>(CurContext);
2703}
2704
2706 const CXXScopeSpec *SS) {
2707 CXXRecordDecl *CurDecl = getCurrentClass(S, SS);
2708 return CurDecl && &II == CurDecl->getIdentifier();
2709}
2710
2712 assert(getLangOpts().CPlusPlus && "No class names in C!");
2713
2714 if (!getLangOpts().SpellChecking)
2715 return false;
2716
2717 CXXRecordDecl *CurDecl;
2718 if (SS && SS->isSet() && !SS->isInvalid()) {
2719 DeclContext *DC = computeDeclContext(*SS, true);
2720 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2721 } else
2722 CurDecl = dyn_cast_or_null<CXXRecordDecl>(CurContext);
2723
2724 if (CurDecl && CurDecl->getIdentifier() && II != CurDecl->getIdentifier() &&
2725 3 * II->getName().edit_distance(CurDecl->getIdentifier()->getName())
2726 < II->getLength()) {
2727 II = CurDecl->getIdentifier();
2728 return true;
2729 }
2730
2731 return false;
2732}
2733
2735 SourceRange SpecifierRange,
2736 bool Virtual, AccessSpecifier Access,
2737 TypeSourceInfo *TInfo,
2738 SourceLocation EllipsisLoc) {
2739 QualType BaseType = TInfo->getType();
2740 SourceLocation BaseLoc = TInfo->getTypeLoc().getBeginLoc();
2741 if (BaseType->containsErrors()) {
2742 // Already emitted a diagnostic when parsing the error type.
2743 return nullptr;
2744 }
2745
2746 if (EllipsisLoc.isValid() && !BaseType->containsUnexpandedParameterPack()) {
2747 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2748 << TInfo->getTypeLoc().getSourceRange();
2749 EllipsisLoc = SourceLocation();
2750 }
2751
2752 auto *BaseDecl =
2753 dyn_cast_if_present<CXXRecordDecl>(computeDeclContext(BaseType));
2754 // C++ [class.derived.general]p2:
2755 // A class-or-decltype shall denote a (possibly cv-qualified) class type
2756 // that is not an incompletely defined class; any cv-qualifiers are
2757 // ignored.
2758 if (BaseDecl) {
2759 // C++ [class.union.general]p4:
2760 // [...] A union shall not be used as a base class.
2761 if (BaseDecl->isUnion()) {
2762 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2763 return nullptr;
2764 }
2765
2766 if (BaseType.hasQualifiers()) {
2767 std::string Quals =
2768 BaseType.getQualifiers().getAsString(Context.getPrintingPolicy());
2769 Diag(BaseLoc, diag::warn_qual_base_type)
2770 << Quals << llvm::count(Quals, ' ') + 1 << BaseType;
2771 Diag(BaseLoc, diag::note_base_class_specified_here) << BaseType;
2772 }
2773
2774 // For the MS ABI, propagate DLL attributes to base class templates.
2775 if (Context.getTargetInfo().getCXXABI().isMicrosoft() ||
2776 Context.getTargetInfo().getTriple().isPS()) {
2777 if (Attr *ClassAttr = getDLLAttr(Class)) {
2778 if (auto *BaseSpec =
2779 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2780 propagateDLLAttrToBaseClassTemplate(Class, ClassAttr, BaseSpec,
2781 BaseLoc);
2782 }
2783 }
2784 }
2785
2786 if (RequireCompleteType(BaseLoc, BaseType, diag::err_incomplete_base_class,
2787 SpecifierRange)) {
2788 Class->setInvalidDecl();
2789 return nullptr;
2790 }
2791
2792 BaseDecl = BaseDecl->getDefinition();
2793 assert(BaseDecl && "Base type is not incomplete, but has no definition");
2794
2795 // Microsoft docs say:
2796 // "If a base-class has a code_seg attribute, derived classes must have the
2797 // same attribute."
2798 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2799 const auto *DerivedCSA = Class->getAttr<CodeSegAttr>();
2800 if ((DerivedCSA || BaseCSA) &&
2801 (!BaseCSA || !DerivedCSA ||
2802 BaseCSA->getName() != DerivedCSA->getName())) {
2803 Diag(Class->getLocation(), diag::err_mismatched_code_seg_base);
2804 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2805 << BaseDecl;
2806 return nullptr;
2807 }
2808
2809 // A class which contains a flexible array member is not suitable for use as
2810 // a base class:
2811 // - If the layout determines that a base comes before another base,
2812 // the flexible array member would index into the subsequent base.
2813 // - If the layout determines that base comes before the derived class,
2814 // the flexible array member would index into the derived class.
2815 if (BaseDecl->hasFlexibleArrayMember()) {
2816 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2817 << BaseDecl->getDeclName();
2818 return nullptr;
2819 }
2820
2821 // C++ [class]p3:
2822 // If a class is marked final and it appears as a base-type-specifier in
2823 // base-clause, the program is ill-formed.
2824 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2825 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2826 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2827 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2828 << BaseDecl->getDeclName() << FA->getRange();
2829 return nullptr;
2830 }
2831
2832 // If the base class is invalid the derived class is as well.
2833 if (BaseDecl->isInvalidDecl())
2834 Class->setInvalidDecl();
2835 } else if (BaseType->isDependentType()) {
2836 // Make sure that we don't make an ill-formed AST where the type of the
2837 // Class is non-dependent and its attached base class specifier is an
2838 // dependent type, which violates invariants in many clang code paths (e.g.
2839 // constexpr evaluator). If this case happens (in errory-recovery mode), we
2840 // explicitly mark the Class decl invalid. The diagnostic was already
2841 // emitted.
2842 if (!Class->isDependentContext())
2843 Class->setInvalidDecl();
2844 } else {
2845 // The base class is some non-dependent non-class type.
2846 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2847 return nullptr;
2848 }
2849
2850 // In HLSL, unspecified class access is public rather than private.
2851 if (getLangOpts().HLSL && Class->getTagKind() == TagTypeKind::Class &&
2852 Access == AS_none)
2853 Access = AS_public;
2854
2855 // Create the base specifier.
2856 return new (Context) CXXBaseSpecifier(
2857 SpecifierRange, Virtual, Class->getTagKind() == TagTypeKind::Class,
2858 Access, TInfo, EllipsisLoc);
2859}
2860
2862 const ParsedAttributesView &Attributes,
2863 bool Virtual, AccessSpecifier Access,
2864 ParsedType basetype, SourceLocation BaseLoc,
2865 SourceLocation EllipsisLoc) {
2866 if (!classdecl)
2867 return true;
2868
2869 AdjustDeclIfTemplate(classdecl);
2870 CXXRecordDecl *Class = dyn_cast<CXXRecordDecl>(classdecl);
2871 if (!Class)
2872 return true;
2873
2874 // We haven't yet attached the base specifiers.
2875 Class->setIsParsingBaseSpecifiers();
2876
2877 // We do not support any C++11 attributes on base-specifiers yet.
2878 // Diagnose any attributes we see.
2879 for (const ParsedAttr &AL : Attributes) {
2880 if (AL.isInvalid() || AL.getKind() == ParsedAttr::IgnoredAttribute)
2881 continue;
2882 if (AL.getKind() == ParsedAttr::UnknownAttribute)
2884 else
2885 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2886 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2887 }
2888
2889 TypeSourceInfo *TInfo = nullptr;
2890 GetTypeFromParser(basetype, &TInfo);
2891
2892 if (EllipsisLoc.isInvalid() &&
2893 DiagnoseUnexpandedParameterPack(SpecifierRange.getBegin(), TInfo,
2895 return true;
2896
2897 // C++ [class.union.general]p4:
2898 // [...] A union shall not have base classes.
2899 if (Class->isUnion()) {
2900 Diag(Class->getLocation(), diag::err_base_clause_on_union)
2901 << SpecifierRange;
2902 return true;
2903 }
2904
2905 if (CXXBaseSpecifier *BaseSpec = CheckBaseSpecifier(Class, SpecifierRange,
2906 Virtual, Access, TInfo,
2907 EllipsisLoc))
2908 return BaseSpec;
2909
2910 Class->setInvalidDecl();
2911 return true;
2912}
2913
2914/// Use small set to collect indirect bases. As this is only used
2915/// locally, there's no need to abstract the small size parameter.
2917
2918/// Recursively add the bases of Type. Don't add Type itself.
2919static void
2921 const QualType &Type)
2922{
2923 // Even though the incoming type is a base, it might not be
2924 // a class -- it could be a template parm, for instance.
2925 if (const auto *Decl = Type->getAsCXXRecordDecl()) {
2926 // Iterate over its bases.
2927 for (const auto &BaseSpec : Decl->bases()) {
2928 QualType Base = Context.getCanonicalType(BaseSpec.getType())
2929 .getUnqualifiedType();
2930 if (Set.insert(Base).second)
2931 // If we've not already seen it, recurse.
2932 NoteIndirectBases(Context, Set, Base);
2933 }
2934 }
2935}
2936
2939 if (Bases.empty())
2940 return false;
2941
2942 // Used to keep track of which base types we have already seen, so
2943 // that we can properly diagnose redundant direct base types. Note
2944 // that the key is always the unqualified canonical type of the base
2945 // class.
2946 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
2947
2948 // Used to track indirect bases so we can see if a direct base is
2949 // ambiguous.
2950 IndirectBaseSet IndirectBaseTypes;
2951
2952 // Copy non-redundant base specifiers into permanent storage.
2953 unsigned NumGoodBases = 0;
2954 bool Invalid = false;
2955 for (unsigned idx = 0; idx < Bases.size(); ++idx) {
2956 QualType NewBaseType
2957 = Context.getCanonicalType(Bases[idx]->getType());
2958 NewBaseType = NewBaseType.getLocalUnqualifiedType();
2959
2960 CXXBaseSpecifier *&KnownBase = KnownBaseTypes[NewBaseType];
2961 if (KnownBase) {
2962 // C++ [class.mi]p3:
2963 // A class shall not be specified as a direct base class of a
2964 // derived class more than once.
2965 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
2966 << KnownBase->getType() << Bases[idx]->getSourceRange();
2967
2968 // Delete the duplicate base class specifier; we're going to
2969 // overwrite its pointer later.
2970 Context.Deallocate(Bases[idx]);
2971
2972 Invalid = true;
2973 } else {
2974 // Okay, add this new base class.
2975 KnownBase = Bases[idx];
2976 Bases[NumGoodBases++] = Bases[idx];
2977
2978 if (NewBaseType->isDependentType())
2979 continue;
2980 // Note this base's direct & indirect bases, if there could be ambiguity.
2981 if (Bases.size() > 1)
2982 NoteIndirectBases(Context, IndirectBaseTypes, NewBaseType);
2983
2984 if (const auto *RD = NewBaseType->getAsCXXRecordDecl()) {
2985 if (Class->isInterface() &&
2986 (!RD->isInterfaceLike() ||
2987 KnownBase->getAccessSpecifier() != AS_public)) {
2988 // The Microsoft extension __interface does not permit bases that
2989 // are not themselves public interfaces.
2990 Diag(KnownBase->getBeginLoc(), diag::err_invalid_base_in_interface)
2991 << getRecordDiagFromTagKind(RD->getTagKind()) << RD
2992 << RD->getSourceRange();
2993 Invalid = true;
2994 }
2995 if (RD->hasAttr<WeakAttr>())
2996 Class->addAttr(WeakAttr::CreateImplicit(Context));
2997 }
2998 }
2999 }
3000
3001 // Attach the remaining base class specifiers to the derived class.
3002 Class->setBases(Bases.data(), NumGoodBases);
3003
3004 // Check that the only base classes that are duplicate are virtual.
3005 for (unsigned idx = 0; idx < NumGoodBases; ++idx) {
3006 // Check whether this direct base is inaccessible due to ambiguity.
3007 QualType BaseType = Bases[idx]->getType();
3008
3009 // Skip all dependent types in templates being used as base specifiers.
3010 // Checks below assume that the base specifier is a CXXRecord.
3011 if (BaseType->isDependentType())
3012 continue;
3013
3014 CanQualType CanonicalBase = Context.getCanonicalType(BaseType)
3015 .getUnqualifiedType();
3016
3017 if (IndirectBaseTypes.count(CanonicalBase)) {
3018 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
3019 /*DetectVirtual=*/true);
3020 bool found
3021 = Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
3022 assert(found);
3023 (void)found;
3024
3025 if (Paths.isAmbiguous(CanonicalBase))
3026 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
3027 << BaseType << getAmbiguousPathsDisplayString(Paths)
3028 << Bases[idx]->getSourceRange();
3029 else
3030 assert(Bases[idx]->isVirtual());
3031 }
3032
3033 // Delete the base class specifier, since its data has been copied
3034 // into the CXXRecordDecl.
3035 Context.Deallocate(Bases[idx]);
3036 }
3037
3038 return Invalid;
3039}
3040
3043 if (!ClassDecl || Bases.empty())
3044 return;
3045
3046 AdjustDeclIfTemplate(ClassDecl);
3047 AttachBaseSpecifiers(cast<CXXRecordDecl>(ClassDecl), Bases);
3048}
3049
3051 CXXRecordDecl *Base, CXXBasePaths &Paths) {
3052 if (!getLangOpts().CPlusPlus)
3053 return false;
3054
3055 if (!Base || !Derived)
3056 return false;
3057
3058 // If either the base or the derived type is invalid, don't try to
3059 // check whether one is derived from the other.
3060 if (Base->isInvalidDecl() || Derived->isInvalidDecl())
3061 return false;
3062
3063 // FIXME: In a modules build, do we need the entire path to be visible for us
3064 // to be able to use the inheritance relationship?
3065 if (!isCompleteType(Loc, Context.getCanonicalTagType(Derived)) &&
3066 !Derived->isBeingDefined())
3067 return false;
3068
3069 return Derived->isDerivedFrom(Base, Paths);
3070}
3071
3074 CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/false,
3075 /*DetectVirtual=*/false);
3076 return IsDerivedFrom(Loc, Derived, Base, Paths);
3077}
3078
3080 CXXBasePaths Paths(/*FindAmbiguities=*/false, /*RecordPaths=*/false,
3081 /*DetectVirtual=*/false);
3082 return IsDerivedFrom(Loc, Derived->getAsCXXRecordDecl(),
3083 Base->getAsCXXRecordDecl(), Paths);
3084}
3085
3087 CXXBasePaths &Paths) {
3088 return IsDerivedFrom(Loc, Derived->getAsCXXRecordDecl(),
3089 Base->getAsCXXRecordDecl(), Paths);
3090}
3091
3092static void BuildBasePathArray(const CXXBasePath &Path,
3093 CXXCastPath &BasePathArray) {
3094 // We first go backward and check if we have a virtual base.
3095 // FIXME: It would be better if CXXBasePath had the base specifier for
3096 // the nearest virtual base.
3097 unsigned Start = 0;
3098 for (unsigned I = Path.size(); I != 0; --I) {
3099 if (Path[I - 1].Base->isVirtual()) {
3100 Start = I - 1;
3101 break;
3102 }
3103 }
3104
3105 // Now add all bases.
3106 for (unsigned I = Start, E = Path.size(); I != E; ++I)
3107 BasePathArray.push_back(const_cast<CXXBaseSpecifier*>(Path[I].Base));
3108}
3109
3110
3112 CXXCastPath &BasePathArray) {
3113 assert(BasePathArray.empty() && "Base path array must be empty!");
3114 assert(Paths.isRecordingPaths() && "Must record paths!");
3115 return ::BuildBasePathArray(Paths.front(), BasePathArray);
3116}
3117
3118bool
3120 unsigned InaccessibleBaseID,
3121 unsigned AmbiguousBaseConvID,
3122 SourceLocation Loc, SourceRange Range,
3123 DeclarationName Name,
3124 CXXCastPath *BasePath,
3125 bool IgnoreAccess) {
3126 // First, determine whether the path from Derived to Base is
3127 // ambiguous. This is slightly more expensive than checking whether
3128 // the Derived to Base conversion exists, because here we need to
3129 // explore multiple paths to determine if there is an ambiguity.
3130 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
3131 /*DetectVirtual=*/false);
3132 bool DerivationOkay = IsDerivedFrom(Loc, Derived, Base, Paths);
3133 if (!DerivationOkay)
3134 return true;
3135
3136 const CXXBasePath *Path = nullptr;
3137 if (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType()))
3138 Path = &Paths.front();
3139
3140 // For MSVC compatibility, check if Derived directly inherits from Base. Clang
3141 // warns about this hierarchy under -Winaccessible-base, but MSVC allows the
3142 // user to access such bases.
3143 if (!Path && getLangOpts().MSVCCompat) {
3144 for (const CXXBasePath &PossiblePath : Paths) {
3145 if (PossiblePath.size() == 1) {
3146 Path = &PossiblePath;
3147 if (AmbiguousBaseConvID)
3148 Diag(Loc, diag::ext_ms_ambiguous_direct_base)
3149 << Base << Derived << Range;
3150 break;
3151 }
3152 }
3153 }
3154
3155 if (Path) {
3156 if (!IgnoreAccess) {
3157 // Check that the base class can be accessed.
3158 switch (
3159 CheckBaseClassAccess(Loc, Base, Derived, *Path, InaccessibleBaseID)) {
3160 case AR_inaccessible:
3161 return true;
3162 case AR_accessible:
3163 case AR_dependent:
3164 case AR_delayed:
3165 break;
3166 }
3167 }
3168
3169 // Build a base path if necessary.
3170 if (BasePath)
3171 ::BuildBasePathArray(*Path, *BasePath);
3172 return false;
3173 }
3174
3175 if (AmbiguousBaseConvID) {
3176 // We know that the derived-to-base conversion is ambiguous, and
3177 // we're going to produce a diagnostic. Perform the derived-to-base
3178 // search just one more time to compute all of the possible paths so
3179 // that we can print them out. This is more expensive than any of
3180 // the previous derived-to-base checks we've done, but at this point
3181 // performance isn't as much of an issue.
3182 Paths.clear();
3183 Paths.setRecordingPaths(true);
3184 bool StillOkay = IsDerivedFrom(Loc, Derived, Base, Paths);
3185 assert(StillOkay && "Can only be used with a derived-to-base conversion");
3186 (void)StillOkay;
3187
3188 // Build up a textual representation of the ambiguous paths, e.g.,
3189 // D -> B -> A, that will be used to illustrate the ambiguous
3190 // conversions in the diagnostic. We only print one of the paths
3191 // to each base class subobject.
3192 std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths);
3193
3194 Diag(Loc, AmbiguousBaseConvID)
3195 << Derived << Base << PathDisplayStr << Range << Name;
3196 }
3197 return true;
3198}
3199
3200bool
3202 SourceLocation Loc, SourceRange Range,
3203 CXXCastPath *BasePath,
3204 bool IgnoreAccess) {
3206 Derived, Base, diag::err_upcast_to_inaccessible_base,
3207 diag::err_ambiguous_derived_to_base_conv, Loc, Range, DeclarationName(),
3208 BasePath, IgnoreAccess);
3209}
3210
3212 std::string PathDisplayStr;
3213 std::set<unsigned> DisplayedPaths;
3214 for (CXXBasePaths::paths_iterator Path = Paths.begin();
3215 Path != Paths.end(); ++Path) {
3216 if (DisplayedPaths.insert(Path->back().SubobjectNumber).second) {
3217 // We haven't displayed a path to this particular base
3218 // class subobject yet.
3219 PathDisplayStr += "\n ";
3220 PathDisplayStr += QualType(Context.getCanonicalTagType(Paths.getOrigin()))
3221 .getAsString();
3222 for (CXXBasePath::const_iterator Element = Path->begin();
3223 Element != Path->end(); ++Element)
3224 PathDisplayStr += " -> " + Element->Base->getType().getAsString();
3225 }
3226 }
3227
3228 return PathDisplayStr;
3229}
3230
3231//===----------------------------------------------------------------------===//
3232// C++ class member Handling
3233//===----------------------------------------------------------------------===//
3234
3236 SourceLocation ColonLoc,
3237 const ParsedAttributesView &Attrs) {
3238 assert(Access != AS_none && "Invalid kind for syntactic access specifier!");
3240 ASLoc, ColonLoc);
3241 CurContext->addHiddenDecl(ASDecl);
3242 return ProcessAccessDeclAttributeList(ASDecl, Attrs);
3243}
3244
3246 if (D->isInvalidDecl())
3247 return;
3248
3249 // We only care about "override" and "final" declarations.
3250 if (!D->hasAttr<OverrideAttr>() && !D->hasAttr<FinalAttr>())
3251 return;
3252
3253 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D);
3254
3255 // We can't check dependent instance methods.
3256 if (MD && MD->isInstance() &&
3257 (MD->getParent()->hasAnyDependentBases() ||
3258 MD->getType()->isDependentType()))
3259 return;
3260
3261 if (MD && !MD->isVirtual()) {
3262 // If we have a non-virtual method, check if it hides a virtual method.
3263 // (In that case, it's most likely the method has the wrong type.)
3264 SmallVector<CXXMethodDecl *, 8> OverloadedMethods;
3265 FindHiddenVirtualMethods(MD, OverloadedMethods);
3266
3267 if (!OverloadedMethods.empty()) {
3268 if (OverrideAttr *OA = D->getAttr<OverrideAttr>()) {
3269 Diag(OA->getLocation(),
3270 diag::override_keyword_hides_virtual_member_function)
3271 << "override" << (OverloadedMethods.size() > 1);
3272 } else if (FinalAttr *FA = D->getAttr<FinalAttr>()) {
3273 Diag(FA->getLocation(),
3274 diag::override_keyword_hides_virtual_member_function)
3275 << (FA->isSpelledAsSealed() ? "sealed" : "final")
3276 << (OverloadedMethods.size() > 1);
3277 }
3278 NoteHiddenVirtualMethods(MD, OverloadedMethods);
3279 MD->setInvalidDecl();
3280 return;
3281 }
3282 // Fall through into the general case diagnostic.
3283 // FIXME: We might want to attempt typo correction here.
3284 }
3285
3286 if (!MD || !MD->isVirtual()) {
3287 if (OverrideAttr *OA = D->getAttr<OverrideAttr>()) {
3288 Diag(OA->getLocation(),
3289 diag::override_keyword_only_allowed_on_virtual_member_functions)
3290 << "override" << FixItHint::CreateRemoval(OA->getLocation());
3291 D->dropAttr<OverrideAttr>();
3292 }
3293 if (FinalAttr *FA = D->getAttr<FinalAttr>()) {
3294 Diag(FA->getLocation(),
3295 diag::override_keyword_only_allowed_on_virtual_member_functions)
3296 << (FA->isSpelledAsSealed() ? "sealed" : "final")
3297 << FixItHint::CreateRemoval(FA->getLocation());
3298 D->dropAttr<FinalAttr>();
3299 }
3300 return;
3301 }
3302
3303 // C++11 [class.virtual]p5:
3304 // If a function is marked with the virt-specifier override and
3305 // does not override a member function of a base class, the program is
3306 // ill-formed.
3307 bool HasOverriddenMethods = MD->size_overridden_methods() != 0;
3308 if (MD->hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3309 Diag(MD->getLocation(), diag::err_function_marked_override_not_overriding)
3310 << MD->getDeclName();
3311}
3312
3314 if (D->isInvalidDecl() || D->hasAttr<OverrideAttr>())
3315 return;
3316 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D);
3317 if (!MD || MD->isImplicit() || MD->hasAttr<FinalAttr>())
3318 return;
3319
3320 SourceLocation Loc = MD->getLocation();
3321 SourceLocation SpellingLoc = Loc;
3322 if (getSourceManager().isMacroArgExpansion(Loc))
3323 SpellingLoc = getSourceManager().getImmediateExpansionRange(Loc).getBegin();
3324 SpellingLoc = getSourceManager().getSpellingLoc(SpellingLoc);
3325 if (SpellingLoc.isValid() && getSourceManager().isInSystemHeader(SpellingLoc))
3326 return;
3327
3328 if (MD->size_overridden_methods() > 0) {
3329 auto EmitDiag = [&](unsigned DiagInconsistent, unsigned DiagSuggest) {
3330 unsigned DiagID =
3331 Inconsistent && !Diags.isIgnored(DiagInconsistent, MD->getLocation())
3332 ? DiagInconsistent
3333 : DiagSuggest;
3334 Diag(MD->getLocation(), DiagID) << MD->getDeclName();
3335 const CXXMethodDecl *OMD = *MD->begin_overridden_methods();
3336 Diag(OMD->getLocation(), diag::note_overridden_virtual_function);
3337 };
3338 if (isa<CXXDestructorDecl>(MD))
3339 EmitDiag(
3340 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3341 diag::warn_suggest_destructor_marked_not_override_overriding);
3342 else
3343 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3344 diag::warn_suggest_function_marked_not_override_overriding);
3345 }
3346}
3347
3349 const CXXMethodDecl *Old) {
3350 FinalAttr *FA = Old->getAttr<FinalAttr>();
3351 if (!FA)
3352 return false;
3353
3354 Diag(New->getLocation(), diag::err_final_function_overridden)
3355 << New->getDeclName()
3356 << FA->isSpelledAsSealed();
3357 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
3358 return true;
3359}
3360
3362 const Type *T = FD.getType()->getBaseElementTypeUnsafe();
3363 // FIXME: Destruction of ObjC lifetime types has side-effects.
3364 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
3365 return !RD->isCompleteDefinition() ||
3366 !RD->hasTrivialDefaultConstructor() ||
3367 !RD->hasTrivialDestructor();
3368 return false;
3369}
3370
3371void Sema::CheckShadowInheritedFields(const SourceLocation &Loc,
3372 DeclarationName FieldName,
3373 const CXXRecordDecl *RD,
3374 bool DeclIsField) {
3375 if (Diags.isIgnored(diag::warn_shadow_field, Loc))
3376 return;
3377
3378 // To record a shadowed field in a base
3379 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3380 auto FieldShadowed = [&](const CXXBaseSpecifier *Specifier,
3381 CXXBasePath &Path) {
3382 const auto Base = Specifier->getType()->getAsCXXRecordDecl();
3383 // Record an ambiguous path directly
3384 if (Bases.find(Base) != Bases.end())
3385 return true;
3386 for (const auto Field : Base->lookup(FieldName)) {
3387 if ((isa<FieldDecl>(Field) || isa<IndirectFieldDecl>(Field)) &&
3388 Field->getAccess() != AS_private) {
3389 assert(Field->getAccess() != AS_none);
3390 assert(Bases.find(Base) == Bases.end());
3391 Bases[Base] = Field;
3392 return true;
3393 }
3394 }
3395 return false;
3396 };
3397
3398 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
3399 /*DetectVirtual=*/true);
3400 if (!RD->lookupInBases(FieldShadowed, Paths))
3401 return;
3402
3403 for (const auto &P : Paths) {
3404 auto Base = P.back().Base->getType()->getAsCXXRecordDecl();
3405 auto It = Bases.find(Base);
3406 // Skip duplicated bases
3407 if (It == Bases.end())
3408 continue;
3409 auto BaseField = It->second;
3410 assert(BaseField->getAccess() != AS_private);
3411 if (AS_none !=
3412 CXXRecordDecl::MergeAccess(P.Access, BaseField->getAccess())) {
3413 Diag(Loc, diag::warn_shadow_field)
3414 << FieldName << RD << Base << DeclIsField;
3415 Diag(BaseField->getLocation(), diag::note_shadow_field);
3416 Bases.erase(It);
3417 }
3418 }
3419}
3420
3421template <typename AttrType>
3422inline static bool HasAttribute(const QualType &T) {
3423 if (const TagDecl *TD = T->getAsTagDecl())
3424 return TD->hasAttr<AttrType>();
3425 if (const TypedefType *TDT = T->getAs<TypedefType>())
3426 return TDT->getDecl()->hasAttr<AttrType>();
3427 return false;
3428}
3429
3430static bool IsUnusedPrivateField(const FieldDecl *FD) {
3431 if (FD->getAccess() == AS_private && FD->getDeclName()) {
3432 QualType FieldType = FD->getType();
3433 if (HasAttribute<WarnUnusedAttr>(FieldType))
3434 return true;
3435
3436 return !FD->isImplicit() && !FD->hasAttr<UnusedAttr>() &&
3437 !FD->getParent()->isDependentContext() &&
3438 !HasAttribute<UnusedAttr>(FieldType) &&
3440 }
3441 return false;
3442}
3443
3444NamedDecl *
3446 MultiTemplateParamsArg TemplateParameterLists,
3447 Expr *BitWidth, const VirtSpecifiers &VS,
3448 InClassInitStyle InitStyle) {
3449 const DeclSpec &DS = D.getDeclSpec();
3451 DeclarationName Name = NameInfo.getName();
3452 SourceLocation Loc = NameInfo.getLoc();
3453
3454 // For anonymous bitfields, the location should point to the type.
3455 if (Loc.isInvalid())
3456 Loc = D.getBeginLoc();
3457
3459 assert(!DS.isFriendSpecified());
3460
3461 bool isFunc = D.isDeclarationOfFunction();
3462 const ParsedAttr *MSPropertyAttr =
3464
3465 if (cast<CXXRecordDecl>(CurContext)->isInterface()) {
3466 // The Microsoft extension __interface only permits public member functions
3467 // and prohibits constructors, destructors, operators, non-public member
3468 // functions, static methods and data members.
3469 unsigned InvalidDecl;
3470 bool ShowDeclName = true;
3471 if (!isFunc &&
3472 (DS.getStorageClassSpec() == DeclSpec::SCS_typedef || MSPropertyAttr))
3473 InvalidDecl = 0;
3474 else if (!isFunc)
3475 InvalidDecl = 1;
3476 else if (AS != AS_public)
3477 InvalidDecl = 2;
3479 InvalidDecl = 3;
3480 else switch (Name.getNameKind()) {
3482 InvalidDecl = 4;
3483 ShowDeclName = false;
3484 break;
3485
3487 InvalidDecl = 5;
3488 ShowDeclName = false;
3489 break;
3490
3493 InvalidDecl = 6;
3494 break;
3495
3496 default:
3497 InvalidDecl = 0;
3498 break;
3499 }
3500
3501 if (InvalidDecl) {
3502 if (ShowDeclName)
3503 Diag(Loc, diag::err_invalid_member_in_interface)
3504 << (InvalidDecl-1) << Name;
3505 else
3506 Diag(Loc, diag::err_invalid_member_in_interface)
3507 << (InvalidDecl-1) << "";
3508 return nullptr;
3509 }
3510 }
3511
3512 // C++ 9.2p6: A member shall not be declared to have automatic storage
3513 // duration (auto, register) or with the extern storage-class-specifier.
3514 // C++ 7.1.1p8: The mutable specifier can be applied only to names of class
3515 // data members and cannot be applied to names declared const or static,
3516 // and cannot be applied to reference members.
3517 switch (DS.getStorageClassSpec()) {
3521 break;
3523 if (isFunc) {
3524 Diag(DS.getStorageClassSpecLoc(), diag::err_mutable_function);
3525
3526 // FIXME: It would be nicer if the keyword was ignored only for this
3527 // declarator. Otherwise we could get follow-up errors.
3529 }
3530 break;
3531 default:
3533 diag::err_storageclass_invalid_for_member);
3535 break;
3536 }
3537
3538 bool isInstField = (DS.getStorageClassSpec() == DeclSpec::SCS_unspecified ||
3540 !isFunc && TemplateParameterLists.empty();
3541
3542 if (DS.hasConstexprSpecifier() && isInstField) {
3544 Diag(DS.getConstexprSpecLoc(), diag::err_invalid_constexpr_member);
3545 SourceLocation ConstexprLoc = DS.getConstexprSpecLoc();
3546 if (InitStyle == ICIS_NoInit) {
3547 B << 0 << 0;
3549 B << FixItHint::CreateRemoval(ConstexprLoc);
3550 else {
3551 B << FixItHint::CreateReplacement(ConstexprLoc, "const");
3553 const char *PrevSpec;
3554 unsigned DiagID;
3555 bool Failed = D.getMutableDeclSpec().SetTypeQual(
3556 DeclSpec::TQ_const, ConstexprLoc, PrevSpec, DiagID, getLangOpts());
3557 (void)Failed;
3558 assert(!Failed && "Making a constexpr member const shouldn't fail");
3559 }
3560 } else {
3561 B << 1;
3562 const char *PrevSpec;
3563 unsigned DiagID;
3565 *this, DeclSpec::SCS_static, ConstexprLoc, PrevSpec, DiagID,
3566 Context.getPrintingPolicy())) {
3568 "This is the only DeclSpec that should fail to be applied");
3569 B << 1;
3570 } else {
3571 B << 0 << FixItHint::CreateInsertion(ConstexprLoc, "static ");
3572 isInstField = false;
3573 }
3574 }
3575 }
3576
3578 if (isInstField) {
3579 CXXScopeSpec &SS = D.getCXXScopeSpec();
3580
3581 // Data members must have identifiers for names.
3582 if (!Name.isIdentifier()) {
3583 Diag(Loc, diag::err_bad_variable_name)
3584 << Name;
3585 return nullptr;
3586 }
3587
3590 Diag(D.getIdentifierLoc(), diag::err_member_with_template_arguments)
3591 << II
3595 D.SetIdentifier(II, Loc);
3596 }
3597
3598 if (SS.isSet() && !SS.isInvalid()) {
3599 // The user provided a superfluous scope specifier inside a class
3600 // definition:
3601 //
3602 // class X {
3603 // int X::member;
3604 // };
3605 if (DeclContext *DC = computeDeclContext(SS, false)) {
3606 TemplateIdAnnotation *TemplateId =
3608 ? D.getName().TemplateId
3609 : nullptr;
3611 TemplateId,
3612 /*IsMemberSpecialization=*/false);
3613 } else {
3614 Diag(D.getIdentifierLoc(), diag::err_member_qualification)
3615 << Name << SS.getRange();
3616 }
3617 SS.clear();
3618 }
3619
3620 if (MSPropertyAttr) {
3622 BitWidth, InitStyle, AS, *MSPropertyAttr);
3623 if (!Member)
3624 return nullptr;
3625 isInstField = false;
3626 } else {
3628 BitWidth, InitStyle, AS);
3629 if (!Member)
3630 return nullptr;
3631 }
3632
3633 CheckShadowInheritedFields(Loc, Name, cast<CXXRecordDecl>(CurContext));
3634 } else {
3635 Member = HandleDeclarator(S, D, TemplateParameterLists);
3636 if (!Member)
3637 return nullptr;
3638
3639 // Non-instance-fields can't have a bitfield.
3640 if (BitWidth) {
3641 if (Member->isInvalidDecl()) {
3642 // don't emit another diagnostic.
3644 // C++ 9.6p3: A bit-field shall not be a static member.
3645 // "static member 'A' cannot be a bit-field"
3646 Diag(Loc, diag::err_static_not_bitfield)
3647 << Name << BitWidth->getSourceRange();
3648 } else if (isa<TypedefDecl>(Member)) {
3649 // "typedef member 'x' cannot be a bit-field"
3650 Diag(Loc, diag::err_typedef_not_bitfield)
3651 << Name << BitWidth->getSourceRange();
3652 } else {
3653 // A function typedef ("typedef int f(); f a;").
3654 // C++ 9.6p3: A bit-field shall have integral or enumeration type.
3655 Diag(Loc, diag::err_not_integral_type_bitfield)
3656 << Name << cast<ValueDecl>(Member)->getType()
3657 << BitWidth->getSourceRange();
3658 }
3659
3660 BitWidth = nullptr;
3661 Member->setInvalidDecl();
3662 }
3663
3664 NamedDecl *NonTemplateMember = Member;
3665 if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(Member))
3666 NonTemplateMember = FunTmpl->getTemplatedDecl();
3667 else if (VarTemplateDecl *VarTmpl = dyn_cast<VarTemplateDecl>(Member))
3668 NonTemplateMember = VarTmpl->getTemplatedDecl();
3669
3670 Member->setAccess(AS);
3671
3672 // If we have declared a member function template or static data member
3673 // template, set the access of the templated declaration as well.
3674 if (NonTemplateMember != Member)
3675 NonTemplateMember->setAccess(AS);
3676
3677 // C++ [temp.deduct.guide]p3:
3678 // A deduction guide [...] for a member class template [shall be
3679 // declared] with the same access [as the template].
3680 if (auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3681 auto *TD = DG->getDeducedTemplate();
3682 // Access specifiers are only meaningful if both the template and the
3683 // deduction guide are from the same scope.
3684 if (AS != TD->getAccess() &&
3685 TD->getDeclContext()->getRedeclContext()->Equals(
3686 DG->getDeclContext()->getRedeclContext())) {
3687 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3688 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3689 << TD->getAccess();
3690 const AccessSpecDecl *LastAccessSpec = nullptr;
3691 for (const auto *D : cast<CXXRecordDecl>(CurContext)->decls()) {
3692 if (const auto *AccessSpec = dyn_cast<AccessSpecDecl>(D))
3693 LastAccessSpec = AccessSpec;
3694 }
3695 assert(LastAccessSpec && "differing access with no access specifier");
3696 Diag(LastAccessSpec->getBeginLoc(), diag::note_deduction_guide_access)
3697 << AS;
3698 }
3699 }
3700 }
3701
3702 if (VS.isOverrideSpecified())
3703 Member->addAttr(OverrideAttr::Create(Context, VS.getOverrideLoc()));
3704 if (VS.isFinalSpecified())
3705 Member->addAttr(FinalAttr::Create(Context, VS.getFinalLoc(),
3707 ? FinalAttr::Keyword_sealed
3708 : FinalAttr::Keyword_final));
3709
3710 if (VS.getLastLocation().isValid()) {
3711 // Update the end location of a method that has a virt-specifiers.
3712 if (CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(Member))
3713 MD->setRangeEnd(VS.getLastLocation());
3714 }
3715
3717
3718 assert((Name || isInstField) && "No identifier for non-field ?");
3719
3720 if (isInstField) {
3722 FieldCollector->Add(FD);
3723
3724 if (!Diags.isIgnored(diag::warn_unused_private_field, FD->getLocation()) &&
3726 // Remember all explicit private FieldDecls that have a name, no side
3727 // effects and are not part of a dependent type declaration.
3728 UnusedPrivateFields.insert(FD);
3729 }
3730 }
3731
3732 return Member;
3733}
3734
3735namespace {
3736 class UninitializedFieldVisitor
3737 : public EvaluatedExprVisitor<UninitializedFieldVisitor> {
3738 Sema &S;
3739 // List of Decls to generate a warning on. Also remove Decls that become
3740 // initialized.
3741 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3742 // List of base classes of the record. Classes are removed after their
3743 // initializers.
3744 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3745 // Vector of decls to be removed from the Decl set prior to visiting the
3746 // nodes. These Decls may have been initialized in the prior initializer.
3748 // If non-null, add a note to the warning pointing back to the constructor.
3750 // Variables to hold state when processing an initializer list. When
3751 // InitList is true, special case initialization of FieldDecls matching
3752 // InitListFieldDecl.
3753 bool InitList;
3754 FieldDecl *InitListFieldDecl;
3755 llvm::SmallVector<unsigned, 4> InitFieldIndex;
3756
3757 public:
3759 UninitializedFieldVisitor(Sema &S,
3760 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3761 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3762 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3763 Constructor(nullptr), InitList(false), InitListFieldDecl(nullptr) {}
3764
3765 // Returns true if the use of ME is not an uninitialized use.
3766 bool IsInitListMemberExprInitialized(MemberExpr *ME,
3767 bool CheckReferenceOnly) {
3769 bool ReferenceField = false;
3770 while (ME) {
3771 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
3772 if (!FD)
3773 return false;
3774 Fields.push_back(FD);
3775 if (FD->getType()->isReferenceType())
3776 ReferenceField = true;
3777 ME = dyn_cast<MemberExpr>(ME->getBase()->IgnoreParenImpCasts());
3778 }
3779
3780 // Binding a reference to an uninitialized field is not an
3781 // uninitialized use.
3782 if (CheckReferenceOnly && !ReferenceField)
3783 return true;
3784
3785 // Discard the first field since it is the field decl that is being
3786 // initialized.
3787 auto UsedFields = llvm::drop_begin(llvm::reverse(Fields));
3788 auto UsedIter = UsedFields.begin();
3789 const auto UsedEnd = UsedFields.end();
3790
3791 for (const unsigned Orig : InitFieldIndex) {
3792 if (UsedIter == UsedEnd)
3793 break;
3794 const unsigned UsedIndex = (*UsedIter)->getFieldIndex();
3795 if (UsedIndex < Orig)
3796 return true;
3797 if (UsedIndex > Orig)
3798 break;
3799 ++UsedIter;
3800 }
3801
3802 return false;
3803 }
3804
3805 void HandleMemberExpr(MemberExpr *ME, bool CheckReferenceOnly,
3806 bool AddressOf) {
3808 return;
3809
3810 // FieldME is the inner-most MemberExpr that is not an anonymous struct
3811 // or union.
3812 MemberExpr *FieldME = ME;
3813
3814 bool AllPODFields = FieldME->getType().isPODType(S.Context);
3815
3816 Expr *Base = ME;
3817 while (MemberExpr *SubME =
3818 dyn_cast<MemberExpr>(Base->IgnoreParenImpCasts())) {
3819
3820 if (isa<VarDecl>(SubME->getMemberDecl()))
3821 return;
3822
3823 if (FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3824 if (!FD->isAnonymousStructOrUnion())
3825 FieldME = SubME;
3826
3827 if (!FieldME->getType().isPODType(S.Context))
3828 AllPODFields = false;
3829
3830 Base = SubME->getBase();
3831 }
3832
3833 if (!isa<CXXThisExpr>(Base->IgnoreParenImpCasts())) {
3834 Visit(Base);
3835 return;
3836 }
3837
3838 if (AddressOf && AllPODFields)
3839 return;
3840
3841 ValueDecl* FoundVD = FieldME->getMemberDecl();
3842
3843 if (ImplicitCastExpr *BaseCast = dyn_cast<ImplicitCastExpr>(Base)) {
3844 while (isa<ImplicitCastExpr>(BaseCast->getSubExpr())) {
3845 BaseCast = cast<ImplicitCastExpr>(BaseCast->getSubExpr());
3846 }
3847
3848 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3849 QualType T = BaseCast->getType();
3850 if (T->isPointerType() &&
3851 BaseClasses.count(T->getPointeeType())) {
3852 S.Diag(FieldME->getExprLoc(), diag::warn_base_class_is_uninit)
3853 << T->getPointeeType() << FoundVD;
3854 }
3855 }
3856 }
3857
3858 if (!Decls.count(FoundVD))
3859 return;
3860
3861 const bool IsReference = FoundVD->getType()->isReferenceType();
3862
3863 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3864 // Special checking for initializer lists.
3865 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3866 return;
3867 }
3868 } else {
3869 // Prevent double warnings on use of unbounded references.
3870 if (CheckReferenceOnly && !IsReference)
3871 return;
3872 }
3873
3874 unsigned diag = IsReference
3875 ? diag::warn_reference_field_is_uninit
3876 : diag::warn_field_is_uninit;
3877 S.Diag(FieldME->getExprLoc(), diag) << FoundVD;
3878 if (Constructor)
3879 S.Diag(Constructor->getLocation(),
3880 diag::note_uninit_in_this_constructor)
3881 << (Constructor->isDefaultConstructor() && Constructor->isImplicit());
3882
3883 }
3884
3885 void HandleValue(Expr *E, bool AddressOf) {
3886 E = E->IgnoreParens();
3887
3888 if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
3889 HandleMemberExpr(ME, false /*CheckReferenceOnly*/,
3890 AddressOf /*AddressOf*/);
3891 return;
3892 }
3893
3894 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
3895 Visit(CO->getCond());
3896 HandleValue(CO->getTrueExpr(), AddressOf);
3897 HandleValue(CO->getFalseExpr(), AddressOf);
3898 return;
3899 }
3900
3901 if (BinaryConditionalOperator *BCO =
3902 dyn_cast<BinaryConditionalOperator>(E)) {
3903 Visit(BCO->getCond());
3904 HandleValue(BCO->getFalseExpr(), AddressOf);
3905 return;
3906 }
3907
3908 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
3909 HandleValue(OVE->getSourceExpr(), AddressOf);
3910 return;
3911 }
3912
3913 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
3914 switch (BO->getOpcode()) {
3915 default:
3916 break;
3917 case(BO_PtrMemD):
3918 case(BO_PtrMemI):
3919 HandleValue(BO->getLHS(), AddressOf);
3920 Visit(BO->getRHS());
3921 return;
3922 case(BO_Comma):
3923 Visit(BO->getLHS());
3924 HandleValue(BO->getRHS(), AddressOf);
3925 return;
3926 }
3927 }
3928
3929 Visit(E);
3930 }
3931
3932 void CheckInitListExpr(InitListExpr *ILE) {
3933 InitFieldIndex.push_back(0);
3934 for (auto *Child : ILE->children()) {
3935 if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
3936 CheckInitListExpr(SubList);
3937 } else {
3938 Visit(Child);
3939 }
3940 ++InitFieldIndex.back();
3941 }
3942 InitFieldIndex.pop_back();
3943 }
3944
3945 void CheckInitializer(Expr *E, const CXXConstructorDecl *FieldConstructor,
3946 FieldDecl *Field, const Type *BaseClass) {
3947 // Remove Decls that may have been initialized in the previous
3948 // initializer.
3949 for (ValueDecl* VD : DeclsToRemove)
3950 Decls.erase(VD);
3951 DeclsToRemove.clear();
3952
3953 Constructor = FieldConstructor;
3954 InitListExpr *ILE = dyn_cast<InitListExpr>(E);
3955
3956 if (ILE && Field) {
3957 InitList = true;
3958 InitListFieldDecl = Field;
3959 InitFieldIndex.clear();
3960 CheckInitListExpr(ILE);
3961 } else {
3962 InitList = false;
3963 Visit(E);
3964 }
3965
3966 if (Field)
3967 Decls.erase(Field);
3968 if (BaseClass)
3969 BaseClasses.erase(BaseClass->getCanonicalTypeInternal());
3970 }
3971
3972 void VisitMemberExpr(MemberExpr *ME) {
3973 // All uses of unbounded reference fields will warn.
3974 HandleMemberExpr(ME, true /*CheckReferenceOnly*/, false /*AddressOf*/);
3975 }
3976
3977 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
3978 if (E->getCastKind() == CK_LValueToRValue) {
3979 HandleValue(E->getSubExpr(), false /*AddressOf*/);
3980 return;
3981 }
3982
3983 Inherited::VisitImplicitCastExpr(E);
3984 }
3985
3986 void VisitCXXConstructExpr(CXXConstructExpr *E) {
3987 if (E->getConstructor()->isCopyConstructor()) {
3988 Expr *ArgExpr = E->getArg(0);
3989 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
3990 if (ILE->getNumInits() == 1)
3991 ArgExpr = ILE->getInit(0);
3992 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
3993 if (ICE->getCastKind() == CK_NoOp)
3994 ArgExpr = ICE->getSubExpr();
3995 HandleValue(ArgExpr, false /*AddressOf*/);
3996 return;
3997 }
3998 Inherited::VisitCXXConstructExpr(E);
3999 }
4000
4001 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
4002 Expr *Callee = E->getCallee();
4003 if (isa<MemberExpr>(Callee)) {
4004 HandleValue(Callee, false /*AddressOf*/);
4005 for (auto *Arg : E->arguments())
4006 Visit(Arg);
4007 return;
4008 }
4009
4010 Inherited::VisitCXXMemberCallExpr(E);
4011 }
4012
4013 void VisitCallExpr(CallExpr *E) {
4014 // Treat std::move as a use.
4015 if (E->isCallToStdMove()) {
4016 HandleValue(E->getArg(0), /*AddressOf=*/false);
4017 return;
4018 }
4019
4020 Inherited::VisitCallExpr(E);
4021 }
4022
4023 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
4024 Expr *Callee = E->getCallee();
4025
4026 if (isa<UnresolvedLookupExpr>(Callee))
4027 return Inherited::VisitCXXOperatorCallExpr(E);
4028
4029 Visit(Callee);
4030 for (auto *Arg : E->arguments())
4031 HandleValue(Arg->IgnoreParenImpCasts(), false /*AddressOf*/);
4032 }
4033
4034 void VisitBinaryOperator(BinaryOperator *E) {
4035 // If a field assignment is detected, remove the field from the
4036 // uninitiailized field set.
4037 if (E->getOpcode() == BO_Assign)
4038 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->getLHS()))
4039 if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl()))
4040 if (!FD->getType()->isReferenceType())
4041 DeclsToRemove.push_back(FD);
4042
4043 if (E->isCompoundAssignmentOp()) {
4044 HandleValue(E->getLHS(), false /*AddressOf*/);
4045 Visit(E->getRHS());
4046 return;
4047 }
4048
4049 Inherited::VisitBinaryOperator(E);
4050 }
4051
4052 void VisitUnaryOperator(UnaryOperator *E) {
4053 if (E->isIncrementDecrementOp()) {
4054 HandleValue(E->getSubExpr(), false /*AddressOf*/);
4055 return;
4056 }
4057 if (E->getOpcode() == UO_AddrOf) {
4058 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->getSubExpr())) {
4059 HandleValue(ME->getBase(), true /*AddressOf*/);
4060 return;
4061 }
4062 }
4063
4064 Inherited::VisitUnaryOperator(E);
4065 }
4066 };
4067
4068 // Diagnose value-uses of fields to initialize themselves, e.g.
4069 // foo(foo)
4070 // where foo is not also a parameter to the constructor.
4071 // Also diagnose across field uninitialized use such as
4072 // x(y), y(x)
4073 // TODO: implement -Wuninitialized and fold this into that framework.
4074 static void DiagnoseUninitializedFields(
4075 Sema &SemaRef, const CXXConstructorDecl *Constructor) {
4076
4077 if (SemaRef.getDiagnostics().isIgnored(diag::warn_field_is_uninit,
4078 Constructor->getLocation())) {
4079 return;
4080 }
4081
4082 if (Constructor->isInvalidDecl())
4083 return;
4084
4085 const CXXRecordDecl *RD = Constructor->getParent();
4086
4087 if (RD->isDependentContext())
4088 return;
4089
4090 // Holds fields that are uninitialized.
4091 llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;
4092
4093 // At the beginning, all fields are uninitialized.
4094 for (auto *I : RD->decls()) {
4095 if (auto *FD = dyn_cast<FieldDecl>(I)) {
4096 UninitializedFields.insert(FD);
4097 } else if (auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
4098 UninitializedFields.insert(IFD->getAnonField());
4099 }
4100 }
4101
4102 llvm::SmallPtrSet<QualType, 4> UninitializedBaseClasses;
4103 for (const auto &I : RD->bases())
4104 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
4105
4106 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4107 return;
4108
4109 UninitializedFieldVisitor UninitializedChecker(SemaRef,
4110 UninitializedFields,
4111 UninitializedBaseClasses);
4112
4113 for (const auto *FieldInit : Constructor->inits()) {
4114 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
4115 break;
4116
4117 Expr *InitExpr = FieldInit->getInit();
4118 if (!InitExpr)
4119 continue;
4120
4121 if (CXXDefaultInitExpr *Default =
4122 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4123 InitExpr = Default->getExpr();
4124 if (!InitExpr)
4125 continue;
4126 // In class initializers will point to the constructor.
4127 UninitializedChecker.CheckInitializer(InitExpr, Constructor,
4128 FieldInit->getAnyMember(),
4129 FieldInit->getBaseClass());
4130 } else {
4131 UninitializedChecker.CheckInitializer(InitExpr, nullptr,
4132 FieldInit->getAnyMember(),
4133 FieldInit->getBaseClass());
4134 }
4135 }
4136 }
4137} // namespace
4138
4140 // Create a synthetic function scope to represent the call to the constructor
4141 // that notionally surrounds a use of this initializer.
4143}
4144
4146 if (!D.isFunctionDeclarator())
4147 return;
4148 auto &FTI = D.getFunctionTypeInfo();
4149 if (!FTI.Params)
4150 return;
4151 for (auto &Param : ArrayRef<DeclaratorChunk::ParamInfo>(FTI.Params,
4152 FTI.NumParams)) {
4153 auto *ParamDecl = cast<NamedDecl>(Param.Param);
4154 if (ParamDecl->getDeclName())
4155 PushOnScopeChains(ParamDecl, S, /*AddToContext=*/false);
4156 }
4157}
4158
4160 return ActOnRequiresClause(ConstraintExpr);
4161}
4162
4164 if (ConstraintExpr.isInvalid())
4165 return ExprError();
4166
4167 if (DiagnoseUnexpandedParameterPack(ConstraintExpr.get(),
4169 return ExprError();
4170
4171 return ConstraintExpr;
4172}
4173
4175 Expr *InitExpr,
4176 SourceLocation InitLoc) {
4177 InitializedEntity Entity =
4179 InitializationKind Kind =
4182 InitExpr->getBeginLoc(),
4183 InitExpr->getEndLoc())
4184 : InitializationKind::CreateCopy(InitExpr->getBeginLoc(), InitLoc);
4185 InitializationSequence Seq(*this, Entity, Kind, InitExpr);
4186 return Seq.Perform(*this, Entity, Kind, InitExpr);
4187}
4188
4190 SourceLocation InitLoc,
4191 ExprResult InitExpr) {
4192 // Pop the notional constructor scope we created earlier.
4193 PopFunctionScopeInfo(nullptr, D);
4194
4195 // Microsoft C++'s property declaration cannot have a default member
4196 // initializer.
4197 if (isa<MSPropertyDecl>(D)) {
4198 D->setInvalidDecl();
4199 return;
4200 }
4201
4202 FieldDecl *FD = dyn_cast<FieldDecl>(D);
4203 assert((FD && FD->getInClassInitStyle() != ICIS_NoInit) &&
4204 "must set init style when field is created");
4205
4206 if (!InitExpr.isUsable() ||
4208 FD->setInvalidDecl();
4209 ExprResult RecoveryInit =
4210 CreateRecoveryExpr(InitLoc, InitLoc, {}, FD->getType());
4211 if (RecoveryInit.isUsable())
4212 FD->setInClassInitializer(RecoveryInit.get());
4213 return;
4214 }
4215
4216 if (!FD->getType()->isDependentType() && !InitExpr.get()->isTypeDependent()) {
4217 InitExpr = ConvertMemberDefaultInitExpression(FD, InitExpr.get(), InitLoc);
4218 // C++11 [class.base.init]p7:
4219 // The initialization of each base and member constitutes a
4220 // full-expression.
4221 if (!InitExpr.isInvalid())
4222 InitExpr = ActOnFinishFullExpr(InitExpr.get(), /*DiscarededValue=*/false);
4223 if (InitExpr.isInvalid()) {
4224 FD->setInvalidDecl();
4225 return;
4226 }
4227 }
4228
4229 FD->setInClassInitializer(InitExpr.get());
4230}
4231
4232/// Find the direct and/or virtual base specifiers that
4233/// correspond to the given base type, for use in base initialization
4234/// within a constructor.
4235static bool FindBaseInitializer(Sema &SemaRef,
4236 CXXRecordDecl *ClassDecl,
4237 QualType BaseType,
4238 const CXXBaseSpecifier *&DirectBaseSpec,
4239 const CXXBaseSpecifier *&VirtualBaseSpec) {
4240 // First, check for a direct base class.
4241 DirectBaseSpec = nullptr;
4242 for (const auto &Base : ClassDecl->bases()) {
4243 if (SemaRef.Context.hasSameUnqualifiedType(BaseType, Base.getType())) {
4244 // We found a direct base of this type. That's what we're
4245 // initializing.
4246 DirectBaseSpec = &Base;
4247 break;
4248 }
4249 }
4250
4251 // Check for a virtual base class.
4252 // FIXME: We might be able to short-circuit this if we know in advance that
4253 // there are no virtual bases.
4254 VirtualBaseSpec = nullptr;
4255 if (!DirectBaseSpec || !DirectBaseSpec->isVirtual()) {
4256 // We haven't found a base yet; search the class hierarchy for a
4257 // virtual base class.
4258 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
4259 /*DetectVirtual=*/false);
4260 if (SemaRef.IsDerivedFrom(ClassDecl->getLocation(),
4261 SemaRef.Context.getCanonicalTagType(ClassDecl),
4262 BaseType, Paths)) {
4263 for (CXXBasePaths::paths_iterator Path = Paths.begin();
4264 Path != Paths.end(); ++Path) {
4265 if (Path->back().Base->isVirtual()) {
4266 VirtualBaseSpec = Path->back().Base;
4267 break;
4268 }
4269 }
4270 }
4271 }
4272
4273 return DirectBaseSpec || VirtualBaseSpec;
4274}
4275
4278 Scope *S,
4279 CXXScopeSpec &SS,
4280 IdentifierInfo *MemberOrBase,
4281 ParsedType TemplateTypeTy,
4282 const DeclSpec &DS,
4283 SourceLocation IdLoc,
4284 Expr *InitList,
4285 SourceLocation EllipsisLoc) {
4286 return BuildMemInitializer(ConstructorD, S, SS, MemberOrBase, TemplateTypeTy,
4287 DS, IdLoc, InitList,
4288 EllipsisLoc);
4289}
4290
4293 Scope *S,
4294 CXXScopeSpec &SS,
4295 IdentifierInfo *MemberOrBase,
4296 ParsedType TemplateTypeTy,
4297 const DeclSpec &DS,
4298 SourceLocation IdLoc,
4299 SourceLocation LParenLoc,
4300 ArrayRef<Expr *> Args,
4301 SourceLocation RParenLoc,
4302 SourceLocation EllipsisLoc) {
4303 Expr *List = ParenListExpr::Create(Context, LParenLoc, Args, RParenLoc);
4304 return BuildMemInitializer(ConstructorD, S, SS, MemberOrBase, TemplateTypeTy,
4305 DS, IdLoc, List, EllipsisLoc);
4306}
4307
4308namespace {
4309
4310// Callback to only accept typo corrections that can be a valid C++ member
4311// initializer: either a non-static field member or a base class.
4312class MemInitializerValidatorCCC final : public CorrectionCandidateCallback {
4313public:
4314 explicit MemInitializerValidatorCCC(CXXRecordDecl *ClassDecl)
4315 : ClassDecl(ClassDecl) {}
4316
4317 bool ValidateCandidate(const TypoCorrection &candidate) override {
4318 if (NamedDecl *ND = candidate.getCorrectionDecl()) {
4319 if (FieldDecl *Member = dyn_cast<FieldDecl>(ND))
4320 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4321 return isa<TypeDecl>(ND);
4322 }
4323 return false;
4324 }
4325
4326 std::unique_ptr<CorrectionCandidateCallback> clone() override {
4327 return std::make_unique<MemInitializerValidatorCCC>(*this);
4328 }
4329
4330private:
4331 CXXRecordDecl *ClassDecl;
4332};
4333
4334}
4335
4337 RecordDecl *ClassDecl,
4338 const IdentifierInfo *Name) {
4339 DeclContextLookupResult Result = ClassDecl->lookup(Name);
4341 llvm::find_if(Result, [this](const NamedDecl *Elem) {
4342 return isa<FieldDecl, IndirectFieldDecl>(Elem) &&
4344 });
4345 // We did not find a placeholder variable
4346 if (Found == Result.end())
4347 return false;
4348 Diag(Loc, diag::err_using_placeholder_variable) << Name;
4349 for (DeclContextLookupResult::iterator It = Found; It != Result.end(); It++) {
4350 const NamedDecl *ND = *It;
4351 if (ND->getDeclContext() != ND->getDeclContext())
4352 break;
4355 Diag(ND->getLocation(), diag::note_reference_placeholder) << ND;
4356 }
4357 return true;
4358}
4359
4360ValueDecl *
4362 const IdentifierInfo *MemberOrBase) {
4363 ValueDecl *ND = nullptr;
4364 for (auto *D : ClassDecl->lookup(MemberOrBase)) {
4366 bool IsPlaceholder = D->isPlaceholderVar(getLangOpts());
4367 if (ND) {
4368 if (IsPlaceholder && D->getDeclContext() == ND->getDeclContext())
4369 return nullptr;
4370 break;
4371 }
4372 if (!IsPlaceholder)
4373 return cast<ValueDecl>(D);
4374 ND = cast<ValueDecl>(D);
4375 }
4376 }
4377 return ND;
4378}
4379
4381 CXXScopeSpec &SS,
4382 ParsedType TemplateTypeTy,
4383 IdentifierInfo *MemberOrBase) {
4384 if (SS.getScopeRep() || TemplateTypeTy)
4385 return nullptr;
4386 return tryLookupUnambiguousFieldDecl(ClassDecl, MemberOrBase);
4387}
4388
4391 Scope *S,
4392 CXXScopeSpec &SS,
4393 IdentifierInfo *MemberOrBase,
4394 ParsedType TemplateTypeTy,
4395 const DeclSpec &DS,
4396 SourceLocation IdLoc,
4397 Expr *Init,
4398 SourceLocation EllipsisLoc) {
4399 if (!ConstructorD || !Init)
4400 return true;
4401
4402 AdjustDeclIfTemplate(ConstructorD);
4403
4405 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4406 if (!Constructor) {
4407 // The user wrote a constructor initializer on a function that is
4408 // not a C++ constructor. Ignore the error for now, because we may
4409 // have more member initializers coming; we'll diagnose it just
4410 // once in ActOnMemInitializers.
4411 return true;
4412 }
4413
4414 CXXRecordDecl *ClassDecl = Constructor->getParent();
4415
4416 // C++ [class.base.init]p2:
4417 // Names in a mem-initializer-id are looked up in the scope of the
4418 // constructor's class and, if not found in that scope, are looked
4419 // up in the scope containing the constructor's definition.
4420 // [Note: if the constructor's class contains a member with the
4421 // same name as a direct or virtual base class of the class, a
4422 // mem-initializer-id naming the member or base class and composed
4423 // of a single identifier refers to the class member. A
4424 // mem-initializer-id for the hidden base class may be specified
4425 // using a qualified name. ]
4426
4427 // Look for a member, first.
4429 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4430 if (EllipsisLoc.isValid())
4431 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4432 << MemberOrBase
4433 << SourceRange(IdLoc, Init->getSourceRange().getEnd());
4434
4435 return BuildMemberInitializer(Member, Init, IdLoc);
4436 }
4437 // It didn't name a member, so see if it names a class.
4438 QualType BaseType;
4439 TypeSourceInfo *TInfo = nullptr;
4440
4441 if (TemplateTypeTy) {
4442 BaseType = GetTypeFromParser(TemplateTypeTy, &TInfo);
4443 if (BaseType.isNull())
4444 return true;
4445 } else if (DS.getTypeSpecType() == TST_decltype) {
4446 BaseType = BuildDecltypeType(DS.getRepAsExpr());
4447 } else if (DS.getTypeSpecType() == TST_decltype_auto) {
4448 Diag(DS.getTypeSpecTypeLoc(), diag::err_decltype_auto_invalid);
4449 return true;
4450 } else if (DS.getTypeSpecType() == TST_typename_pack_indexing) {
4451 BaseType =
4453 DS.getBeginLoc(), DS.getEllipsisLoc());
4454 } else {
4455 LookupResult R(*this, MemberOrBase, IdLoc, LookupOrdinaryName);
4456 LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
4457
4458 TypeDecl *TyD = R.getAsSingle<TypeDecl>();
4459 if (!TyD) {
4460 if (R.isAmbiguous()) return true;
4461
4462 // We don't want access-control diagnostics here.
4464
4465 if (SS.isSet() && isDependentScopeSpecifier(SS)) {
4466 bool NotUnknownSpecialization = false;
4467 DeclContext *DC = computeDeclContext(SS, false);
4468 if (CXXRecordDecl *Record = dyn_cast_or_null<CXXRecordDecl>(DC))
4469 NotUnknownSpecialization = !Record->hasAnyDependentBases();
4470
4471 if (!NotUnknownSpecialization) {
4472 // When the scope specifier can refer to a member of an unknown
4473 // specialization, we take it as a type name.
4474 BaseType = CheckTypenameType(
4476 SS.getWithLocInContext(Context), *MemberOrBase, IdLoc);
4477 if (BaseType.isNull())
4478 return true;
4479
4480 TInfo = Context.CreateTypeSourceInfo(BaseType);
4483 if (!TL.isNull()) {
4484 TL.setNameLoc(IdLoc);
4487 }
4488
4489 R.clear();
4490 R.setLookupName(MemberOrBase);
4491 }
4492 }
4493
4494 if (getLangOpts().MSVCCompat && !getLangOpts().CPlusPlus20) {
4495 if (auto UnqualifiedBase = R.getAsSingle<ClassTemplateDecl>()) {
4496 auto *TempSpec = cast<TemplateSpecializationType>(
4497 UnqualifiedBase->getCanonicalInjectedSpecializationType(Context));
4498 TemplateName TN = TempSpec->getTemplateName();
4499 for (auto const &Base : ClassDecl->bases()) {
4500 auto BaseTemplate =
4501 Base.getType()->getAs<TemplateSpecializationType>();
4502 if (BaseTemplate &&
4503 Context.hasSameTemplateName(BaseTemplate->getTemplateName(), TN,
4504 /*IgnoreDeduced=*/true)) {
4505 Diag(IdLoc, diag::ext_unqualified_base_class)
4506 << SourceRange(IdLoc, Init->getSourceRange().getEnd());
4507 BaseType = Base.getType();
4508 break;
4509 }
4510 }
4511 }
4512 }
4513
4514 // If no results were found, try to correct typos.
4515 TypoCorrection Corr;
4516 MemInitializerValidatorCCC CCC(ClassDecl);
4517 if (R.empty() && BaseType.isNull() &&
4518 (Corr =
4520 CCC, CorrectTypoKind::ErrorRecovery, ClassDecl))) {
4522 // We have found a non-static data member with a similar
4523 // name to what was typed; complain and initialize that
4524 // member.
4525 diagnoseTypo(Corr,
4526 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4527 << MemberOrBase << true);
4528 return BuildMemberInitializer(Member, Init, IdLoc);
4529 } else if (TypeDecl *Type = Corr.getCorrectionDeclAs<TypeDecl>()) {
4530 const CXXBaseSpecifier *DirectBaseSpec;
4531 const CXXBaseSpecifier *VirtualBaseSpec;
4532 if (FindBaseInitializer(*this, ClassDecl,
4533 Context.getTypeDeclType(Type),
4534 DirectBaseSpec, VirtualBaseSpec)) {
4535 // We have found a direct or virtual base class with a
4536 // similar name to what was typed; complain and initialize
4537 // that base class.
4538 diagnoseTypo(Corr,
4539 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4540 << MemberOrBase << false,
4541 PDiag() /*Suppress note, we provide our own.*/);
4542
4543 const CXXBaseSpecifier *BaseSpec = DirectBaseSpec ? DirectBaseSpec
4544 : VirtualBaseSpec;
4545 Diag(BaseSpec->getBeginLoc(), diag::note_base_class_specified_here)
4546 << BaseSpec->getType() << BaseSpec->getSourceRange();
4547
4548 TyD = Type;
4549 }
4550 }
4551 }
4552
4553 if (!TyD && BaseType.isNull()) {
4554 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4555 << MemberOrBase << SourceRange(IdLoc,Init->getSourceRange().getEnd());
4556 return true;
4557 }
4558 }
4559
4560 if (BaseType.isNull()) {
4561 MarkAnyDeclReferenced(TyD->getLocation(), TyD, /*OdrUse=*/false);
4562
4563 TypeLocBuilder TLB;
4564 // FIXME: This is missing building the UsingType for TyD, if any.
4565 if (const auto *TD = dyn_cast<TagDecl>(TyD)) {
4566 BaseType = Context.getTagType(ElaboratedTypeKeyword::None,
4567 SS.getScopeRep(), TD, /*OwnsTag=*/false);
4568 auto TL = TLB.push<TagTypeLoc>(BaseType);
4570 TL.setQualifierLoc(SS.getWithLocInContext(Context));
4571 TL.setNameLoc(IdLoc);
4572 } else if (auto *TN = dyn_cast<TypedefNameDecl>(TyD)) {
4573 BaseType = Context.getTypedefType(ElaboratedTypeKeyword::None,
4574 SS.getScopeRep(), TN);
4575 TLB.push<TypedefTypeLoc>(BaseType).set(
4576 /*ElaboratedKeywordLoc=*/SourceLocation(),
4577 SS.getWithLocInContext(Context), IdLoc);
4578 } else if (auto *UD = dyn_cast<UnresolvedUsingTypenameDecl>(TyD)) {
4579 BaseType = Context.getUnresolvedUsingType(ElaboratedTypeKeyword::None,
4580 SS.getScopeRep(), UD);
4581 TLB.push<UnresolvedUsingTypeLoc>(BaseType).set(
4582 /*ElaboratedKeywordLoc=*/SourceLocation(),
4583 SS.getWithLocInContext(Context), IdLoc);
4584 } else {
4585 // FIXME: What else can appear here?
4586 assert(SS.isEmpty());
4587 BaseType = Context.getTypeDeclType(TyD);
4588 TLB.pushTypeSpec(BaseType).setNameLoc(IdLoc);
4589 }
4590 TInfo = TLB.getTypeSourceInfo(Context, BaseType);
4591 }
4592 }
4593
4594 if (!TInfo)
4595 TInfo = Context.getTrivialTypeSourceInfo(BaseType, IdLoc);
4596
4597 return BuildBaseInitializer(BaseType, TInfo, Init, ClassDecl, EllipsisLoc);
4598}
4599
4602 SourceLocation IdLoc) {
4603 FieldDecl *DirectMember = dyn_cast<FieldDecl>(Member);
4604 IndirectFieldDecl *IndirectMember = dyn_cast<IndirectFieldDecl>(Member);
4605 assert((DirectMember || IndirectMember) &&
4606 "Member must be a FieldDecl or IndirectFieldDecl");
4607
4609 return true;
4610
4611 if (Member->isInvalidDecl())
4612 return true;
4613
4614 MultiExprArg Args;
4615 if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
4616 Args = MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4617 } else if (InitListExpr *InitList = dyn_cast<InitListExpr>(Init)) {
4618 Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
4619 } else {
4620 // Template instantiation doesn't reconstruct ParenListExprs for us.
4621 Args = Init;
4622 }
4623
4624 SourceRange InitRange = Init->getSourceRange();
4625
4626 if (Member->getType()->isDependentType() || Init->isTypeDependent()) {
4627 // Can't check initialization for a member of dependent type or when
4628 // any of the arguments are type-dependent expressions.
4630 } else {
4631 bool InitList = false;
4632 if (isa<InitListExpr>(Init)) {
4633 InitList = true;
4634 Args = Init;
4635 }
4636
4637 // Initialize the member.
4638 InitializedEntity MemberEntity =
4639 DirectMember ? InitializedEntity::InitializeMember(DirectMember, nullptr)
4640 : InitializedEntity::InitializeMember(IndirectMember,
4641 nullptr);
4642 InitializationKind Kind =
4644 IdLoc, Init->getBeginLoc(), Init->getEndLoc())
4645 : InitializationKind::CreateDirect(IdLoc, InitRange.getBegin(),
4646 InitRange.getEnd());
4647
4648 InitializationSequence InitSeq(*this, MemberEntity, Kind, Args);
4649 ExprResult MemberInit = InitSeq.Perform(*this, MemberEntity, Kind, Args,
4650 nullptr);
4651 if (!MemberInit.isInvalid()) {
4652 // C++11 [class.base.init]p7:
4653 // The initialization of each base and member constitutes a
4654 // full-expression.
4655 MemberInit = ActOnFinishFullExpr(MemberInit.get(), InitRange.getBegin(),
4656 /*DiscardedValue*/ false);
4657 }
4658
4659 if (MemberInit.isInvalid()) {
4660 // Args were sensible expressions but we couldn't initialize the member
4661 // from them. Preserve them in a RecoveryExpr instead.
4662 Init = CreateRecoveryExpr(InitRange.getBegin(), InitRange.getEnd(), Args,
4663 Member->getType())
4664 .get();
4665 if (!Init)
4666 return true;
4667 } else {
4668 Init = MemberInit.get();
4669 }
4670 }
4671
4672 if (DirectMember) {
4673 return new (Context) CXXCtorInitializer(Context, DirectMember, IdLoc,
4674 InitRange.getBegin(), Init,
4675 InitRange.getEnd());
4676 } else {
4677 return new (Context) CXXCtorInitializer(Context, IndirectMember, IdLoc,
4678 InitRange.getBegin(), Init,
4679 InitRange.getEnd());
4680 }
4681}
4682
4685 CXXRecordDecl *ClassDecl) {
4686 SourceLocation NameLoc = TInfo->getTypeLoc().getSourceRange().getBegin();
4687 if (!LangOpts.CPlusPlus11)
4688 return Diag(NameLoc, diag::err_delegating_ctor)
4689 << TInfo->getTypeLoc().getSourceRange();
4690 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4691
4692 bool InitList = true;
4693 MultiExprArg Args = Init;
4694 if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
4695 InitList = false;
4696 Args = MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4697 }
4698
4699 CanQualType ClassType = Context.getCanonicalTagType(ClassDecl);
4700
4701 SourceRange InitRange = Init->getSourceRange();
4702 // Initialize the object.
4703 InitializedEntity DelegationEntity =
4705 InitializationKind Kind =
4707 NameLoc, Init->getBeginLoc(), Init->getEndLoc())
4708 : InitializationKind::CreateDirect(NameLoc, InitRange.getBegin(),
4709 InitRange.getEnd());
4710 InitializationSequence InitSeq(*this, DelegationEntity, Kind, Args);
4711 ExprResult DelegationInit = InitSeq.Perform(*this, DelegationEntity, Kind,
4712 Args, nullptr);
4713 if (!DelegationInit.isInvalid()) {
4714 assert((DelegationInit.get()->containsErrors() ||
4715 cast<CXXConstructExpr>(DelegationInit.get())->getConstructor()) &&
4716 "Delegating constructor with no target?");
4717
4718 // C++11 [class.base.init]p7:
4719 // The initialization of each base and member constitutes a
4720 // full-expression.
4721 DelegationInit = ActOnFinishFullExpr(
4722 DelegationInit.get(), InitRange.getBegin(), /*DiscardedValue*/ false);
4723 }
4724
4725 if (DelegationInit.isInvalid()) {
4726 DelegationInit = CreateRecoveryExpr(InitRange.getBegin(),
4727 InitRange.getEnd(), Args, ClassType);
4728 if (DelegationInit.isInvalid())
4729 return true;
4730 } else {
4731 // If we are in a dependent context, template instantiation will
4732 // perform this type-checking again. Just save the arguments that we
4733 // received in a ParenListExpr.
4734 // FIXME: This isn't quite ideal, since our ASTs don't capture all
4735 // of the information that we have about the base
4736 // initializer. However, deconstructing the ASTs is a dicey process,
4737 // and this approach is far more likely to get the corner cases right.
4738 if (CurContext->isDependentContext())
4739 DelegationInit = Init;
4740 }
4741
4742 return new (Context) CXXCtorInitializer(Context, TInfo, InitRange.getBegin(),
4743 DelegationInit.getAs<Expr>(),
4744 InitRange.getEnd());
4745}
4746
4749 Expr *Init, CXXRecordDecl *ClassDecl,
4750 SourceLocation EllipsisLoc) {
4751 SourceLocation BaseLoc = BaseTInfo->getTypeLoc().getBeginLoc();
4752
4753 if (!BaseType->isDependentType() && !BaseType->isRecordType())
4754 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4755 << BaseType << BaseTInfo->getTypeLoc().getSourceRange();
4756
4757 // C++ [class.base.init]p2:
4758 // [...] Unless the mem-initializer-id names a nonstatic data
4759 // member of the constructor's class or a direct or virtual base
4760 // of that class, the mem-initializer is ill-formed. A
4761 // mem-initializer-list can initialize a base class using any
4762 // name that denotes that base class type.
4763
4764 // We can store the initializers in "as-written" form and delay analysis until
4765 // instantiation if the constructor is dependent. But not for dependent
4766 // (broken) code in a non-template! SetCtorInitializers does not expect this.
4767 bool Dependent = CurContext->isDependentContext() &&
4768 (BaseType->isDependentType() || Init->isTypeDependent());
4769
4770 SourceRange InitRange = Init->getSourceRange();
4771 if (EllipsisLoc.isValid()) {
4772 // This is a pack expansion.
4773 if (!BaseType->containsUnexpandedParameterPack()) {
4774 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4775 << SourceRange(BaseLoc, InitRange.getEnd());
4776
4777 EllipsisLoc = SourceLocation();
4778 }
4779 } else {
4780 // Check for any unexpanded parameter packs.
4781 if (DiagnoseUnexpandedParameterPack(BaseLoc, BaseTInfo, UPPC_Initializer))
4782 return true;
4783
4785 return true;
4786 }
4787
4788 // Check for direct and virtual base classes.
4789 const CXXBaseSpecifier *DirectBaseSpec = nullptr;
4790 const CXXBaseSpecifier *VirtualBaseSpec = nullptr;
4791 if (!Dependent) {
4792 if (declaresSameEntity(ClassDecl, BaseType->getAsCXXRecordDecl()))
4793 return BuildDelegatingInitializer(BaseTInfo, Init, ClassDecl);
4794
4795 FindBaseInitializer(*this, ClassDecl, BaseType, DirectBaseSpec,
4796 VirtualBaseSpec);
4797
4798 // C++ [base.class.init]p2:
4799 // Unless the mem-initializer-id names a nonstatic data member of the
4800 // constructor's class or a direct or virtual base of that class, the
4801 // mem-initializer is ill-formed.
4802 if (!DirectBaseSpec && !VirtualBaseSpec) {
4803 // If the class has any dependent bases, then it's possible that
4804 // one of those types will resolve to the same type as
4805 // BaseType. Therefore, just treat this as a dependent base
4806 // class initialization. FIXME: Should we try to check the
4807 // initialization anyway? It seems odd.
4808 if (ClassDecl->hasAnyDependentBases())
4809 Dependent = true;
4810 else
4811 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4812 << BaseType << Context.getCanonicalTagType(ClassDecl)
4813 << BaseTInfo->getTypeLoc().getSourceRange();
4814 }
4815 }
4816
4817 if (Dependent) {
4819
4820 return new (Context) CXXCtorInitializer(Context, BaseTInfo,
4821 /*IsVirtual=*/false,
4822 InitRange.getBegin(), Init,
4823 InitRange.getEnd(), EllipsisLoc);
4824 }
4825
4826 // C++ [base.class.init]p2:
4827 // If a mem-initializer-id is ambiguous because it designates both
4828 // a direct non-virtual base class and an inherited virtual base
4829 // class, the mem-initializer is ill-formed.
4830 if (DirectBaseSpec && VirtualBaseSpec)
4831 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4832 << BaseType << BaseTInfo->getTypeLoc().getLocalSourceRange();
4833
4834 const CXXBaseSpecifier *BaseSpec = DirectBaseSpec;
4835 if (!BaseSpec)
4836 BaseSpec = VirtualBaseSpec;
4837
4838 // Initialize the base.
4839 bool InitList = true;
4840 MultiExprArg Args = Init;
4841 if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
4842 InitList = false;
4843 Args = MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4844 }
4845
4846 InitializedEntity BaseEntity =
4847 InitializedEntity::InitializeBase(Context, BaseSpec, VirtualBaseSpec);
4848 InitializationKind Kind =
4849 InitList ? InitializationKind::CreateDirectList(BaseLoc)
4850 : InitializationKind::CreateDirect(BaseLoc, InitRange.getBegin(),
4851 InitRange.getEnd());
4852 InitializationSequence InitSeq(*this, BaseEntity, Kind, Args);
4853 ExprResult BaseInit = InitSeq.Perform(*this, BaseEntity, Kind, Args, nullptr);
4854 if (!BaseInit.isInvalid()) {
4855 // C++11 [class.base.init]p7:
4856 // The initialization of each base and member constitutes a
4857 // full-expression.
4858 BaseInit = ActOnFinishFullExpr(BaseInit.get(), InitRange.getBegin(),
4859 /*DiscardedValue*/ false);
4860 }
4861
4862 if (BaseInit.isInvalid()) {
4863 BaseInit = CreateRecoveryExpr(InitRange.getBegin(), InitRange.getEnd(),
4864 Args, BaseType);
4865 if (BaseInit.isInvalid())
4866 return true;
4867 } else {
4868 // If we are in a dependent context, template instantiation will
4869 // perform this type-checking again. Just save the arguments that we
4870 // received in a ParenListExpr.
4871 // FIXME: This isn't quite ideal, since our ASTs don't capture all
4872 // of the information that we have about the base
4873 // initializer. However, deconstructing the ASTs is a dicey process,
4874 // and this approach is far more likely to get the corner cases right.
4875 if (CurContext->isDependentContext())
4876 BaseInit = Init;
4877 }
4878
4879 return new (Context) CXXCtorInitializer(Context, BaseTInfo,
4880 BaseSpec->isVirtual(),
4881 InitRange.getBegin(),
4882 BaseInit.getAs<Expr>(),
4883 InitRange.getEnd(), EllipsisLoc);
4884}
4885
4886// Create a static_cast<T&&>(expr).
4887static Expr *CastForMoving(Sema &SemaRef, Expr *E) {
4888 QualType TargetType =
4889 SemaRef.BuildReferenceType(E->getType(), /*SpelledAsLValue*/ false,
4891 SourceLocation ExprLoc = E->getBeginLoc();
4892 TypeSourceInfo *TargetLoc = SemaRef.Context.getTrivialTypeSourceInfo(
4893 TargetType, ExprLoc);
4894
4895 return SemaRef.BuildCXXNamedCast(ExprLoc, tok::kw_static_cast, TargetLoc, E,
4896 SourceRange(ExprLoc, ExprLoc),
4897 E->getSourceRange()).get();
4898}
4899
4900/// ImplicitInitializerKind - How an implicit base or member initializer should
4901/// initialize its base or member.
4908
4909static bool
4911 ImplicitInitializerKind ImplicitInitKind,
4912 CXXBaseSpecifier *BaseSpec,
4913 bool IsInheritedVirtualBase,
4914 CXXCtorInitializer *&CXXBaseInit) {
4915 InitializedEntity InitEntity
4916 = InitializedEntity::InitializeBase(SemaRef.Context, BaseSpec,
4917 IsInheritedVirtualBase);
4918
4919 ExprResult BaseInit;
4920
4921 switch (ImplicitInitKind) {
4922 case IIK_Inherit:
4923 case IIK_Default: {
4924 InitializationKind InitKind
4926 InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, {});
4927 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
4928 break;
4929 }
4930
4931 case IIK_Move:
4932 case IIK_Copy: {
4933 bool Moving = ImplicitInitKind == IIK_Move;
4934 ParmVarDecl *Param = Constructor->getParamDecl(0);
4935 QualType ParamType = Param->getType().getNonReferenceType();
4936
4937 Expr *CopyCtorArg =
4939 SourceLocation(), Param, false,
4940 Constructor->getLocation(), ParamType,
4941 VK_LValue, nullptr);
4942
4943 SemaRef.MarkDeclRefReferenced(cast<DeclRefExpr>(CopyCtorArg));
4944
4945 // Cast to the base class to avoid ambiguities.
4946 QualType ArgTy =
4947 SemaRef.Context.getQualifiedType(BaseSpec->getType().getUnqualifiedType(),
4948 ParamType.getQualifiers());
4949
4950 if (Moving) {
4951 CopyCtorArg = CastForMoving(SemaRef, CopyCtorArg);
4952 }
4953
4954 CXXCastPath BasePath;
4955 BasePath.push_back(BaseSpec);
4956 CopyCtorArg = SemaRef.ImpCastExprToType(CopyCtorArg, ArgTy,
4957 CK_UncheckedDerivedToBase,
4958 Moving ? VK_XValue : VK_LValue,
4959 &BasePath).get();
4960
4961 InitializationKind InitKind
4964 InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, CopyCtorArg);
4965 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, CopyCtorArg);
4966 break;
4967 }
4968 }
4969
4970 BaseInit = SemaRef.MaybeCreateExprWithCleanups(BaseInit);
4971 if (BaseInit.isInvalid())
4972 return true;
4973
4974 CXXBaseInit =
4975 new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context,
4976 SemaRef.Context.getTrivialTypeSourceInfo(BaseSpec->getType(),
4977 SourceLocation()),
4978 BaseSpec->isVirtual(),
4980 BaseInit.getAs<Expr>(),
4982 SourceLocation());
4983
4984 return false;
4985}
4986
4987static bool RefersToRValueRef(Expr *MemRef) {
4988 ValueDecl *Referenced = cast<MemberExpr>(MemRef)->getMemberDecl();
4989 return Referenced->getType()->isRValueReferenceType();
4990}
4991
4992static bool
4994 ImplicitInitializerKind ImplicitInitKind,
4995 FieldDecl *Field, IndirectFieldDecl *Indirect,
4996 CXXCtorInitializer *&CXXMemberInit) {
4997 if (Field->isInvalidDecl())
4998 return true;
4999
5000 SourceLocation Loc = Constructor->getLocation();
5001
5002 if (ImplicitInitKind == IIK_Copy || ImplicitInitKind == IIK_Move) {
5003 bool Moving = ImplicitInitKind == IIK_Move;
5004 ParmVarDecl *Param = Constructor->getParamDecl(0);
5005 QualType ParamType = Param->getType().getNonReferenceType();
5006
5007 // Suppress copying zero-width bitfields.
5008 if (Field->isZeroLengthBitField())
5009 return false;
5010
5011 Expr *MemberExprBase =
5013 SourceLocation(), Param, false,
5014 Loc, ParamType, VK_LValue, nullptr);
5015
5016 SemaRef.MarkDeclRefReferenced(cast<DeclRefExpr>(MemberExprBase));
5017
5018 if (Moving) {
5019 MemberExprBase = CastForMoving(SemaRef, MemberExprBase);
5020 }
5021
5022 // Build a reference to this field within the parameter.
5023 CXXScopeSpec SS;
5024 LookupResult MemberLookup(SemaRef, Field->getDeclName(), Loc,
5026 MemberLookup.addDecl(Indirect ? cast<ValueDecl>(Indirect)
5027 : cast<ValueDecl>(Field), AS_public);
5028 MemberLookup.resolveKind();
5029 ExprResult CtorArg
5030 = SemaRef.BuildMemberReferenceExpr(MemberExprBase,
5031 ParamType, Loc,
5032 /*IsArrow=*/false,
5033 SS,
5034 /*TemplateKWLoc=*/SourceLocation(),
5035 /*FirstQualifierInScope=*/nullptr,
5036 MemberLookup,
5037 /*TemplateArgs=*/nullptr,
5038 /*S*/nullptr);
5039 if (CtorArg.isInvalid())
5040 return true;
5041
5042 // C++11 [class.copy]p15:
5043 // - if a member m has rvalue reference type T&&, it is direct-initialized
5044 // with static_cast<T&&>(x.m);
5045 if (RefersToRValueRef(CtorArg.get())) {
5046 CtorArg = CastForMoving(SemaRef, CtorArg.get());
5047 }
5048
5049 InitializedEntity Entity =
5050 Indirect ? InitializedEntity::InitializeMember(Indirect, nullptr,
5051 /*Implicit*/ true)
5052 : InitializedEntity::InitializeMember(Field, nullptr,
5053 /*Implicit*/ true);
5054
5055 // Direct-initialize to use the copy constructor.
5056 InitializationKind InitKind =
5058
5059 Expr *CtorArgE = CtorArg.getAs<Expr>();
5060 InitializationSequence InitSeq(SemaRef, Entity, InitKind, CtorArgE);
5061 ExprResult MemberInit =
5062 InitSeq.Perform(SemaRef, Entity, InitKind, MultiExprArg(&CtorArgE, 1));
5063 MemberInit = SemaRef.MaybeCreateExprWithCleanups(MemberInit);
5064 if (MemberInit.isInvalid())
5065 return true;
5066
5067 if (Indirect)
5068 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(
5069 SemaRef.Context, Indirect, Loc, Loc, MemberInit.getAs<Expr>(), Loc);
5070 else
5071 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(
5072 SemaRef.Context, Field, Loc, Loc, MemberInit.getAs<Expr>(), Loc);
5073 return false;
5074 }
5075
5076 assert((ImplicitInitKind == IIK_Default || ImplicitInitKind == IIK_Inherit) &&
5077 "Unhandled implicit init kind!");
5078
5079 QualType FieldBaseElementType =
5080 SemaRef.Context.getBaseElementType(Field->getType());
5081
5082 if (FieldBaseElementType->isRecordType()) {
5083 InitializedEntity InitEntity =
5084 Indirect ? InitializedEntity::InitializeMember(Indirect, nullptr,
5085 /*Implicit*/ true)
5086 : InitializedEntity::InitializeMember(Field, nullptr,
5087 /*Implicit*/ true);
5088 InitializationKind InitKind =
5090
5091 InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, {});
5092 ExprResult MemberInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
5093
5094 MemberInit = SemaRef.MaybeCreateExprWithCleanups(MemberInit);
5095 if (MemberInit.isInvalid())
5096 return true;
5097
5098 if (Indirect)
5099 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context,
5100 Indirect, Loc,
5101 Loc,
5102 MemberInit.get(),
5103 Loc);
5104 else
5105 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context,
5106 Field, Loc, Loc,
5107 MemberInit.get(),
5108 Loc);
5109 return false;
5110 }
5111
5112 if (!Field->getParent()->isUnion()) {
5113 if (FieldBaseElementType->isReferenceType()) {
5114 SemaRef.Diag(Constructor->getLocation(),
5115 diag::err_uninitialized_member_in_ctor)
5116 << (int)Constructor->isImplicit()
5117 << SemaRef.Context.getCanonicalTagType(Constructor->getParent()) << 0
5118 << Field->getDeclName();
5119 SemaRef.Diag(Field->getLocation(), diag::note_declared_at);
5120 return true;
5121 }
5122
5123 if (FieldBaseElementType.isConstQualified()) {
5124 SemaRef.Diag(Constructor->getLocation(),
5125 diag::err_uninitialized_member_in_ctor)
5126 << (int)Constructor->isImplicit()
5127 << SemaRef.Context.getCanonicalTagType(Constructor->getParent()) << 1
5128 << Field->getDeclName();
5129 SemaRef.Diag(Field->getLocation(), diag::note_declared_at);
5130 return true;
5131 }
5132 }
5133
5134 if (FieldBaseElementType.hasNonTrivialObjCLifetime()) {
5135 // ARC and Weak:
5136 // Default-initialize Objective-C pointers to NULL.
5137 CXXMemberInit
5138 = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context, Field,
5139 Loc, Loc,
5140 new (SemaRef.Context) ImplicitValueInitExpr(Field->getType()),
5141 Loc);
5142 return false;
5143 }
5144
5145 // Nothing to initialize.
5146 CXXMemberInit = nullptr;
5147 return false;
5148}
5149
5150namespace {
5151struct BaseAndFieldInfo {
5152 Sema &S;
5153 CXXConstructorDecl *Ctor;
5154 bool AnyErrorsInInits;
5156 llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
5157 SmallVector<CXXCtorInitializer*, 8> AllToInit;
5158 llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;
5159
5160 BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor, bool ErrorsInInits)
5161 : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
5162 bool Generated = Ctor->isImplicit() || Ctor->isDefaulted();
5163 if (Ctor->getInheritedConstructor())
5164 IIK = IIK_Inherit;
5165 else if (Generated && Ctor->isCopyConstructor())
5166 IIK = IIK_Copy;
5167 else if (Generated && Ctor->isMoveConstructor())
5168 IIK = IIK_Move;
5169 else
5170 IIK = IIK_Default;
5171 }
5172
5173 bool isImplicitCopyOrMove() const {
5174 switch (IIK) {
5175 case IIK_Copy:
5176 case IIK_Move:
5177 return true;
5178
5179 case IIK_Default:
5180 case IIK_Inherit:
5181 return false;
5182 }
5183
5184 llvm_unreachable("Invalid ImplicitInitializerKind!");
5185 }
5186
5187 bool addFieldInitializer(CXXCtorInitializer *Init) {
5188 AllToInit.push_back(Init);
5189
5190 // Check whether this initializer makes the field "used".
5191 if (Init->getInit()->HasSideEffects(S.Context))
5192 S.UnusedPrivateFields.remove(Init->getAnyMember());
5193
5194 return false;
5195 }
5196
5197 bool isInactiveUnionMember(FieldDecl *Field) {
5198 RecordDecl *Record = Field->getParent();
5199 if (!Record->isUnion())
5200 return false;
5201
5202 if (FieldDecl *Active =
5203 ActiveUnionMember.lookup(Record->getCanonicalDecl()))
5204 return Active != Field->getCanonicalDecl();
5205
5206 // In an implicit copy or move constructor, ignore any in-class initializer.
5207 if (isImplicitCopyOrMove())
5208 return true;
5209
5210 // If there's no explicit initialization, the field is active only if it
5211 // has an in-class initializer...
5212 if (Field->hasInClassInitializer())
5213 return false;
5214 // ... or it's an anonymous struct or union whose class has an in-class
5215 // initializer.
5216 if (!Field->isAnonymousStructOrUnion())
5217 return true;
5218 CXXRecordDecl *FieldRD = Field->getType()->getAsCXXRecordDecl();
5219 return !FieldRD->hasInClassInitializer();
5220 }
5221
5222 /// Determine whether the given field is, or is within, a union member
5223 /// that is inactive (because there was an initializer given for a different
5224 /// member of the union, or because the union was not initialized at all).
5225 bool isWithinInactiveUnionMember(FieldDecl *Field,
5226 IndirectFieldDecl *Indirect) {
5227 if (!Indirect)
5228 return isInactiveUnionMember(Field);
5229
5230 for (auto *C : Indirect->chain()) {
5231 FieldDecl *Field = dyn_cast<FieldDecl>(C);
5232 if (Field && isInactiveUnionMember(Field))
5233 return true;
5234 }
5235 return false;
5236 }
5237};
5238}
5239
5240/// Determine whether the given type is an incomplete or zero-lenfgth
5241/// array type.
5243 if (T->isIncompleteArrayType())
5244 return true;
5245
5246 while (const ConstantArrayType *ArrayT = Context.getAsConstantArrayType(T)) {
5247 if (ArrayT->isZeroSize())
5248 return true;
5249
5250 T = ArrayT->getElementType();
5251 }
5252
5253 return false;
5254}
5255
5256static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info,
5257 FieldDecl *Field,
5258 IndirectFieldDecl *Indirect = nullptr) {
5259 if (Field->isInvalidDecl())
5260 return false;
5261
5262 // Overwhelmingly common case: we have a direct initializer for this field.
5264 Info.AllBaseFields.lookup(Field->getCanonicalDecl()))
5265 return Info.addFieldInitializer(Init);
5266
5267 // C++11 [class.base.init]p8:
5268 // if the entity is a non-static data member that has a
5269 // brace-or-equal-initializer and either
5270 // -- the constructor's class is a union and no other variant member of that
5271 // union is designated by a mem-initializer-id or
5272 // -- the constructor's class is not a union, and, if the entity is a member
5273 // of an anonymous union, no other member of that union is designated by
5274 // a mem-initializer-id,
5275 // the entity is initialized as specified in [dcl.init].
5276 //
5277 // We also apply the same rules to handle anonymous structs within anonymous
5278 // unions.
5279 if (Info.isWithinInactiveUnionMember(Field, Indirect))
5280 return false;
5281
5282 if (Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {
5283 ExprResult DIE =
5284 SemaRef.BuildCXXDefaultInitExpr(Info.Ctor->getLocation(), Field);
5285 if (DIE.isInvalid())
5286 return true;
5287
5288 auto Entity = InitializedEntity::InitializeMember(Field, nullptr, true);
5289 SemaRef.checkInitializerLifetime(Entity, DIE.get());
5290
5292 if (Indirect)
5293 Init = new (SemaRef.Context)
5294 CXXCtorInitializer(SemaRef.Context, Indirect, SourceLocation(),
5295 SourceLocation(), DIE.get(), SourceLocation());
5296 else
5297 Init = new (SemaRef.Context)
5298 CXXCtorInitializer(SemaRef.Context, Field, SourceLocation(),
5299 SourceLocation(), DIE.get(), SourceLocation());
5300 return Info.addFieldInitializer(Init);
5301 }
5302
5303 // Don't initialize incomplete or zero-length arrays.
5304 if (isIncompleteOrZeroLengthArrayType(SemaRef.Context, Field->getType()))
5305 return false;
5306
5307 // Don't try to build an implicit initializer if there were semantic
5308 // errors in any of the initializers (and therefore we might be
5309 // missing some that the user actually wrote).
5310 if (Info.AnyErrorsInInits)
5311 return false;
5312
5313 CXXCtorInitializer *Init = nullptr;
5314 if (BuildImplicitMemberInitializer(Info.S, Info.Ctor, Info.IIK, Field,
5315 Indirect, Init))
5316 return true;
5317
5318 if (!Init)
5319 return false;
5320
5321 return Info.addFieldInitializer(Init);
5322}
5323
5324bool
5327 assert(Initializer->isDelegatingInitializer());
5328 Constructor->setNumCtorInitializers(1);
5329 CXXCtorInitializer **initializer =
5330 new (Context) CXXCtorInitializer*[1];
5331 memcpy(initializer, &Initializer, sizeof (CXXCtorInitializer*));
5332 Constructor->setCtorInitializers(initializer);
5333
5334 if (CXXDestructorDecl *Dtor = LookupDestructor(Constructor->getParent())) {
5335 MarkFunctionReferenced(Initializer->getSourceLocation(), Dtor);
5336 DiagnoseUseOfDecl(Dtor, Initializer->getSourceLocation());
5337 }
5338
5340
5341 DiagnoseUninitializedFields(*this, Constructor);
5342
5343 return false;
5344}
5345
5347 CXXRecordDecl *Class) {
5348 if (Class->isInvalidDecl())
5349 return nullptr;
5350 if (Class->hasIrrelevantDestructor())
5351 return nullptr;
5352
5353 // Dtor might still be missing, e.g because it's invalid.
5354 return S.LookupDestructor(Class);
5355}
5356
5358 FieldDecl *Field) {
5359 if (Field->isInvalidDecl())
5360 return;
5361
5362 // Don't destroy incomplete or zero-length arrays.
5363 if (isIncompleteOrZeroLengthArrayType(S.Context, Field->getType()))
5364 return;
5365
5366 QualType FieldType = S.Context.getBaseElementType(Field->getType());
5367
5368 auto *FieldClassDecl = FieldType->getAsCXXRecordDecl();
5369 if (!FieldClassDecl)
5370 return;
5371
5372 // The destructor for an implicit anonymous union member is never invoked.
5373 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
5374 return;
5375
5376 auto *Dtor = LookupDestructorIfRelevant(S, FieldClassDecl);
5377 if (!Dtor)
5378 return;
5379
5380 S.CheckDestructorAccess(Field->getLocation(), Dtor,
5381 S.PDiag(diag::err_access_dtor_field)
5382 << Field->getDeclName() << FieldType);
5383
5384 S.MarkFunctionReferenced(Location, Dtor);
5385 S.DiagnoseUseOfDecl(Dtor, Location);
5386}
5387
5389 CXXRecordDecl *ClassDecl) {
5390 if (ClassDecl->isDependentContext())
5391 return;
5392
5393 // We only potentially invoke the destructors of potentially constructed
5394 // subobjects.
5395 bool VisitVirtualBases = !ClassDecl->isAbstract();
5396
5397 // If the destructor exists and has already been marked used in the MS ABI,
5398 // then virtual base destructors have already been checked and marked used.
5399 // Skip checking them again to avoid duplicate diagnostics.
5401 CXXDestructorDecl *Dtor = ClassDecl->getDestructor();
5402 if (Dtor && Dtor->isUsed())
5403 VisitVirtualBases = false;
5404 }
5405
5407
5408 // Bases.
5409 for (const auto &Base : ClassDecl->bases()) {
5410 auto *BaseClassDecl = Base.getType()->getAsCXXRecordDecl();
5411 if (!BaseClassDecl)
5412 continue;
5413
5414 // Remember direct virtual bases.
5415 if (Base.isVirtual()) {
5416 if (!VisitVirtualBases)
5417 continue;
5418 DirectVirtualBases.insert(BaseClassDecl);
5419 }
5420
5421 auto *Dtor = LookupDestructorIfRelevant(S, BaseClassDecl);
5422 if (!Dtor)
5423 continue;
5424
5425 // FIXME: caret should be on the start of the class name
5426 S.CheckDestructorAccess(Base.getBeginLoc(), Dtor,
5427 S.PDiag(diag::err_access_dtor_base)
5428 << Base.getType() << Base.getSourceRange(),
5429 S.Context.getCanonicalTagType(ClassDecl));
5430
5431 S.MarkFunctionReferenced(Location, Dtor);
5432 S.DiagnoseUseOfDecl(Dtor, Location);
5433 }
5434
5435 if (VisitVirtualBases)
5436 S.MarkVirtualBaseDestructorsReferenced(Location, ClassDecl,
5437 &DirectVirtualBases);
5438}
5439
5441 ArrayRef<CXXCtorInitializer *> Initializers) {
5442 if (Constructor->isDependentContext()) {
5443 // Just store the initializers as written, they will be checked during
5444 // instantiation.
5445 if (!Initializers.empty()) {
5446 Constructor->setNumCtorInitializers(Initializers.size());
5447 CXXCtorInitializer **baseOrMemberInitializers =
5448 new (Context) CXXCtorInitializer*[Initializers.size()];
5449 memcpy(baseOrMemberInitializers, Initializers.data(),
5450 Initializers.size() * sizeof(CXXCtorInitializer*));
5451 Constructor->setCtorInitializers(baseOrMemberInitializers);
5452 }
5453
5454 // Let template instantiation know whether we had errors.
5455 if (AnyErrors)
5456 Constructor->setInvalidDecl();
5457
5458 return false;
5459 }
5460
5461 BaseAndFieldInfo Info(*this, Constructor, AnyErrors);
5462
5463 // We need to build the initializer AST according to order of construction
5464 // and not what user specified in the Initializers list.
5465 CXXRecordDecl *ClassDecl = Constructor->getParent()->getDefinition();
5466 if (!ClassDecl)
5467 return true;
5468
5469 bool HadError = false;
5470
5471 for (unsigned i = 0; i < Initializers.size(); i++) {
5472 CXXCtorInitializer *Member = Initializers[i];
5473
5474 if (Member->isBaseInitializer())
5475 Info.AllBaseFields[Member->getBaseClass()->getAsCanonical<RecordType>()] =
5476 Member;
5477 else {
5478 Info.AllBaseFields[Member->getAnyMember()->getCanonicalDecl()] = Member;
5479
5480 if (IndirectFieldDecl *F = Member->getIndirectMember()) {
5481 for (auto *C : F->chain()) {
5482 FieldDecl *FD = dyn_cast<FieldDecl>(C);
5483 if (FD && FD->getParent()->isUnion())
5484 Info.ActiveUnionMember.insert(std::make_pair(
5486 }
5487 } else if (FieldDecl *FD = Member->getMember()) {
5488 if (FD->getParent()->isUnion())
5489 Info.ActiveUnionMember.insert(std::make_pair(
5491 }
5492 }
5493 }
5494
5495 // Keep track of the direct virtual bases.
5497 for (auto &I : ClassDecl->bases()) {
5498 if (I.isVirtual())
5499 DirectVBases.insert(&I);
5500 }
5501
5502 // Push virtual bases before others.
5503 for (auto &VBase : ClassDecl->vbases()) {
5504 if (CXXCtorInitializer *Value = Info.AllBaseFields.lookup(
5505 VBase.getType()->getAsCanonical<RecordType>())) {
5506 // [class.base.init]p7, per DR257:
5507 // A mem-initializer where the mem-initializer-id names a virtual base
5508 // class is ignored during execution of a constructor of any class that
5509 // is not the most derived class.
5510 if (ClassDecl->isAbstract()) {
5511 // FIXME: Provide a fixit to remove the base specifier. This requires
5512 // tracking the location of the associated comma for a base specifier.
5513 Diag(Value->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)
5514 << VBase.getType() << ClassDecl;
5515 DiagnoseAbstractType(ClassDecl);
5516 }
5517
5518 Info.AllToInit.push_back(Value);
5519 } else if (!AnyErrors && !ClassDecl->isAbstract()) {
5520 // [class.base.init]p8, per DR257:
5521 // If a given [...] base class is not named by a mem-initializer-id
5522 // [...] and the entity is not a virtual base class of an abstract
5523 // class, then [...] the entity is default-initialized.
5524 bool IsInheritedVirtualBase = !DirectVBases.count(&VBase);
5525 CXXCtorInitializer *CXXBaseInit;
5526 if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
5527 &VBase, IsInheritedVirtualBase,
5528 CXXBaseInit)) {
5529 HadError = true;
5530 continue;
5531 }
5532
5533 Info.AllToInit.push_back(CXXBaseInit);
5534 }
5535 }
5536
5537 // Non-virtual bases.
5538 for (auto &Base : ClassDecl->bases()) {
5539 // Virtuals are in the virtual base list and already constructed.
5540 if (Base.isVirtual())
5541 continue;
5542
5543 if (CXXCtorInitializer *Value = Info.AllBaseFields.lookup(
5544 Base.getType()->getAsCanonical<RecordType>())) {
5545 Info.AllToInit.push_back(Value);
5546 } else if (!AnyErrors) {
5547 CXXCtorInitializer *CXXBaseInit;
5548 if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
5549 &Base, /*IsInheritedVirtualBase=*/false,
5550 CXXBaseInit)) {
5551 HadError = true;
5552 continue;
5553 }
5554
5555 Info.AllToInit.push_back(CXXBaseInit);
5556 }
5557 }
5558
5559 // Fields.
5560 for (auto *Mem : ClassDecl->decls()) {
5561 if (auto *F = dyn_cast<FieldDecl>(Mem)) {
5562 // C++ [class.bit]p2:
5563 // A declaration for a bit-field that omits the identifier declares an
5564 // unnamed bit-field. Unnamed bit-fields are not members and cannot be
5565 // initialized.
5566 if (F->isUnnamedBitField())
5567 continue;
5568
5569 // If we're not generating the implicit copy/move constructor, then we'll
5570 // handle anonymous struct/union fields based on their individual
5571 // indirect fields.
5572 if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())
5573 continue;
5574
5575 if (CollectFieldInitializer(*this, Info, F))
5576 HadError = true;
5577 continue;
5578 }
5579
5580 // Beyond this point, we only consider default initialization.
5581 if (Info.isImplicitCopyOrMove())
5582 continue;
5583
5584 if (auto *F = dyn_cast<IndirectFieldDecl>(Mem)) {
5585 if (F->getType()->isIncompleteArrayType()) {
5586 assert(ClassDecl->hasFlexibleArrayMember() &&
5587 "Incomplete array type is not valid");
5588 continue;
5589 }
5590
5591 // Initialize each field of an anonymous struct individually.
5592 if (CollectFieldInitializer(*this, Info, F->getAnonField(), F))
5593 HadError = true;
5594
5595 continue;
5596 }
5597 }
5598
5599 unsigned NumInitializers = Info.AllToInit.size();
5600 if (NumInitializers > 0) {
5601 Constructor->setNumCtorInitializers(NumInitializers);
5602 CXXCtorInitializer **baseOrMemberInitializers =
5603 new (Context) CXXCtorInitializer*[NumInitializers];
5604 memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
5605 NumInitializers * sizeof(CXXCtorInitializer*));
5606 Constructor->setCtorInitializers(baseOrMemberInitializers);
5607
5608 SourceLocation Location = Constructor->getLocation();
5609
5610 // Constructors implicitly reference the base and member
5611 // destructors.
5612
5613 for (CXXCtorInitializer *Initializer : Info.AllToInit) {
5614 FieldDecl *Field = Initializer->getAnyMember();
5615 if (!Field)
5616 continue;
5617
5618 // C++ [class.base.init]p12:
5619 // In a non-delegating constructor, the destructor for each
5620 // potentially constructed subobject of class type is potentially
5621 // invoked.
5622 MarkFieldDestructorReferenced(*this, Location, Field);
5623 }
5624
5625 MarkBaseDestructorsReferenced(*this, Location, Constructor->getParent());
5626 }
5627
5628 return HadError;
5629}
5630
5632 if (const RecordType *RT = Field->getType()->getAsCanonical<RecordType>()) {
5633 const RecordDecl *RD = RT->getDecl();
5634 if (RD->isAnonymousStructOrUnion()) {
5635 for (auto *Field : RD->getDefinitionOrSelf()->fields())
5636 PopulateKeysForFields(Field, IdealInits);
5637 return;
5638 }
5639 }
5640 IdealInits.push_back(Field->getCanonicalDecl());
5641}
5642
5643static const void *GetKeyForBase(ASTContext &Context, QualType BaseType) {
5644 return Context.getCanonicalType(BaseType).getTypePtr();
5645}
5646
5647static const void *GetKeyForMember(ASTContext &Context,
5649 if (!Member->isAnyMemberInitializer())
5650 return GetKeyForBase(Context, QualType(Member->getBaseClass(), 0));
5651
5652 return Member->getAnyMember()->getCanonicalDecl();
5653}
5654
5657 const CXXCtorInitializer *Current) {
5658 if (Previous->isAnyMemberInitializer())
5659 Diag << 0 << Previous->getAnyMember();
5660 else
5661 Diag << 1 << Previous->getTypeSourceInfo()->getType();
5662
5663 if (Current->isAnyMemberInitializer())
5664 Diag << 0 << Current->getAnyMember();
5665 else
5666 Diag << 1 << Current->getTypeSourceInfo()->getType();
5667}
5668
5670 Sema &SemaRef, const CXXConstructorDecl *Constructor,
5672 if (Constructor->getDeclContext()->isDependentContext())
5673 return;
5674
5675 // Don't check initializers order unless the warning is enabled at the
5676 // location of at least one initializer.
5677 bool ShouldCheckOrder = false;
5678 for (unsigned InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) {
5679 CXXCtorInitializer *Init = Inits[InitIndex];
5680 if (!SemaRef.Diags.isIgnored(diag::warn_initializer_out_of_order,
5681 Init->getSourceLocation())) {
5682 ShouldCheckOrder = true;
5683 break;
5684 }
5685 }
5686 if (!ShouldCheckOrder)
5687 return;
5688
5689 // Build the list of bases and members in the order that they'll
5690 // actually be initialized. The explicit initializers should be in
5691 // this same order but may be missing things.
5692 SmallVector<const void*, 32> IdealInitKeys;
5693
5694 const CXXRecordDecl *ClassDecl = Constructor->getParent();
5695
5696 // 1. Virtual bases.
5697 for (const auto &VBase : ClassDecl->vbases())
5698 IdealInitKeys.push_back(GetKeyForBase(SemaRef.Context, VBase.getType()));
5699
5700 // 2. Non-virtual bases.
5701 for (const auto &Base : ClassDecl->bases()) {
5702 if (Base.isVirtual())
5703 continue;
5704 IdealInitKeys.push_back(GetKeyForBase(SemaRef.Context, Base.getType()));
5705 }
5706
5707 // 3. Direct fields.
5708 for (auto *Field : ClassDecl->fields()) {
5709 if (Field->isUnnamedBitField())
5710 continue;
5711
5712 PopulateKeysForFields(Field, IdealInitKeys);
5713 }
5714
5715 unsigned NumIdealInits = IdealInitKeys.size();
5716 unsigned IdealIndex = 0;
5717
5718 // Track initializers that are in an incorrect order for either a warning or
5719 // note if multiple ones occur.
5720 SmallVector<unsigned> WarnIndexes;
5721 // Correlates the index of an initializer in the init-list to the index of
5722 // the field/base in the class.
5723 SmallVector<std::pair<unsigned, unsigned>, 32> CorrelatedInitOrder;
5724
5725 for (unsigned InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) {
5726 const void *InitKey = GetKeyForMember(SemaRef.Context, Inits[InitIndex]);
5727
5728 // Scan forward to try to find this initializer in the idealized
5729 // initializers list.
5730 for (; IdealIndex != NumIdealInits; ++IdealIndex)
5731 if (InitKey == IdealInitKeys[IdealIndex])
5732 break;
5733
5734 // If we didn't find this initializer, it must be because we
5735 // scanned past it on a previous iteration. That can only
5736 // happen if we're out of order; emit a warning.
5737 if (IdealIndex == NumIdealInits && InitIndex) {
5738 WarnIndexes.push_back(InitIndex);
5739
5740 // Move back to the initializer's location in the ideal list.
5741 for (IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)
5742 if (InitKey == IdealInitKeys[IdealIndex])
5743 break;
5744
5745 assert(IdealIndex < NumIdealInits &&
5746 "initializer not found in initializer list");
5747 }
5748 CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
5749 }
5750
5751 if (WarnIndexes.empty())
5752 return;
5753
5754 // Sort based on the ideal order, first in the pair.
5755 llvm::sort(CorrelatedInitOrder, llvm::less_first());
5756
5757 // Introduce a new scope as SemaDiagnosticBuilder needs to be destroyed to
5758 // emit the diagnostic before we can try adding notes.
5759 {
5761 Inits[WarnIndexes.front() - 1]->getSourceLocation(),
5762 WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order
5763 : diag::warn_some_initializers_out_of_order);
5764
5765 for (unsigned I = 0; I < CorrelatedInitOrder.size(); ++I) {
5766 if (CorrelatedInitOrder[I].second == I)
5767 continue;
5768 // Ideally we would be using InsertFromRange here, but clang doesn't
5769 // appear to handle InsertFromRange correctly when the source range is
5770 // modified by another fix-it.
5772 Inits[I]->getSourceRange(),
5775 Inits[CorrelatedInitOrder[I].second]->getSourceRange()),
5776 SemaRef.getSourceManager(), SemaRef.getLangOpts()));
5777 }
5778
5779 // If there is only 1 item out of order, the warning expects the name and
5780 // type of each being added to it.
5781 if (WarnIndexes.size() == 1) {
5782 AddInitializerToDiag(D, Inits[WarnIndexes.front() - 1],
5783 Inits[WarnIndexes.front()]);
5784 return;
5785 }
5786 }
5787 // More than 1 item to warn, create notes letting the user know which ones
5788 // are bad.
5789 for (unsigned WarnIndex : WarnIndexes) {
5790 const clang::CXXCtorInitializer *PrevInit = Inits[WarnIndex - 1];
5791 auto D = SemaRef.Diag(PrevInit->getSourceLocation(),
5792 diag::note_initializer_out_of_order);
5793 AddInitializerToDiag(D, PrevInit, Inits[WarnIndex]);
5794 D << PrevInit->getSourceRange();
5795 }
5796}
5797
5798namespace {
5799bool CheckRedundantInit(Sema &S,
5800 CXXCtorInitializer *Init,
5801 CXXCtorInitializer *&PrevInit) {
5802 if (!PrevInit) {
5803 PrevInit = Init;
5804 return false;
5805 }
5806
5807 if (FieldDecl *Field = Init->getAnyMember())
5808 S.Diag(Init->getSourceLocation(),
5809 diag::err_multiple_mem_initialization)
5810 << Field->getDeclName()
5811 << Init->getSourceRange();
5812 else {
5813 const Type *BaseClass = Init->getBaseClass();
5814 assert(BaseClass && "neither field nor base");
5815 S.Diag(Init->getSourceLocation(),
5816 diag::err_multiple_base_initialization)
5817 << QualType(BaseClass, 0)
5818 << Init->getSourceRange();
5819 }
5820 S.Diag(PrevInit->getSourceLocation(), diag::note_previous_initializer)
5821 << 0 << PrevInit->getSourceRange();
5822
5823 return true;
5824}
5825
5826typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
5827typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
5828
5829bool CheckRedundantUnionInit(Sema &S,
5830 CXXCtorInitializer *Init,
5831 RedundantUnionMap &Unions) {
5832 FieldDecl *Field = Init->getAnyMember();
5833 RecordDecl *Parent = Field->getParent();
5834 NamedDecl *Child = Field;
5835
5836 while (Parent->isAnonymousStructOrUnion() || Parent->isUnion()) {
5837 if (Parent->isUnion()) {
5838 UnionEntry &En = Unions[Parent];
5839 if (En.first && En.first != Child) {
5840 S.Diag(Init->getSourceLocation(),
5841 diag::err_multiple_mem_union_initialization)
5842 << Field->getDeclName()
5843 << Init->getSourceRange();
5844 S.Diag(En.second->getSourceLocation(), diag::note_previous_initializer)
5845 << 0 << En.second->getSourceRange();
5846 return true;
5847 }
5848 if (!En.first) {
5849 En.first = Child;
5850 En.second = Init;
5851 }
5852 if (!Parent->isAnonymousStructOrUnion())
5853 return false;
5854 }
5855
5856 Child = Parent;
5857 Parent = cast<RecordDecl>(Parent->getDeclContext());
5858 }
5859
5860 return false;
5861}
5862} // namespace
5863
5864void Sema::ActOnMemInitializers(Decl *ConstructorDecl,
5865 SourceLocation ColonLoc,
5867 bool AnyErrors) {
5868 if (!ConstructorDecl)
5869 return;
5870
5871 AdjustDeclIfTemplate(ConstructorDecl);
5872
5874 = dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5875
5876 if (!Constructor) {
5877 Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
5878 return;
5879 }
5880
5881 // Mapping for the duplicate initializers check.
5882 // For member initializers, this is keyed with a FieldDecl*.
5883 // For base initializers, this is keyed with a Type*.
5884 llvm::DenseMap<const void *, CXXCtorInitializer *> Members;
5885
5886 // Mapping for the inconsistent anonymous-union initializers check.
5887 RedundantUnionMap MemberUnions;
5888
5889 bool HadError = false;
5890 for (unsigned i = 0; i < MemInits.size(); i++) {
5891 CXXCtorInitializer *Init = MemInits[i];
5892
5893 // Set the source order index.
5894 Init->setSourceOrder(i);
5895
5896 if (Init->isAnyMemberInitializer()) {
5897 const void *Key = GetKeyForMember(Context, Init);
5898 if (CheckRedundantInit(*this, Init, Members[Key]) ||
5899 CheckRedundantUnionInit(*this, Init, MemberUnions))
5900 HadError = true;
5901 } else if (Init->isBaseInitializer()) {
5902 const void *Key = GetKeyForMember(Context, Init);
5903 if (CheckRedundantInit(*this, Init, Members[Key]))
5904 HadError = true;
5905 } else {
5906 assert(Init->isDelegatingInitializer());
5907 // This must be the only initializer
5908 if (MemInits.size() != 1) {
5909 Diag(Init->getSourceLocation(),
5910 diag::err_delegating_initializer_alone)
5911 << Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();
5912 // We will treat this as being the only initializer.
5913 }
5915 // Return immediately as the initializer is set.
5916 return;
5917 }
5918 }
5919
5920 if (HadError)
5921 return;
5922
5924
5925 SetCtorInitializers(Constructor, AnyErrors, MemInits);
5926
5927 DiagnoseUninitializedFields(*this, Constructor);
5928}
5929
5931 CXXRecordDecl *ClassDecl) {
5932 // Ignore dependent contexts. Also ignore unions, since their members never
5933 // have destructors implicitly called.
5934 if (ClassDecl->isDependentContext() || ClassDecl->isUnion())
5935 return;
5936
5937 // FIXME: all the access-control diagnostics are positioned on the
5938 // field/base declaration. That's probably good; that said, the
5939 // user might reasonably want to know why the destructor is being
5940 // emitted, and we currently don't say.
5941
5942 // Non-static data members.
5943 for (auto *Field : ClassDecl->fields()) {
5944 MarkFieldDestructorReferenced(*this, Location, Field);
5945 }
5946
5947 MarkBaseDestructorsReferenced(*this, Location, ClassDecl);
5948}
5949
5951 SourceLocation Location, CXXRecordDecl *ClassDecl,
5952 llvm::SmallPtrSetImpl<const CXXRecordDecl *> *DirectVirtualBases) {
5953 // Virtual bases.
5954 for (const auto &VBase : ClassDecl->vbases()) {
5955 auto *BaseClassDecl = VBase.getType()->getAsCXXRecordDecl();
5956 if (!BaseClassDecl)
5957 continue;
5958
5959 // Ignore already visited direct virtual bases.
5960 if (DirectVirtualBases && DirectVirtualBases->count(BaseClassDecl))
5961 continue;
5962
5963 auto *Dtor = LookupDestructorIfRelevant(*this, BaseClassDecl);
5964 if (!Dtor)
5965 continue;
5966
5967 CanQualType CT = Context.getCanonicalTagType(ClassDecl);
5968 if (CheckDestructorAccess(ClassDecl->getLocation(), Dtor,
5969 PDiag(diag::err_access_dtor_vbase)
5970 << CT << VBase.getType(),
5971 CT) == AR_accessible) {
5973 CT, VBase.getType(), diag::err_access_dtor_vbase, 0,
5974 ClassDecl->getLocation(), SourceRange(), DeclarationName(), nullptr);
5975 }
5976
5977 MarkFunctionReferenced(Location, Dtor);
5978 DiagnoseUseOfDecl(Dtor, Location);
5979 }
5980}
5981
5983 if (!CDtorDecl)
5984 return;
5985
5987 = dyn_cast<CXXConstructorDecl>(CDtorDecl)) {
5988 if (CXXRecordDecl *ClassDecl = Constructor->getParent();
5989 !ClassDecl || ClassDecl->isInvalidDecl()) {
5990 return;
5991 }
5992 SetCtorInitializers(Constructor, /*AnyErrors=*/false);
5993 DiagnoseUninitializedFields(*this, Constructor);
5994 }
5995}
5996
5998 if (!getLangOpts().CPlusPlus)
5999 return false;
6000
6001 const auto *RD = Context.getBaseElementType(T)->getAsCXXRecordDecl();
6002 if (!RD)
6003 return false;
6004
6005 // FIXME: Per [temp.inst]p1, we are supposed to trigger instantiation of a
6006 // class template specialization here, but doing so breaks a lot of code.
6007
6008 // We can't answer whether something is abstract until it has a
6009 // definition. If it's currently being defined, we'll walk back
6010 // over all the declarations when we have a full definition.
6011 const CXXRecordDecl *Def = RD->getDefinition();
6012 if (!Def || Def->isBeingDefined())
6013 return false;
6014
6015 return RD->isAbstract();
6016}
6017
6019 TypeDiagnoser &Diagnoser) {
6020 if (!isAbstractType(Loc, T))
6021 return false;
6022
6023 T = Context.getBaseElementType(T);
6024 Diagnoser.diagnose(*this, Loc, T);
6025 DiagnoseAbstractType(T->getAsCXXRecordDecl());
6026 return true;
6027}
6028
6030 // Check if we've already emitted the list of pure virtual functions
6031 // for this class.
6033 return;
6034
6035 // If the diagnostic is suppressed, don't emit the notes. We're only
6036 // going to emit them once, so try to attach them to a diagnostic we're
6037 // actually going to show.
6038 if (Diags.isLastDiagnosticIgnored())
6039 return;
6040
6041 CXXFinalOverriderMap FinalOverriders;
6042 RD->getFinalOverriders(FinalOverriders);
6043
6044 // Keep a set of seen pure methods so we won't diagnose the same method
6045 // more than once.
6047
6048 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
6049 MEnd = FinalOverriders.end();
6050 M != MEnd;
6051 ++M) {
6052 for (OverridingMethods::iterator SO = M->second.begin(),
6053 SOEnd = M->second.end();
6054 SO != SOEnd; ++SO) {
6055 // C++ [class.abstract]p4:
6056 // A class is abstract if it contains or inherits at least one
6057 // pure virtual function for which the final overrider is pure
6058 // virtual.
6059
6060 //
6061 if (SO->second.size() != 1)
6062 continue;
6063
6064 if (!SO->second.front().Method->isPureVirtual())
6065 continue;
6066
6067 if (!SeenPureMethods.insert(SO->second.front().Method).second)
6068 continue;
6069
6070 Diag(SO->second.front().Method->getLocation(),
6071 diag::note_pure_virtual_function)
6072 << SO->second.front().Method->getDeclName() << RD->getDeclName();
6073 }
6074 }
6075
6078 PureVirtualClassDiagSet->insert(RD);
6079}
6080
6081namespace {
6082struct AbstractUsageInfo {
6083 Sema &S;
6085 CanQualType AbstractType;
6086 bool Invalid;
6087
6088 AbstractUsageInfo(Sema &S, CXXRecordDecl *Record)
6089 : S(S), Record(Record),
6090 AbstractType(S.Context.getCanonicalTagType(Record)), Invalid(false) {}
6091
6092 void DiagnoseAbstractType() {
6093 if (Invalid) return;
6095 Invalid = true;
6096 }
6097
6098 void CheckType(const NamedDecl *D, TypeLoc TL, Sema::AbstractDiagSelID Sel);
6099};
6100
6101struct CheckAbstractUsage {
6102 AbstractUsageInfo &Info;
6103 const NamedDecl *Ctx;
6104
6105 CheckAbstractUsage(AbstractUsageInfo &Info, const NamedDecl *Ctx)
6106 : Info(Info), Ctx(Ctx) {}
6107
6108 void Visit(TypeLoc TL, Sema::AbstractDiagSelID Sel) {
6109 switch (TL.getTypeLocClass()) {
6110#define ABSTRACT_TYPELOC(CLASS, PARENT)
6111#define TYPELOC(CLASS, PARENT) \
6112 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
6113#include "clang/AST/TypeLocNodes.def"
6114 }
6115 }
6116
6117 void Check(FunctionProtoTypeLoc TL, Sema::AbstractDiagSelID Sel) {
6119 for (unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
6120 if (!TL.getParam(I))
6121 continue;
6122
6123 TypeSourceInfo *TSI = TL.getParam(I)->getTypeSourceInfo();
6124 if (TSI) Visit(TSI->getTypeLoc(), Sema::AbstractParamType);
6125 }
6126 }
6127
6128 void Check(ArrayTypeLoc TL, Sema::AbstractDiagSelID Sel) {
6130 }
6131
6132 void Check(TemplateSpecializationTypeLoc TL, Sema::AbstractDiagSelID Sel) {
6133 // Visit the type parameters from a permissive context.
6134 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
6135 TemplateArgumentLoc TAL = TL.getArgLoc(I);
6137 if (TypeSourceInfo *TSI = TAL.getTypeSourceInfo())
6138 Visit(TSI->getTypeLoc(), Sema::AbstractNone);
6139 // TODO: other template argument types?
6140 }
6141 }
6142
6143 // Visit pointee types from a permissive context.
6144#define CheckPolymorphic(Type) \
6145 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \
6146 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \
6147 }
6153
6154 /// Handle all the types we haven't given a more specific
6155 /// implementation for above.
6156 void Check(TypeLoc TL, Sema::AbstractDiagSelID Sel) {
6157 // Every other kind of type that we haven't called out already
6158 // that has an inner type is either (1) sugar or (2) contains that
6159 // inner type in some way as a subobject.
6160 if (TypeLoc Next = TL.getNextTypeLoc())
6161 return Visit(Next, Sel);
6162
6163 // If there's no inner type and we're in a permissive context,
6164 // don't diagnose.
6165 if (Sel == Sema::AbstractNone) return;
6166
6167 // Check whether the type matches the abstract type.
6168 QualType T = TL.getType();
6169 if (T->isArrayType()) {
6171 T = Info.S.Context.getBaseElementType(T);
6172 }
6173 CanQualType CT = T->getCanonicalTypeUnqualified().getUnqualifiedType();
6174 if (CT != Info.AbstractType) return;
6175
6176 // It matched; do some magic.
6177 // FIXME: These should be at most warnings. See P0929R2, CWG1640, CWG1646.
6178 if (Sel == Sema::AbstractArrayType) {
6179 Info.S.Diag(Ctx->getLocation(), diag::err_array_of_abstract_type)
6180 << T << TL.getSourceRange();
6181 } else {
6182 Info.S.Diag(Ctx->getLocation(), diag::err_abstract_type_in_decl)
6183 << Sel << T << TL.getSourceRange();
6184 }
6185 Info.DiagnoseAbstractType();
6186 }
6187};
6188
6189void AbstractUsageInfo::CheckType(const NamedDecl *D, TypeLoc TL,
6191 CheckAbstractUsage(*this, D).Visit(TL, Sel);
6192}
6193
6194}
6195
6196/// Check for invalid uses of an abstract type in a function declaration.
6197static void CheckAbstractClassUsage(AbstractUsageInfo &Info,
6198 FunctionDecl *FD) {
6199 // Only definitions are required to refer to complete and
6200 // non-abstract types.
6202 return;
6203
6204 // For safety's sake, just ignore it if we don't have type source
6205 // information. This should never happen for non-implicit methods,
6206 // but...
6207 if (TypeSourceInfo *TSI = FD->getTypeSourceInfo())
6208 Info.CheckType(FD, TSI->getTypeLoc(), Sema::AbstractNone);
6209}
6210
6211/// Check for invalid uses of an abstract type in a variable0 declaration.
6212static void CheckAbstractClassUsage(AbstractUsageInfo &Info,
6213 VarDecl *VD) {
6214 // No need to do the check on definitions, which require that
6215 // the type is complete.
6217 return;
6218
6219 Info.CheckType(VD, VD->getTypeSourceInfo()->getTypeLoc(),
6221}
6222
6223/// Check for invalid uses of an abstract type within a class definition.
6224static void CheckAbstractClassUsage(AbstractUsageInfo &Info,
6225 CXXRecordDecl *RD) {
6226 for (auto *D : RD->decls()) {
6227 if (D->isImplicit()) continue;
6228
6229 // Step through friends to the befriended declaration.
6230 if (auto *FD = dyn_cast<FriendDecl>(D)) {
6231 D = FD->getFriendDecl();
6232 if (!D) continue;
6233 }
6234
6235 // Functions and function templates.
6236 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6237 CheckAbstractClassUsage(Info, FD);
6238 } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(D)) {
6239 CheckAbstractClassUsage(Info, FTD->getTemplatedDecl());
6240
6241 // Fields and static variables.
6242 } else if (auto *FD = dyn_cast<FieldDecl>(D)) {
6243 if (TypeSourceInfo *TSI = FD->getTypeSourceInfo())
6244 Info.CheckType(FD, TSI->getTypeLoc(), Sema::AbstractFieldType);
6245 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
6246 CheckAbstractClassUsage(Info, VD);
6247 } else if (auto *VTD = dyn_cast<VarTemplateDecl>(D)) {
6248 CheckAbstractClassUsage(Info, VTD->getTemplatedDecl());
6249
6250 // Nested classes and class templates.
6251 } else if (auto *RD = dyn_cast<CXXRecordDecl>(D)) {
6252 CheckAbstractClassUsage(Info, RD);
6253 } else if (auto *CTD = dyn_cast<ClassTemplateDecl>(D)) {
6254 CheckAbstractClassUsage(Info, CTD->getTemplatedDecl());
6255 }
6256 }
6257}
6258
6260 Attr *ClassAttr = getDLLAttr(Class);
6261 if (!ClassAttr)
6262 return;
6263
6264 assert(ClassAttr->getKind() == attr::DLLExport);
6265
6266 TemplateSpecializationKind TSK = Class->getTemplateSpecializationKind();
6267
6269 // Don't go any further if this is just an explicit instantiation
6270 // declaration.
6271 return;
6272
6273 // Add a context note to explain how we got to any diagnostics produced below.
6274 struct MarkingClassDllexported {
6275 Sema &S;
6276 MarkingClassDllexported(Sema &S, CXXRecordDecl *Class,
6277 SourceLocation AttrLoc)
6278 : S(S) {
6281 Ctx.PointOfInstantiation = AttrLoc;
6282 Ctx.Entity = Class;
6284 }
6285 ~MarkingClassDllexported() {
6287 }
6288 } MarkingDllexportedContext(S, Class, ClassAttr->getLocation());
6289
6290 if (S.Context.getTargetInfo().getTriple().isOSCygMing())
6291 S.MarkVTableUsed(Class->getLocation(), Class, true);
6292
6293 for (Decl *Member : Class->decls()) {
6294 // Skip members that were not marked exported.
6295 if (!Member->hasAttr<DLLExportAttr>())
6296 continue;
6297
6298 // Defined static variables that are members of an exported base
6299 // class must be marked export too.
6300 auto *VD = dyn_cast<VarDecl>(Member);
6301 if (VD && VD->getStorageClass() == SC_Static &&
6303 S.MarkVariableReferenced(VD->getLocation(), VD);
6304
6305 auto *MD = dyn_cast<CXXMethodDecl>(Member);
6306 if (!MD)
6307 continue;
6308
6309 if (MD->isUserProvided()) {
6310 // Instantiate non-default class member functions ...
6311
6312 // .. except for certain kinds of template specializations.
6313 if (TSK == TSK_ImplicitInstantiation && !ClassAttr->isInherited())
6314 continue;
6315
6316 // If this is an MS ABI dllexport default constructor, instantiate any
6317 // default arguments.
6319 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6320 if (CD && CD->isDefaultConstructor() && TSK == TSK_Undeclared) {
6322 }
6323 }
6324
6325 S.MarkFunctionReferenced(Class->getLocation(), MD);
6326
6327 // The function will be passed to the consumer when its definition is
6328 // encountered.
6329 } else if (MD->isExplicitlyDefaulted()) {
6330 // Synthesize and instantiate explicitly defaulted methods.
6331 S.MarkFunctionReferenced(Class->getLocation(), MD);
6332
6334 // Except for explicit instantiation defs, we will not see the
6335 // definition again later, so pass it to the consumer now.
6337 }
6338 } else if (!MD->isTrivial() ||
6339 MD->isCopyAssignmentOperator() ||
6340 MD->isMoveAssignmentOperator()) {
6341 // Synthesize and instantiate non-trivial implicit methods, and the copy
6342 // and move assignment operators. The latter are exported even if they
6343 // are trivial, because the address of an operator can be taken and
6344 // should compare equal across libraries.
6345 S.MarkFunctionReferenced(Class->getLocation(), MD);
6346
6347 // There is no later point when we will see the definition of this
6348 // function, so pass it to the consumer now.
6350 }
6351 }
6352}
6353
6355 CXXRecordDecl *Class) {
6356 // Only the MS ABI has default constructor closures, so we don't need to do
6357 // this semantic checking anywhere else.
6359 return;
6360
6361 CXXConstructorDecl *LastExportedDefaultCtor = nullptr;
6362 for (Decl *Member : Class->decls()) {
6363 // Look for exported default constructors.
6364 auto *CD = dyn_cast<CXXConstructorDecl>(Member);
6365 if (!CD || !CD->isDefaultConstructor())
6366 continue;
6367 auto *Attr = CD->getAttr<DLLExportAttr>();
6368 if (!Attr)
6369 continue;
6370
6371 // If the class is non-dependent, mark the default arguments as ODR-used so
6372 // that we can properly codegen the constructor closure.
6373 if (!Class->isDependentContext()) {
6374 for (ParmVarDecl *PD : CD->parameters()) {
6375 (void)S.CheckCXXDefaultArgExpr(Attr->getLocation(), CD, PD);
6377 }
6378 }
6379
6380 if (LastExportedDefaultCtor) {
6381 S.Diag(LastExportedDefaultCtor->getLocation(),
6382 diag::err_attribute_dll_ambiguous_default_ctor)
6383 << Class;
6384 S.Diag(CD->getLocation(), diag::note_entity_declared_at)
6385 << CD->getDeclName();
6386 return;
6387 }
6388 LastExportedDefaultCtor = CD;
6389 }
6390}
6391
6393 CXXRecordDecl *Class) {
6394 bool ErrorReported = false;
6395 auto reportIllegalClassTemplate = [&ErrorReported](Sema &S,
6396 ClassTemplateDecl *TD) {
6397 if (ErrorReported)
6398 return;
6399 S.Diag(TD->getLocation(),
6400 diag::err_cuda_device_builtin_surftex_cls_template)
6401 << /*surface*/ 0 << TD;
6402 ErrorReported = true;
6403 };
6404
6405 ClassTemplateDecl *TD = Class->getDescribedClassTemplate();
6406 if (!TD) {
6407 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6408 if (!SD) {
6409 S.Diag(Class->getLocation(),
6410 diag::err_cuda_device_builtin_surftex_ref_decl)
6411 << /*surface*/ 0 << Class;
6412 S.Diag(Class->getLocation(),
6413 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6414 << Class;
6415 return;
6416 }
6417 TD = SD->getSpecializedTemplate();
6418 }
6419
6421 unsigned N = Params->size();
6422
6423 if (N != 2) {
6424 reportIllegalClassTemplate(S, TD);
6425 S.Diag(TD->getLocation(),
6426 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6427 << TD << 2;
6428 }
6429 if (N > 0 && !isa<TemplateTypeParmDecl>(Params->getParam(0))) {
6430 reportIllegalClassTemplate(S, TD);
6431 S.Diag(TD->getLocation(),
6432 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6433 << TD << /*1st*/ 0 << /*type*/ 0;
6434 }
6435 if (N > 1) {
6436 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->getParam(1));
6437 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6438 reportIllegalClassTemplate(S, TD);
6439 S.Diag(TD->getLocation(),
6440 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6441 << TD << /*2nd*/ 1 << /*integer*/ 1;
6442 }
6443 }
6444}
6445
6447 CXXRecordDecl *Class) {
6448 bool ErrorReported = false;
6449 auto reportIllegalClassTemplate = [&ErrorReported](Sema &S,
6450 ClassTemplateDecl *TD) {
6451 if (ErrorReported)
6452 return;
6453 S.Diag(TD->getLocation(),
6454 diag::err_cuda_device_builtin_surftex_cls_template)
6455 << /*texture*/ 1 << TD;
6456 ErrorReported = true;
6457 };
6458
6459 ClassTemplateDecl *TD = Class->getDescribedClassTemplate();
6460 if (!TD) {
6461 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6462 if (!SD) {
6463 S.Diag(Class->getLocation(),
6464 diag::err_cuda_device_builtin_surftex_ref_decl)
6465 << /*texture*/ 1 << Class;
6466 S.Diag(Class->getLocation(),
6467 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6468 << Class;
6469 return;
6470 }
6471 TD = SD->getSpecializedTemplate();
6472 }
6473
6475 unsigned N = Params->size();
6476
6477 if (N != 3) {
6478 reportIllegalClassTemplate(S, TD);
6479 S.Diag(TD->getLocation(),
6480 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6481 << TD << 3;
6482 }
6483 if (N > 0 && !isa<TemplateTypeParmDecl>(Params->getParam(0))) {
6484 reportIllegalClassTemplate(S, TD);
6485 S.Diag(TD->getLocation(),
6486 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6487 << TD << /*1st*/ 0 << /*type*/ 0;
6488 }
6489 if (N > 1) {
6490 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->getParam(1));
6491 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6492 reportIllegalClassTemplate(S, TD);
6493 S.Diag(TD->getLocation(),
6494 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6495 << TD << /*2nd*/ 1 << /*integer*/ 1;
6496 }
6497 }
6498 if (N > 2) {
6499 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->getParam(2));
6500 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6501 reportIllegalClassTemplate(S, TD);
6502 S.Diag(TD->getLocation(),
6503 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6504 << TD << /*3rd*/ 2 << /*integer*/ 1;
6505 }
6506 }
6507}
6508
6510 // Mark any compiler-generated routines with the implicit code_seg attribute.
6511 for (auto *Method : Class->methods()) {
6512 if (Method->isUserProvided())
6513 continue;
6514 if (Attr *A = getImplicitCodeSegOrSectionAttrForFunction(Method, /*IsDefinition=*/true))
6515 Method->addAttr(A);
6516 }
6517}
6518
6520 Attr *ClassAttr = getDLLAttr(Class);
6521
6522 // MSVC inherits DLL attributes to partial class template specializations.
6523 if (Context.getTargetInfo().shouldDLLImportComdatSymbols() && !ClassAttr) {
6524 if (auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(Class)) {
6525 if (Attr *TemplateAttr =
6526 getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
6527 auto *A = cast<InheritableAttr>(TemplateAttr->clone(getASTContext()));
6528 A->setInherited(true);
6529 ClassAttr = A;
6530 }
6531 }
6532 }
6533
6534 if (!ClassAttr)
6535 return;
6536
6537 // MSVC allows imported or exported template classes that have UniqueExternal
6538 // linkage. This occurs when the template class has been instantiated with
6539 // a template parameter which itself has internal linkage.
6540 // We drop the attribute to avoid exporting or importing any members.
6541 if ((Context.getTargetInfo().getCXXABI().isMicrosoft() ||
6542 Context.getTargetInfo().getTriple().isPS()) &&
6543 (!Class->isExternallyVisible() && Class->hasExternalFormalLinkage())) {
6544 Class->dropAttrs<DLLExportAttr, DLLImportAttr>();
6545 return;
6546 }
6547
6548 if (!Class->isExternallyVisible()) {
6549 Diag(Class->getLocation(), diag::err_attribute_dll_not_extern)
6550 << Class << ClassAttr;
6551 return;
6552 }
6553
6554 if (Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6555 !ClassAttr->isInherited()) {
6556 // Diagnose dll attributes on members of class with dll attribute.
6557 for (Decl *Member : Class->decls()) {
6559 continue;
6560 InheritableAttr *MemberAttr = getDLLAttr(Member);
6561 if (!MemberAttr || MemberAttr->isInherited() || Member->isInvalidDecl())
6562 continue;
6563
6564 Diag(MemberAttr->getLocation(),
6565 diag::err_attribute_dll_member_of_dll_class)
6566 << MemberAttr << ClassAttr;
6567 Diag(ClassAttr->getLocation(), diag::note_previous_attribute);
6568 Member->setInvalidDecl();
6569 }
6570 }
6571
6572 if (Class->getDescribedClassTemplate())
6573 // Don't inherit dll attribute until the template is instantiated.
6574 return;
6575
6576 // The class is either imported or exported.
6577 const bool ClassExported = ClassAttr->getKind() == attr::DLLExport;
6578
6579 // Check if this was a dllimport attribute propagated from a derived class to
6580 // a base class template specialization. We don't apply these attributes to
6581 // static data members.
6582 const bool PropagatedImport =
6583 !ClassExported &&
6584 cast<DLLImportAttr>(ClassAttr)->wasPropagatedToBaseTemplate();
6585
6586 TemplateSpecializationKind TSK = Class->getTemplateSpecializationKind();
6587
6588 // Ignore explicit dllexport on explicit class template instantiation
6589 // declarations, except in MinGW mode.
6590 if (ClassExported && !ClassAttr->isInherited() &&
6592 !Context.getTargetInfo().getTriple().isOSCygMing()) {
6593 if (auto *DEA = Class->getAttr<DLLExportAttr>()) {
6594 Class->addAttr(DLLExportOnDeclAttr::Create(Context, DEA->getLoc()));
6595 Class->dropAttr<DLLExportAttr>();
6596 }
6597 return;
6598 }
6599
6600 // Force declaration of implicit members so they can inherit the attribute.
6602
6603 // FIXME: MSVC's docs say all bases must be exportable, but this doesn't
6604 // seem to be true in practice?
6605
6606 for (Decl *Member : Class->decls()) {
6607 VarDecl *VD = dyn_cast<VarDecl>(Member);
6608 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member);
6609
6610 // Only methods and static fields inherit the attributes.
6611 if (!VD && !MD)
6612 continue;
6613
6614 if (MD) {
6615 // Don't process deleted methods.
6616 if (MD->isDeleted())
6617 continue;
6618
6619 if (MD->isInlined()) {
6620 // MinGW does not import or export inline methods. But do it for
6621 // template instantiations.
6622 if (!Context.getTargetInfo().shouldDLLImportComdatSymbols() &&
6625 continue;
6626
6627 // MSVC versions before 2015 don't export the move assignment operators
6628 // and move constructor, so don't attempt to import/export them if
6629 // we have a definition.
6630 auto *Ctor = dyn_cast<CXXConstructorDecl>(MD);
6631 if ((MD->isMoveAssignmentOperator() ||
6632 (Ctor && Ctor->isMoveConstructor())) &&
6633 getLangOpts().isCompatibleWithMSVC() &&
6634 !getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015))
6635 continue;
6636
6637 // MSVC2015 doesn't export trivial defaulted x-tor but copy assign
6638 // operator is exported anyway.
6639 if (getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015) &&
6640 (Ctor || isa<CXXDestructorDecl>(MD)) && MD->isTrivial())
6641 continue;
6642 }
6643 }
6644
6645 // Don't apply dllimport attributes to static data members of class template
6646 // instantiations when the attribute is propagated from a derived class.
6647 if (VD && PropagatedImport)
6648 continue;
6649
6651 continue;
6652
6653 if (!getDLLAttr(Member)) {
6654 InheritableAttr *NewAttr = nullptr;
6655
6656 // Do not export/import inline function when -fno-dllexport-inlines is
6657 // passed. But add attribute for later local static var check.
6658 if (!getLangOpts().DllExportInlines && MD && MD->isInlined() &&
6661 if (ClassExported) {
6662 NewAttr = ::new (getASTContext())
6663 DLLExportStaticLocalAttr(getASTContext(), *ClassAttr);
6664 } else {
6665 NewAttr = ::new (getASTContext())
6666 DLLImportStaticLocalAttr(getASTContext(), *ClassAttr);
6667 }
6668 } else {
6669 NewAttr = cast<InheritableAttr>(ClassAttr->clone(getASTContext()));
6670 }
6671
6672 NewAttr->setInherited(true);
6673 Member->addAttr(NewAttr);
6674
6675 if (MD) {
6676 // Propagate DLLAttr to friend re-declarations of MD that have already
6677 // been constructed.
6678 for (FunctionDecl *FD = MD->getMostRecentDecl(); FD;
6679 FD = FD->getPreviousDecl()) {
6681 continue;
6682 assert(!getDLLAttr(FD) &&
6683 "friend re-decl should not already have a DLLAttr");
6684 NewAttr = cast<InheritableAttr>(ClassAttr->clone(getASTContext()));
6685 NewAttr->setInherited(true);
6686 FD->addAttr(NewAttr);
6687 }
6688 }
6689 }
6690 }
6691
6692 if (ClassExported)
6693 DelayedDllExportClasses.push_back(Class);
6694}
6695
6697 CXXRecordDecl *Class, Attr *ClassAttr,
6698 ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc) {
6699 if (getDLLAttr(
6700 BaseTemplateSpec->getSpecializedTemplate()->getTemplatedDecl())) {
6701 // If the base class template has a DLL attribute, don't try to change it.
6702 return;
6703 }
6704
6705 auto TSK = BaseTemplateSpec->getSpecializationKind();
6706 if (!getDLLAttr(BaseTemplateSpec) &&
6708 TSK == TSK_ImplicitInstantiation)) {
6709 // The template hasn't been instantiated yet (or it has, but only as an
6710 // explicit instantiation declaration or implicit instantiation, which means
6711 // we haven't codegenned any members yet), so propagate the attribute.
6712 auto *NewAttr = cast<InheritableAttr>(ClassAttr->clone(getASTContext()));
6713 NewAttr->setInherited(true);
6714 BaseTemplateSpec->addAttr(NewAttr);
6715
6716 // If this was an import, mark that we propagated it from a derived class to
6717 // a base class template specialization.
6718 if (auto *ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))
6719 ImportAttr->setPropagatedToBaseTemplate();
6720
6721 // If the template is already instantiated, checkDLLAttributeRedeclaration()
6722 // needs to be run again to work see the new attribute. Otherwise this will
6723 // get run whenever the template is instantiated.
6724 if (TSK != TSK_Undeclared)
6725 checkClassLevelDLLAttribute(BaseTemplateSpec);
6726
6727 return;
6728 }
6729
6730 if (getDLLAttr(BaseTemplateSpec)) {
6731 // The template has already been specialized or instantiated with an
6732 // attribute, explicitly or through propagation. We should not try to change
6733 // it.
6734 return;
6735 }
6736
6737 // The template was previously instantiated or explicitly specialized without
6738 // a dll attribute, It's too late for us to add an attribute, so warn that
6739 // this is unsupported.
6740 Diag(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)
6741 << BaseTemplateSpec->isExplicitSpecialization();
6742 Diag(ClassAttr->getLocation(), diag::note_attribute);
6743 if (BaseTemplateSpec->isExplicitSpecialization()) {
6744 Diag(BaseTemplateSpec->getLocation(),
6745 diag::note_template_class_explicit_specialization_was_here)
6746 << BaseTemplateSpec;
6747 } else {
6748 Diag(BaseTemplateSpec->getPointOfInstantiation(),
6749 diag::note_template_class_instantiation_was_here)
6750 << BaseTemplateSpec;
6751 }
6752}
6753
6756 if (auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6757 if (const CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
6758 if (Ctor->isDefaultConstructor())
6760
6761 if (Ctor->isCopyConstructor())
6763
6764 if (Ctor->isMoveConstructor())
6766 }
6767
6768 if (MD->isCopyAssignmentOperator())
6770
6771 if (MD->isMoveAssignmentOperator())
6773
6774 if (isa<CXXDestructorDecl>(FD))
6776 }
6777
6778 switch (FD->getDeclName().getCXXOverloadedOperator()) {
6779 case OO_EqualEqual:
6781
6782 case OO_ExclaimEqual:
6784
6785 case OO_Spaceship:
6786 // No point allowing this if <=> doesn't exist in the current language mode.
6787 if (!getLangOpts().CPlusPlus20)
6788 break;
6790
6791 case OO_Less:
6792 case OO_LessEqual:
6793 case OO_Greater:
6794 case OO_GreaterEqual:
6795 // No point allowing this if <=> doesn't exist in the current language mode.
6796 if (!getLangOpts().CPlusPlus20)
6797 break;
6799
6800 default:
6801 break;
6802 }
6803
6804 // Not defaultable.
6805 return DefaultedFunctionKind();
6806}
6807
6809 SourceLocation DefaultLoc) {
6811 if (DFK.isComparison())
6812 return S.DefineDefaultedComparison(DefaultLoc, FD, DFK.asComparison());
6813
6814 switch (DFK.asSpecialMember()) {
6818 break;
6821 break;
6824 break;
6827 break;
6830 break;
6833 break;
6835 llvm_unreachable("Invalid special member.");
6836 }
6837}
6838
6839/// Determine whether a type is permitted to be passed or returned in
6840/// registers, per C++ [class.temporary]p3.
6843 if (D->isDependentType() || D->isInvalidDecl())
6844 return false;
6845
6846 // Clang <= 4 used the pre-C++11 rule, which ignores move operations.
6847 // The PS4 platform ABI follows the behavior of Clang 3.2.
6849 return !D->hasNonTrivialDestructorForCall() &&
6851
6852 if (CCK == TargetInfo::CCK_MicrosoftWin64) {
6853 bool CopyCtorIsTrivial = false, CopyCtorIsTrivialForCall = false;
6854 bool DtorIsTrivialForCall = false;
6855
6856 // If a class has at least one eligible, trivial copy constructor, it
6857 // is passed according to the C ABI. Otherwise, it is passed indirectly.
6858 //
6859 // Note: This permits classes with non-trivial copy or move ctors to be
6860 // passed in registers, so long as they *also* have a trivial copy ctor,
6861 // which is non-conforming.
6865 CopyCtorIsTrivial = true;
6867 CopyCtorIsTrivialForCall = true;
6868 }
6869 } else {
6870 for (const CXXConstructorDecl *CD : D->ctors()) {
6871 if (CD->isCopyConstructor() && !CD->isDeleted() &&
6872 !CD->isIneligibleOrNotSelected()) {
6873 if (CD->isTrivial())
6874 CopyCtorIsTrivial = true;
6875 if (CD->isTrivialForCall())
6876 CopyCtorIsTrivialForCall = true;
6877 }
6878 }
6879 }
6880
6881 if (D->needsImplicitDestructor()) {
6882 if (!D->defaultedDestructorIsDeleted() &&
6884 DtorIsTrivialForCall = true;
6885 } else if (const auto *DD = D->getDestructor()) {
6886 if (!DD->isDeleted() && DD->isTrivialForCall())
6887 DtorIsTrivialForCall = true;
6888 }
6889
6890 // If the copy ctor and dtor are both trivial-for-calls, pass direct.
6891 if (CopyCtorIsTrivialForCall && DtorIsTrivialForCall)
6892 return true;
6893
6894 // If a class has a destructor, we'd really like to pass it indirectly
6895 // because it allows us to elide copies. Unfortunately, MSVC makes that
6896 // impossible for small types, which it will pass in a single register or
6897 // stack slot. Most objects with dtors are large-ish, so handle that early.
6898 // We can't call out all large objects as being indirect because there are
6899 // multiple x64 calling conventions and the C++ ABI code shouldn't dictate
6900 // how we pass large POD types.
6901
6902 // Note: This permits small classes with nontrivial destructors to be
6903 // passed in registers, which is non-conforming.
6904 bool isAArch64 = S.Context.getTargetInfo().getTriple().isAArch64();
6905 uint64_t TypeSize = isAArch64 ? 128 : 64;
6906
6907 if (CopyCtorIsTrivial && S.getASTContext().getTypeSize(
6908 S.Context.getCanonicalTagType(D)) <= TypeSize)
6909 return true;
6910 return false;
6911 }
6912
6913 // Per C++ [class.temporary]p3, the relevant condition is:
6914 // each copy constructor, move constructor, and destructor of X is
6915 // either trivial or deleted, and X has at least one non-deleted copy
6916 // or move constructor
6917 bool HasNonDeletedCopyOrMove = false;
6918
6922 return false;
6923 HasNonDeletedCopyOrMove = true;
6924 }
6925
6926 if (S.getLangOpts().CPlusPlus11 && D->needsImplicitMoveConstructor() &&
6929 return false;
6930 HasNonDeletedCopyOrMove = true;
6931 }
6932
6935 return false;
6936
6937 for (const CXXMethodDecl *MD : D->methods()) {
6938 if (MD->isDeleted() || MD->isIneligibleOrNotSelected())
6939 continue;
6940
6941 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6942 if (CD && CD->isCopyOrMoveConstructor())
6943 HasNonDeletedCopyOrMove = true;
6944 else if (!isa<CXXDestructorDecl>(MD))
6945 continue;
6946
6947 if (!MD->isTrivialForCall())
6948 return false;
6949 }
6950
6951 return HasNonDeletedCopyOrMove;
6952}
6953
6954/// Report an error regarding overriding, along with any relevant
6955/// overridden methods.
6956///
6957/// \param DiagID the primary error to report.
6958/// \param MD the overriding method.
6959static bool
6960ReportOverrides(Sema &S, unsigned DiagID, const CXXMethodDecl *MD,
6961 llvm::function_ref<bool(const CXXMethodDecl *)> Report) {
6962 bool IssuedDiagnostic = false;
6963 for (const CXXMethodDecl *O : MD->overridden_methods()) {
6964 if (Report(O)) {
6965 if (!IssuedDiagnostic) {
6966 S.Diag(MD->getLocation(), DiagID) << MD->getDeclName();
6967 IssuedDiagnostic = true;
6968 }
6969 S.Diag(O->getLocation(), diag::note_overridden_virtual_function);
6970 }
6971 }
6972 return IssuedDiagnostic;
6973}
6974
6976 if (!Record)
6977 return;
6978
6979 if (Record->isAbstract() && !Record->isInvalidDecl()) {
6980 AbstractUsageInfo Info(*this, Record);
6982 }
6983
6984 // If this is not an aggregate type and has no user-declared constructor,
6985 // complain about any non-static data members of reference or const scalar
6986 // type, since they will never get initializers.
6987 if (!Record->isInvalidDecl() && !Record->isDependentType() &&
6988 !Record->isAggregate() && !Record->hasUserDeclaredConstructor() &&
6989 !Record->isLambda()) {
6990 bool Complained = false;
6991 for (const auto *F : Record->fields()) {
6992 if (F->hasInClassInitializer() || F->isUnnamedBitField())
6993 continue;
6994
6995 if (F->getType()->isReferenceType() ||
6996 (F->getType().isConstQualified() && F->getType()->isScalarType())) {
6997 if (!Complained) {
6998 Diag(Record->getLocation(), diag::warn_no_constructor_for_refconst)
6999 << Record->getTagKind() << Record;
7000 Complained = true;
7001 }
7002
7003 Diag(F->getLocation(), diag::note_refconst_member_not_initialized)
7004 << F->getType()->isReferenceType()
7005 << F->getDeclName();
7006 }
7007 }
7008 }
7009
7010 if (Record->getIdentifier()) {
7011 // C++ [class.mem]p13:
7012 // If T is the name of a class, then each of the following shall have a
7013 // name different from T:
7014 // - every member of every anonymous union that is a member of class T.
7015 //
7016 // C++ [class.mem]p14:
7017 // In addition, if class T has a user-declared constructor (12.1), every
7018 // non-static data member of class T shall have a name different from T.
7019 DeclContext::lookup_result R = Record->lookup(Record->getDeclName());
7020 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E;
7021 ++I) {
7022 NamedDecl *D = (*I)->getUnderlyingDecl();
7023 // Invalid IndirectFieldDecls have already been diagnosed with
7024 // err_anonymous_record_member_redecl in
7025 // SemaDecl.cpp:CheckAnonMemberRedeclaration.
7027 Record->hasUserDeclaredConstructor()) ||
7028 (isa<IndirectFieldDecl>(D) && !D->isInvalidDecl())) {
7029 Diag((*I)->getLocation(), diag::err_member_name_of_class)
7030 << D->getDeclName();
7031 break;
7032 }
7033 }
7034 }
7035
7036 // Warn if the class has virtual methods but non-virtual public destructor.
7037 if (Record->isPolymorphic() && !Record->isDependentType()) {
7038 CXXDestructorDecl *dtor = Record->getDestructor();
7039 if ((!dtor || (!dtor->isVirtual() && dtor->getAccess() == AS_public)) &&
7040 !Record->hasAttr<FinalAttr>())
7041 Diag(dtor ? dtor->getLocation() : Record->getLocation(),
7042 diag::warn_non_virtual_dtor)
7043 << Context.getCanonicalTagType(Record);
7044 }
7045
7046 if (Record->isAbstract()) {
7047 if (FinalAttr *FA = Record->getAttr<FinalAttr>()) {
7048 Diag(Record->getLocation(), diag::warn_abstract_final_class)
7049 << FA->isSpelledAsSealed();
7051 }
7052 }
7053
7054 // Warn if the class has a final destructor but is not itself marked final.
7055 if (!Record->hasAttr<FinalAttr>()) {
7056 if (const CXXDestructorDecl *dtor = Record->getDestructor()) {
7057 if (const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
7058 Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
7059 << FA->isSpelledAsSealed()
7061 getLocForEndOfToken(Record->getLocation()),
7062 (FA->isSpelledAsSealed() ? " sealed" : " final"));
7063 Diag(Record->getLocation(),
7064 diag::note_final_dtor_non_final_class_silence)
7065 << Context.getCanonicalTagType(Record) << FA->isSpelledAsSealed();
7066 }
7067 }
7068 }
7069
7070 // See if trivial_abi has to be dropped.
7071 if (Record->hasAttr<TrivialABIAttr>())
7073
7074 // Set HasTrivialSpecialMemberForCall if the record has attribute
7075 // "trivial_abi".
7076 bool HasTrivialABI = Record->hasAttr<TrivialABIAttr>();
7077
7078 if (HasTrivialABI)
7079 Record->setHasTrivialSpecialMemberForCall();
7080
7081 // Explicitly-defaulted secondary comparison functions (!=, <, <=, >, >=).
7082 // We check these last because they can depend on the properties of the
7083 // primary comparison functions (==, <=>).
7084 llvm::SmallVector<FunctionDecl*, 5> DefaultedSecondaryComparisons;
7085
7086 // Perform checks that can't be done until we know all the properties of a
7087 // member function (whether it's defaulted, deleted, virtual, overriding,
7088 // ...).
7089 auto CheckCompletedMemberFunction = [&](CXXMethodDecl *MD) {
7090 // A static function cannot override anything.
7091 if (MD->getStorageClass() == SC_Static) {
7092 if (ReportOverrides(*this, diag::err_static_overrides_virtual, MD,
7093 [](const CXXMethodDecl *) { return true; }))
7094 return;
7095 }
7096
7097 // A deleted function cannot override a non-deleted function and vice
7098 // versa.
7099 if (ReportOverrides(*this,
7100 MD->isDeleted() ? diag::err_deleted_override
7101 : diag::err_non_deleted_override,
7102 MD, [&](const CXXMethodDecl *V) {
7103 return MD->isDeleted() != V->isDeleted();
7104 })) {
7105 if (MD->isDefaulted() && MD->isDeleted())
7106 // Explain why this defaulted function was deleted.
7108 return;
7109 }
7110
7111 // A consteval function cannot override a non-consteval function and vice
7112 // versa.
7113 if (ReportOverrides(*this,
7114 MD->isConsteval() ? diag::err_consteval_override
7115 : diag::err_non_consteval_override,
7116 MD, [&](const CXXMethodDecl *V) {
7117 return MD->isConsteval() != V->isConsteval();
7118 })) {
7119 if (MD->isDefaulted() && MD->isDeleted())
7120 // Explain why this defaulted function was deleted.
7122 return;
7123 }
7124 };
7125
7126 auto CheckForDefaultedFunction = [&](FunctionDecl *FD) -> bool {
7127 if (!FD || FD->isInvalidDecl() || !FD->isExplicitlyDefaulted())
7128 return false;
7129
7133 DefaultedSecondaryComparisons.push_back(FD);
7134 return true;
7135 }
7136
7138 return false;
7139 };
7140
7141 if (!Record->isInvalidDecl() &&
7142 Record->hasAttr<VTablePointerAuthenticationAttr>())
7144
7145 auto CompleteMemberFunction = [&](CXXMethodDecl *M) {
7146 // Check whether the explicitly-defaulted members are valid.
7147 bool Incomplete = CheckForDefaultedFunction(M);
7148
7149 // Skip the rest of the checks for a member of a dependent class.
7150 if (Record->isDependentType())
7151 return;
7152
7153 // For an explicitly defaulted or deleted special member, we defer
7154 // determining triviality until the class is complete. That time is now!
7156 if (!M->isImplicit() && !M->isUserProvided()) {
7157 if (CSM != CXXSpecialMemberKind::Invalid) {
7158 M->setTrivial(SpecialMemberIsTrivial(M, CSM));
7159 // Inform the class that we've finished declaring this member.
7160 Record->finishedDefaultedOrDeletedMember(M);
7161 M->setTrivialForCall(
7162 HasTrivialABI ||
7165 Record->setTrivialForCallFlags(M);
7166 }
7167 }
7168
7169 // Set triviality for the purpose of calls if this is a user-provided
7170 // copy/move constructor or destructor.
7174 M->isUserProvided()) {
7175 M->setTrivialForCall(HasTrivialABI);
7176 Record->setTrivialForCallFlags(M);
7177 }
7178
7179 if (!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&
7180 M->hasAttr<DLLExportAttr>()) {
7181 if (getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015) &&
7182 M->isTrivial() &&
7186 M->dropAttr<DLLExportAttr>();
7187
7188 if (M->hasAttr<DLLExportAttr>()) {
7189 // Define after any fields with in-class initializers have been parsed.
7191 }
7192 }
7193
7194 bool EffectivelyConstexprDestructor = true;
7195 // Avoid triggering vtable instantiation due to a dtor that is not
7196 // "effectively constexpr" for better compatibility.
7197 // See https://github.com/llvm/llvm-project/issues/102293 for more info.
7198 if (isa<CXXDestructorDecl>(M)) {
7199 llvm::SmallDenseSet<QualType> Visited;
7200 auto Check = [&Visited](QualType T, auto &&Check) -> bool {
7201 if (!Visited.insert(T->getCanonicalTypeUnqualified()).second)
7202 return false;
7203 const CXXRecordDecl *RD =
7204 T->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
7205 if (!RD || !RD->isCompleteDefinition())
7206 return true;
7207
7208 if (!RD->hasConstexprDestructor())
7209 return false;
7210
7211 for (const CXXBaseSpecifier &B : RD->bases())
7212 if (!Check(B.getType(), Check))
7213 return false;
7214 for (const FieldDecl *FD : RD->fields())
7215 if (!Check(FD->getType(), Check))
7216 return false;
7217 return true;
7218 };
7219 EffectivelyConstexprDestructor =
7220 Check(Context.getCanonicalTagType(Record), Check);
7221 }
7222
7223 // Define defaulted constexpr virtual functions that override a base class
7224 // function right away.
7225 // FIXME: We can defer doing this until the vtable is marked as used.
7226 if (CSM != CXXSpecialMemberKind::Invalid && !M->isDeleted() &&
7227 M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&
7228 EffectivelyConstexprDestructor)
7229 DefineDefaultedFunction(*this, M, M->getLocation());
7230
7231 if (!Incomplete)
7232 CheckCompletedMemberFunction(M);
7233 };
7234
7235 // Check the destructor before any other member function. We need to
7236 // determine whether it's trivial in order to determine whether the claas
7237 // type is a literal type, which is a prerequisite for determining whether
7238 // other special member functions are valid and whether they're implicitly
7239 // 'constexpr'.
7240 if (CXXDestructorDecl *Dtor = Record->getDestructor())
7241 CompleteMemberFunction(Dtor);
7242
7243 bool HasMethodWithOverrideControl = false,
7244 HasOverridingMethodWithoutOverrideControl = false;
7245 for (auto *D : Record->decls()) {
7246 if (auto *M = dyn_cast<CXXMethodDecl>(D)) {
7247 // FIXME: We could do this check for dependent types with non-dependent
7248 // bases.
7249 if (!Record->isDependentType()) {
7250 // See if a method overloads virtual methods in a base
7251 // class without overriding any.
7252 if (!M->isStatic())
7254
7255 if (M->hasAttr<OverrideAttr>()) {
7256 HasMethodWithOverrideControl = true;
7257 } else if (M->size_overridden_methods() > 0) {
7258 HasOverridingMethodWithoutOverrideControl = true;
7259 } else {
7260 // Warn on newly-declared virtual methods in `final` classes
7261 if (M->isVirtualAsWritten() && Record->isEffectivelyFinal()) {
7262 Diag(M->getLocation(), diag::warn_unnecessary_virtual_specifier)
7263 << M;
7264 }
7265 }
7266 }
7267
7268 if (!isa<CXXDestructorDecl>(M))
7269 CompleteMemberFunction(M);
7270 } else if (auto *F = dyn_cast<FriendDecl>(D)) {
7271 CheckForDefaultedFunction(
7272 dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));
7273 }
7274 }
7275
7276 if (HasOverridingMethodWithoutOverrideControl) {
7277 bool HasInconsistentOverrideControl = HasMethodWithOverrideControl;
7278 for (auto *M : Record->methods())
7279 DiagnoseAbsenceOfOverrideControl(M, HasInconsistentOverrideControl);
7280 }
7281
7282 // Check the defaulted secondary comparisons after any other member functions.
7283 for (FunctionDecl *FD : DefaultedSecondaryComparisons) {
7285
7286 // If this is a member function, we deferred checking it until now.
7287 if (auto *MD = dyn_cast<CXXMethodDecl>(FD))
7288 CheckCompletedMemberFunction(MD);
7289 }
7290
7291 // {ms,gcc}_struct is a request to change ABI rules to either follow
7292 // Microsoft or Itanium C++ ABI. However, even if these attributes are
7293 // present, we do not layout classes following foreign ABI rules, but
7294 // instead enter a special "compatibility mode", which only changes
7295 // alignments of fundamental types and layout of bit fields.
7296 // Check whether this class uses any C++ features that are implemented
7297 // completely differently in the requested ABI, and if so, emit a
7298 // diagnostic. That diagnostic defaults to an error, but we allow
7299 // projects to map it down to a warning (or ignore it). It's a fairly
7300 // common practice among users of the ms_struct pragma to
7301 // mass-annotate headers, sweeping up a bunch of types that the
7302 // project doesn't really rely on MSVC-compatible layout for. We must
7303 // therefore support "ms_struct except for C++ stuff" as a secondary
7304 // ABI.
7305 // Don't emit this diagnostic if the feature was enabled as a
7306 // language option (as opposed to via a pragma or attribute), as
7307 // the option -mms-bitfields otherwise essentially makes it impossible
7308 // to build C++ code, unless this diagnostic is turned off.
7309 if (Context.getLangOpts().getLayoutCompatibility() ==
7311 Record->isMsStruct(Context) != Context.defaultsToMsStruct() &&
7312 (Record->isPolymorphic() || Record->getNumBases())) {
7313 Diag(Record->getLocation(), diag::warn_cxx_ms_struct);
7314 }
7315
7318
7319 bool ClangABICompat4 =
7320 Context.getLangOpts().getClangABICompat() <= LangOptions::ClangABI::Ver4;
7322 Context.getTargetInfo().getCallingConvKind(ClangABICompat4);
7323 bool CanPass = canPassInRegisters(*this, Record, CCK);
7324
7325 // Do not change ArgPassingRestrictions if it has already been set to
7326 // RecordArgPassingKind::CanNeverPassInRegs.
7327 if (Record->getArgPassingRestrictions() !=
7329 Record->setArgPassingRestrictions(
7332
7333 // If canPassInRegisters returns true despite the record having a non-trivial
7334 // destructor, the record is destructed in the callee. This happens only when
7335 // the record or one of its subobjects has a field annotated with trivial_abi
7336 // or a field qualified with ObjC __strong/__weak.
7337 if (Context.getTargetInfo().getCXXABI().areArgsDestroyedLeftToRightInCallee())
7338 Record->setParamDestroyedInCallee(true);
7339 else if (Record->hasNonTrivialDestructor())
7340 Record->setParamDestroyedInCallee(CanPass);
7341
7342 if (getLangOpts().ForceEmitVTables) {
7343 // If we want to emit all the vtables, we need to mark it as used. This
7344 // is especially required for cases like vtable assumption loads.
7345 MarkVTableUsed(Record->getInnerLocStart(), Record);
7346 }
7347
7348 if (getLangOpts().CUDA) {
7349 if (Record->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())
7351 else if (Record->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())
7353 }
7354
7355 llvm::SmallDenseMap<OverloadedOperatorKind,
7357 TypeAwareDecls{{OO_New, {}},
7358 {OO_Array_New, {}},
7359 {OO_Delete, {}},
7360 {OO_Array_New, {}}};
7361 for (auto *D : Record->decls()) {
7362 const FunctionDecl *FnDecl = D->getAsFunction();
7363 if (!FnDecl || !FnDecl->isTypeAwareOperatorNewOrDelete())
7364 continue;
7365 assert(FnDecl->getDeclName().isAnyOperatorNewOrDelete());
7366 TypeAwareDecls[FnDecl->getOverloadedOperator()].push_back(FnDecl);
7367 }
7368 auto CheckMismatchedTypeAwareAllocators =
7369 [this, &TypeAwareDecls, Record](OverloadedOperatorKind NewKind,
7370 OverloadedOperatorKind DeleteKind) {
7371 auto &NewDecls = TypeAwareDecls[NewKind];
7372 auto &DeleteDecls = TypeAwareDecls[DeleteKind];
7373 if (NewDecls.empty() == DeleteDecls.empty())
7374 return;
7375 DeclarationName FoundOperator =
7376 Context.DeclarationNames.getCXXOperatorName(
7377 NewDecls.empty() ? DeleteKind : NewKind);
7378 DeclarationName MissingOperator =
7379 Context.DeclarationNames.getCXXOperatorName(
7380 NewDecls.empty() ? NewKind : DeleteKind);
7381 Diag(Record->getLocation(),
7382 diag::err_type_aware_allocator_missing_matching_operator)
7383 << FoundOperator << Context.getCanonicalTagType(Record)
7384 << MissingOperator;
7385 for (auto MD : NewDecls)
7386 Diag(MD->getLocation(),
7387 diag::note_unmatched_type_aware_allocator_declared)
7388 << MD;
7389 for (auto MD : DeleteDecls)
7390 Diag(MD->getLocation(),
7391 diag::note_unmatched_type_aware_allocator_declared)
7392 << MD;
7393 };
7394 CheckMismatchedTypeAwareAllocators(OO_New, OO_Delete);
7395 CheckMismatchedTypeAwareAllocators(OO_Array_New, OO_Array_Delete);
7396}
7397
7398/// Look up the special member function that would be called by a special
7399/// member function for a subobject of class type.
7400///
7401/// \param Class The class type of the subobject.
7402/// \param CSM The kind of special member function.
7403/// \param FieldQuals If the subobject is a field, its cv-qualifiers.
7404/// \param ConstRHS True if this is a copy operation with a const object
7405/// on its RHS, that is, if the argument to the outer special member
7406/// function is 'const' and this is not a field marked 'mutable'.
7409 CXXSpecialMemberKind CSM, unsigned FieldQuals,
7410 bool ConstRHS) {
7411 unsigned LHSQuals = 0;
7414 LHSQuals = FieldQuals;
7415
7416 unsigned RHSQuals = FieldQuals;
7419 RHSQuals = 0;
7420 else if (ConstRHS)
7421 RHSQuals |= Qualifiers::Const;
7422
7423 return S.LookupSpecialMember(Class, CSM,
7424 RHSQuals & Qualifiers::Const,
7425 RHSQuals & Qualifiers::Volatile,
7426 false,
7427 LHSQuals & Qualifiers::Const,
7428 LHSQuals & Qualifiers::Volatile);
7429}
7430
7432 Sema &S;
7433 SourceLocation UseLoc;
7434
7435 /// A mapping from the base classes through which the constructor was
7436 /// inherited to the using shadow declaration in that base class (or a null
7437 /// pointer if the constructor was declared in that base class).
7438 llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>
7439 InheritedFromBases;
7440
7441public:
7444 : S(S), UseLoc(UseLoc) {
7445 bool DiagnosedMultipleConstructedBases = false;
7446 CXXRecordDecl *ConstructedBase = nullptr;
7447 BaseUsingDecl *ConstructedBaseIntroducer = nullptr;
7448
7449 // Find the set of such base class subobjects and check that there's a
7450 // unique constructed subobject.
7451 for (auto *D : Shadow->redecls()) {
7452 auto *DShadow = cast<ConstructorUsingShadowDecl>(D);
7453 auto *DNominatedBase = DShadow->getNominatedBaseClass();
7454 auto *DConstructedBase = DShadow->getConstructedBaseClass();
7455
7456 InheritedFromBases.insert(
7457 std::make_pair(DNominatedBase->getCanonicalDecl(),
7458 DShadow->getNominatedBaseClassShadowDecl()));
7459 if (DShadow->constructsVirtualBase())
7460 InheritedFromBases.insert(
7461 std::make_pair(DConstructedBase->getCanonicalDecl(),
7462 DShadow->getConstructedBaseClassShadowDecl()));
7463 else
7464 assert(DNominatedBase == DConstructedBase);
7465
7466 // [class.inhctor.init]p2:
7467 // If the constructor was inherited from multiple base class subobjects
7468 // of type B, the program is ill-formed.
7469 if (!ConstructedBase) {
7470 ConstructedBase = DConstructedBase;
7471 ConstructedBaseIntroducer = D->getIntroducer();
7472 } else if (ConstructedBase != DConstructedBase &&
7473 !Shadow->isInvalidDecl()) {
7474 if (!DiagnosedMultipleConstructedBases) {
7475 S.Diag(UseLoc, diag::err_ambiguous_inherited_constructor)
7476 << Shadow->getTargetDecl();
7477 S.Diag(ConstructedBaseIntroducer->getLocation(),
7478 diag::note_ambiguous_inherited_constructor_using)
7479 << ConstructedBase;
7480 DiagnosedMultipleConstructedBases = true;
7481 }
7482 S.Diag(D->getIntroducer()->getLocation(),
7483 diag::note_ambiguous_inherited_constructor_using)
7484 << DConstructedBase;
7485 }
7486 }
7487
7488 if (DiagnosedMultipleConstructedBases)
7489 Shadow->setInvalidDecl();
7490 }
7491
7492 /// Find the constructor to use for inherited construction of a base class,
7493 /// and whether that base class constructor inherits the constructor from a
7494 /// virtual base class (in which case it won't actually invoke it).
7495 std::pair<CXXConstructorDecl *, bool>
7497 auto It = InheritedFromBases.find(Base->getCanonicalDecl());
7498 if (It == InheritedFromBases.end())
7499 return std::make_pair(nullptr, false);
7500
7501 // This is an intermediary class.
7502 if (It->second)
7503 return std::make_pair(
7504 S.findInheritingConstructor(UseLoc, Ctor, It->second),
7505 It->second->constructsVirtualBase());
7506
7507 // This is the base class from which the constructor was inherited.
7508 return std::make_pair(Ctor, false);
7509 }
7510};
7511
7512/// Is the special member function which would be selected to perform the
7513/// specified operation on the specified class type a constexpr constructor?
7515 Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, unsigned Quals,
7516 bool ConstRHS, CXXConstructorDecl *InheritedCtor = nullptr,
7517 Sema::InheritedConstructorInfo *Inherited = nullptr) {
7518 // Suppress duplicate constraint checking here, in case a constraint check
7519 // caused us to decide to do this. Any truely recursive checks will get
7520 // caught during these checks anyway.
7522
7523 // If we're inheriting a constructor, see if we need to call it for this base
7524 // class.
7525 if (InheritedCtor) {
7527 auto BaseCtor =
7528 Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;
7529 if (BaseCtor)
7530 return BaseCtor->isConstexpr();
7531 }
7532
7534 return ClassDecl->hasConstexprDefaultConstructor();
7536 return ClassDecl->hasConstexprDestructor();
7537
7539 lookupCallFromSpecialMember(S, ClassDecl, CSM, Quals, ConstRHS);
7540 if (!SMOR.getMethod())
7541 // A constructor we wouldn't select can't be "involved in initializing"
7542 // anything.
7543 return true;
7544 return SMOR.getMethod()->isConstexpr();
7545}
7546
7547/// Determine whether the specified special member function would be constexpr
7548/// if it were implicitly defined.
7550 Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, bool ConstArg,
7551 CXXConstructorDecl *InheritedCtor = nullptr,
7552 Sema::InheritedConstructorInfo *Inherited = nullptr) {
7553 if (!S.getLangOpts().CPlusPlus11)
7554 return false;
7555
7556 // C++11 [dcl.constexpr]p4:
7557 // In the definition of a constexpr constructor [...]
7558 bool Ctor = true;
7559 switch (CSM) {
7561 if (Inherited)
7562 break;
7563 // Since default constructor lookup is essentially trivial (and cannot
7564 // involve, for instance, template instantiation), we compute whether a
7565 // defaulted default constructor is constexpr directly within CXXRecordDecl.
7566 //
7567 // This is important for performance; we need to know whether the default
7568 // constructor is constexpr to determine whether the type is a literal type.
7569 return ClassDecl->defaultedDefaultConstructorIsConstexpr();
7570
7573 // For copy or move constructors, we need to perform overload resolution.
7574 break;
7575
7578 if (!S.getLangOpts().CPlusPlus14)
7579 return false;
7580 // In C++1y, we need to perform overload resolution.
7581 Ctor = false;
7582 break;
7583
7585 return ClassDecl->defaultedDestructorIsConstexpr();
7586
7588 return false;
7589 }
7590
7591 // -- if the class is a non-empty union, or for each non-empty anonymous
7592 // union member of a non-union class, exactly one non-static data member
7593 // shall be initialized; [DR1359]
7594 //
7595 // If we squint, this is guaranteed, since exactly one non-static data member
7596 // will be initialized (if the constructor isn't deleted), we just don't know
7597 // which one.
7598 if (Ctor && ClassDecl->isUnion())
7600 ? ClassDecl->hasInClassInitializer() ||
7601 !ClassDecl->hasVariantMembers()
7602 : true;
7603
7604 // -- the class shall not have any virtual base classes;
7605 if (Ctor && ClassDecl->getNumVBases())
7606 return false;
7607
7608 // C++1y [class.copy]p26:
7609 // -- [the class] is a literal type, and
7610 if (!Ctor && !ClassDecl->isLiteral() && !S.getLangOpts().CPlusPlus23)
7611 return false;
7612
7613 // -- every constructor involved in initializing [...] base class
7614 // sub-objects shall be a constexpr constructor;
7615 // -- the assignment operator selected to copy/move each direct base
7616 // class is a constexpr function, and
7617 if (!S.getLangOpts().CPlusPlus23) {
7618 for (const auto &B : ClassDecl->bases()) {
7619 auto *BaseClassDecl = B.getType()->getAsCXXRecordDecl();
7620 if (!BaseClassDecl)
7621 continue;
7622 if (!specialMemberIsConstexpr(S, BaseClassDecl, CSM, 0, ConstArg,
7623 InheritedCtor, Inherited))
7624 return false;
7625 }
7626 }
7627
7628 // -- every constructor involved in initializing non-static data members
7629 // [...] shall be a constexpr constructor;
7630 // -- every non-static data member and base class sub-object shall be
7631 // initialized
7632 // -- for each non-static data member of X that is of class type (or array
7633 // thereof), the assignment operator selected to copy/move that member is
7634 // a constexpr function
7635 if (!S.getLangOpts().CPlusPlus23) {
7636 for (const auto *F : ClassDecl->fields()) {
7637 if (F->isInvalidDecl())
7638 continue;
7640 F->hasInClassInitializer())
7641 continue;
7642 QualType BaseType = S.Context.getBaseElementType(F->getType());
7643 if (const RecordType *RecordTy = BaseType->getAsCanonical<RecordType>()) {
7644 auto *FieldRecDecl =
7645 cast<CXXRecordDecl>(RecordTy->getDecl())->getDefinitionOrSelf();
7646 if (!specialMemberIsConstexpr(S, FieldRecDecl, CSM,
7647 BaseType.getCVRQualifiers(),
7648 ConstArg && !F->isMutable()))
7649 return false;
7650 } else if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
7651 return false;
7652 }
7653 }
7654 }
7655
7656 // All OK, it's constexpr!
7657 return true;
7658}
7659
7660namespace {
7661/// RAII object to register a defaulted function as having its exception
7662/// specification computed.
7663struct ComputingExceptionSpec {
7664 Sema &S;
7665
7666 ComputingExceptionSpec(Sema &S, FunctionDecl *FD, SourceLocation Loc)
7667 : S(S) {
7668 Sema::CodeSynthesisContext Ctx;
7670 Ctx.PointOfInstantiation = Loc;
7671 Ctx.Entity = FD;
7673 }
7674 ~ComputingExceptionSpec() {
7676 }
7677};
7678}
7679
7680static Sema::ImplicitExceptionSpecification
7681ComputeDefaultedSpecialMemberExceptionSpec(Sema &S, SourceLocation Loc,
7682 CXXMethodDecl *MD,
7684 Sema::InheritedConstructorInfo *ICI);
7685
7686static Sema::ImplicitExceptionSpecification
7687ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc,
7688 FunctionDecl *FD,
7690
7691static Sema::ImplicitExceptionSpecification
7693 auto DFK = S.getDefaultedFunctionKind(FD);
7694 if (DFK.isSpecialMember())
7696 S, Loc, cast<CXXMethodDecl>(FD), DFK.asSpecialMember(), nullptr);
7697 if (DFK.isComparison())
7699 DFK.asComparison());
7700
7701 auto *CD = cast<CXXConstructorDecl>(FD);
7702 assert(CD->getInheritedConstructor() &&
7703 "only defaulted functions and inherited constructors have implicit "
7704 "exception specs");
7706 S, Loc, CD->getInheritedConstructor().getShadowDecl());
7709}
7710
7712 CXXMethodDecl *MD) {
7714
7715 // Build an exception specification pointing back at this member.
7717 EPI.ExceptionSpec.SourceDecl = MD;
7718
7719 // Set the calling convention to the default for C++ instance methods.
7721 S.Context.getDefaultCallingConvention(/*IsVariadic=*/false,
7722 /*IsCXXMethod=*/true));
7723 return EPI;
7724}
7725
7727 const FunctionProtoType *FPT = FD->getType()->castAs<FunctionProtoType>();
7729 return;
7730
7731 // Evaluate the exception specification.
7732 auto IES = computeImplicitExceptionSpec(*this, Loc, FD);
7733 auto ESI = IES.getExceptionSpec();
7734
7735 // Update the type of the special member to use it.
7736 UpdateExceptionSpec(FD, ESI);
7737}
7738
7740 assert(FD->isExplicitlyDefaulted() && "not explicitly-defaulted");
7741
7743 if (!DefKind) {
7744 assert(FD->getDeclContext()->isDependentContext());
7745 return;
7746 }
7747
7748 if (DefKind.isComparison()) {
7749 auto PT = FD->getParamDecl(0)->getType();
7750 if (const CXXRecordDecl *RD =
7751 PT.getNonReferenceType()->getAsCXXRecordDecl()) {
7752 for (FieldDecl *Field : RD->fields()) {
7753 UnusedPrivateFields.remove(Field);
7754 }
7755 }
7756 }
7757
7758 if (DefKind.isSpecialMember()
7760 DefKind.asSpecialMember(),
7761 FD->getDefaultLoc())
7763 FD->setInvalidDecl();
7764}
7765
7768 SourceLocation DefaultLoc) {
7769 CXXRecordDecl *RD = MD->getParent();
7770
7772 "not an explicitly-defaulted special member");
7773
7774 // Defer all checking for special members of a dependent type.
7775 if (RD->isDependentType())
7776 return false;
7777
7778 // Whether this was the first-declared instance of the constructor.
7779 // This affects whether we implicitly add an exception spec and constexpr.
7780 bool First = MD == MD->getCanonicalDecl();
7781
7782 bool HadError = false;
7783
7784 // C++11 [dcl.fct.def.default]p1:
7785 // A function that is explicitly defaulted shall
7786 // -- be a special member function [...] (checked elsewhere),
7787 // -- have the same type (except for ref-qualifiers, and except that a
7788 // copy operation can take a non-const reference) as an implicit
7789 // declaration, and
7790 // -- not have default arguments.
7791 // C++2a changes the second bullet to instead delete the function if it's
7792 // defaulted on its first declaration, unless it's "an assignment operator,
7793 // and its return type differs or its parameter type is not a reference".
7794 bool DeleteOnTypeMismatch = getLangOpts().CPlusPlus20 && First;
7795 bool ShouldDeleteForTypeMismatch = false;
7796 unsigned ExpectedParams = 1;
7799 ExpectedParams = 0;
7800 if (MD->getNumExplicitParams() != ExpectedParams) {
7801 // This checks for default arguments: a copy or move constructor with a
7802 // default argument is classified as a default constructor, and assignment
7803 // operations and destructors can't have default arguments.
7804 Diag(MD->getLocation(), diag::err_defaulted_special_member_params)
7805 << CSM << MD->getSourceRange();
7806 HadError = true;
7807 } else if (MD->isVariadic()) {
7808 if (DeleteOnTypeMismatch)
7809 ShouldDeleteForTypeMismatch = true;
7810 else {
7811 Diag(MD->getLocation(), diag::err_defaulted_special_member_variadic)
7812 << CSM << MD->getSourceRange();
7813 HadError = true;
7814 }
7815 }
7816
7818
7819 bool CanHaveConstParam = false;
7821 CanHaveConstParam = RD->implicitCopyConstructorHasConstParam();
7823 CanHaveConstParam = RD->implicitCopyAssignmentHasConstParam();
7824
7825 QualType ReturnType = Context.VoidTy;
7828 // Check for return type matching.
7829 ReturnType = Type->getReturnType();
7831
7832 QualType DeclType =
7834 /*Qualifier=*/std::nullopt, RD, /*OwnsTag=*/false);
7835 DeclType = Context.getAddrSpaceQualType(
7836 DeclType, ThisType.getQualifiers().getAddressSpace());
7837 QualType ExpectedReturnType = Context.getLValueReferenceType(DeclType);
7838
7839 if (!Context.hasSameType(ReturnType, ExpectedReturnType)) {
7840 Diag(MD->getLocation(), diag::err_defaulted_special_member_return_type)
7842 << ExpectedReturnType;
7843 HadError = true;
7844 }
7845
7846 // A defaulted special member cannot have cv-qualifiers.
7847 if (ThisType.isConstQualified() || ThisType.isVolatileQualified()) {
7848 if (DeleteOnTypeMismatch)
7849 ShouldDeleteForTypeMismatch = true;
7850 else {
7851 Diag(MD->getLocation(), diag::err_defaulted_special_member_quals)
7853 << getLangOpts().CPlusPlus14;
7854 HadError = true;
7855 }
7856 }
7857 // [C++23][dcl.fct.def.default]/p2.2
7858 // if F2 has an implicit object parameter of type “reference to C”,
7859 // F1 may be an explicit object member function whose explicit object
7860 // parameter is of (possibly different) type “reference to C”,
7861 // in which case the type of F1 would differ from the type of F2
7862 // in that the type of F1 has an additional parameter;
7863 QualType ExplicitObjectParameter = MD->isExplicitObjectMemberFunction()
7864 ? MD->getParamDecl(0)->getType()
7865 : QualType();
7866 if (!ExplicitObjectParameter.isNull() &&
7867 (!ExplicitObjectParameter->isReferenceType() ||
7868 !Context.hasSameType(ExplicitObjectParameter.getNonReferenceType(),
7869 Context.getCanonicalTagType(RD)))) {
7870 if (DeleteOnTypeMismatch)
7871 ShouldDeleteForTypeMismatch = true;
7872 else {
7873 Diag(MD->getLocation(),
7874 diag::err_defaulted_special_member_explicit_object_mismatch)
7875 << (CSM == CXXSpecialMemberKind::MoveAssignment) << RD
7876 << MD->getSourceRange();
7877 HadError = true;
7878 }
7879 }
7880 }
7881
7882 // Check for parameter type matching.
7884 ExpectedParams
7885 ? Type->getParamType(MD->isExplicitObjectMemberFunction() ? 1 : 0)
7886 : QualType();
7887 bool HasConstParam = false;
7888 if (ExpectedParams && ArgType->isReferenceType()) {
7889 // Argument must be reference to possibly-const T.
7890 QualType ReferentType = ArgType->getPointeeType();
7891 HasConstParam = ReferentType.isConstQualified();
7892
7893 if (ReferentType.isVolatileQualified()) {
7894 if (DeleteOnTypeMismatch)
7895 ShouldDeleteForTypeMismatch = true;
7896 else {
7897 Diag(MD->getLocation(),
7898 diag::err_defaulted_special_member_volatile_param)
7899 << CSM;
7900 HadError = true;
7901 }
7902 }
7903
7904 if (HasConstParam && !CanHaveConstParam) {
7905 if (DeleteOnTypeMismatch)
7906 ShouldDeleteForTypeMismatch = true;
7907 else if (CSM == CXXSpecialMemberKind::CopyConstructor ||
7909 Diag(MD->getLocation(),
7910 diag::err_defaulted_special_member_copy_const_param)
7912 // FIXME: Explain why this special member can't be const.
7913 HadError = true;
7914 } else {
7915 Diag(MD->getLocation(),
7916 diag::err_defaulted_special_member_move_const_param)
7918 HadError = true;
7919 }
7920 }
7921 } else if (ExpectedParams) {
7922 // A copy assignment operator can take its argument by value, but a
7923 // defaulted one cannot.
7925 "unexpected non-ref argument");
7926 Diag(MD->getLocation(), diag::err_defaulted_copy_assign_not_ref);
7927 HadError = true;
7928 }
7929
7930 // C++11 [dcl.fct.def.default]p2:
7931 // An explicitly-defaulted function may be declared constexpr only if it
7932 // would have been implicitly declared as constexpr,
7933 // Do not apply this rule to members of class templates, since core issue 1358
7934 // makes such functions always instantiate to constexpr functions. For
7935 // functions which cannot be constexpr (for non-constructors in C++11 and for
7936 // destructors in C++14 and C++17), this is checked elsewhere.
7937 //
7938 // FIXME: This should not apply if the member is deleted.
7939 bool Constexpr = defaultedSpecialMemberIsConstexpr(*this, RD, CSM,
7940 HasConstParam);
7941
7942 // C++14 [dcl.constexpr]p6 (CWG DR647/CWG DR1358):
7943 // If the instantiated template specialization of a constexpr function
7944 // template or member function of a class template would fail to satisfy
7945 // the requirements for a constexpr function or constexpr constructor, that
7946 // specialization is still a constexpr function or constexpr constructor,
7947 // even though a call to such a function cannot appear in a constant
7948 // expression.
7949 if (MD->isTemplateInstantiation() && MD->isConstexpr())
7950 Constexpr = true;
7951
7952 if ((getLangOpts().CPlusPlus20 ||
7954 : isa<CXXConstructorDecl>(MD))) &&
7955 MD->isConstexpr() && !Constexpr &&
7957 if (!MD->isConsteval() && RD->getNumVBases()) {
7958 Diag(MD->getBeginLoc(),
7959 diag::err_incorrect_defaulted_constexpr_with_vb)
7960 << CSM;
7961 for (const auto &I : RD->vbases())
7962 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);
7963 } else {
7964 Diag(MD->getBeginLoc(), diag::err_incorrect_defaulted_constexpr)
7965 << CSM << MD->isConsteval();
7966 }
7967 HadError = true;
7968 // FIXME: Explain why the special member can't be constexpr.
7969 }
7970
7971 if (First) {
7972 // C++2a [dcl.fct.def.default]p3:
7973 // If a function is explicitly defaulted on its first declaration, it is
7974 // implicitly considered to be constexpr if the implicit declaration
7975 // would be.
7980
7981 if (!Type->hasExceptionSpec()) {
7982 // C++2a [except.spec]p3:
7983 // If a declaration of a function does not have a noexcept-specifier
7984 // [and] is defaulted on its first declaration, [...] the exception
7985 // specification is as specified below
7986 FunctionProtoType::ExtProtoInfo EPI = Type->getExtProtoInfo();
7988 EPI.ExceptionSpec.SourceDecl = MD;
7989 MD->setType(
7990 Context.getFunctionType(ReturnType, Type->getParamTypes(), EPI));
7991 }
7992 }
7993
7994 if (ShouldDeleteForTypeMismatch || ShouldDeleteSpecialMember(MD, CSM)) {
7995 if (First) {
7996 SetDeclDeleted(MD, MD->getLocation());
7997 if (!inTemplateInstantiation() && !HadError) {
7998 Diag(MD->getLocation(), diag::warn_defaulted_method_deleted) << CSM;
7999 if (ShouldDeleteForTypeMismatch) {
8000 Diag(MD->getLocation(), diag::note_deleted_type_mismatch) << CSM;
8001 } else if (ShouldDeleteSpecialMember(MD, CSM, nullptr,
8002 /*Diagnose*/ true) &&
8003 DefaultLoc.isValid()) {
8004 Diag(DefaultLoc, diag::note_replace_equals_default_to_delete)
8005 << FixItHint::CreateReplacement(DefaultLoc, "delete");
8006 }
8007 }
8008 if (ShouldDeleteForTypeMismatch && !HadError) {
8009 Diag(MD->getLocation(),
8010 diag::warn_cxx17_compat_defaulted_method_type_mismatch)
8011 << CSM;
8012 }
8013 } else {
8014 // C++11 [dcl.fct.def.default]p4:
8015 // [For a] user-provided explicitly-defaulted function [...] if such a
8016 // function is implicitly defined as deleted, the program is ill-formed.
8017 Diag(MD->getLocation(), diag::err_out_of_line_default_deletes) << CSM;
8018 assert(!ShouldDeleteForTypeMismatch && "deleted non-first decl");
8019 ShouldDeleteSpecialMember(MD, CSM, nullptr, /*Diagnose*/true);
8020 HadError = true;
8021 }
8022 }
8023
8024 return HadError;
8025}
8026
8027namespace {
8028/// Helper class for building and checking a defaulted comparison.
8029///
8030/// Defaulted functions are built in two phases:
8031///
8032/// * First, the set of operations that the function will perform are
8033/// identified, and some of them are checked. If any of the checked
8034/// operations is invalid in certain ways, the comparison function is
8035/// defined as deleted and no body is built.
8036/// * Then, if the function is not defined as deleted, the body is built.
8037///
8038/// This is accomplished by performing two visitation steps over the eventual
8039/// body of the function.
8040template<typename Derived, typename ResultList, typename Result,
8041 typename Subobject>
8042class DefaultedComparisonVisitor {
8043public:
8044 using DefaultedComparisonKind = Sema::DefaultedComparisonKind;
8045
8046 DefaultedComparisonVisitor(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8047 DefaultedComparisonKind DCK)
8048 : S(S), RD(RD), FD(FD), DCK(DCK) {
8049 if (auto *Info = FD->getDefaultedOrDeletedInfo()) {
8050 // FIXME: Change CreateOverloadedBinOp to take an ArrayRef instead of an
8051 // UnresolvedSet to avoid this copy.
8052 Fns.assign(Info->getUnqualifiedLookups().begin(),
8053 Info->getUnqualifiedLookups().end());
8054 }
8055 }
8056
8057 ResultList visit() {
8058 // The type of an lvalue naming a parameter of this function.
8059 QualType ParamLvalType =
8061
8062 ResultList Results;
8063
8064 switch (DCK) {
8065 case DefaultedComparisonKind::None:
8066 llvm_unreachable("not a defaulted comparison");
8067
8068 case DefaultedComparisonKind::Equal:
8069 case DefaultedComparisonKind::ThreeWay:
8070 getDerived().visitSubobjects(Results, RD, ParamLvalType.getQualifiers());
8071 return Results;
8072
8073 case DefaultedComparisonKind::NotEqual:
8074 case DefaultedComparisonKind::Relational:
8075 Results.add(getDerived().visitExpandedSubobject(
8076 ParamLvalType, getDerived().getCompleteObject()));
8077 return Results;
8078 }
8079 llvm_unreachable("");
8080 }
8081
8082protected:
8083 Derived &getDerived() { return static_cast<Derived&>(*this); }
8084
8085 /// Visit the expanded list of subobjects of the given type, as specified in
8086 /// C++2a [class.compare.default].
8087 ///
8088 /// \return \c true if the ResultList object said we're done, \c false if not.
8089 bool visitSubobjects(ResultList &Results, CXXRecordDecl *Record,
8090 Qualifiers Quals) {
8091 // C++2a [class.compare.default]p4:
8092 // The direct base class subobjects of C
8093 for (CXXBaseSpecifier &Base : Record->bases())
8094 if (Results.add(getDerived().visitSubobject(
8095 S.Context.getQualifiedType(Base.getType(), Quals),
8096 getDerived().getBase(&Base))))
8097 return true;
8098
8099 // followed by the non-static data members of C
8100 for (FieldDecl *Field : Record->fields()) {
8101 // C++23 [class.bit]p2:
8102 // Unnamed bit-fields are not members ...
8103 if (Field->isUnnamedBitField())
8104 continue;
8105 // Recursively expand anonymous structs.
8106 if (Field->isAnonymousStructOrUnion()) {
8107 if (visitSubobjects(Results, Field->getType()->getAsCXXRecordDecl(),
8108 Quals))
8109 return true;
8110 continue;
8111 }
8112
8113 // Figure out the type of an lvalue denoting this field.
8114 Qualifiers FieldQuals = Quals;
8115 if (Field->isMutable())
8116 FieldQuals.removeConst();
8117 QualType FieldType =
8118 S.Context.getQualifiedType(Field->getType(), FieldQuals);
8119
8120 if (Results.add(getDerived().visitSubobject(
8121 FieldType, getDerived().getField(Field))))
8122 return true;
8123 }
8124
8125 // form a list of subobjects.
8126 return false;
8127 }
8128
8129 Result visitSubobject(QualType Type, Subobject Subobj) {
8130 // In that list, any subobject of array type is recursively expanded
8131 const ArrayType *AT = S.Context.getAsArrayType(Type);
8132 if (auto *CAT = dyn_cast_or_null<ConstantArrayType>(AT))
8133 return getDerived().visitSubobjectArray(CAT->getElementType(),
8134 CAT->getSize(), Subobj);
8135 return getDerived().visitExpandedSubobject(Type, Subobj);
8136 }
8137
8138 Result visitSubobjectArray(QualType Type, const llvm::APInt &Size,
8139 Subobject Subobj) {
8140 return getDerived().visitSubobject(Type, Subobj);
8141 }
8142
8143protected:
8144 Sema &S;
8145 CXXRecordDecl *RD;
8146 FunctionDecl *FD;
8147 DefaultedComparisonKind DCK;
8148 UnresolvedSet<16> Fns;
8149};
8150
8151/// Information about a defaulted comparison, as determined by
8152/// DefaultedComparisonAnalyzer.
8153struct DefaultedComparisonInfo {
8154 bool Deleted = false;
8155 bool Constexpr = true;
8156 ComparisonCategoryType Category = ComparisonCategoryType::StrongOrdering;
8157
8158 static DefaultedComparisonInfo deleted() {
8159 DefaultedComparisonInfo Deleted;
8160 Deleted.Deleted = true;
8161 return Deleted;
8162 }
8163
8164 bool add(const DefaultedComparisonInfo &R) {
8165 Deleted |= R.Deleted;
8166 Constexpr &= R.Constexpr;
8167 Category = commonComparisonType(Category, R.Category);
8168 return Deleted;
8169 }
8170};
8171
8172/// An element in the expanded list of subobjects of a defaulted comparison, as
8173/// specified in C++2a [class.compare.default]p4.
8174struct DefaultedComparisonSubobject {
8175 enum { CompleteObject, Member, Base } Kind;
8176 NamedDecl *Decl;
8177 SourceLocation Loc;
8178};
8179
8180/// A visitor over the notional body of a defaulted comparison that determines
8181/// whether that body would be deleted or constexpr.
8182class DefaultedComparisonAnalyzer
8183 : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,
8184 DefaultedComparisonInfo,
8185 DefaultedComparisonInfo,
8186 DefaultedComparisonSubobject> {
8187public:
8188 enum DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };
8189
8190private:
8191 DiagnosticKind Diagnose;
8192
8193public:
8194 using Base = DefaultedComparisonVisitor;
8195 using Result = DefaultedComparisonInfo;
8196 using Subobject = DefaultedComparisonSubobject;
8197
8198 friend Base;
8199
8200 DefaultedComparisonAnalyzer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8201 DefaultedComparisonKind DCK,
8202 DiagnosticKind Diagnose = NoDiagnostics)
8203 : Base(S, RD, FD, DCK), Diagnose(Diagnose) {}
8204
8205 Result visit() {
8206 if ((DCK == DefaultedComparisonKind::Equal ||
8207 DCK == DefaultedComparisonKind::ThreeWay) &&
8208 RD->hasVariantMembers()) {
8209 // C++2a [class.compare.default]p2 [P2002R0]:
8210 // A defaulted comparison operator function for class C is defined as
8211 // deleted if [...] C has variant members.
8212 if (Diagnose == ExplainDeleted) {
8213 S.Diag(FD->getLocation(), diag::note_defaulted_comparison_union)
8214 << FD << RD->isUnion() << RD;
8215 }
8216 return Result::deleted();
8217 }
8218
8219 return Base::visit();
8220 }
8221
8222private:
8223 Subobject getCompleteObject() {
8224 return Subobject{Subobject::CompleteObject, RD, FD->getLocation()};
8225 }
8226
8227 Subobject getBase(CXXBaseSpecifier *Base) {
8228 return Subobject{Subobject::Base, Base->getType()->getAsCXXRecordDecl(),
8229 Base->getBaseTypeLoc()};
8230 }
8231
8232 Subobject getField(FieldDecl *Field) {
8233 return Subobject{Subobject::Member, Field, Field->getLocation()};
8234 }
8235
8236 Result visitExpandedSubobject(QualType Type, Subobject Subobj) {
8237 // C++2a [class.compare.default]p2 [P2002R0]:
8238 // A defaulted <=> or == operator function for class C is defined as
8239 // deleted if any non-static data member of C is of reference type
8240 if (Type->isReferenceType()) {
8241 if (Diagnose == ExplainDeleted) {
8242 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member)
8243 << FD << RD;
8244 }
8245 return Result::deleted();
8246 }
8247
8248 // [...] Let xi be an lvalue denoting the ith element [...]
8249 OpaqueValueExpr Xi(FD->getLocation(), Type, VK_LValue);
8250 Expr *Args[] = {&Xi, &Xi};
8251
8252 // All operators start by trying to apply that same operator recursively.
8254 assert(OO != OO_None && "not an overloaded operator!");
8255 return visitBinaryOperator(OO, Args, Subobj);
8256 }
8257
8258 Result
8259 visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args,
8260 Subobject Subobj,
8261 OverloadCandidateSet *SpaceshipCandidates = nullptr) {
8262 // Note that there is no need to consider rewritten candidates here if
8263 // we've already found there is no viable 'operator<=>' candidate (and are
8264 // considering synthesizing a '<=>' from '==' and '<').
8265 OverloadCandidateSet CandidateSet(
8267 OverloadCandidateSet::OperatorRewriteInfo(
8268 OO, FD->getLocation(),
8269 /*AllowRewrittenCandidates=*/!SpaceshipCandidates));
8270
8271 /// C++2a [class.compare.default]p1 [P2002R0]:
8272 /// [...] the defaulted function itself is never a candidate for overload
8273 /// resolution [...]
8274 CandidateSet.exclude(FD);
8275
8276 if (Args[0]->getType()->isOverloadableType())
8277 S.LookupOverloadedBinOp(CandidateSet, OO, Fns, Args);
8278 else
8279 // FIXME: We determine whether this is a valid expression by checking to
8280 // see if there's a viable builtin operator candidate for it. That isn't
8281 // really what the rules ask us to do, but should give the right results.
8282 S.AddBuiltinOperatorCandidates(OO, FD->getLocation(), Args, CandidateSet);
8283
8284 Result R;
8285
8287 switch (CandidateSet.BestViableFunction(S, FD->getLocation(), Best)) {
8288 case OR_Success: {
8289 // C++2a [class.compare.secondary]p2 [P2002R0]:
8290 // The operator function [...] is defined as deleted if [...] the
8291 // candidate selected by overload resolution is not a rewritten
8292 // candidate.
8293 if ((DCK == DefaultedComparisonKind::NotEqual ||
8294 DCK == DefaultedComparisonKind::Relational) &&
8295 !Best->RewriteKind) {
8296 if (Diagnose == ExplainDeleted) {
8297 if (Best->Function) {
8298 S.Diag(Best->Function->getLocation(),
8299 diag::note_defaulted_comparison_not_rewritten_callee)
8300 << FD;
8301 } else {
8302 assert(Best->Conversions.size() == 2 &&
8303 Best->Conversions[0].isUserDefined() &&
8304 "non-user-defined conversion from class to built-in "
8305 "comparison");
8306 S.Diag(Best->Conversions[0]
8307 .UserDefined.FoundConversionFunction.getDecl()
8308 ->getLocation(),
8309 diag::note_defaulted_comparison_not_rewritten_conversion)
8310 << FD;
8311 }
8312 }
8313 return Result::deleted();
8314 }
8315
8316 // Throughout C++2a [class.compare]: if overload resolution does not
8317 // result in a usable function, the candidate function is defined as
8318 // deleted. This requires that we selected an accessible function.
8319 //
8320 // Note that this only considers the access of the function when named
8321 // within the type of the subobject, and not the access path for any
8322 // derived-to-base conversion.
8323 CXXRecordDecl *ArgClass = Args[0]->getType()->getAsCXXRecordDecl();
8324 if (ArgClass && Best->FoundDecl.getDecl() &&
8325 Best->FoundDecl.getDecl()->isCXXClassMember()) {
8326 QualType ObjectType = Subobj.Kind == Subobject::Member
8327 ? Args[0]->getType()
8330 ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,
8331 Diagnose == ExplainDeleted
8332 ? S.PDiag(diag::note_defaulted_comparison_inaccessible)
8333 << FD << Subobj.Kind << Subobj.Decl
8334 : S.PDiag()))
8335 return Result::deleted();
8336 }
8337
8338 bool NeedsDeducing =
8339 OO == OO_Spaceship && FD->getReturnType()->isUndeducedAutoType();
8340
8341 if (FunctionDecl *BestFD = Best->Function) {
8342 // C++2a [class.compare.default]p3 [P2002R0]:
8343 // A defaulted comparison function is constexpr-compatible if
8344 // [...] no overlod resolution performed [...] results in a
8345 // non-constexpr function.
8346 assert(!BestFD->isDeleted() && "wrong overload resolution result");
8347 // If it's not constexpr, explain why not.
8348 if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {
8349 if (Subobj.Kind != Subobject::CompleteObject)
8350 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)
8351 << Subobj.Kind << Subobj.Decl;
8352 S.Diag(BestFD->getLocation(),
8353 diag::note_defaulted_comparison_not_constexpr_here);
8354 // Bail out after explaining; we don't want any more notes.
8355 return Result::deleted();
8356 }
8357 R.Constexpr &= BestFD->isConstexpr();
8358
8359 if (NeedsDeducing) {
8360 // If any callee has an undeduced return type, deduce it now.
8361 // FIXME: It's not clear how a failure here should be handled. For
8362 // now, we produce an eager diagnostic, because that is forward
8363 // compatible with most (all?) other reasonable options.
8364 if (BestFD->getReturnType()->isUndeducedType() &&
8365 S.DeduceReturnType(BestFD, FD->getLocation(),
8366 /*Diagnose=*/false)) {
8367 // Don't produce a duplicate error when asked to explain why the
8368 // comparison is deleted: we diagnosed that when initially checking
8369 // the defaulted operator.
8370 if (Diagnose == NoDiagnostics) {
8371 S.Diag(
8372 FD->getLocation(),
8373 diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)
8374 << Subobj.Kind << Subobj.Decl;
8375 S.Diag(
8376 Subobj.Loc,
8377 diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)
8378 << Subobj.Kind << Subobj.Decl;
8379 S.Diag(BestFD->getLocation(),
8380 diag::note_defaulted_comparison_cannot_deduce_callee)
8381 << Subobj.Kind << Subobj.Decl;
8382 }
8383 return Result::deleted();
8384 }
8386 BestFD->getCallResultType());
8387 if (!Info) {
8388 if (Diagnose == ExplainDeleted) {
8389 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)
8390 << Subobj.Kind << Subobj.Decl
8391 << BestFD->getCallResultType().withoutLocalFastQualifiers();
8392 S.Diag(BestFD->getLocation(),
8393 diag::note_defaulted_comparison_cannot_deduce_callee)
8394 << Subobj.Kind << Subobj.Decl;
8395 }
8396 return Result::deleted();
8397 }
8398 R.Category = Info->Kind;
8399 }
8400 } else {
8401 QualType T = Best->BuiltinParamTypes[0];
8402 assert(T == Best->BuiltinParamTypes[1] &&
8403 "builtin comparison for different types?");
8404 assert(Best->BuiltinParamTypes[2].isNull() &&
8405 "invalid builtin comparison");
8406
8407 // FIXME: If the type we deduced is a vector type, we mark the
8408 // comparison as deleted because we don't yet support this.
8409 if (isa<VectorType>(T)) {
8410 if (Diagnose == ExplainDeleted) {
8411 S.Diag(FD->getLocation(),
8412 diag::note_defaulted_comparison_vector_types)
8413 << FD;
8414 S.Diag(Subobj.Decl->getLocation(), diag::note_declared_at);
8415 }
8416 return Result::deleted();
8417 }
8418
8419 if (NeedsDeducing) {
8420 std::optional<ComparisonCategoryType> Cat =
8422 assert(Cat && "no category for builtin comparison?");
8423 R.Category = *Cat;
8424 }
8425 }
8426
8427 // Note that we might be rewriting to a different operator. That call is
8428 // not considered until we come to actually build the comparison function.
8429 break;
8430 }
8431
8432 case OR_Ambiguous:
8433 if (Diagnose == ExplainDeleted) {
8434 unsigned Kind = 0;
8435 if (FD->getOverloadedOperator() == OO_Spaceship && OO != OO_Spaceship)
8436 Kind = OO == OO_EqualEqual ? 1 : 2;
8437 CandidateSet.NoteCandidates(
8439 Subobj.Loc, S.PDiag(diag::note_defaulted_comparison_ambiguous)
8440 << FD << Kind << Subobj.Kind << Subobj.Decl),
8441 S, OCD_AmbiguousCandidates, Args);
8442 }
8443 R = Result::deleted();
8444 break;
8445
8446 case OR_Deleted:
8447 if (Diagnose == ExplainDeleted) {
8448 if ((DCK == DefaultedComparisonKind::NotEqual ||
8449 DCK == DefaultedComparisonKind::Relational) &&
8450 !Best->RewriteKind) {
8451 S.Diag(Best->Function->getLocation(),
8452 diag::note_defaulted_comparison_not_rewritten_callee)
8453 << FD;
8454 } else {
8455 S.Diag(Subobj.Loc,
8456 diag::note_defaulted_comparison_calls_deleted)
8457 << FD << Subobj.Kind << Subobj.Decl;
8458 S.NoteDeletedFunction(Best->Function);
8459 }
8460 }
8461 R = Result::deleted();
8462 break;
8463
8465 // If there's no usable candidate, we're done unless we can rewrite a
8466 // '<=>' in terms of '==' and '<'.
8467 if (OO == OO_Spaceship &&
8469 // For any kind of comparison category return type, we need a usable
8470 // '==' and a usable '<'.
8471 if (!R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,
8472 &CandidateSet)))
8473 R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));
8474 break;
8475 }
8476
8477 if (Diagnose == ExplainDeleted) {
8478 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)
8479 << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)
8480 << Subobj.Kind << Subobj.Decl;
8481
8482 // For a three-way comparison, list both the candidates for the
8483 // original operator and the candidates for the synthesized operator.
8484 if (SpaceshipCandidates) {
8485 SpaceshipCandidates->NoteCandidates(
8486 S, Args,
8487 SpaceshipCandidates->CompleteCandidates(S, OCD_AllCandidates,
8488 Args, FD->getLocation()));
8489 S.Diag(Subobj.Loc,
8490 diag::note_defaulted_comparison_no_viable_function_synthesized)
8491 << (OO == OO_EqualEqual ? 0 : 1);
8492 }
8493
8494 CandidateSet.NoteCandidates(
8495 S, Args,
8496 CandidateSet.CompleteCandidates(S, OCD_AllCandidates, Args,
8497 FD->getLocation()));
8498 }
8499 R = Result::deleted();
8500 break;
8501 }
8502
8503 return R;
8504 }
8505};
8506
8507/// A list of statements.
8508struct StmtListResult {
8509 bool IsInvalid = false;
8510 llvm::SmallVector<Stmt*, 16> Stmts;
8511
8512 bool add(const StmtResult &S) {
8513 IsInvalid |= S.isInvalid();
8514 if (IsInvalid)
8515 return true;
8516 Stmts.push_back(S.get());
8517 return false;
8518 }
8519};
8520
8521/// A visitor over the notional body of a defaulted comparison that synthesizes
8522/// the actual body.
8523class DefaultedComparisonSynthesizer
8524 : public DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,
8525 StmtListResult, StmtResult,
8526 std::pair<ExprResult, ExprResult>> {
8527 SourceLocation Loc;
8528 unsigned ArrayDepth = 0;
8529
8530public:
8531 using Base = DefaultedComparisonVisitor;
8532 using ExprPair = std::pair<ExprResult, ExprResult>;
8533
8534 friend Base;
8535
8536 DefaultedComparisonSynthesizer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8537 DefaultedComparisonKind DCK,
8538 SourceLocation BodyLoc)
8539 : Base(S, RD, FD, DCK), Loc(BodyLoc) {}
8540
8541 /// Build a suitable function body for this defaulted comparison operator.
8542 StmtResult build() {
8543 Sema::CompoundScopeRAII CompoundScope(S);
8544
8545 StmtListResult Stmts = visit();
8546 if (Stmts.IsInvalid)
8547 return StmtError();
8548
8549 ExprResult RetVal;
8550 switch (DCK) {
8551 case DefaultedComparisonKind::None:
8552 llvm_unreachable("not a defaulted comparison");
8553
8554 case DefaultedComparisonKind::Equal: {
8555 // C++2a [class.eq]p3:
8556 // [...] compar[e] the corresponding elements [...] until the first
8557 // index i where xi == yi yields [...] false. If no such index exists,
8558 // V is true. Otherwise, V is false.
8559 //
8560 // Join the comparisons with '&&'s and return the result. Use a right
8561 // fold (traversing the conditions right-to-left), because that
8562 // short-circuits more naturally.
8563 auto OldStmts = std::move(Stmts.Stmts);
8564 Stmts.Stmts.clear();
8565 ExprResult CmpSoFar;
8566 // Finish a particular comparison chain.
8567 auto FinishCmp = [&] {
8568 if (Expr *Prior = CmpSoFar.get()) {
8569 // Convert the last expression to 'return ...;'
8570 if (RetVal.isUnset() && Stmts.Stmts.empty())
8571 RetVal = CmpSoFar;
8572 // Convert any prior comparison to 'if (!(...)) return false;'
8573 else if (Stmts.add(buildIfNotCondReturnFalse(Prior)))
8574 return true;
8575 CmpSoFar = ExprResult();
8576 }
8577 return false;
8578 };
8579 for (Stmt *EAsStmt : llvm::reverse(OldStmts)) {
8580 Expr *E = dyn_cast<Expr>(EAsStmt);
8581 if (!E) {
8582 // Found an array comparison.
8583 if (FinishCmp() || Stmts.add(EAsStmt))
8584 return StmtError();
8585 continue;
8586 }
8587
8588 if (CmpSoFar.isUnset()) {
8589 CmpSoFar = E;
8590 continue;
8591 }
8592 CmpSoFar = S.CreateBuiltinBinOp(Loc, BO_LAnd, E, CmpSoFar.get());
8593 if (CmpSoFar.isInvalid())
8594 return StmtError();
8595 }
8596 if (FinishCmp())
8597 return StmtError();
8598 std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());
8599 // If no such index exists, V is true.
8600 if (RetVal.isUnset())
8601 RetVal = S.ActOnCXXBoolLiteral(Loc, tok::kw_true);
8602 break;
8603 }
8604
8605 case DefaultedComparisonKind::ThreeWay: {
8606 // Per C++2a [class.spaceship]p3, as a fallback add:
8607 // return static_cast<R>(std::strong_ordering::equal);
8608 QualType StrongOrdering = S.CheckComparisonCategoryType(
8609 ComparisonCategoryType::StrongOrdering, Loc,
8610 Sema::ComparisonCategoryUsage::DefaultedOperator);
8611 if (StrongOrdering.isNull())
8612 return StmtError();
8613 VarDecl *EqualVD = S.Context.CompCategories.getInfoForType(StrongOrdering)
8614 .getValueInfo(ComparisonCategoryResult::Equal)
8615 ->VD;
8616 RetVal = getDecl(EqualVD);
8617 if (RetVal.isInvalid())
8618 return StmtError();
8619 RetVal = buildStaticCastToR(RetVal.get());
8620 break;
8621 }
8622
8623 case DefaultedComparisonKind::NotEqual:
8624 case DefaultedComparisonKind::Relational:
8625 RetVal = cast<Expr>(Stmts.Stmts.pop_back_val());
8626 break;
8627 }
8628
8629 // Build the final return statement.
8630 if (RetVal.isInvalid())
8631 return StmtError();
8632 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, RetVal.get());
8633 if (ReturnStmt.isInvalid())
8634 return StmtError();
8635 Stmts.Stmts.push_back(ReturnStmt.get());
8636
8637 return S.ActOnCompoundStmt(Loc, Loc, Stmts.Stmts, /*IsStmtExpr=*/false);
8638 }
8639
8640private:
8641 ExprResult getDecl(ValueDecl *VD) {
8642 return S.BuildDeclarationNameExpr(
8643 CXXScopeSpec(), DeclarationNameInfo(VD->getDeclName(), Loc), VD);
8644 }
8645
8646 ExprResult getParam(unsigned I) {
8647 ParmVarDecl *PD = FD->getParamDecl(I);
8648 return getDecl(PD);
8649 }
8650
8651 ExprPair getCompleteObject() {
8652 unsigned Param = 0;
8653 ExprResult LHS;
8654 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD);
8655 MD && MD->isImplicitObjectMemberFunction()) {
8656 // LHS is '*this'.
8657 LHS = S.ActOnCXXThis(Loc);
8658 if (!LHS.isInvalid())
8659 LHS = S.CreateBuiltinUnaryOp(Loc, UO_Deref, LHS.get());
8660 } else {
8661 LHS = getParam(Param++);
8662 }
8663 ExprResult RHS = getParam(Param++);
8664 assert(Param == FD->getNumParams());
8665 return {LHS, RHS};
8666 }
8667
8668 ExprPair getBase(CXXBaseSpecifier *Base) {
8669 ExprPair Obj = getCompleteObject();
8670 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8671 return {ExprError(), ExprError()};
8672 CXXCastPath Path = {Base};
8673 const auto CastToBase = [&](Expr *E) {
8674 QualType ToType = S.Context.getQualifiedType(
8675 Base->getType(), E->getType().getQualifiers());
8676 return S.ImpCastExprToType(E, ToType, CK_DerivedToBase, VK_LValue, &Path);
8677 };
8678 return {CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};
8679 }
8680
8681 ExprPair getField(FieldDecl *Field) {
8682 ExprPair Obj = getCompleteObject();
8683 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8684 return {ExprError(), ExprError()};
8685
8686 DeclAccessPair Found = DeclAccessPair::make(Field, Field->getAccess());
8687 DeclarationNameInfo NameInfo(Field->getDeclName(), Loc);
8688 return {S.BuildFieldReferenceExpr(Obj.first.get(), /*IsArrow=*/false, Loc,
8689 CXXScopeSpec(), Field, Found, NameInfo),
8690 S.BuildFieldReferenceExpr(Obj.second.get(), /*IsArrow=*/false, Loc,
8691 CXXScopeSpec(), Field, Found, NameInfo)};
8692 }
8693
8694 // FIXME: When expanding a subobject, register a note in the code synthesis
8695 // stack to say which subobject we're comparing.
8696
8697 StmtResult buildIfNotCondReturnFalse(ExprResult Cond) {
8698 if (Cond.isInvalid())
8699 return StmtError();
8700
8701 ExprResult NotCond = S.CreateBuiltinUnaryOp(Loc, UO_LNot, Cond.get());
8702 if (NotCond.isInvalid())
8703 return StmtError();
8704
8705 ExprResult False = S.ActOnCXXBoolLiteral(Loc, tok::kw_false);
8706 assert(!False.isInvalid() && "should never fail");
8707 StmtResult ReturnFalse = S.BuildReturnStmt(Loc, False.get());
8708 if (ReturnFalse.isInvalid())
8709 return StmtError();
8710
8711 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, nullptr,
8712 S.ActOnCondition(nullptr, Loc, NotCond.get(),
8713 Sema::ConditionKind::Boolean),
8714 Loc, ReturnFalse.get(), SourceLocation(), nullptr);
8715 }
8716
8717 StmtResult visitSubobjectArray(QualType Type, llvm::APInt Size,
8718 ExprPair Subobj) {
8719 QualType SizeType = S.Context.getSizeType();
8720 Size = Size.zextOrTrunc(S.Context.getTypeSize(SizeType));
8721
8722 // Build 'size_t i$n = 0'.
8723 IdentifierInfo *IterationVarName = nullptr;
8724 {
8725 SmallString<8> Str;
8726 llvm::raw_svector_ostream OS(Str);
8727 OS << "i" << ArrayDepth;
8728 IterationVarName = &S.Context.Idents.get(OS.str());
8729 }
8730 VarDecl *IterationVar = VarDecl::Create(
8731 S.Context, S.CurContext, Loc, Loc, IterationVarName, SizeType,
8732 S.Context.getTrivialTypeSourceInfo(SizeType, Loc), SC_None);
8733 llvm::APInt Zero(S.Context.getTypeSize(SizeType), 0);
8734 IterationVar->setInit(
8735 IntegerLiteral::Create(S.Context, Zero, SizeType, Loc));
8736 Stmt *Init = new (S.Context) DeclStmt(DeclGroupRef(IterationVar), Loc, Loc);
8737
8738 auto IterRef = [&] {
8739 ExprResult Ref = S.BuildDeclarationNameExpr(
8740 CXXScopeSpec(), DeclarationNameInfo(IterationVarName, Loc),
8741 IterationVar);
8742 assert(!Ref.isInvalid() && "can't reference our own variable?");
8743 return Ref.get();
8744 };
8745
8746 // Build 'i$n != Size'.
8747 ExprResult Cond = S.CreateBuiltinBinOp(
8748 Loc, BO_NE, IterRef(),
8749 IntegerLiteral::Create(S.Context, Size, SizeType, Loc));
8750 assert(!Cond.isInvalid() && "should never fail");
8751
8752 // Build '++i$n'.
8753 ExprResult Inc = S.CreateBuiltinUnaryOp(Loc, UO_PreInc, IterRef());
8754 assert(!Inc.isInvalid() && "should never fail");
8755
8756 // Build 'a[i$n]' and 'b[i$n]'.
8757 auto Index = [&](ExprResult E) {
8758 if (E.isInvalid())
8759 return ExprError();
8760 return S.CreateBuiltinArraySubscriptExpr(E.get(), Loc, IterRef(), Loc);
8761 };
8762 Subobj.first = Index(Subobj.first);
8763 Subobj.second = Index(Subobj.second);
8764
8765 // Compare the array elements.
8766 ++ArrayDepth;
8767 StmtResult Substmt = visitSubobject(Type, Subobj);
8768 --ArrayDepth;
8769
8770 if (Substmt.isInvalid())
8771 return StmtError();
8772
8773 // For the inner level of an 'operator==', build 'if (!cmp) return false;'.
8774 // For outer levels or for an 'operator<=>' we already have a suitable
8775 // statement that returns as necessary.
8776 if (Expr *ElemCmp = dyn_cast<Expr>(Substmt.get())) {
8777 assert(DCK == DefaultedComparisonKind::Equal &&
8778 "should have non-expression statement");
8779 Substmt = buildIfNotCondReturnFalse(ElemCmp);
8780 if (Substmt.isInvalid())
8781 return StmtError();
8782 }
8783
8784 // Build 'for (...) ...'
8785 return S.ActOnForStmt(Loc, Loc, Init,
8786 S.ActOnCondition(nullptr, Loc, Cond.get(),
8787 Sema::ConditionKind::Boolean),
8788 S.MakeFullDiscardedValueExpr(Inc.get()), Loc,
8789 Substmt.get());
8790 }
8791
8792 StmtResult visitExpandedSubobject(QualType Type, ExprPair Obj) {
8793 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8794 return StmtError();
8795
8798 ExprResult Op;
8799 if (Type->isOverloadableType())
8800 Op = S.CreateOverloadedBinOp(Loc, Opc, Fns, Obj.first.get(),
8801 Obj.second.get(), /*PerformADL=*/true,
8802 /*AllowRewrittenCandidates=*/true, FD);
8803 else
8804 Op = S.CreateBuiltinBinOp(Loc, Opc, Obj.first.get(), Obj.second.get());
8805 if (Op.isInvalid())
8806 return StmtError();
8807
8808 switch (DCK) {
8809 case DefaultedComparisonKind::None:
8810 llvm_unreachable("not a defaulted comparison");
8811
8812 case DefaultedComparisonKind::Equal:
8813 // Per C++2a [class.eq]p2, each comparison is individually contextually
8814 // converted to bool.
8815 Op = S.PerformContextuallyConvertToBool(Op.get());
8816 if (Op.isInvalid())
8817 return StmtError();
8818 return Op.get();
8819
8820 case DefaultedComparisonKind::ThreeWay: {
8821 // Per C++2a [class.spaceship]p3, form:
8822 // if (R cmp = static_cast<R>(op); cmp != 0)
8823 // return cmp;
8824 QualType R = FD->getReturnType();
8825 Op = buildStaticCastToR(Op.get());
8826 if (Op.isInvalid())
8827 return StmtError();
8828
8829 // R cmp = ...;
8830 IdentifierInfo *Name = &S.Context.Idents.get("cmp");
8831 VarDecl *VD =
8832 VarDecl::Create(S.Context, S.CurContext, Loc, Loc, Name, R,
8833 S.Context.getTrivialTypeSourceInfo(R, Loc), SC_None);
8834 S.AddInitializerToDecl(VD, Op.get(), /*DirectInit=*/false);
8835 Stmt *InitStmt = new (S.Context) DeclStmt(DeclGroupRef(VD), Loc, Loc);
8836
8837 // cmp != 0
8838 ExprResult VDRef = getDecl(VD);
8839 if (VDRef.isInvalid())
8840 return StmtError();
8841 llvm::APInt ZeroVal(S.Context.getIntWidth(S.Context.IntTy), 0);
8842 Expr *Zero =
8843 IntegerLiteral::Create(S.Context, ZeroVal, S.Context.IntTy, Loc);
8845 if (VDRef.get()->getType()->isOverloadableType())
8846 Comp = S.CreateOverloadedBinOp(Loc, BO_NE, Fns, VDRef.get(), Zero, true,
8847 true, FD);
8848 else
8849 Comp = S.CreateBuiltinBinOp(Loc, BO_NE, VDRef.get(), Zero);
8850 if (Comp.isInvalid())
8851 return StmtError();
8852 Sema::ConditionResult Cond = S.ActOnCondition(
8853 nullptr, Loc, Comp.get(), Sema::ConditionKind::Boolean);
8854 if (Cond.isInvalid())
8855 return StmtError();
8856
8857 // return cmp;
8858 VDRef = getDecl(VD);
8859 if (VDRef.isInvalid())
8860 return StmtError();
8861 StmtResult ReturnStmt = S.BuildReturnStmt(Loc, VDRef.get());
8862 if (ReturnStmt.isInvalid())
8863 return StmtError();
8864
8865 // if (...)
8866 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, InitStmt, Cond,
8867 Loc, ReturnStmt.get(),
8868 /*ElseLoc=*/SourceLocation(), /*Else=*/nullptr);
8869 }
8870
8871 case DefaultedComparisonKind::NotEqual:
8872 case DefaultedComparisonKind::Relational:
8873 // C++2a [class.compare.secondary]p2:
8874 // Otherwise, the operator function yields x @ y.
8875 return Op.get();
8876 }
8877 llvm_unreachable("");
8878 }
8879
8880 /// Build "static_cast<R>(E)".
8881 ExprResult buildStaticCastToR(Expr *E) {
8882 QualType R = FD->getReturnType();
8883 assert(!R->isUndeducedType() && "type should have been deduced already");
8884
8885 // Don't bother forming a no-op cast in the common case.
8886 if (E->isPRValue() && S.Context.hasSameType(E->getType(), R))
8887 return E;
8888 return S.BuildCXXNamedCast(Loc, tok::kw_static_cast,
8889 S.Context.getTrivialTypeSourceInfo(R, Loc), E,
8890 SourceRange(Loc, Loc), SourceRange(Loc, Loc));
8891 }
8892};
8893}
8894
8895/// Perform the unqualified lookups that might be needed to form a defaulted
8896/// comparison function for the given operator.
8898 UnresolvedSetImpl &Operators,
8900 auto Lookup = [&](OverloadedOperatorKind OO) {
8901 Self.LookupOverloadedOperatorName(OO, S, Operators);
8902 };
8903
8904 // Every defaulted operator looks up itself.
8905 Lookup(Op);
8906 // ... and the rewritten form of itself, if any.
8908 Lookup(ExtraOp);
8909
8910 // For 'operator<=>', we also form a 'cmp != 0' expression, and might
8911 // synthesize a three-way comparison from '<' and '=='. In a dependent
8912 // context, we also need to look up '==' in case we implicitly declare a
8913 // defaulted 'operator=='.
8914 if (Op == OO_Spaceship) {
8915 Lookup(OO_ExclaimEqual);
8916 Lookup(OO_Less);
8917 Lookup(OO_EqualEqual);
8918 }
8919}
8920
8923 assert(DCK != DefaultedComparisonKind::None && "not a defaulted comparison");
8924
8925 // Perform any unqualified lookups we're going to need to default this
8926 // function.
8927 if (S) {
8928 UnresolvedSet<32> Operators;
8929 lookupOperatorsForDefaultedComparison(*this, S, Operators,
8930 FD->getOverloadedOperator());
8933 Context, Operators.pairs()));
8934 }
8935
8936 // C++2a [class.compare.default]p1:
8937 // A defaulted comparison operator function for some class C shall be a
8938 // non-template function declared in the member-specification of C that is
8939 // -- a non-static const non-volatile member of C having one parameter of
8940 // type const C& and either no ref-qualifier or the ref-qualifier &, or
8941 // -- a friend of C having two parameters of type const C& or two
8942 // parameters of type C.
8943
8944 CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalDeclContext());
8945 bool IsMethod = isa<CXXMethodDecl>(FD);
8946 if (IsMethod) {
8947 auto *MD = cast<CXXMethodDecl>(FD);
8948 assert(!MD->isStatic() && "comparison function cannot be a static member");
8949
8950 if (MD->getRefQualifier() == RQ_RValue) {
8951 Diag(MD->getLocation(), diag::err_ref_qualifier_comparison_operator);
8952
8953 // Remove the ref qualifier to recover.
8954 const auto *FPT = MD->getType()->castAs<FunctionProtoType>();
8955 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
8956 EPI.RefQualifier = RQ_None;
8957 MD->setType(Context.getFunctionType(FPT->getReturnType(),
8958 FPT->getParamTypes(), EPI));
8959 }
8960
8961 // If we're out-of-class, this is the class we're comparing.
8962 if (!RD)
8963 RD = MD->getParent();
8964 QualType T = MD->getFunctionObjectParameterReferenceType();
8965 if (!T.getNonReferenceType().isConstQualified() &&
8966 (MD->isImplicitObjectMemberFunction() || T->isLValueReferenceType())) {
8967 SourceLocation Loc, InsertLoc;
8968 if (MD->isExplicitObjectMemberFunction()) {
8969 Loc = MD->getParamDecl(0)->getBeginLoc();
8970 InsertLoc = getLocForEndOfToken(
8971 MD->getParamDecl(0)->getExplicitObjectParamThisLoc());
8972 } else {
8973 Loc = MD->getLocation();
8974 if (FunctionTypeLoc Loc = MD->getFunctionTypeLoc())
8975 InsertLoc = Loc.getRParenLoc();
8976 }
8977 // Don't diagnose an implicit 'operator=='; we will have diagnosed the
8978 // corresponding defaulted 'operator<=>' already.
8979 if (!MD->isImplicit()) {
8980 Diag(Loc, diag::err_defaulted_comparison_non_const)
8981 << (int)DCK << FixItHint::CreateInsertion(InsertLoc, " const");
8982 }
8983
8984 // Add the 'const' to the type to recover.
8985 if (MD->isExplicitObjectMemberFunction()) {
8986 assert(T->isLValueReferenceType());
8987 MD->getParamDecl(0)->setType(Context.getLValueReferenceType(
8988 T.getNonReferenceType().withConst()));
8989 } else {
8990 const auto *FPT = MD->getType()->castAs<FunctionProtoType>();
8991 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
8992 EPI.TypeQuals.addConst();
8993 MD->setType(Context.getFunctionType(FPT->getReturnType(),
8994 FPT->getParamTypes(), EPI));
8995 }
8996 }
8997
8998 if (MD->isVolatile()) {
8999 Diag(MD->getLocation(), diag::err_volatile_comparison_operator);
9000
9001 // Remove the 'volatile' from the type to recover.
9002 const auto *FPT = MD->getType()->castAs<FunctionProtoType>();
9003 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
9005 MD->setType(Context.getFunctionType(FPT->getReturnType(),
9006 FPT->getParamTypes(), EPI));
9007 }
9008 }
9009
9010 if ((FD->getNumParams() -
9011 (unsigned)FD->hasCXXExplicitFunctionObjectParameter()) !=
9012 (IsMethod ? 1 : 2)) {
9013 // Let's not worry about using a variadic template pack here -- who would do
9014 // such a thing?
9015 Diag(FD->getLocation(), diag::err_defaulted_comparison_num_args)
9016 << int(IsMethod) << int(DCK);
9017 return true;
9018 }
9019
9020 const ParmVarDecl *KnownParm = nullptr;
9021 for (const ParmVarDecl *Param : FD->parameters()) {
9022 QualType ParmTy = Param->getType();
9023 if (!KnownParm) {
9024 auto CTy = ParmTy;
9025 // Is it `T const &`?
9026 bool Ok = !IsMethod || FD->hasCXXExplicitFunctionObjectParameter();
9027 QualType ExpectedTy;
9028 if (RD)
9029 ExpectedTy = Context.getCanonicalTagType(RD);
9030 if (auto *Ref = CTy->getAs<LValueReferenceType>()) {
9031 CTy = Ref->getPointeeType();
9032 if (RD)
9033 ExpectedTy.addConst();
9034 Ok = true;
9035 }
9036
9037 // Is T a class?
9038 if (RD) {
9039 Ok &= RD->isDependentType() || Context.hasSameType(CTy, ExpectedTy);
9040 } else {
9041 RD = CTy->getAsCXXRecordDecl();
9042 Ok &= RD != nullptr;
9043 }
9044
9045 if (Ok) {
9046 KnownParm = Param;
9047 } else {
9048 // Don't diagnose an implicit 'operator=='; we will have diagnosed the
9049 // corresponding defaulted 'operator<=>' already.
9050 if (!FD->isImplicit()) {
9051 if (RD) {
9052 CanQualType PlainTy = Context.getCanonicalTagType(RD);
9053 QualType RefTy =
9054 Context.getLValueReferenceType(PlainTy.withConst());
9055 Diag(FD->getLocation(), diag::err_defaulted_comparison_param)
9056 << int(DCK) << ParmTy << RefTy << int(!IsMethod) << PlainTy
9057 << Param->getSourceRange();
9058 } else {
9059 assert(!IsMethod && "should know expected type for method");
9060 Diag(FD->getLocation(),
9061 diag::err_defaulted_comparison_param_unknown)
9062 << int(DCK) << ParmTy << Param->getSourceRange();
9063 }
9064 }
9065 return true;
9066 }
9067 } else if (!Context.hasSameType(KnownParm->getType(), ParmTy)) {
9068 Diag(FD->getLocation(), diag::err_defaulted_comparison_param_mismatch)
9069 << int(DCK) << KnownParm->getType() << KnownParm->getSourceRange()
9070 << ParmTy << Param->getSourceRange();
9071 return true;
9072 }
9073 }
9074
9075 assert(RD && "must have determined class");
9076 if (IsMethod) {
9077 } else if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
9078 // In-class, must be a friend decl.
9079 assert(FD->getFriendObjectKind() && "expected a friend declaration");
9080 } else {
9081 // Out of class, require the defaulted comparison to be a friend (of a
9082 // complete type, per CWG2547).
9083 if (RequireCompleteType(FD->getLocation(), Context.getCanonicalTagType(RD),
9084 diag::err_defaulted_comparison_not_friend, int(DCK),
9085 int(1)))
9086 return true;
9087
9088 if (llvm::none_of(RD->friends(), [&](const FriendDecl *F) {
9089 return declaresSameEntity(F->getFriendDecl(), FD);
9090 })) {
9091 Diag(FD->getLocation(), diag::err_defaulted_comparison_not_friend)
9092 << int(DCK) << int(0) << RD;
9093 Diag(RD->getCanonicalDecl()->getLocation(), diag::note_declared_at);
9094 return true;
9095 }
9096 }
9097
9098 // C++2a [class.eq]p1, [class.rel]p1:
9099 // A [defaulted comparison other than <=>] shall have a declared return
9100 // type bool.
9103 !Context.hasSameType(FD->getDeclaredReturnType(), Context.BoolTy)) {
9104 Diag(FD->getLocation(), diag::err_defaulted_comparison_return_type_not_bool)
9105 << (int)DCK << FD->getDeclaredReturnType() << Context.BoolTy
9106 << FD->getReturnTypeSourceRange();
9107 return true;
9108 }
9109 // C++2a [class.spaceship]p2 [P2002R0]:
9110 // Let R be the declared return type [...]. If R is auto, [...]. Otherwise,
9111 // R shall not contain a placeholder type.
9112 if (QualType RT = FD->getDeclaredReturnType();
9114 RT->getContainedDeducedType() &&
9115 (!Context.hasSameType(RT, Context.getAutoDeductType()) ||
9116 RT->getContainedAutoType()->isConstrained())) {
9117 Diag(FD->getLocation(),
9118 diag::err_defaulted_comparison_deduced_return_type_not_auto)
9119 << (int)DCK << FD->getDeclaredReturnType() << Context.AutoDeductTy
9120 << FD->getReturnTypeSourceRange();
9121 return true;
9122 }
9123
9124 // For a defaulted function in a dependent class, defer all remaining checks
9125 // until instantiation.
9126 if (RD->isDependentType())
9127 return false;
9128
9129 // Determine whether the function should be defined as deleted.
9130 DefaultedComparisonInfo Info =
9131 DefaultedComparisonAnalyzer(*this, RD, FD, DCK).visit();
9132
9133 bool First = FD == FD->getCanonicalDecl();
9134
9135 if (!First) {
9136 if (Info.Deleted) {
9137 // C++11 [dcl.fct.def.default]p4:
9138 // [For a] user-provided explicitly-defaulted function [...] if such a
9139 // function is implicitly defined as deleted, the program is ill-formed.
9140 //
9141 // This is really just a consequence of the general rule that you can
9142 // only delete a function on its first declaration.
9143 Diag(FD->getLocation(), diag::err_non_first_default_compare_deletes)
9144 << FD->isImplicit() << (int)DCK;
9145 DefaultedComparisonAnalyzer(*this, RD, FD, DCK,
9146 DefaultedComparisonAnalyzer::ExplainDeleted)
9147 .visit();
9148 return true;
9149 }
9151 // C++20 [class.compare.default]p1:
9152 // [...] A definition of a comparison operator as defaulted that appears
9153 // in a class shall be the first declaration of that function.
9154 Diag(FD->getLocation(), diag::err_non_first_default_compare_in_class)
9155 << (int)DCK;
9157 diag::note_previous_declaration);
9158 return true;
9159 }
9160 }
9161
9162 // If we want to delete the function, then do so; there's nothing else to
9163 // check in that case.
9164 if (Info.Deleted) {
9165 SetDeclDeleted(FD, FD->getLocation());
9166 if (!inTemplateInstantiation() && !FD->isImplicit()) {
9167 Diag(FD->getLocation(), diag::warn_defaulted_comparison_deleted)
9168 << (int)DCK;
9169 DefaultedComparisonAnalyzer(*this, RD, FD, DCK,
9170 DefaultedComparisonAnalyzer::ExplainDeleted)
9171 .visit();
9172 if (FD->getDefaultLoc().isValid())
9173 Diag(FD->getDefaultLoc(), diag::note_replace_equals_default_to_delete)
9174 << FixItHint::CreateReplacement(FD->getDefaultLoc(), "delete");
9175 }
9176 return false;
9177 }
9178
9179 // C++2a [class.spaceship]p2:
9180 // The return type is deduced as the common comparison type of R0, R1, ...
9184 if (RetLoc.isInvalid())
9185 RetLoc = FD->getBeginLoc();
9186 // FIXME: Should we really care whether we have the complete type and the
9187 // 'enumerator' constants here? A forward declaration seems sufficient.
9189 Info.Category, RetLoc, ComparisonCategoryUsage::DefaultedOperator);
9190 if (Cat.isNull())
9191 return true;
9192 Context.adjustDeducedFunctionResultType(
9193 FD, SubstAutoType(FD->getDeclaredReturnType(), Cat));
9194 }
9195
9196 // C++2a [dcl.fct.def.default]p3 [P2002R0]:
9197 // An explicitly-defaulted function that is not defined as deleted may be
9198 // declared constexpr or consteval only if it is constexpr-compatible.
9199 // C++2a [class.compare.default]p3 [P2002R0]:
9200 // A defaulted comparison function is constexpr-compatible if it satisfies
9201 // the requirements for a constexpr function [...]
9202 // The only relevant requirements are that the parameter and return types are
9203 // literal types. The remaining conditions are checked by the analyzer.
9204 //
9205 // We support P2448R2 in language modes earlier than C++23 as an extension.
9206 // The concept of constexpr-compatible was removed.
9207 // C++23 [dcl.fct.def.default]p3 [P2448R2]
9208 // A function explicitly defaulted on its first declaration is implicitly
9209 // inline, and is implicitly constexpr if it is constexpr-suitable.
9210 // C++23 [dcl.constexpr]p3
9211 // A function is constexpr-suitable if
9212 // - it is not a coroutine, and
9213 // - if the function is a constructor or destructor, its class does not
9214 // have any virtual base classes.
9215 if (FD->isConstexpr()) {
9216 if (!getLangOpts().CPlusPlus23 &&
9219 !Info.Constexpr) {
9220 Diag(FD->getBeginLoc(), diag::err_defaulted_comparison_constexpr_mismatch)
9221 << FD->isImplicit() << (int)DCK << FD->isConsteval();
9222 DefaultedComparisonAnalyzer(*this, RD, FD, DCK,
9223 DefaultedComparisonAnalyzer::ExplainConstexpr)
9224 .visit();
9225 }
9226 }
9227
9228 // C++2a [dcl.fct.def.default]p3 [P2002R0]:
9229 // If a constexpr-compatible function is explicitly defaulted on its first
9230 // declaration, it is implicitly considered to be constexpr.
9231 // FIXME: Only applying this to the first declaration seems problematic, as
9232 // simple reorderings can affect the meaning of the program.
9233 if (First && !FD->isConstexpr() && Info.Constexpr)
9235
9236 // C++2a [except.spec]p3:
9237 // If a declaration of a function does not have a noexcept-specifier
9238 // [and] is defaulted on its first declaration, [...] the exception
9239 // specification is as specified below
9240 if (FD->getExceptionSpecType() == EST_None) {
9241 auto *FPT = FD->getType()->castAs<FunctionProtoType>();
9242 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
9244 EPI.ExceptionSpec.SourceDecl = FD;
9245 FD->setType(Context.getFunctionType(FPT->getReturnType(),
9246 FPT->getParamTypes(), EPI));
9247 }
9248
9249 return false;
9250}
9251
9253 FunctionDecl *Spaceship) {
9256 Ctx.PointOfInstantiation = Spaceship->getEndLoc();
9257 Ctx.Entity = Spaceship;
9259
9260 if (FunctionDecl *EqualEqual = SubstSpaceshipAsEqualEqual(RD, Spaceship))
9261 EqualEqual->setImplicit();
9262
9264}
9265
9268 assert(FD->isDefaulted() && !FD->isDeleted() &&
9270 if (FD->willHaveBody() || FD->isInvalidDecl())
9271 return;
9272
9274
9275 // Add a context note for diagnostics produced after this point.
9276 Scope.addContextNote(UseLoc);
9277
9278 {
9279 // Build and set up the function body.
9280 // The first parameter has type maybe-ref-to maybe-const T, use that to get
9281 // the type of the class being compared.
9282 auto PT = FD->getParamDecl(0)->getType();
9283 CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl();
9284 SourceLocation BodyLoc =
9285 FD->getEndLoc().isValid() ? FD->getEndLoc() : FD->getLocation();
9286 StmtResult Body =
9287 DefaultedComparisonSynthesizer(*this, RD, FD, DCK, BodyLoc).build();
9288 if (Body.isInvalid()) {
9289 FD->setInvalidDecl();
9290 return;
9291 }
9292 FD->setBody(Body.get());
9293 FD->markUsed(Context);
9294 }
9295
9296 // The exception specification is needed because we are defining the
9297 // function. Note that this will reuse the body we just built.
9299
9301 L->CompletedImplicitDefinition(FD);
9302}
9303
9306 FunctionDecl *FD,
9308 ComputingExceptionSpec CES(S, FD, Loc);
9310
9311 if (FD->isInvalidDecl())
9312 return ExceptSpec;
9313
9314 // The common case is that we just defined the comparison function. In that
9315 // case, just look at whether the body can throw.
9316 if (FD->hasBody()) {
9317 ExceptSpec.CalledStmt(FD->getBody());
9318 } else {
9319 // Otherwise, build a body so we can check it. This should ideally only
9320 // happen when we're not actually marking the function referenced. (This is
9321 // only really important for efficiency: we don't want to build and throw
9322 // away bodies for comparison functions more than we strictly need to.)
9323
9324 // Pretend to synthesize the function body in an unevaluated context.
9325 // Note that we can't actually just go ahead and define the function here:
9326 // we are not permitted to mark its callees as referenced.
9330
9331 CXXRecordDecl *RD =
9333 ? FD->getDeclContext()
9334 : FD->getLexicalDeclContext());
9335 SourceLocation BodyLoc =
9336 FD->getEndLoc().isValid() ? FD->getEndLoc() : FD->getLocation();
9337 StmtResult Body =
9338 DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();
9339 if (!Body.isInvalid())
9340 ExceptSpec.CalledStmt(Body.get());
9341
9342 // FIXME: Can we hold onto this body and just transform it to potentially
9343 // evaluated when we're asked to define the function rather than rebuilding
9344 // it? Either that, or we should only build the bits of the body that we
9345 // need (the expressions, not the statements).
9346 }
9347
9348 return ExceptSpec;
9349}
9350
9352 decltype(DelayedOverridingExceptionSpecChecks) Overriding;
9354
9355 std::swap(Overriding, DelayedOverridingExceptionSpecChecks);
9357
9358 // Perform any deferred checking of exception specifications for virtual
9359 // destructors.
9360 for (auto &Check : Overriding)
9361 CheckOverridingFunctionExceptionSpec(Check.first, Check.second);
9362
9363 // Perform any deferred checking of exception specifications for befriended
9364 // special members.
9365 for (auto &Check : Equivalent)
9366 CheckEquivalentExceptionSpec(Check.second, Check.first);
9367}
9368
9369namespace {
9370/// CRTP base class for visiting operations performed by a special member
9371/// function (or inherited constructor).
9372template<typename Derived>
9373struct SpecialMemberVisitor {
9374 Sema &S;
9375 CXXMethodDecl *MD;
9378
9379 // Properties of the special member, computed for convenience.
9380 bool IsConstructor = false, IsAssignment = false, ConstArg = false;
9381
9382 SpecialMemberVisitor(Sema &S, CXXMethodDecl *MD, CXXSpecialMemberKind CSM,
9384 : S(S), MD(MD), CSM(CSM), ICI(ICI) {
9385 switch (CSM) {
9389 IsConstructor = true;
9390 break;
9393 IsAssignment = true;
9394 break;
9396 break;
9398 llvm_unreachable("invalid special member kind");
9399 }
9400
9401 if (MD->getNumExplicitParams()) {
9402 if (const ReferenceType *RT =
9403 MD->getNonObjectParameter(0)->getType()->getAs<ReferenceType>())
9404 ConstArg = RT->getPointeeType().isConstQualified();
9405 }
9406 }
9407
9408 Derived &getDerived() { return static_cast<Derived&>(*this); }
9409
9410 /// Is this a "move" special member?
9411 bool isMove() const {
9412 return CSM == CXXSpecialMemberKind::MoveConstructor ||
9413 CSM == CXXSpecialMemberKind::MoveAssignment;
9414 }
9415
9416 /// Look up the corresponding special member in the given class.
9417 Sema::SpecialMemberOverloadResult lookupIn(CXXRecordDecl *Class,
9418 unsigned Quals, bool IsMutable) {
9419 return lookupCallFromSpecialMember(S, Class, CSM, Quals,
9420 ConstArg && !IsMutable);
9421 }
9422
9423 /// Look up the constructor for the specified base class to see if it's
9424 /// overridden due to this being an inherited constructor.
9425 Sema::SpecialMemberOverloadResult lookupInheritedCtor(CXXRecordDecl *Class) {
9426 if (!ICI)
9427 return {};
9428 assert(CSM == CXXSpecialMemberKind::DefaultConstructor);
9429 auto *BaseCtor =
9430 cast<CXXConstructorDecl>(MD)->getInheritedConstructor().getConstructor();
9431 if (auto *MD = ICI->findConstructorForBase(Class, BaseCtor).first)
9432 return MD;
9433 return {};
9434 }
9435
9436 /// A base or member subobject.
9437 typedef llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;
9438
9439 /// Get the location to use for a subobject in diagnostics.
9440 static SourceLocation getSubobjectLoc(Subobject Subobj) {
9441 // FIXME: For an indirect virtual base, the direct base leading to
9442 // the indirect virtual base would be a more useful choice.
9443 if (auto *B = dyn_cast<CXXBaseSpecifier *>(Subobj))
9444 return B->getBaseTypeLoc();
9445 else
9446 return cast<FieldDecl *>(Subobj)->getLocation();
9447 }
9448
9449 enum BasesToVisit {
9450 /// Visit all non-virtual (direct) bases.
9451 VisitNonVirtualBases,
9452 /// Visit all direct bases, virtual or not.
9453 VisitDirectBases,
9454 /// Visit all non-virtual bases, and all virtual bases if the class
9455 /// is not abstract.
9456 VisitPotentiallyConstructedBases,
9457 /// Visit all direct or virtual bases.
9458 VisitAllBases
9459 };
9460
9461 // Visit the bases and members of the class.
9462 bool visit(BasesToVisit Bases) {
9463 CXXRecordDecl *RD = MD->getParent();
9464
9465 if (Bases == VisitPotentiallyConstructedBases)
9466 Bases = RD->isAbstract() ? VisitNonVirtualBases : VisitAllBases;
9467
9468 for (auto &B : RD->bases())
9469 if ((Bases == VisitDirectBases || !B.isVirtual()) &&
9470 getDerived().visitBase(&B))
9471 return true;
9472
9473 if (Bases == VisitAllBases)
9474 for (auto &B : RD->vbases())
9475 if (getDerived().visitBase(&B))
9476 return true;
9477
9478 for (auto *F : RD->fields())
9479 if (!F->isInvalidDecl() && !F->isUnnamedBitField() &&
9480 getDerived().visitField(F))
9481 return true;
9482
9483 return false;
9484 }
9485};
9486}
9487
9488namespace {
9489struct SpecialMemberDeletionInfo
9490 : SpecialMemberVisitor<SpecialMemberDeletionInfo> {
9491 bool Diagnose;
9492
9493 SourceLocation Loc;
9494
9495 bool AllFieldsAreConst;
9496
9497 SpecialMemberDeletionInfo(Sema &S, CXXMethodDecl *MD,
9499 Sema::InheritedConstructorInfo *ICI, bool Diagnose)
9500 : SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),
9501 Loc(MD->getLocation()), AllFieldsAreConst(true) {}
9502
9503 bool inUnion() const { return MD->getParent()->isUnion(); }
9504
9505 CXXSpecialMemberKind getEffectiveCSM() {
9506 return ICI ? CXXSpecialMemberKind::Invalid : CSM;
9507 }
9508
9509 bool shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType);
9510
9511 bool shouldDeleteForVariantPtrAuthMember(const FieldDecl *FD);
9512
9513 bool visitBase(CXXBaseSpecifier *Base) { return shouldDeleteForBase(Base); }
9514 bool visitField(FieldDecl *Field) { return shouldDeleteForField(Field); }
9515
9516 bool shouldDeleteForBase(CXXBaseSpecifier *Base);
9517 bool shouldDeleteForField(FieldDecl *FD);
9518 bool shouldDeleteForAllConstMembers();
9519
9520 bool shouldDeleteForClassSubobject(CXXRecordDecl *Class, Subobject Subobj,
9521 unsigned Quals);
9522 bool shouldDeleteForSubobjectCall(Subobject Subobj,
9523 Sema::SpecialMemberOverloadResult SMOR,
9524 bool IsDtorCallInCtor);
9525
9526 bool isAccessible(Subobject Subobj, CXXMethodDecl *D);
9527};
9528}
9529
9530/// Is the given special member inaccessible when used on the given
9531/// sub-object.
9532bool SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,
9533 CXXMethodDecl *target) {
9534 /// If we're operating on a base class, the object type is the
9535 /// type of this special member.
9536 CanQualType objectTy;
9537 AccessSpecifier access = target->getAccess();
9538 if (CXXBaseSpecifier *base = Subobj.dyn_cast<CXXBaseSpecifier*>()) {
9539 objectTy = S.Context.getCanonicalTagType(MD->getParent());
9540 access = CXXRecordDecl::MergeAccess(base->getAccessSpecifier(), access);
9541
9542 // If we're operating on a field, the object type is the type of the field.
9543 } else {
9544 objectTy = S.Context.getCanonicalTagType(target->getParent());
9545 }
9546
9548 target->getParent(), DeclAccessPair::make(target, access), objectTy);
9549}
9550
9551/// Check whether we should delete a special member due to the implicit
9552/// definition containing a call to a special member of a subobject.
9553bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
9554 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR,
9555 bool IsDtorCallInCtor) {
9556 CXXMethodDecl *Decl = SMOR.getMethod();
9557 FieldDecl *Field = Subobj.dyn_cast<FieldDecl*>();
9558
9559 enum {
9560 NotSet = -1,
9561 NoDecl,
9562 DeletedDecl,
9563 MultipleDecl,
9564 InaccessibleDecl,
9565 NonTrivialDecl
9566 } DiagKind = NotSet;
9567
9569 if (CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9570 Field->getParent()->isUnion()) {
9571 // [class.default.ctor]p2:
9572 // A defaulted default constructor for class X is defined as deleted if
9573 // - X is a union that has a variant member with a non-trivial default
9574 // constructor and no variant member of X has a default member
9575 // initializer
9576 const auto *RD = cast<CXXRecordDecl>(Field->getParent());
9577 if (RD->hasInClassInitializer())
9578 return false;
9579 }
9580 DiagKind = !Decl ? NoDecl : DeletedDecl;
9582 DiagKind = MultipleDecl;
9583 else if (!isAccessible(Subobj, Decl))
9584 DiagKind = InaccessibleDecl;
9585 else if (!IsDtorCallInCtor && Field && Field->getParent()->isUnion() &&
9586 !Decl->isTrivial()) {
9587 // A member of a union must have a trivial corresponding special member.
9588 // As a weird special case, a destructor call from a union's constructor
9589 // must be accessible and non-deleted, but need not be trivial. Such a
9590 // destructor is never actually called, but is semantically checked as
9591 // if it were.
9592 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9593 // [class.default.ctor]p2:
9594 // A defaulted default constructor for class X is defined as deleted if
9595 // - X is a union that has a variant member with a non-trivial default
9596 // constructor and no variant member of X has a default member
9597 // initializer
9598 const auto *RD = cast<CXXRecordDecl>(Field->getParent());
9599 if (!RD->hasInClassInitializer())
9600 DiagKind = NonTrivialDecl;
9601 } else {
9602 DiagKind = NonTrivialDecl;
9603 }
9604 }
9605
9606 if (DiagKind == NotSet)
9607 return false;
9608
9609 if (Diagnose) {
9610 if (Field) {
9611 S.Diag(Field->getLocation(),
9612 diag::note_deleted_special_member_class_subobject)
9613 << getEffectiveCSM() << MD->getParent() << /*IsField*/ true << Field
9614 << DiagKind << IsDtorCallInCtor << /*IsObjCPtr*/ false;
9615 } else {
9616 CXXBaseSpecifier *Base = cast<CXXBaseSpecifier *>(Subobj);
9617 S.Diag(Base->getBeginLoc(),
9618 diag::note_deleted_special_member_class_subobject)
9619 << getEffectiveCSM() << MD->getParent() << /*IsField*/ false
9620 << Base->getType() << DiagKind << IsDtorCallInCtor
9621 << /*IsObjCPtr*/ false;
9622 }
9623
9624 if (DiagKind == DeletedDecl)
9625 S.NoteDeletedFunction(Decl);
9626 // FIXME: Explain inaccessibility if DiagKind == InaccessibleDecl.
9627 }
9628
9629 return true;
9630}
9631
9632/// Check whether we should delete a special member function due to having a
9633/// direct or virtual base class or non-static data member of class type M.
9634bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(
9635 CXXRecordDecl *Class, Subobject Subobj, unsigned Quals) {
9636 FieldDecl *Field = Subobj.dyn_cast<FieldDecl*>();
9637 bool IsMutable = Field && Field->isMutable();
9638
9639 // C++11 [class.ctor]p5:
9640 // -- any direct or virtual base class, or non-static data member with no
9641 // brace-or-equal-initializer, has class type M (or array thereof) and
9642 // either M has no default constructor or overload resolution as applied
9643 // to M's default constructor results in an ambiguity or in a function
9644 // that is deleted or inaccessible
9645 // C++11 [class.copy]p11, C++11 [class.copy]p23:
9646 // -- a direct or virtual base class B that cannot be copied/moved because
9647 // overload resolution, as applied to B's corresponding special member,
9648 // results in an ambiguity or a function that is deleted or inaccessible
9649 // from the defaulted special member
9650 // C++11 [class.dtor]p5:
9651 // -- any direct or virtual base class [...] has a type with a destructor
9652 // that is deleted or inaccessible
9653 if (!(CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9654 Field->hasInClassInitializer()) &&
9655 shouldDeleteForSubobjectCall(Subobj, lookupIn(Class, Quals, IsMutable),
9656 false))
9657 return true;
9658
9659 // C++11 [class.ctor]p5, C++11 [class.copy]p11:
9660 // -- any direct or virtual base class or non-static data member has a
9661 // type with a destructor that is deleted or inaccessible
9662 if (IsConstructor) {
9663 Sema::SpecialMemberOverloadResult SMOR =
9664 S.LookupSpecialMember(Class, CXXSpecialMemberKind::Destructor, false,
9665 false, false, false, false);
9666 if (shouldDeleteForSubobjectCall(Subobj, SMOR, true))
9667 return true;
9668 }
9669
9670 return false;
9671}
9672
9673bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(
9674 FieldDecl *FD, QualType FieldType) {
9675 // The defaulted special functions are defined as deleted if this is a variant
9676 // member with a non-trivial ownership type, e.g., ObjC __strong or __weak
9677 // type under ARC.
9678 if (!FieldType.hasNonTrivialObjCLifetime())
9679 return false;
9680
9681 // Don't make the defaulted default constructor defined as deleted if the
9682 // member has an in-class initializer.
9683 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9685 return false;
9686
9687 if (Diagnose) {
9688 auto *ParentClass = cast<CXXRecordDecl>(FD->getParent());
9689 S.Diag(FD->getLocation(), diag::note_deleted_special_member_class_subobject)
9690 << getEffectiveCSM() << ParentClass << /*IsField*/ true << FD << 4
9691 << /*IsDtorCallInCtor*/ false << /*IsObjCPtr*/ true;
9692 }
9693
9694 return true;
9695}
9696
9697bool SpecialMemberDeletionInfo::shouldDeleteForVariantPtrAuthMember(
9698 const FieldDecl *FD) {
9699 QualType FieldType = S.Context.getBaseElementType(FD->getType());
9700 // Copy/move constructors/assignment operators are deleted if the field has an
9701 // address-discriminated ptrauth qualifier.
9702 PointerAuthQualifier Q = FieldType.getPointerAuth();
9703
9704 if (!Q || !Q.isAddressDiscriminated())
9705 return false;
9706
9707 if (CSM == CXXSpecialMemberKind::DefaultConstructor ||
9708 CSM == CXXSpecialMemberKind::Destructor)
9709 return false;
9710
9711 if (Diagnose) {
9712 auto *ParentClass = cast<CXXRecordDecl>(FD->getParent());
9713 S.Diag(FD->getLocation(), diag::note_deleted_special_member_class_subobject)
9714 << getEffectiveCSM() << ParentClass << /*IsField*/ true << FD << 4
9715 << /*IsDtorCallInCtor*/ false << 2;
9716 }
9717
9718 return true;
9719}
9720
9721/// Check whether we should delete a special member function due to the class
9722/// having a particular direct or virtual base class.
9723bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {
9724 CXXRecordDecl *BaseClass = Base->getType()->getAsCXXRecordDecl();
9725 // If program is correct, BaseClass cannot be null, but if it is, the error
9726 // must be reported elsewhere.
9727 if (!BaseClass)
9728 return false;
9729 // If we have an inheriting constructor, check whether we're calling an
9730 // inherited constructor instead of a default constructor.
9731 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
9732 if (auto *BaseCtor = SMOR.getMethod()) {
9733 // Note that we do not check access along this path; other than that,
9734 // this is the same as shouldDeleteForSubobjectCall(Base, BaseCtor, false);
9735 // FIXME: Check that the base has a usable destructor! Sink this into
9736 // shouldDeleteForClassSubobject.
9737 if (BaseCtor->isDeleted() && Diagnose) {
9738 S.Diag(Base->getBeginLoc(),
9739 diag::note_deleted_special_member_class_subobject)
9740 << getEffectiveCSM() << MD->getParent() << /*IsField*/ false
9741 << Base->getType() << /*Deleted*/ 1 << /*IsDtorCallInCtor*/ false
9742 << /*IsObjCPtr*/ false;
9743 S.NoteDeletedFunction(BaseCtor);
9744 }
9745 return BaseCtor->isDeleted();
9746 }
9747 return shouldDeleteForClassSubobject(BaseClass, Base, 0);
9748}
9749
9750/// Check whether we should delete a special member function due to the class
9751/// having a particular non-static data member.
9752bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
9753 QualType FieldType = S.Context.getBaseElementType(FD->getType());
9754 CXXRecordDecl *FieldRecord = FieldType->getAsCXXRecordDecl();
9755
9756 if (inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))
9757 return true;
9758
9759 if (inUnion() && shouldDeleteForVariantPtrAuthMember(FD))
9760 return true;
9761
9762 if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
9763 // For a default constructor, all references must be initialized in-class
9764 // and, if a union, it must have a non-const member.
9765 if (FieldType->isReferenceType() && !FD->hasInClassInitializer()) {
9766 if (Diagnose)
9767 S.Diag(FD->getLocation(), diag::note_deleted_default_ctor_uninit_field)
9768 << !!ICI << MD->getParent() << FD << FieldType << /*Reference*/0;
9769 return true;
9770 }
9771 // C++11 [class.ctor]p5 (modified by DR2394): any non-variant non-static
9772 // data member of const-qualified type (or array thereof) with no
9773 // brace-or-equal-initializer is not const-default-constructible.
9774 if (!inUnion() && FieldType.isConstQualified() &&
9775 !FD->hasInClassInitializer() &&
9776 (!FieldRecord || !FieldRecord->allowConstDefaultInit())) {
9777 if (Diagnose)
9778 S.Diag(FD->getLocation(), diag::note_deleted_default_ctor_uninit_field)
9779 << !!ICI << MD->getParent() << FD << FD->getType() << /*Const*/1;
9780 return true;
9781 }
9782
9783 if (inUnion() && !FieldType.isConstQualified())
9784 AllFieldsAreConst = false;
9785 } else if (CSM == CXXSpecialMemberKind::CopyConstructor) {
9786 // For a copy constructor, data members must not be of rvalue reference
9787 // type.
9788 if (FieldType->isRValueReferenceType()) {
9789 if (Diagnose)
9790 S.Diag(FD->getLocation(), diag::note_deleted_copy_ctor_rvalue_reference)
9791 << MD->getParent() << FD << FieldType;
9792 return true;
9793 }
9794 } else if (IsAssignment) {
9795 // For an assignment operator, data members must not be of reference type.
9796 if (FieldType->isReferenceType()) {
9797 if (Diagnose)
9798 S.Diag(FD->getLocation(), diag::note_deleted_assign_field)
9799 << isMove() << MD->getParent() << FD << FieldType << /*Reference*/0;
9800 return true;
9801 }
9802 if (!FieldRecord && FieldType.isConstQualified()) {
9803 // C++11 [class.copy]p23:
9804 // -- a non-static data member of const non-class type (or array thereof)
9805 if (Diagnose)
9806 S.Diag(FD->getLocation(), diag::note_deleted_assign_field)
9807 << isMove() << MD->getParent() << FD << FD->getType() << /*Const*/1;
9808 return true;
9809 }
9810 }
9811
9812 if (FieldRecord) {
9813 // Some additional restrictions exist on the variant members.
9814 if (!inUnion() && FieldRecord->isUnion() &&
9815 FieldRecord->isAnonymousStructOrUnion()) {
9816 bool AllVariantFieldsAreConst = true;
9817
9818 // FIXME: Handle anonymous unions declared within anonymous unions.
9819 for (auto *UI : FieldRecord->fields()) {
9820 QualType UnionFieldType = S.Context.getBaseElementType(UI->getType());
9821
9822 if (shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))
9823 return true;
9824
9825 if (shouldDeleteForVariantPtrAuthMember(&*UI))
9826 return true;
9827
9828 if (!UnionFieldType.isConstQualified())
9829 AllVariantFieldsAreConst = false;
9830
9831 CXXRecordDecl *UnionFieldRecord = UnionFieldType->getAsCXXRecordDecl();
9832 if (UnionFieldRecord &&
9833 shouldDeleteForClassSubobject(UnionFieldRecord, UI,
9834 UnionFieldType.getCVRQualifiers()))
9835 return true;
9836 }
9837
9838 // At least one member in each anonymous union must be non-const
9839 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
9840 AllVariantFieldsAreConst && !FieldRecord->field_empty()) {
9841 if (Diagnose)
9842 S.Diag(FieldRecord->getLocation(),
9843 diag::note_deleted_default_ctor_all_const)
9844 << !!ICI << MD->getParent() << /*anonymous union*/1;
9845 return true;
9846 }
9847
9848 // Don't check the implicit member of the anonymous union type.
9849 // This is technically non-conformant but supported, and we have a
9850 // diagnostic for this elsewhere.
9851 return false;
9852 }
9853
9854 if (shouldDeleteForClassSubobject(FieldRecord, FD,
9855 FieldType.getCVRQualifiers()))
9856 return true;
9857 }
9858
9859 return false;
9860}
9861
9862/// C++11 [class.ctor] p5:
9863/// A defaulted default constructor for a class X is defined as deleted if
9864/// X is a union and all of its variant members are of const-qualified type.
9865bool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {
9866 // This is a silly definition, because it gives an empty union a deleted
9867 // default constructor. Don't do that.
9868 if (CSM == CXXSpecialMemberKind::DefaultConstructor && inUnion() &&
9869 AllFieldsAreConst) {
9870 bool AnyFields = false;
9871 for (auto *F : MD->getParent()->fields())
9872 if ((AnyFields = !F->isUnnamedBitField()))
9873 break;
9874 if (!AnyFields)
9875 return false;
9876 if (Diagnose)
9877 S.Diag(MD->getParent()->getLocation(),
9878 diag::note_deleted_default_ctor_all_const)
9879 << !!ICI << MD->getParent() << /*not anonymous union*/0;
9880 return true;
9881 }
9882 return false;
9883}
9884
9885/// Determine whether a defaulted special member function should be defined as
9886/// deleted, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p11,
9887/// C++11 [class.copy]p23, and C++11 [class.dtor]p5.
9891 bool Diagnose) {
9892 if (MD->isInvalidDecl())
9893 return false;
9894 CXXRecordDecl *RD = MD->getParent();
9895 assert(!RD->isDependentType() && "do deletion after instantiation");
9896 if (!LangOpts.CPlusPlus || (!LangOpts.CPlusPlus11 && !RD->isLambda()) ||
9897 RD->isInvalidDecl())
9898 return false;
9899
9900 // C++11 [expr.lambda.prim]p19:
9901 // The closure type associated with a lambda-expression has a
9902 // deleted (8.4.3) default constructor and a deleted copy
9903 // assignment operator.
9904 // C++2a adds back these operators if the lambda has no lambda-capture.
9908 if (Diagnose)
9909 Diag(RD->getLocation(), diag::note_lambda_decl);
9910 return true;
9911 }
9912
9913 // C++11 [class.copy]p7, p18:
9914 // If the class definition declares a move constructor or move assignment
9915 // operator, an implicitly declared copy constructor or copy assignment
9916 // operator is defined as deleted.
9919 CXXMethodDecl *UserDeclaredMove = nullptr;
9920
9921 // In Microsoft mode up to MSVC 2013, a user-declared move only causes the
9922 // deletion of the corresponding copy operation, not both copy operations.
9923 // MSVC 2015 has adopted the standards conforming behavior.
9924 bool DeletesOnlyMatchingCopy =
9925 getLangOpts().MSVCCompat &&
9926 !getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015);
9927
9929 (!DeletesOnlyMatchingCopy ||
9931 if (!Diagnose) return true;
9932
9933 // Find any user-declared move constructor.
9934 for (auto *I : RD->ctors()) {
9935 if (I->isMoveConstructor()) {
9936 UserDeclaredMove = I;
9937 break;
9938 }
9939 }
9940 assert(UserDeclaredMove);
9941 } else if (RD->hasUserDeclaredMoveAssignment() &&
9942 (!DeletesOnlyMatchingCopy ||
9944 if (!Diagnose) return true;
9945
9946 // Find any user-declared move assignment operator.
9947 for (auto *I : RD->methods()) {
9948 if (I->isMoveAssignmentOperator()) {
9949 UserDeclaredMove = I;
9950 break;
9951 }
9952 }
9953 assert(UserDeclaredMove);
9954 }
9955
9956 if (UserDeclaredMove) {
9957 Diag(UserDeclaredMove->getLocation(),
9958 diag::note_deleted_copy_user_declared_move)
9959 << (CSM == CXXSpecialMemberKind::CopyAssignment) << RD
9960 << UserDeclaredMove->isMoveAssignmentOperator();
9961 return true;
9962 }
9963 }
9964
9965 // Do access control from the special member function
9966 ContextRAII MethodContext(*this, MD);
9967
9968 // C++11 [class.dtor]p5:
9969 // -- for a virtual destructor, lookup of the non-array deallocation function
9970 // results in an ambiguity or in a function that is deleted or inaccessible
9971 if (CSM == CXXSpecialMemberKind::Destructor && MD->isVirtual()) {
9972 FunctionDecl *OperatorDelete = nullptr;
9973 CanQualType DeallocType = Context.getCanonicalTagType(RD);
9974 DeclarationName Name =
9975 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
9979 if (FindDeallocationFunction(MD->getLocation(), MD->getParent(), Name,
9980 OperatorDelete, IDP,
9981 /*Diagnose=*/false)) {
9982 if (Diagnose)
9983 Diag(RD->getLocation(), diag::note_deleted_dtor_no_operator_delete);
9984 return true;
9985 }
9986 }
9987
9988 SpecialMemberDeletionInfo SMI(*this, MD, CSM, ICI, Diagnose);
9989
9990 // Per DR1611, do not consider virtual bases of constructors of abstract
9991 // classes, since we are not going to construct them.
9992 // Per DR1658, do not consider virtual bases of destructors of abstract
9993 // classes either.
9994 // Per DR2180, for assignment operators we only assign (and thus only
9995 // consider) direct bases.
9996 if (SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases
9997 : SMI.VisitPotentiallyConstructedBases))
9998 return true;
9999
10000 if (SMI.shouldDeleteForAllConstMembers())
10001 return true;
10002
10003 if (getLangOpts().CUDA) {
10004 // We should delete the special member in CUDA mode if target inference
10005 // failed.
10006 // For inherited constructors (non-null ICI), CSM may be passed so that MD
10007 // is treated as certain special member, which may not reflect what special
10008 // member MD really is. However inferTargetForImplicitSpecialMember
10009 // expects CSM to match MD, therefore recalculate CSM.
10010 assert(ICI || CSM == getSpecialMember(MD));
10011 auto RealCSM = CSM;
10012 if (ICI)
10013 RealCSM = getSpecialMember(MD);
10014
10015 return CUDA().inferTargetForImplicitSpecialMember(RD, RealCSM, MD,
10016 SMI.ConstArg, Diagnose);
10017 }
10018
10019 return false;
10020}
10021
10024 assert(DFK && "not a defaultable function");
10025 assert(FD->isDefaulted() && FD->isDeleted() && "not defaulted and deleted");
10026
10027 if (DFK.isSpecialMember()) {
10029 nullptr, /*Diagnose=*/true);
10030 } else {
10031 DefaultedComparisonAnalyzer(
10033 DFK.asComparison(), DefaultedComparisonAnalyzer::ExplainDeleted)
10034 .visit();
10035 }
10036}
10037
10038/// Perform lookup for a special member of the specified kind, and determine
10039/// whether it is trivial. If the triviality can be determined without the
10040/// lookup, skip it. This is intended for use when determining whether a
10041/// special member of a containing object is trivial, and thus does not ever
10042/// perform overload resolution for default constructors.
10043///
10044/// If \p Selected is not \c NULL, \c *Selected will be filled in with the
10045/// member that was most likely to be intended to be trivial, if any.
10046///
10047/// If \p ForCall is true, look at CXXRecord::HasTrivialSpecialMembersForCall to
10048/// determine whether the special member is trivial.
10050 CXXSpecialMemberKind CSM, unsigned Quals,
10051 bool ConstRHS, TrivialABIHandling TAH,
10052 CXXMethodDecl **Selected) {
10053 if (Selected)
10054 *Selected = nullptr;
10055
10056 switch (CSM) {
10058 llvm_unreachable("not a special member");
10059
10061 // C++11 [class.ctor]p5:
10062 // A default constructor is trivial if:
10063 // - all the [direct subobjects] have trivial default constructors
10064 //
10065 // Note, no overload resolution is performed in this case.
10067 return true;
10068
10069 if (Selected) {
10070 // If there's a default constructor which could have been trivial, dig it
10071 // out. Otherwise, if there's any user-provided default constructor, point
10072 // to that as an example of why there's not a trivial one.
10073 CXXConstructorDecl *DefCtor = nullptr;
10076 for (auto *CI : RD->ctors()) {
10077 if (!CI->isDefaultConstructor())
10078 continue;
10079 DefCtor = CI;
10080 if (!DefCtor->isUserProvided())
10081 break;
10082 }
10083
10084 *Selected = DefCtor;
10085 }
10086
10087 return false;
10088
10090 // C++11 [class.dtor]p5:
10091 // A destructor is trivial if:
10092 // - all the direct [subobjects] have trivial destructors
10093 if (RD->hasTrivialDestructor() ||
10096 return true;
10097
10098 if (Selected) {
10099 if (RD->needsImplicitDestructor())
10101 *Selected = RD->getDestructor();
10102 }
10103
10104 return false;
10105
10107 // C++11 [class.copy]p12:
10108 // A copy constructor is trivial if:
10109 // - the constructor selected to copy each direct [subobject] is trivial
10110 if (RD->hasTrivialCopyConstructor() ||
10113 if (Quals == Qualifiers::Const)
10114 // We must either select the trivial copy constructor or reach an
10115 // ambiguity; no need to actually perform overload resolution.
10116 return true;
10117 } else if (!Selected) {
10118 return false;
10119 }
10120 // In C++98, we are not supposed to perform overload resolution here, but we
10121 // treat that as a language defect, as suggested on cxx-abi-dev, to treat
10122 // cases like B as having a non-trivial copy constructor:
10123 // struct A { template<typename T> A(T&); };
10124 // struct B { mutable A a; };
10125 goto NeedOverloadResolution;
10126
10128 // C++11 [class.copy]p25:
10129 // A copy assignment operator is trivial if:
10130 // - the assignment operator selected to copy each direct [subobject] is
10131 // trivial
10132 if (RD->hasTrivialCopyAssignment()) {
10133 if (Quals == Qualifiers::Const)
10134 return true;
10135 } else if (!Selected) {
10136 return false;
10137 }
10138 // In C++98, we are not supposed to perform overload resolution here, but we
10139 // treat that as a language defect.
10140 goto NeedOverloadResolution;
10141
10144 NeedOverloadResolution:
10146 lookupCallFromSpecialMember(S, RD, CSM, Quals, ConstRHS);
10147
10148 // The standard doesn't describe how to behave if the lookup is ambiguous.
10149 // We treat it as not making the member non-trivial, just like the standard
10150 // mandates for the default constructor. This should rarely matter, because
10151 // the member will also be deleted.
10153 return true;
10154
10155 if (!SMOR.getMethod()) {
10156 assert(SMOR.getKind() ==
10158 return false;
10159 }
10160
10161 // We deliberately don't check if we found a deleted special member. We're
10162 // not supposed to!
10163 if (Selected)
10164 *Selected = SMOR.getMethod();
10165
10169 return SMOR.getMethod()->isTrivialForCall();
10170 return SMOR.getMethod()->isTrivial();
10171 }
10172
10173 llvm_unreachable("unknown special method kind");
10174}
10175
10177 for (auto *CI : RD->ctors())
10178 if (!CI->isImplicit())
10179 return CI;
10180
10181 // Look for constructor templates.
10183 for (tmpl_iter TI(RD->decls_begin()), TE(RD->decls_end()); TI != TE; ++TI) {
10184 if (CXXConstructorDecl *CD =
10185 dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))
10186 return CD;
10187 }
10188
10189 return nullptr;
10190}
10191
10192/// The kind of subobject we are checking for triviality. The values of this
10193/// enumeration are used in diagnostics.
10195 /// The subobject is a base class.
10197 /// The subobject is a non-static data member.
10199 /// The object is actually the complete object.
10201};
10202
10203/// Check whether the special member selected for a given type would be trivial.
10205 QualType SubType, bool ConstRHS,
10208 TrivialABIHandling TAH, bool Diagnose) {
10209 CXXRecordDecl *SubRD = SubType->getAsCXXRecordDecl();
10210 if (!SubRD)
10211 return true;
10212
10213 CXXMethodDecl *Selected;
10214 if (findTrivialSpecialMember(S, SubRD, CSM, SubType.getCVRQualifiers(),
10215 ConstRHS, TAH, Diagnose ? &Selected : nullptr))
10216 return true;
10217
10218 if (Diagnose) {
10219 if (ConstRHS)
10220 SubType.addConst();
10221
10222 if (!Selected && CSM == CXXSpecialMemberKind::DefaultConstructor) {
10223 S.Diag(SubobjLoc, diag::note_nontrivial_no_def_ctor)
10224 << Kind << SubType.getUnqualifiedType();
10226 S.Diag(CD->getLocation(), diag::note_user_declared_ctor);
10227 } else if (!Selected)
10228 S.Diag(SubobjLoc, diag::note_nontrivial_no_copy)
10229 << Kind << SubType.getUnqualifiedType() << CSM << SubType;
10230 else if (Selected->isUserProvided()) {
10231 if (Kind == TSK_CompleteObject)
10232 S.Diag(Selected->getLocation(), diag::note_nontrivial_user_provided)
10233 << Kind << SubType.getUnqualifiedType() << CSM;
10234 else {
10235 S.Diag(SubobjLoc, diag::note_nontrivial_user_provided)
10236 << Kind << SubType.getUnqualifiedType() << CSM;
10237 S.Diag(Selected->getLocation(), diag::note_declared_at);
10238 }
10239 } else {
10240 if (Kind != TSK_CompleteObject)
10241 S.Diag(SubobjLoc, diag::note_nontrivial_subobject)
10242 << Kind << SubType.getUnqualifiedType() << CSM;
10243
10244 // Explain why the defaulted or deleted special member isn't trivial.
10245 S.SpecialMemberIsTrivial(Selected, CSM,
10247 }
10248 }
10249
10250 return false;
10251}
10252
10253/// Check whether the members of a class type allow a special member to be
10254/// trivial.
10256 CXXSpecialMemberKind CSM, bool ConstArg,
10257 TrivialABIHandling TAH, bool Diagnose) {
10258 for (const auto *FI : RD->fields()) {
10259 if (FI->isInvalidDecl() || FI->isUnnamedBitField())
10260 continue;
10261
10262 QualType FieldType = S.Context.getBaseElementType(FI->getType());
10263
10264 // Pretend anonymous struct or union members are members of this class.
10265 if (FI->isAnonymousStructOrUnion()) {
10266 if (!checkTrivialClassMembers(S, FieldType->getAsCXXRecordDecl(),
10267 CSM, ConstArg, TAH, Diagnose))
10268 return false;
10269 continue;
10270 }
10271
10272 // C++11 [class.ctor]p5:
10273 // A default constructor is trivial if [...]
10274 // -- no non-static data member of its class has a
10275 // brace-or-equal-initializer
10277 FI->hasInClassInitializer()) {
10278 if (Diagnose)
10279 S.Diag(FI->getLocation(), diag::note_nontrivial_default_member_init)
10280 << FI;
10281 return false;
10282 }
10283
10284 // Objective C ARC 4.3.5:
10285 // [...] nontrivally ownership-qualified types are [...] not trivially
10286 // default constructible, copy constructible, move constructible, copy
10287 // assignable, move assignable, or destructible [...]
10288 if (FieldType.hasNonTrivialObjCLifetime()) {
10289 if (Diagnose)
10290 S.Diag(FI->getLocation(), diag::note_nontrivial_objc_ownership)
10291 << RD << FieldType.getObjCLifetime();
10292 return false;
10293 }
10294
10295 bool ConstRHS = ConstArg && !FI->isMutable();
10296 if (!checkTrivialSubobjectCall(S, FI->getLocation(), FieldType, ConstRHS,
10297 CSM, TSK_Field, TAH, Diagnose))
10298 return false;
10299 }
10300
10301 return true;
10302}
10303
10306 CanQualType Ty = Context.getCanonicalTagType(RD);
10307
10308 bool ConstArg = (CSM == CXXSpecialMemberKind::CopyConstructor ||
10310 checkTrivialSubobjectCall(*this, RD->getLocation(), Ty, ConstArg, CSM,
10313 /*Diagnose*/ true);
10314}
10315
10317 TrivialABIHandling TAH, bool Diagnose) {
10318 assert(!MD->isUserProvided() && CSM != CXXSpecialMemberKind::Invalid &&
10319 "not special enough");
10320
10321 CXXRecordDecl *RD = MD->getParent();
10322
10323 bool ConstArg = false;
10324
10325 // C++11 [class.copy]p12, p25: [DR1593]
10326 // A [special member] is trivial if [...] its parameter-type-list is
10327 // equivalent to the parameter-type-list of an implicit declaration [...]
10328 switch (CSM) {
10331 // Trivial default constructors and destructors cannot have parameters.
10332 break;
10333
10336 const ParmVarDecl *Param0 = MD->getNonObjectParameter(0);
10337 const ReferenceType *RT = Param0->getType()->getAs<ReferenceType>();
10338
10339 // When ClangABICompat14 is true, CXX copy constructors will only be trivial
10340 // if they are not user-provided and their parameter-type-list is equivalent
10341 // to the parameter-type-list of an implicit declaration. This maintains the
10342 // behavior before dr2171 was implemented.
10343 //
10344 // Otherwise, if ClangABICompat14 is false, All copy constructors can be
10345 // trivial, if they are not user-provided, regardless of the qualifiers on
10346 // the reference type.
10347 const bool ClangABICompat14 = Context.getLangOpts().getClangABICompat() <=
10348 LangOptions::ClangABI::Ver14;
10349 if (!RT ||
10351 ClangABICompat14)) {
10352 if (Diagnose)
10353 Diag(Param0->getLocation(), diag::note_nontrivial_param_type)
10354 << Param0->getSourceRange() << Param0->getType()
10355 << Context.getLValueReferenceType(
10356 Context.getCanonicalTagType(RD).withConst());
10357 return false;
10358 }
10359
10360 ConstArg = RT->getPointeeType().isConstQualified();
10361 break;
10362 }
10363
10366 // Trivial move operations always have non-cv-qualified parameters.
10367 const ParmVarDecl *Param0 = MD->getNonObjectParameter(0);
10368 const RValueReferenceType *RT =
10369 Param0->getType()->getAs<RValueReferenceType>();
10370 if (!RT || RT->getPointeeType().getCVRQualifiers()) {
10371 if (Diagnose)
10372 Diag(Param0->getLocation(), diag::note_nontrivial_param_type)
10373 << Param0->getSourceRange() << Param0->getType()
10374 << Context.getRValueReferenceType(Context.getCanonicalTagType(RD));
10375 return false;
10376 }
10377 break;
10378 }
10379
10381 llvm_unreachable("not a special member");
10382 }
10383
10384 if (MD->getMinRequiredArguments() < MD->getNumParams()) {
10385 if (Diagnose)
10387 diag::note_nontrivial_default_arg)
10389 return false;
10390 }
10391 if (MD->isVariadic()) {
10392 if (Diagnose)
10393 Diag(MD->getLocation(), diag::note_nontrivial_variadic);
10394 return false;
10395 }
10396
10397 // C++11 [class.ctor]p5, C++11 [class.dtor]p5:
10398 // A copy/move [constructor or assignment operator] is trivial if
10399 // -- the [member] selected to copy/move each direct base class subobject
10400 // is trivial
10401 //
10402 // C++11 [class.copy]p12, C++11 [class.copy]p25:
10403 // A [default constructor or destructor] is trivial if
10404 // -- all the direct base classes have trivial [default constructors or
10405 // destructors]
10406 for (const auto &BI : RD->bases())
10407 if (!checkTrivialSubobjectCall(*this, BI.getBeginLoc(), BI.getType(),
10408 ConstArg, CSM, TSK_BaseClass, TAH, Diagnose))
10409 return false;
10410
10411 // C++11 [class.ctor]p5, C++11 [class.dtor]p5:
10412 // A copy/move [constructor or assignment operator] for a class X is
10413 // trivial if
10414 // -- for each non-static data member of X that is of class type (or array
10415 // thereof), the constructor selected to copy/move that member is
10416 // trivial
10417 //
10418 // C++11 [class.copy]p12, C++11 [class.copy]p25:
10419 // A [default constructor or destructor] is trivial if
10420 // -- for all of the non-static data members of its class that are of class
10421 // type (or array thereof), each such class has a trivial [default
10422 // constructor or destructor]
10423 if (!checkTrivialClassMembers(*this, RD, CSM, ConstArg, TAH, Diagnose))
10424 return false;
10425
10426 // C++11 [class.dtor]p5:
10427 // A destructor is trivial if [...]
10428 // -- the destructor is not virtual
10429 if (CSM == CXXSpecialMemberKind::Destructor && MD->isVirtual()) {
10430 if (Diagnose)
10431 Diag(MD->getLocation(), diag::note_nontrivial_virtual_dtor) << RD;
10432 return false;
10433 }
10434
10435 // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
10436 // A [special member] for class X is trivial if [...]
10437 // -- class X has no virtual functions and no virtual base classes
10439 MD->getParent()->isDynamicClass()) {
10440 if (!Diagnose)
10441 return false;
10442
10443 if (RD->getNumVBases()) {
10444 // Check for virtual bases. We already know that the corresponding
10445 // member in all bases is trivial, so vbases must all be direct.
10446 CXXBaseSpecifier &BS = *RD->vbases_begin();
10447 assert(BS.isVirtual());
10448 Diag(BS.getBeginLoc(), diag::note_nontrivial_has_virtual) << RD << 1;
10449 return false;
10450 }
10451
10452 // Must have a virtual method.
10453 for (const auto *MI : RD->methods()) {
10454 if (MI->isVirtual()) {
10455 SourceLocation MLoc = MI->getBeginLoc();
10456 Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;
10457 return false;
10458 }
10459 }
10460
10461 llvm_unreachable("dynamic class with no vbases and no virtual functions");
10462 }
10463
10464 // Looks like it's trivial!
10465 return true;
10466}
10467
10468namespace {
10469struct FindHiddenVirtualMethod {
10470 Sema *S;
10472 llvm::SmallPtrSet<const CXXMethodDecl *, 8> OverridenAndUsingBaseMethods;
10473 SmallVector<CXXMethodDecl *, 8> OverloadedMethods;
10474
10475private:
10476 /// Check whether any most overridden method from MD in Methods
10477 static bool CheckMostOverridenMethods(
10478 const CXXMethodDecl *MD,
10479 const llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {
10480 if (MD->size_overridden_methods() == 0)
10481 return Methods.count(MD->getCanonicalDecl());
10482 for (const CXXMethodDecl *O : MD->overridden_methods())
10483 if (CheckMostOverridenMethods(O, Methods))
10484 return true;
10485 return false;
10486 }
10487
10488public:
10489 /// Member lookup function that determines whether a given C++
10490 /// method overloads virtual methods in a base class without overriding any,
10491 /// to be used with CXXRecordDecl::lookupInBases().
10492 bool operator()(const CXXBaseSpecifier *Specifier, CXXBasePath &Path) {
10493 auto *BaseRecord = Specifier->getType()->castAsRecordDecl();
10494 DeclarationName Name = Method->getDeclName();
10495 assert(Name.getNameKind() == DeclarationName::Identifier);
10496
10497 bool foundSameNameMethod = false;
10498 SmallVector<CXXMethodDecl *, 8> overloadedMethods;
10499 for (Path.Decls = BaseRecord->lookup(Name).begin();
10500 Path.Decls != DeclContext::lookup_iterator(); ++Path.Decls) {
10501 NamedDecl *D = *Path.Decls;
10502 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
10503 MD = MD->getCanonicalDecl();
10504 foundSameNameMethod = true;
10505 // Interested only in hidden virtual methods.
10506 if (!MD->isVirtual())
10507 continue;
10508 // If the method we are checking overrides a method from its base
10509 // don't warn about the other overloaded methods. Clang deviates from
10510 // GCC by only diagnosing overloads of inherited virtual functions that
10511 // do not override any other virtual functions in the base. GCC's
10512 // -Woverloaded-virtual diagnoses any derived function hiding a virtual
10513 // function from a base class. These cases may be better served by a
10514 // warning (not specific to virtual functions) on call sites when the
10515 // call would select a different function from the base class, were it
10516 // visible.
10517 // See FIXME in test/SemaCXX/warn-overload-virtual.cpp for an example.
10518 if (!S->IsOverload(Method, MD, false))
10519 return true;
10520 // Collect the overload only if its hidden.
10521 if (!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))
10522 overloadedMethods.push_back(MD);
10523 }
10524 }
10525
10526 if (foundSameNameMethod)
10527 OverloadedMethods.append(overloadedMethods.begin(),
10528 overloadedMethods.end());
10529 return foundSameNameMethod;
10530 }
10531};
10532} // end anonymous namespace
10533
10534/// Add the most overridden methods from MD to Methods
10536 llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {
10537 if (MD->size_overridden_methods() == 0)
10538 Methods.insert(MD->getCanonicalDecl());
10539 else
10540 for (const CXXMethodDecl *O : MD->overridden_methods())
10541 AddMostOverridenMethods(O, Methods);
10542}
10543
10545 SmallVectorImpl<CXXMethodDecl*> &OverloadedMethods) {
10546 if (!MD->getDeclName().isIdentifier())
10547 return;
10548
10549 CXXBasePaths Paths(/*FindAmbiguities=*/true, // true to look in all bases.
10550 /*bool RecordPaths=*/false,
10551 /*bool DetectVirtual=*/false);
10552 FindHiddenVirtualMethod FHVM;
10553 FHVM.Method = MD;
10554 FHVM.S = this;
10555
10556 // Keep the base methods that were overridden or introduced in the subclass
10557 // by 'using' in a set. A base method not in this set is hidden.
10558 CXXRecordDecl *DC = MD->getParent();
10560 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; ++I) {
10561 NamedDecl *ND = *I;
10562 if (UsingShadowDecl *shad = dyn_cast<UsingShadowDecl>(*I))
10563 ND = shad->getTargetDecl();
10564 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND))
10565 AddMostOverridenMethods(MD, FHVM.OverridenAndUsingBaseMethods);
10566 }
10567
10568 if (DC->lookupInBases(FHVM, Paths))
10569 OverloadedMethods = FHVM.OverloadedMethods;
10570}
10571
10573 SmallVectorImpl<CXXMethodDecl*> &OverloadedMethods) {
10574 for (unsigned i = 0, e = OverloadedMethods.size(); i != e; ++i) {
10575 CXXMethodDecl *overloadedMD = OverloadedMethods[i];
10577 diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
10578 HandleFunctionTypeMismatch(PD, MD->getType(), overloadedMD->getType());
10579 Diag(overloadedMD->getLocation(), PD);
10580 }
10581}
10582
10584 if (MD->isInvalidDecl())
10585 return;
10586
10587 if (Diags.isIgnored(diag::warn_overloaded_virtual, MD->getLocation()))
10588 return;
10589
10590 SmallVector<CXXMethodDecl *, 8> OverloadedMethods;
10591 FindHiddenVirtualMethods(MD, OverloadedMethods);
10592 if (!OverloadedMethods.empty()) {
10593 Diag(MD->getLocation(), diag::warn_overloaded_virtual)
10594 << MD << (OverloadedMethods.size() > 1);
10595
10596 NoteHiddenVirtualMethods(MD, OverloadedMethods);
10597 }
10598}
10599
10601 auto PrintDiagAndRemoveAttr = [&](unsigned N) {
10602 // No diagnostics if this is a template instantiation.
10604 Diag(RD.getAttr<TrivialABIAttr>()->getLocation(),
10605 diag::ext_cannot_use_trivial_abi) << &RD;
10606 Diag(RD.getAttr<TrivialABIAttr>()->getLocation(),
10607 diag::note_cannot_use_trivial_abi_reason) << &RD << N;
10608 }
10609 RD.dropAttr<TrivialABIAttr>();
10610 };
10611
10612 // Ill-formed if the struct has virtual functions.
10613 if (RD.isPolymorphic()) {
10614 PrintDiagAndRemoveAttr(1);
10615 return;
10616 }
10617
10618 for (const auto &B : RD.bases()) {
10619 // Ill-formed if the base class is non-trivial for the purpose of calls or a
10620 // virtual base.
10621 if (!B.getType()->isDependentType() &&
10622 !B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {
10623 PrintDiagAndRemoveAttr(2);
10624 return;
10625 }
10626
10627 if (B.isVirtual()) {
10628 PrintDiagAndRemoveAttr(3);
10629 return;
10630 }
10631 }
10632
10633 for (const auto *FD : RD.fields()) {
10634 // Ill-formed if the field is an ObjectiveC pointer or of a type that is
10635 // non-trivial for the purpose of calls.
10636 QualType FT = FD->getType();
10638 PrintDiagAndRemoveAttr(4);
10639 return;
10640 }
10641
10642 // Ill-formed if the field is an address-discriminated value.
10644 PrintDiagAndRemoveAttr(6);
10645 return;
10646 }
10647
10648 if (const auto *RT =
10649 FT->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>())
10650 if (!RT->isDependentType() &&
10651 !cast<CXXRecordDecl>(RT->getDecl()->getDefinitionOrSelf())
10652 ->canPassInRegisters()) {
10653 PrintDiagAndRemoveAttr(5);
10654 return;
10655 }
10656 }
10657
10659 return;
10660
10661 // Ill-formed if the copy and move constructors are deleted.
10662 auto HasNonDeletedCopyOrMoveConstructor = [&]() {
10663 // If the type is dependent, then assume it might have
10664 // implicit copy or move ctor because we won't know yet at this point.
10665 if (RD.isDependentType())
10666 return true;
10669 return true;
10672 return true;
10673 for (const CXXConstructorDecl *CD : RD.ctors())
10674 if (CD->isCopyOrMoveConstructor() && !CD->isDeleted())
10675 return true;
10676 return false;
10677 };
10678
10679 if (!HasNonDeletedCopyOrMoveConstructor()) {
10680 PrintDiagAndRemoveAttr(0);
10681 return;
10682 }
10683}
10684
10686 CXXRecordDecl &RD) {
10687 if (RequireCompleteType(RD.getLocation(), Context.getCanonicalTagType(&RD),
10688 diag::err_incomplete_type_vtable_pointer_auth))
10689 return;
10690
10691 const CXXRecordDecl *PrimaryBase = &RD;
10692 if (PrimaryBase->hasAnyDependentBases())
10693 return;
10694
10695 while (1) {
10696 assert(PrimaryBase);
10697 const CXXRecordDecl *Base = nullptr;
10698 for (const CXXBaseSpecifier &BasePtr : PrimaryBase->bases()) {
10699 if (!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())
10700 continue;
10701 Base = BasePtr.getType()->getAsCXXRecordDecl();
10702 break;
10703 }
10704 if (!Base || Base == PrimaryBase || !Base->isPolymorphic())
10705 break;
10706 Diag(RD.getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10707 diag::err_non_top_level_vtable_pointer_auth)
10708 << &RD << Base;
10709 PrimaryBase = Base;
10710 }
10711
10712 if (!RD.isPolymorphic())
10713 Diag(RD.getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10714 diag::err_non_polymorphic_vtable_pointer_auth)
10715 << &RD;
10716}
10717
10720 SourceLocation RBrac, const ParsedAttributesView &AttrList) {
10721 if (!TagDecl)
10722 return;
10723
10725
10726 for (const ParsedAttr &AL : AttrList) {
10727 if (AL.getKind() != ParsedAttr::AT_Visibility)
10728 continue;
10729 AL.setInvalid();
10730 Diag(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;
10731 }
10732
10733 ActOnFields(S, RLoc, TagDecl,
10735 // strict aliasing violation!
10736 reinterpret_cast<Decl **>(FieldCollector->getCurFields()),
10737 FieldCollector->getCurNumFields()),
10738 LBrac, RBrac, AttrList);
10739
10741}
10742
10743/// Find the equality comparison functions that should be implicitly declared
10744/// in a given class definition, per C++2a [class.compare.default]p3.
10746 ASTContext &Ctx, CXXRecordDecl *RD,
10748 DeclarationName EqEq = Ctx.DeclarationNames.getCXXOperatorName(OO_EqualEqual);
10749 if (!RD->lookup(EqEq).empty())
10750 // Member operator== explicitly declared: no implicit operator==s.
10751 return;
10752
10753 // Traverse friends looking for an '==' or a '<=>'.
10754 for (FriendDecl *Friend : RD->friends()) {
10755 FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(Friend->getFriendDecl());
10756 if (!FD) continue;
10757
10758 if (FD->getOverloadedOperator() == OO_EqualEqual) {
10759 // Friend operator== explicitly declared: no implicit operator==s.
10760 Spaceships.clear();
10761 return;
10762 }
10763
10764 if (FD->getOverloadedOperator() == OO_Spaceship &&
10766 Spaceships.push_back(FD);
10767 }
10768
10769 // Look for members named 'operator<=>'.
10770 DeclarationName Cmp = Ctx.DeclarationNames.getCXXOperatorName(OO_Spaceship);
10771 for (NamedDecl *ND : RD->lookup(Cmp)) {
10772 // Note that we could find a non-function here (either a function template
10773 // or a using-declaration). Neither case results in an implicit
10774 // 'operator=='.
10775 if (auto *FD = dyn_cast<FunctionDecl>(ND))
10776 if (FD->isExplicitlyDefaulted())
10777 Spaceships.push_back(FD);
10778 }
10779}
10780
10782 // Don't add implicit special members to templated classes.
10783 // FIXME: This means unqualified lookups for 'operator=' within a class
10784 // template don't work properly.
10785 if (!ClassDecl->isDependentType()) {
10786 if (ClassDecl->needsImplicitDefaultConstructor()) {
10787 ++getASTContext().NumImplicitDefaultConstructors;
10788
10789 if (ClassDecl->hasInheritedConstructor())
10791 }
10792
10793 if (ClassDecl->needsImplicitCopyConstructor()) {
10794 ++getASTContext().NumImplicitCopyConstructors;
10795
10796 // If the properties or semantics of the copy constructor couldn't be
10797 // determined while the class was being declared, force a declaration
10798 // of it now.
10800 ClassDecl->hasInheritedConstructor())
10802 // For the MS ABI we need to know whether the copy ctor is deleted. A
10803 // prerequisite for deleting the implicit copy ctor is that the class has
10804 // a move ctor or move assignment that is either user-declared or whose
10805 // semantics are inherited from a subobject. FIXME: We should provide a
10806 // more direct way for CodeGen to ask whether the constructor was deleted.
10807 else if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10808 (ClassDecl->hasUserDeclaredMoveConstructor() ||
10810 ClassDecl->hasUserDeclaredMoveAssignment() ||
10813 }
10814
10815 if (getLangOpts().CPlusPlus11 &&
10816 ClassDecl->needsImplicitMoveConstructor()) {
10817 ++getASTContext().NumImplicitMoveConstructors;
10818
10820 ClassDecl->hasInheritedConstructor())
10822 }
10823
10824 if (ClassDecl->needsImplicitCopyAssignment()) {
10825 ++getASTContext().NumImplicitCopyAssignmentOperators;
10826
10827 // If we have a dynamic class, then the copy assignment operator may be
10828 // virtual, so we have to declare it immediately. This ensures that, e.g.,
10829 // it shows up in the right place in the vtable and that we diagnose
10830 // problems with the implicit exception specification.
10831 if (ClassDecl->isDynamicClass() ||
10833 ClassDecl->hasInheritedAssignment())
10835 }
10836
10837 if (getLangOpts().CPlusPlus11 && ClassDecl->needsImplicitMoveAssignment()) {
10838 ++getASTContext().NumImplicitMoveAssignmentOperators;
10839
10840 // Likewise for the move assignment operator.
10841 if (ClassDecl->isDynamicClass() ||
10843 ClassDecl->hasInheritedAssignment())
10845 }
10846
10847 if (ClassDecl->needsImplicitDestructor()) {
10848 ++getASTContext().NumImplicitDestructors;
10849
10850 // If we have a dynamic class, then the destructor may be virtual, so we
10851 // have to declare the destructor immediately. This ensures that, e.g., it
10852 // shows up in the right place in the vtable and that we diagnose problems
10853 // with the implicit exception specification.
10854 if (ClassDecl->isDynamicClass() ||
10856 DeclareImplicitDestructor(ClassDecl);
10857 }
10858 }
10859
10860 // C++2a [class.compare.default]p3:
10861 // If the member-specification does not explicitly declare any member or
10862 // friend named operator==, an == operator function is declared implicitly
10863 // for each defaulted three-way comparison operator function defined in
10864 // the member-specification
10865 // FIXME: Consider doing this lazily.
10866 // We do this during the initial parse for a class template, not during
10867 // instantiation, so that we can handle unqualified lookups for 'operator=='
10868 // when parsing the template.
10870 llvm::SmallVector<FunctionDecl *, 4> DefaultedSpaceships;
10872 DefaultedSpaceships);
10873 for (auto *FD : DefaultedSpaceships)
10874 DeclareImplicitEqualityComparison(ClassDecl, FD);
10875 }
10876}
10877
10878unsigned
10880 llvm::function_ref<Scope *()> EnterScope) {
10881 if (!D)
10882 return 0;
10884
10885 // In order to get name lookup right, reenter template scopes in order from
10886 // outermost to innermost.
10888 DeclContext *LookupDC = dyn_cast<DeclContext>(D);
10889
10890 if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
10891 for (unsigned i = 0; i < DD->getNumTemplateParameterLists(); ++i)
10892 ParameterLists.push_back(DD->getTemplateParameterList(i));
10893
10894 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
10895 if (FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate())
10896 ParameterLists.push_back(FTD->getTemplateParameters());
10897 } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
10898 LookupDC = VD->getDeclContext();
10899
10901 ParameterLists.push_back(VTD->getTemplateParameters());
10902 else if (auto *PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(D))
10903 ParameterLists.push_back(PSD->getTemplateParameters());
10904 }
10905 } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10906 for (unsigned i = 0; i < TD->getNumTemplateParameterLists(); ++i)
10907 ParameterLists.push_back(TD->getTemplateParameterList(i));
10908
10909 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TD)) {
10911 ParameterLists.push_back(CTD->getTemplateParameters());
10912 else if (auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
10913 ParameterLists.push_back(PSD->getTemplateParameters());
10914 }
10915 }
10916 // FIXME: Alias declarations and concepts.
10917
10918 unsigned Count = 0;
10919 Scope *InnermostTemplateScope = nullptr;
10920 for (TemplateParameterList *Params : ParameterLists) {
10921 // Ignore explicit specializations; they don't contribute to the template
10922 // depth.
10923 if (Params->size() == 0)
10924 continue;
10925
10926 InnermostTemplateScope = EnterScope();
10927 for (NamedDecl *Param : *Params) {
10928 if (Param->getDeclName()) {
10929 InnermostTemplateScope->AddDecl(Param);
10930 IdResolver.AddDecl(Param);
10931 }
10932 }
10933 ++Count;
10934 }
10935
10936 // Associate the new template scopes with the corresponding entities.
10937 if (InnermostTemplateScope) {
10938 assert(LookupDC && "no enclosing DeclContext for template lookup");
10939 EnterTemplatedContext(InnermostTemplateScope, LookupDC);
10940 }
10941
10942 return Count;
10943}
10944
10946 if (!RecordD) return;
10947 AdjustDeclIfTemplate(RecordD);
10950}
10951
10953 if (!RecordD) return;
10955}
10956
10958 if (!Param)
10959 return;
10960
10961 S->AddDecl(Param);
10962 if (Param->getDeclName())
10963 IdResolver.AddDecl(Param);
10964}
10965
10968
10969/// ActOnDelayedCXXMethodParameter - We've already started a delayed
10970/// C++ method declaration. We're (re-)introducing the given
10971/// function parameter into scope for use in parsing later parts of
10972/// the method declaration. For example, we could see an
10973/// ActOnParamDefaultArgument event for this parameter.
10975 if (!ParamD)
10976 return;
10977
10978 ParmVarDecl *Param = cast<ParmVarDecl>(ParamD);
10979
10980 S->AddDecl(Param);
10981 if (Param->getDeclName())
10982 IdResolver.AddDecl(Param);
10983}
10984
10986 if (!MethodD)
10987 return;
10988
10989 AdjustDeclIfTemplate(MethodD);
10990
10992
10993 // Now that we have our default arguments, check the constructor
10994 // again. It could produce additional diagnostics or affect whether
10995 // the class has implicitly-declared destructors, among other
10996 // things.
10997 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Method))
10999
11000 // Check the default arguments, which we may have added.
11001 if (!Method->isInvalidDecl())
11003}
11004
11005// Emit the given diagnostic for each non-address-space qualifier.
11006// Common part of CheckConstructorDeclarator and CheckDestructorDeclarator.
11007static void checkMethodTypeQualifiers(Sema &S, Declarator &D, unsigned DiagID) {
11009 if (FTI.hasMethodTypeQualifiers() && !D.isInvalidType()) {
11010 bool DiagOccured = false;
11012 [DiagID, &S, &DiagOccured](DeclSpec::TQ, StringRef QualName,
11013 SourceLocation SL) {
11014 // This diagnostic should be emitted on any qualifier except an addr
11015 // space qualifier. However, forEachQualifier currently doesn't visit
11016 // addr space qualifiers, so there's no way to write this condition
11017 // right now; we just diagnose on everything.
11018 S.Diag(SL, DiagID) << QualName << SourceRange(SL);
11019 DiagOccured = true;
11020 });
11021 if (DiagOccured)
11022 D.setInvalidType();
11023 }
11024}
11025
11027 unsigned Kind) {
11028 if (D.isInvalidType() || D.getNumTypeObjects() <= 1)
11029 return;
11030
11032 if (Chunk.Kind == DeclaratorChunk::Paren ||
11034 return;
11035
11036 SourceLocation PointerLoc = Chunk.getSourceRange().getBegin();
11037 S.Diag(PointerLoc, diag::err_invalid_ctor_dtor_decl)
11038 << Kind << Chunk.getSourceRange();
11039 D.setInvalidType();
11040}
11041
11043 StorageClass &SC) {
11044 bool isVirtual = D.getDeclSpec().isVirtualSpecified();
11045
11046 // C++ [class.ctor]p3:
11047 // A constructor shall not be virtual (10.3) or static (9.4). A
11048 // constructor can be invoked for a const, volatile or const
11049 // volatile object. A constructor shall not be declared const,
11050 // volatile, or const volatile (9.3.2).
11051 if (isVirtual) {
11052 if (!D.isInvalidType())
11053 Diag(D.getIdentifierLoc(), diag::err_constructor_cannot_be)
11054 << "virtual" << SourceRange(D.getDeclSpec().getVirtualSpecLoc())
11056 D.setInvalidType();
11057 }
11058 if (SC == SC_Static) {
11059 if (!D.isInvalidType())
11060 Diag(D.getIdentifierLoc(), diag::err_constructor_cannot_be)
11061 << "static" << SourceRange(D.getDeclSpec().getStorageClassSpecLoc())
11063 D.setInvalidType();
11064 SC = SC_None;
11065 }
11066
11067 if (unsigned TypeQuals = D.getDeclSpec().getTypeQualifiers()) {
11069 diag::err_constructor_return_type, TypeQuals, SourceLocation(),
11073 D.setInvalidType();
11074 }
11075
11076 checkMethodTypeQualifiers(*this, D, diag::err_invalid_qualified_constructor);
11077 diagnoseInvalidDeclaratorChunks(*this, D, /*constructor*/ 0);
11078
11079 // C++0x [class.ctor]p4:
11080 // A constructor shall not be declared with a ref-qualifier.
11082 if (FTI.hasRefQualifier()) {
11083 Diag(FTI.getRefQualifierLoc(), diag::err_ref_qualifier_constructor)
11086 D.setInvalidType();
11087 }
11088
11089 // Rebuild the function type "R" without any type qualifiers (in
11090 // case any of the errors above fired) and with "void" as the
11091 // return type, since constructors don't have return types.
11092 const FunctionProtoType *Proto = R->castAs<FunctionProtoType>();
11093 if (Proto->getReturnType() == Context.VoidTy && !D.isInvalidType())
11094 return R;
11095
11097 EPI.TypeQuals = Qualifiers();
11098 EPI.RefQualifier = RQ_None;
11099
11100 return Context.getFunctionType(Context.VoidTy, Proto->getParamTypes(), EPI);
11101}
11102
11104 CXXRecordDecl *ClassDecl
11105 = dyn_cast<CXXRecordDecl>(Constructor->getDeclContext());
11106 if (!ClassDecl)
11107 return Constructor->setInvalidDecl();
11108
11109 // C++ [class.copy]p3:
11110 // A declaration of a constructor for a class X is ill-formed if
11111 // its first parameter is of type (optionally cv-qualified) X and
11112 // either there are no other parameters or else all other
11113 // parameters have default arguments.
11114 if (!Constructor->isInvalidDecl() &&
11115 Constructor->hasOneParamOrDefaultArgs() &&
11116 !Constructor->isFunctionTemplateSpecialization()) {
11117 CanQualType ParamType =
11118 Constructor->getParamDecl(0)->getType()->getCanonicalTypeUnqualified();
11119 CanQualType ClassTy = Context.getCanonicalTagType(ClassDecl);
11120 if (ParamType == ClassTy) {
11121 SourceLocation ParamLoc = Constructor->getParamDecl(0)->getLocation();
11122 const char *ConstRef
11123 = Constructor->getParamDecl(0)->getIdentifier() ? "const &"
11124 : " const &";
11125 Diag(ParamLoc, diag::err_constructor_byvalue_arg)
11126 << FixItHint::CreateInsertion(ParamLoc, ConstRef);
11127
11128 // FIXME: Rather that making the constructor invalid, we should endeavor
11129 // to fix the type.
11130 Constructor->setInvalidDecl();
11131 }
11132 }
11133}
11134
11136 CXXRecordDecl *RD = Destructor->getParent();
11137
11138 if (!Destructor->getOperatorDelete() && Destructor->isVirtual()) {
11139 SourceLocation Loc;
11140
11141 if (!Destructor->isImplicit())
11142 Loc = Destructor->getLocation();
11143 else
11144 Loc = RD->getLocation();
11145
11146 DeclarationName Name =
11147 Context.DeclarationNames.getCXXOperatorName(OO_Delete);
11148 // If we have a virtual destructor, look up the deallocation function
11150 Loc, RD, /*Diagnose=*/true, /*LookForGlobal=*/false, Name)) {
11151 Expr *ThisArg = nullptr;
11152
11153 // If the notional 'delete this' expression requires a non-trivial
11154 // conversion from 'this' to the type of a destroying operator delete's
11155 // first parameter, perform that conversion now.
11156 if (OperatorDelete->isDestroyingOperatorDelete()) {
11157 unsigned AddressParamIndex = 0;
11158 if (OperatorDelete->isTypeAwareOperatorNewOrDelete())
11159 ++AddressParamIndex;
11160 QualType ParamType =
11161 OperatorDelete->getParamDecl(AddressParamIndex)->getType();
11162 if (!declaresSameEntity(ParamType->getAsCXXRecordDecl(), RD)) {
11163 // C++ [class.dtor]p13:
11164 // ... as if for the expression 'delete this' appearing in a
11165 // non-virtual destructor of the destructor's class.
11166 ContextRAII SwitchContext(*this, Destructor);
11168 OperatorDelete->getParamDecl(AddressParamIndex)->getLocation());
11169 assert(!This.isInvalid() && "couldn't form 'this' expr in dtor?");
11170 This = PerformImplicitConversion(This.get(), ParamType,
11172 if (This.isInvalid()) {
11173 // FIXME: Register this as a context note so that it comes out
11174 // in the right order.
11175 Diag(Loc, diag::note_implicit_delete_this_in_destructor_here);
11176 return true;
11177 }
11178 ThisArg = This.get();
11179 }
11180 }
11181
11182 DiagnoseUseOfDecl(OperatorDelete, Loc);
11183 MarkFunctionReferenced(Loc, OperatorDelete);
11184 Destructor->setOperatorDelete(OperatorDelete, ThisArg);
11185
11186 if (isa<CXXMethodDecl>(OperatorDelete) &&
11187 Context.getTargetInfo().callGlobalDeleteInDeletingDtor(
11188 Context.getLangOpts())) {
11189 // In Microsoft ABI whenever a class has a defined operator delete,
11190 // scalar deleting destructors check the 3rd bit of the implicit
11191 // parameter and if it is set, then, global operator delete must be
11192 // called instead of the class-specific one. Find and save the global
11193 // operator delete for that case. Do not diagnose at this point because
11194 // the lack of a global operator delete is not an error if there are no
11195 // delete calls that require it.
11196 FunctionDecl *GlobalOperatorDelete =
11197 FindDeallocationFunctionForDestructor(Loc, RD, /*Diagnose*/ false,
11198 /*LookForGlobal*/ true, Name);
11199 if (GlobalOperatorDelete) {
11200 MarkFunctionReferenced(Loc, GlobalOperatorDelete);
11201 Destructor->setOperatorGlobalDelete(GlobalOperatorDelete);
11202 }
11203 }
11204
11205 if (Context.getTargetInfo().emitVectorDeletingDtors(
11206 Context.getLangOpts())) {
11207 // Lookup delete[] too in case we have to emit a vector deleting dtor.
11208 DeclarationName VDeleteName =
11209 Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
11211 Loc, RD, /*Diagnose*/ false,
11212 /*LookForGlobal*/ false, VDeleteName);
11213 if (ArrOperatorDelete && isa<CXXMethodDecl>(ArrOperatorDelete)) {
11214 FunctionDecl *GlobalArrOperatorDelete =
11215 FindDeallocationFunctionForDestructor(Loc, RD, /*Diagnose*/ false,
11216 /*LookForGlobal*/ true,
11217 VDeleteName);
11218 Destructor->setGlobalOperatorArrayDelete(GlobalArrOperatorDelete);
11219 if (GlobalArrOperatorDelete &&
11220 Context.classNeedsVectorDeletingDestructor(RD))
11221 MarkFunctionReferenced(Loc, GlobalArrOperatorDelete);
11222 } else if (!ArrOperatorDelete) {
11223 ArrOperatorDelete = FindDeallocationFunctionForDestructor(
11224 Loc, RD, /*Diagnose*/ false,
11225 /*LookForGlobal*/ true, VDeleteName);
11226 }
11227 Destructor->setOperatorArrayDelete(ArrOperatorDelete);
11228 if (ArrOperatorDelete && Context.classNeedsVectorDeletingDestructor(RD))
11229 MarkFunctionReferenced(Loc, ArrOperatorDelete);
11230 }
11231 }
11232 }
11233
11234 return false;
11235}
11236
11238 StorageClass& SC) {
11239 // C++ [class.dtor]p1:
11240 // [...] A typedef-name that names a class is a class-name
11241 // (7.1.3); however, a typedef-name that names a class shall not
11242 // be used as the identifier in the declarator for a destructor
11243 // declaration.
11244 QualType DeclaratorType = GetTypeFromParser(D.getName().DestructorName);
11245 if (const TypedefType *TT = DeclaratorType->getAs<TypedefType>())
11246 Diag(D.getIdentifierLoc(), diag::ext_destructor_typedef_name)
11247 << DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());
11248 else if (const TemplateSpecializationType *TST =
11249 DeclaratorType->getAs<TemplateSpecializationType>())
11250 if (TST->isTypeAlias())
11251 Diag(D.getIdentifierLoc(), diag::ext_destructor_typedef_name)
11252 << DeclaratorType << 1;
11253
11254 // C++ [class.dtor]p2:
11255 // A destructor is used to destroy objects of its class type. A
11256 // destructor takes no parameters, and no return type can be
11257 // specified for it (not even void). The address of a destructor
11258 // shall not be taken. A destructor shall not be static. A
11259 // destructor can be invoked for a const, volatile or const
11260 // volatile object. A destructor shall not be declared const,
11261 // volatile or const volatile (9.3.2).
11262 if (SC == SC_Static) {
11263 if (!D.isInvalidType())
11264 Diag(D.getIdentifierLoc(), diag::err_destructor_cannot_be)
11265 << "static" << SourceRange(D.getDeclSpec().getStorageClassSpecLoc())
11268
11269 SC = SC_None;
11270 }
11271 if (!D.isInvalidType()) {
11272 // Destructors don't have return types, but the parser will
11273 // happily parse something like:
11274 //
11275 // class X {
11276 // float ~X();
11277 // };
11278 //
11279 // The return type will be eliminated later.
11280 if (D.getDeclSpec().hasTypeSpecifier())
11281 Diag(D.getIdentifierLoc(), diag::err_destructor_return_type)
11284 else if (unsigned TypeQuals = D.getDeclSpec().getTypeQualifiers()) {
11285 diagnoseIgnoredQualifiers(diag::err_destructor_return_type, TypeQuals,
11291 D.setInvalidType();
11292 }
11293 }
11294
11295 checkMethodTypeQualifiers(*this, D, diag::err_invalid_qualified_destructor);
11296 diagnoseInvalidDeclaratorChunks(*this, D, /*destructor*/ 1);
11297
11298 // C++0x [class.dtor]p2:
11299 // A destructor shall not be declared with a ref-qualifier.
11301 if (FTI.hasRefQualifier()) {
11302 Diag(FTI.getRefQualifierLoc(), diag::err_ref_qualifier_destructor)
11305 D.setInvalidType();
11306 }
11307
11308 // Make sure we don't have any parameters.
11309 if (FTIHasNonVoidParameters(FTI)) {
11310 Diag(D.getIdentifierLoc(), diag::err_destructor_with_params);
11311
11312 // Delete the parameters.
11313 FTI.freeParams();
11314 D.setInvalidType();
11315 }
11316
11317 // Make sure the destructor isn't variadic.
11318 if (FTI.isVariadic) {
11319 Diag(D.getIdentifierLoc(), diag::err_destructor_variadic);
11320 D.setInvalidType();
11321 }
11322
11323 // Rebuild the function type "R" without any type qualifiers or
11324 // parameters (in case any of the errors above fired) and with
11325 // "void" as the return type, since destructors don't have return
11326 // types.
11327 if (!D.isInvalidType())
11328 return R;
11329
11330 const FunctionProtoType *Proto = R->castAs<FunctionProtoType>();
11332 EPI.Variadic = false;
11333 EPI.TypeQuals = Qualifiers();
11334 EPI.RefQualifier = RQ_None;
11335 return Context.getFunctionType(Context.VoidTy, {}, EPI);
11336}
11337
11338static void extendLeft(SourceRange &R, SourceRange Before) {
11339 if (Before.isInvalid())
11340 return;
11341 R.setBegin(Before.getBegin());
11342 if (R.getEnd().isInvalid())
11343 R.setEnd(Before.getEnd());
11344}
11345
11346static void extendRight(SourceRange &R, SourceRange After) {
11347 if (After.isInvalid())
11348 return;
11349 if (R.getBegin().isInvalid())
11350 R.setBegin(After.getBegin());
11351 R.setEnd(After.getEnd());
11352}
11353
11355 StorageClass& SC) {
11356 // C++ [class.conv.fct]p1:
11357 // Neither parameter types nor return type can be specified. The
11358 // type of a conversion function (8.3.5) is "function taking no
11359 // parameter returning conversion-type-id."
11360 if (SC == SC_Static) {
11361 if (!D.isInvalidType())
11362 Diag(D.getIdentifierLoc(), diag::err_conv_function_not_member)
11364 << D.getName().getSourceRange();
11365 D.setInvalidType();
11366 SC = SC_None;
11367 }
11368
11369 TypeSourceInfo *ConvTSI = nullptr;
11370 QualType ConvType =
11372
11373 const DeclSpec &DS = D.getDeclSpec();
11374 if (DS.hasTypeSpecifier() && !D.isInvalidType()) {
11375 // Conversion functions don't have return types, but the parser will
11376 // happily parse something like:
11377 //
11378 // class X {
11379 // float operator bool();
11380 // };
11381 //
11382 // The return type will be changed later anyway.
11383 Diag(D.getIdentifierLoc(), diag::err_conv_function_return_type)
11386 D.setInvalidType();
11387 } else if (DS.getTypeQualifiers() && !D.isInvalidType()) {
11388 // It's also plausible that the user writes type qualifiers in the wrong
11389 // place, such as:
11390 // struct S { const operator int(); };
11391 // FIXME: we could provide a fixit to move the qualifiers onto the
11392 // conversion type.
11393 Diag(D.getIdentifierLoc(), diag::err_conv_function_with_complex_decl)
11394 << SourceRange(D.getIdentifierLoc()) << 0;
11395 D.setInvalidType();
11396 }
11397 const auto *Proto = R->castAs<FunctionProtoType>();
11398 // Make sure we don't have any parameters.
11400 unsigned NumParam = Proto->getNumParams();
11401
11402 // [C++2b]
11403 // A conversion function shall have no non-object parameters.
11404 if (NumParam == 1) {
11406 if (const auto *First =
11407 dyn_cast_if_present<ParmVarDecl>(FTI.Params[0].Param);
11408 First && First->isExplicitObjectParameter())
11409 NumParam--;
11410 }
11411
11412 if (NumParam != 0) {
11413 Diag(D.getIdentifierLoc(), diag::err_conv_function_with_params);
11414 // Delete the parameters.
11415 FTI.freeParams();
11416 D.setInvalidType();
11417 } else if (Proto->isVariadic()) {
11418 Diag(D.getIdentifierLoc(), diag::err_conv_function_variadic);
11419 D.setInvalidType();
11420 }
11421
11422 // Diagnose "&operator bool()" and other such nonsense. This
11423 // is actually a gcc extension which we don't support.
11424 if (Proto->getReturnType() != ConvType) {
11425 bool NeedsTypedef = false;
11426 SourceRange Before, After;
11427
11428 // Walk the chunks and extract information on them for our diagnostic.
11429 bool PastFunctionChunk = false;
11430 for (auto &Chunk : D.type_objects()) {
11431 switch (Chunk.Kind) {
11433 if (!PastFunctionChunk) {
11434 if (Chunk.Fun.HasTrailingReturnType) {
11435 TypeSourceInfo *TRT = nullptr;
11436 GetTypeFromParser(Chunk.Fun.getTrailingReturnType(), &TRT);
11437 if (TRT) extendRight(After, TRT->getTypeLoc().getSourceRange());
11438 }
11439 PastFunctionChunk = true;
11440 break;
11441 }
11442 [[fallthrough]];
11444 NeedsTypedef = true;
11445 extendRight(After, Chunk.getSourceRange());
11446 break;
11447
11453 extendLeft(Before, Chunk.getSourceRange());
11454 break;
11455
11457 extendLeft(Before, Chunk.Loc);
11458 extendRight(After, Chunk.EndLoc);
11459 break;
11460 }
11461 }
11462
11463 SourceLocation Loc = Before.isValid() ? Before.getBegin() :
11464 After.isValid() ? After.getBegin() :
11465 D.getIdentifierLoc();
11466 auto &&DB = Diag(Loc, diag::err_conv_function_with_complex_decl);
11467 DB << Before << After;
11468
11469 if (!NeedsTypedef) {
11470 DB << /*don't need a typedef*/0;
11471
11472 // If we can provide a correct fix-it hint, do so.
11473 if (After.isInvalid() && ConvTSI) {
11474 SourceLocation InsertLoc =
11476 DB << FixItHint::CreateInsertion(InsertLoc, " ")
11478 InsertLoc, CharSourceRange::getTokenRange(Before))
11479 << FixItHint::CreateRemoval(Before);
11480 }
11481 } else if (!Proto->getReturnType()->isDependentType()) {
11482 DB << /*typedef*/1 << Proto->getReturnType();
11483 } else if (getLangOpts().CPlusPlus11) {
11484 DB << /*alias template*/2 << Proto->getReturnType();
11485 } else {
11486 DB << /*might not be fixable*/3;
11487 }
11488
11489 // Recover by incorporating the other type chunks into the result type.
11490 // Note, this does *not* change the name of the function. This is compatible
11491 // with the GCC extension:
11492 // struct S { &operator int(); } s;
11493 // int &r = s.operator int(); // ok in GCC
11494 // S::operator int&() {} // error in GCC, function name is 'operator int'.
11495 ConvType = Proto->getReturnType();
11496 }
11497
11498 // C++ [class.conv.fct]p4:
11499 // The conversion-type-id shall not represent a function type nor
11500 // an array type.
11501 if (ConvType->isArrayType()) {
11502 Diag(D.getIdentifierLoc(), diag::err_conv_function_to_array);
11503 ConvType = Context.getPointerType(ConvType);
11504 D.setInvalidType();
11505 } else if (ConvType->isFunctionType()) {
11506 Diag(D.getIdentifierLoc(), diag::err_conv_function_to_function);
11507 ConvType = Context.getPointerType(ConvType);
11508 D.setInvalidType();
11509 }
11510
11511 // Rebuild the function type "R" without any parameters (in case any
11512 // of the errors above fired) and with the conversion type as the
11513 // return type.
11514 if (D.isInvalidType())
11515 R = Context.getFunctionType(ConvType, {}, Proto->getExtProtoInfo());
11516
11517 // C++0x explicit conversion operators.
11521 ? diag::warn_cxx98_compat_explicit_conversion_functions
11522 : diag::ext_explicit_conversion_functions)
11524}
11525
11527 assert(Conversion && "Expected to receive a conversion function declaration");
11528
11529 CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(Conversion->getDeclContext());
11530
11531 // Make sure we aren't redeclaring the conversion function.
11532 QualType ConvType = Context.getCanonicalType(Conversion->getConversionType());
11533 // C++ [class.conv.fct]p1:
11534 // [...] A conversion function is never used to convert a
11535 // (possibly cv-qualified) object to the (possibly cv-qualified)
11536 // same object type (or a reference to it), to a (possibly
11537 // cv-qualified) base class of that type (or a reference to it),
11538 // or to (possibly cv-qualified) void.
11539 CanQualType ClassType = Context.getCanonicalTagType(ClassDecl);
11540 if (const ReferenceType *ConvTypeRef = ConvType->getAs<ReferenceType>())
11541 ConvType = ConvTypeRef->getPointeeType();
11542 if (Conversion->getTemplateSpecializationKind() != TSK_Undeclared &&
11544 /* Suppress diagnostics for instantiations. */;
11545 else if (Conversion->size_overridden_methods() != 0)
11546 /* Suppress diagnostics for overriding virtual function in a base class. */;
11547 else if (ConvType->isRecordType()) {
11548 ConvType = Context.getCanonicalType(ConvType).getUnqualifiedType();
11549 if (ConvType == ClassType)
11550 Diag(Conversion->getLocation(), diag::warn_conv_to_self_not_used)
11551 << ClassType;
11552 else if (IsDerivedFrom(Conversion->getLocation(), ClassType, ConvType))
11553 Diag(Conversion->getLocation(), diag::warn_conv_to_base_not_used)
11554 << ClassType << ConvType;
11555 } else if (ConvType->isVoidType()) {
11556 Diag(Conversion->getLocation(), diag::warn_conv_to_void_not_used)
11557 << ClassType << ConvType;
11558 }
11559
11560 if (FunctionTemplateDecl *ConversionTemplate =
11561 Conversion->getDescribedFunctionTemplate()) {
11562 if (const auto *ConvTypePtr = ConvType->getAs<PointerType>()) {
11563 ConvType = ConvTypePtr->getPointeeType();
11564 }
11565 if (ConvType->isUndeducedAutoType()) {
11566 Diag(Conversion->getTypeSpecStartLoc(), diag::err_auto_not_allowed)
11567 << getReturnTypeLoc(Conversion).getSourceRange()
11568 << ConvType->castAs<AutoType>()->getKeyword()
11569 << /* in declaration of conversion function template= */ 24;
11570 }
11571
11572 return ConversionTemplate;
11573 }
11574
11575 return Conversion;
11576}
11577
11582
11586
11588 DeclarationName Name, QualType R,
11589 bool IsLambda, DeclContext *DC) {
11590 if (!D.isFunctionDeclarator())
11591 return;
11592
11594 if (FTI.NumParams == 0)
11595 return;
11596 ParmVarDecl *ExplicitObjectParam = nullptr;
11597 for (unsigned Idx = 0; Idx < FTI.NumParams; Idx++) {
11598 const auto &ParamInfo = FTI.Params[Idx];
11599 if (!ParamInfo.Param)
11600 continue;
11601 ParmVarDecl *Param = cast<ParmVarDecl>(ParamInfo.Param);
11602 if (!Param->isExplicitObjectParameter())
11603 continue;
11604 if (Idx == 0) {
11605 ExplicitObjectParam = Param;
11606 continue;
11607 } else {
11608 Diag(Param->getLocation(),
11609 diag::err_explicit_object_parameter_must_be_first)
11610 << IsLambda << Param->getSourceRange();
11611 }
11612 }
11613 if (!ExplicitObjectParam)
11614 return;
11615
11616 if (ExplicitObjectParam->hasDefaultArg()) {
11617 Diag(ExplicitObjectParam->getLocation(),
11618 diag::err_explicit_object_default_arg)
11619 << ExplicitObjectParam->getSourceRange();
11620 }
11621
11624 D.isStaticMember())) {
11625 Diag(ExplicitObjectParam->getBeginLoc(),
11626 diag::err_explicit_object_parameter_nonmember)
11627 << D.getSourceRange() << /*static=*/0 << IsLambda;
11628 D.setInvalidType();
11629 }
11630
11631 if (D.getDeclSpec().isVirtualSpecified()) {
11632 Diag(ExplicitObjectParam->getBeginLoc(),
11633 diag::err_explicit_object_parameter_nonmember)
11634 << D.getSourceRange() << /*virtual=*/1 << IsLambda;
11635 D.setInvalidType();
11636 }
11637
11638 // Friend declarations require some care. Consider:
11639 //
11640 // namespace N {
11641 // struct A{};
11642 // int f(A);
11643 // }
11644 //
11645 // struct S {
11646 // struct T {
11647 // int f(this T);
11648 // };
11649 //
11650 // friend int T::f(this T); // Allow this.
11651 // friend int f(this S); // But disallow this.
11652 // friend int N::f(this A); // And disallow this.
11653 // };
11654 //
11655 // Here, it seems to suffice to check whether the scope
11656 // specifier designates a class type.
11657 if (D.getDeclSpec().isFriendSpecified() &&
11658 !isa_and_present<CXXRecordDecl>(
11660 Diag(ExplicitObjectParam->getBeginLoc(),
11661 diag::err_explicit_object_parameter_nonmember)
11662 << D.getSourceRange() << /*non-member=*/2 << IsLambda;
11663 D.setInvalidType();
11664 }
11665
11666 if (IsLambda && FTI.hasMutableQualifier()) {
11667 Diag(ExplicitObjectParam->getBeginLoc(),
11668 diag::err_explicit_object_parameter_mutable)
11669 << D.getSourceRange();
11670 }
11671
11672 if (IsLambda)
11673 return;
11674
11675 if (!DC || !DC->isRecord()) {
11676 assert(D.isInvalidType() && "Explicit object parameter in non-member "
11677 "should have been diagnosed already");
11678 return;
11679 }
11680
11681 // CWG2674: constructors and destructors cannot have explicit parameters.
11684 Diag(ExplicitObjectParam->getBeginLoc(),
11685 diag::err_explicit_object_parameter_constructor)
11687 << D.getSourceRange();
11688 D.setInvalidType();
11689 }
11690}
11691
11692namespace {
11693/// Utility class to accumulate and print a diagnostic listing the invalid
11694/// specifier(s) on a declaration.
11695struct BadSpecifierDiagnoser {
11696 BadSpecifierDiagnoser(Sema &S, SourceLocation Loc, unsigned DiagID)
11697 : S(S), Diagnostic(S.Diag(Loc, DiagID)) {}
11698 ~BadSpecifierDiagnoser() {
11699 Diagnostic << Specifiers;
11700 }
11701
11702 template<typename T> void check(SourceLocation SpecLoc, T Spec) {
11703 return check(SpecLoc, DeclSpec::getSpecifierName(Spec));
11704 }
11705 void check(SourceLocation SpecLoc, DeclSpec::TST Spec) {
11706 return check(SpecLoc,
11708 }
11709 void check(SourceLocation SpecLoc, const char *Spec) {
11710 if (SpecLoc.isInvalid()) return;
11711 Diagnostic << SourceRange(SpecLoc, SpecLoc);
11712 if (!Specifiers.empty()) Specifiers += " ";
11713 Specifiers += Spec;
11714 }
11715
11716 Sema &S;
11717 Sema::SemaDiagnosticBuilder Diagnostic;
11718 std::string Specifiers;
11719};
11720}
11721
11723 StorageClass &SC) {
11724 TemplateName GuidedTemplate = D.getName().TemplateName.get().get();
11725 TemplateDecl *GuidedTemplateDecl = GuidedTemplate.getAsTemplateDecl();
11726 assert(GuidedTemplateDecl && "missing template decl for deduction guide");
11727
11728 // C++ [temp.deduct.guide]p3:
11729 // A deduction-gide shall be declared in the same scope as the
11730 // corresponding class template.
11731 if (!CurContext->getRedeclContext()->Equals(
11732 GuidedTemplateDecl->getDeclContext()->getRedeclContext())) {
11733 Diag(D.getIdentifierLoc(), diag::err_deduction_guide_wrong_scope)
11734 << GuidedTemplateDecl;
11735 NoteTemplateLocation(*GuidedTemplateDecl);
11736 }
11737
11738 auto &DS = D.getMutableDeclSpec();
11739 // We leave 'friend' and 'virtual' to be rejected in the normal way.
11740 if (DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||
11741 DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||
11742 DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {
11743 BadSpecifierDiagnoser Diagnoser(
11744 *this, D.getIdentifierLoc(),
11745 diag::err_deduction_guide_invalid_specifier);
11746
11747 Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());
11748 DS.ClearStorageClassSpecs();
11749 SC = SC_None;
11750
11751 // 'explicit' is permitted.
11752 Diagnoser.check(DS.getInlineSpecLoc(), "inline");
11753 Diagnoser.check(DS.getNoreturnSpecLoc(), "_Noreturn");
11754 Diagnoser.check(DS.getConstexprSpecLoc(), "constexpr");
11755 DS.ClearConstexprSpec();
11756
11757 Diagnoser.check(DS.getConstSpecLoc(), "const");
11758 Diagnoser.check(DS.getRestrictSpecLoc(), "__restrict");
11759 Diagnoser.check(DS.getVolatileSpecLoc(), "volatile");
11760 Diagnoser.check(DS.getAtomicSpecLoc(), "_Atomic");
11761 Diagnoser.check(DS.getUnalignedSpecLoc(), "__unaligned");
11762 DS.ClearTypeQualifiers();
11763
11764 Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());
11765 Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());
11766 Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());
11767 Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());
11768 DS.ClearTypeSpecType();
11769 }
11770
11771 if (D.isInvalidType())
11772 return true;
11773
11774 // Check the declarator is simple enough.
11775 bool FoundFunction = false;
11776 for (const DeclaratorChunk &Chunk : llvm::reverse(D.type_objects())) {
11777 if (Chunk.Kind == DeclaratorChunk::Paren)
11778 continue;
11779 if (Chunk.Kind != DeclaratorChunk::Function || FoundFunction) {
11781 diag::err_deduction_guide_with_complex_decl)
11782 << D.getSourceRange();
11783 break;
11784 }
11785 if (!Chunk.Fun.hasTrailingReturnType())
11786 return Diag(D.getName().getBeginLoc(),
11787 diag::err_deduction_guide_no_trailing_return_type);
11788
11789 // Check that the return type is written as a specialization of
11790 // the template specified as the deduction-guide's name.
11791 // The template name may not be qualified. [temp.deduct.guide]
11792 ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType();
11793 TypeSourceInfo *TSI = nullptr;
11794 QualType RetTy = GetTypeFromParser(TrailingReturnType, &TSI);
11795 assert(TSI && "deduction guide has valid type but invalid return type?");
11796 bool AcceptableReturnType = false;
11797 bool MightInstantiateToSpecialization = false;
11798 if (auto RetTST =
11800 TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName();
11801 bool TemplateMatches = Context.hasSameTemplateName(
11802 SpecifiedName, GuidedTemplate, /*IgnoreDeduced=*/true);
11803
11805 SpecifiedName.getAsQualifiedTemplateName();
11806 assert(Qualifiers && "expected QualifiedTemplate");
11807 bool SimplyWritten =
11808 !Qualifiers->hasTemplateKeyword() && !Qualifiers->getQualifier();
11809 if (SimplyWritten && TemplateMatches)
11810 AcceptableReturnType = true;
11811 else {
11812 // This could still instantiate to the right type, unless we know it
11813 // names the wrong class template.
11814 auto *TD = SpecifiedName.getAsTemplateDecl();
11815 MightInstantiateToSpecialization =
11816 !(TD && isa<ClassTemplateDecl>(TD) && !TemplateMatches);
11817 }
11818 } else if (!RetTy.hasQualifiers() && RetTy->isDependentType()) {
11819 MightInstantiateToSpecialization = true;
11820 }
11821
11822 if (!AcceptableReturnType)
11823 return Diag(TSI->getTypeLoc().getBeginLoc(),
11824 diag::err_deduction_guide_bad_trailing_return_type)
11825 << GuidedTemplate << TSI->getType()
11826 << MightInstantiateToSpecialization
11827 << TSI->getTypeLoc().getSourceRange();
11828
11829 // Keep going to check that we don't have any inner declarator pieces (we
11830 // could still have a function returning a pointer to a function).
11831 FoundFunction = true;
11832 }
11833
11834 if (D.isFunctionDefinition())
11835 // we can still create a valid deduction guide here.
11836 Diag(D.getIdentifierLoc(), diag::err_deduction_guide_defines_function);
11837 return false;
11838}
11839
11840//===----------------------------------------------------------------------===//
11841// Namespace Handling
11842//===----------------------------------------------------------------------===//
11843
11844/// Diagnose a mismatch in 'inline' qualifiers when a namespace is
11845/// reopened.
11847 SourceLocation Loc,
11848 IdentifierInfo *II, bool *IsInline,
11849 NamespaceDecl *PrevNS) {
11850 assert(*IsInline != PrevNS->isInline());
11851
11852 // 'inline' must appear on the original definition, but not necessarily
11853 // on all extension definitions, so the note should point to the first
11854 // definition to avoid confusion.
11855 PrevNS = PrevNS->getFirstDecl();
11856
11857 if (PrevNS->isInline())
11858 // The user probably just forgot the 'inline', so suggest that it
11859 // be added back.
11860 S.Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
11861 << FixItHint::CreateInsertion(KeywordLoc, "inline ");
11862 else
11863 S.Diag(Loc, diag::err_inline_namespace_mismatch);
11864
11865 S.Diag(PrevNS->getLocation(), diag::note_previous_definition);
11866 *IsInline = PrevNS->isInline();
11867}
11868
11869/// ActOnStartNamespaceDef - This is called at the start of a namespace
11870/// definition.
11872 SourceLocation InlineLoc,
11873 SourceLocation NamespaceLoc,
11874 SourceLocation IdentLoc, IdentifierInfo *II,
11875 SourceLocation LBrace,
11876 const ParsedAttributesView &AttrList,
11877 UsingDirectiveDecl *&UD, bool IsNested) {
11878 SourceLocation StartLoc = InlineLoc.isValid() ? InlineLoc : NamespaceLoc;
11879 // For anonymous namespace, take the location of the left brace.
11880 SourceLocation Loc = II ? IdentLoc : LBrace;
11881 bool IsInline = InlineLoc.isValid();
11882 bool IsInvalid = false;
11883 bool IsStd = false;
11884 bool AddToKnown = false;
11885 Scope *DeclRegionScope = NamespcScope->getParent();
11886
11887 NamespaceDecl *PrevNS = nullptr;
11888 if (II) {
11889 // C++ [namespace.std]p7:
11890 // A translation unit shall not declare namespace std to be an inline
11891 // namespace (9.8.2).
11892 //
11893 // Precondition: the std namespace is in the file scope and is declared to
11894 // be inline
11895 auto DiagnoseInlineStdNS = [&]() {
11896 assert(IsInline && II->isStr("std") &&
11897 CurContext->getRedeclContext()->isTranslationUnit() &&
11898 "Precondition of DiagnoseInlineStdNS not met");
11899 Diag(InlineLoc, diag::err_inline_namespace_std)
11900 << SourceRange(InlineLoc, InlineLoc.getLocWithOffset(6));
11901 IsInline = false;
11902 };
11903 // C++ [namespace.def]p2:
11904 // The identifier in an original-namespace-definition shall not
11905 // have been previously defined in the declarative region in
11906 // which the original-namespace-definition appears. The
11907 // identifier in an original-namespace-definition is the name of
11908 // the namespace. Subsequently in that declarative region, it is
11909 // treated as an original-namespace-name.
11910 //
11911 // Since namespace names are unique in their scope, and we don't
11912 // look through using directives, just look for any ordinary names
11913 // as if by qualified name lookup.
11914 LookupResult R(*this, II, IdentLoc, LookupOrdinaryName,
11916 LookupQualifiedName(R, CurContext->getRedeclContext());
11917 NamedDecl *PrevDecl =
11918 R.isSingleResult() ? R.getRepresentativeDecl() : nullptr;
11919 PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);
11920
11921 if (PrevNS) {
11922 // This is an extended namespace definition.
11923 if (IsInline && II->isStr("std") &&
11924 CurContext->getRedeclContext()->isTranslationUnit())
11925 DiagnoseInlineStdNS();
11926 else if (IsInline != PrevNS->isInline())
11927 DiagnoseNamespaceInlineMismatch(*this, NamespaceLoc, Loc, II,
11928 &IsInline, PrevNS);
11929 } else if (PrevDecl) {
11930 // This is an invalid name redefinition.
11931 Diag(Loc, diag::err_redefinition_different_kind)
11932 << II;
11933 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
11934 IsInvalid = true;
11935 // Continue on to push Namespc as current DeclContext and return it.
11936 } else if (II->isStr("std") &&
11937 CurContext->getRedeclContext()->isTranslationUnit()) {
11938 if (IsInline)
11939 DiagnoseInlineStdNS();
11940 // This is the first "real" definition of the namespace "std", so update
11941 // our cache of the "std" namespace to point at this definition.
11942 PrevNS = getStdNamespace();
11943 IsStd = true;
11944 AddToKnown = !IsInline;
11945 } else {
11946 // We've seen this namespace for the first time.
11947 AddToKnown = !IsInline;
11948 }
11949 } else {
11950 // Anonymous namespaces.
11951
11952 // Determine whether the parent already has an anonymous namespace.
11953 DeclContext *Parent = CurContext->getRedeclContext();
11954 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(Parent)) {
11955 PrevNS = TU->getAnonymousNamespace();
11956 } else {
11957 NamespaceDecl *ND = cast<NamespaceDecl>(Parent);
11958 PrevNS = ND->getAnonymousNamespace();
11959 }
11960
11961 if (PrevNS && IsInline != PrevNS->isInline())
11962 DiagnoseNamespaceInlineMismatch(*this, NamespaceLoc, NamespaceLoc, II,
11963 &IsInline, PrevNS);
11964 }
11965
11967 Context, CurContext, IsInline, StartLoc, Loc, II, PrevNS, IsNested);
11968 if (IsInvalid)
11969 Namespc->setInvalidDecl();
11970
11971 ProcessDeclAttributeList(DeclRegionScope, Namespc, AttrList);
11972 AddPragmaAttributes(DeclRegionScope, Namespc);
11973 ProcessAPINotes(Namespc);
11974
11975 // FIXME: Should we be merging attributes?
11976 if (const VisibilityAttr *Attr = Namespc->getAttr<VisibilityAttr>())
11978
11979 if (IsStd)
11980 StdNamespace = Namespc;
11981 if (AddToKnown)
11982 KnownNamespaces[Namespc] = false;
11983
11984 if (II) {
11985 PushOnScopeChains(Namespc, DeclRegionScope);
11986 } else {
11987 // Link the anonymous namespace into its parent.
11988 DeclContext *Parent = CurContext->getRedeclContext();
11989 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(Parent)) {
11990 TU->setAnonymousNamespace(Namespc);
11991 } else {
11992 cast<NamespaceDecl>(Parent)->setAnonymousNamespace(Namespc);
11993 }
11994
11995 CurContext->addDecl(Namespc);
11996
11997 // C++ [namespace.unnamed]p1. An unnamed-namespace-definition
11998 // behaves as if it were replaced by
11999 // namespace unique { /* empty body */ }
12000 // using namespace unique;
12001 // namespace unique { namespace-body }
12002 // where all occurrences of 'unique' in a translation unit are
12003 // replaced by the same identifier and this identifier differs
12004 // from all other identifiers in the entire program.
12005
12006 // We just create the namespace with an empty name and then add an
12007 // implicit using declaration, just like the standard suggests.
12008 //
12009 // CodeGen enforces the "universally unique" aspect by giving all
12010 // declarations semantically contained within an anonymous
12011 // namespace internal linkage.
12012
12013 if (!PrevNS) {
12015 /* 'using' */ LBrace,
12016 /* 'namespace' */ SourceLocation(),
12017 /* qualifier */ NestedNameSpecifierLoc(),
12018 /* identifier */ SourceLocation(),
12019 Namespc,
12020 /* Ancestor */ Parent);
12021 UD->setImplicit();
12022 Parent->addDecl(UD);
12023 }
12024 }
12025
12026 ActOnDocumentableDecl(Namespc);
12027
12028 // Although we could have an invalid decl (i.e. the namespace name is a
12029 // redefinition), push it as current DeclContext and try to continue parsing.
12030 // FIXME: We should be able to push Namespc here, so that the each DeclContext
12031 // for the namespace has the declarations that showed up in that particular
12032 // namespace definition.
12033 PushDeclContext(NamespcScope, Namespc);
12034 return Namespc;
12035}
12036
12037/// getNamespaceDecl - Returns the namespace a decl represents. If the decl
12038/// is a namespace alias, returns the namespace it points to.
12040 if (NamespaceAliasDecl *AD = dyn_cast_or_null<NamespaceAliasDecl>(D))
12041 return AD->getNamespace();
12042 return dyn_cast_or_null<NamespaceDecl>(D);
12043}
12044
12046 NamespaceDecl *Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);
12047 assert(Namespc && "Invalid parameter, expected NamespaceDecl");
12048 Namespc->setRBraceLoc(RBrace);
12050 if (Namespc->hasAttr<VisibilityAttr>())
12051 PopPragmaVisibility(true, RBrace);
12052 // If this namespace contains an export-declaration, export it now.
12053 if (DeferredExportedNamespaces.erase(Namespc))
12055}
12056
12058 return cast_or_null<CXXRecordDecl>(
12059 StdBadAlloc.get(Context.getExternalSource()));
12060}
12061
12063 return cast_or_null<EnumDecl>(StdAlignValT.get(Context.getExternalSource()));
12064}
12065
12067 return cast_or_null<NamespaceDecl>(
12068 StdNamespace.get(Context.getExternalSource()));
12069}
12070
12071namespace {
12072
12073enum UnsupportedSTLSelect {
12074 USS_InvalidMember,
12075 USS_MissingMember,
12076 USS_NonTrivial,
12077 USS_Other
12078};
12079
12080struct InvalidSTLDiagnoser {
12081 Sema &S;
12082 SourceLocation Loc;
12083 QualType TyForDiags;
12084
12085 QualType operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name = "",
12086 const VarDecl *VD = nullptr) {
12087 {
12088 auto D = S.Diag(Loc, diag::err_std_compare_type_not_supported)
12089 << TyForDiags << ((int)Sel);
12090 if (Sel == USS_InvalidMember || Sel == USS_MissingMember) {
12091 assert(!Name.empty());
12092 D << Name;
12093 }
12094 }
12095 if (Sel == USS_InvalidMember) {
12096 S.Diag(VD->getLocation(), diag::note_var_declared_here)
12097 << VD << VD->getSourceRange();
12098 }
12099 return QualType();
12100 }
12101};
12102} // namespace
12103
12105 SourceLocation Loc,
12107 assert(getLangOpts().CPlusPlus &&
12108 "Looking for comparison category type outside of C++.");
12109
12110 // Use an elaborated type for diagnostics which has a name containing the
12111 // prepended 'std' namespace but not any inline namespace names.
12112 auto TyForDiags = [&](ComparisonCategoryInfo *Info) {
12114 /*Prefix=*/std::nullopt);
12115 return Context.getTagType(ElaboratedTypeKeyword::None, Qualifier,
12116 Info->Record,
12117 /*OwnsTag=*/false);
12118 };
12119
12120 // Check if we've already successfully checked the comparison category type
12121 // before. If so, skip checking it again.
12122 ComparisonCategoryInfo *Info = Context.CompCategories.lookupInfo(Kind);
12123 if (Info && FullyCheckedComparisonCategories[static_cast<unsigned>(Kind)]) {
12124 // The only thing we need to check is that the type has a reachable
12125 // definition in the current context.
12126 if (RequireCompleteType(Loc, TyForDiags(Info), diag::err_incomplete_type))
12127 return QualType();
12128
12129 return Info->getType();
12130 }
12131
12132 // If lookup failed
12133 if (!Info) {
12134 std::string NameForDiags = "std::";
12135 NameForDiags += ComparisonCategories::getCategoryString(Kind);
12136 Diag(Loc, diag::err_implied_comparison_category_type_not_found)
12137 << NameForDiags << (int)Usage;
12138 return QualType();
12139 }
12140
12141 assert(Info->Kind == Kind);
12142 assert(Info->Record);
12143
12144 // Update the Record decl in case we encountered a forward declaration on our
12145 // first pass. FIXME: This is a bit of a hack.
12146 if (Info->Record->hasDefinition())
12147 Info->Record = Info->Record->getDefinition();
12148
12149 if (RequireCompleteType(Loc, TyForDiags(Info), diag::err_incomplete_type))
12150 return QualType();
12151
12152 InvalidSTLDiagnoser UnsupportedSTLError{*this, Loc, TyForDiags(Info)};
12153
12154 if (!Info->Record->isTriviallyCopyable())
12155 return UnsupportedSTLError(USS_NonTrivial);
12156
12157 for (const CXXBaseSpecifier &BaseSpec : Info->Record->bases()) {
12158 CXXRecordDecl *Base = BaseSpec.getType()->getAsCXXRecordDecl();
12159 // Tolerate empty base classes.
12160 if (Base->isEmpty())
12161 continue;
12162 // Reject STL implementations which have at least one non-empty base.
12163 return UnsupportedSTLError();
12164 }
12165
12166 // Check that the STL has implemented the types using a single integer field.
12167 // This expectation allows better codegen for builtin operators. We require:
12168 // (1) The class has exactly one field.
12169 // (2) The field is an integral or enumeration type.
12170 auto FIt = Info->Record->field_begin(), FEnd = Info->Record->field_end();
12171 if (std::distance(FIt, FEnd) != 1 ||
12172 !FIt->getType()->isIntegralOrEnumerationType()) {
12173 return UnsupportedSTLError();
12174 }
12175
12176 // Build each of the require values and store them in Info.
12177 for (ComparisonCategoryResult CCR :
12179 StringRef MemName = ComparisonCategories::getResultString(CCR);
12180 ComparisonCategoryInfo::ValueInfo *ValInfo = Info->lookupValueInfo(CCR);
12181
12182 if (!ValInfo)
12183 return UnsupportedSTLError(USS_MissingMember, MemName);
12184
12185 VarDecl *VD = ValInfo->VD;
12186 assert(VD && "should not be null!");
12187
12188 // Attempt to diagnose reasons why the STL definition of this type
12189 // might be foobar, including it failing to be a constant expression.
12190 // TODO Handle more ways the lookup or result can be invalid.
12191 if (!VD->isStaticDataMember() ||
12193 return UnsupportedSTLError(USS_InvalidMember, MemName, VD);
12194
12195 // Attempt to evaluate the var decl as a constant expression and extract
12196 // the value of its first field as a ICE. If this fails, the STL
12197 // implementation is not supported.
12198 if (!ValInfo->hasValidIntValue())
12199 return UnsupportedSTLError();
12200
12201 MarkVariableReferenced(Loc, VD);
12202 }
12203
12204 // We've successfully built the required types and expressions. Update
12205 // the cache and return the newly cached value.
12206 FullyCheckedComparisonCategories[static_cast<unsigned>(Kind)] = true;
12207 return Info->getType();
12208}
12209
12211 if (!StdNamespace) {
12212 // The "std" namespace has not yet been defined, so build one implicitly.
12214 Context, Context.getTranslationUnitDecl(),
12215 /*Inline=*/false, SourceLocation(), SourceLocation(),
12216 &PP.getIdentifierTable().get("std"),
12217 /*PrevDecl=*/nullptr, /*Nested=*/false);
12218 getStdNamespace()->setImplicit(true);
12219 // We want the created NamespaceDecl to be available for redeclaration
12220 // lookups, but not for regular name lookups.
12221 Context.getTranslationUnitDecl()->addDecl(getStdNamespace());
12222 getStdNamespace()->clearIdentifierNamespace();
12223 }
12224
12225 return getStdNamespace();
12226}
12227
12228static bool isStdClassTemplate(Sema &S, QualType SugaredType, QualType *TypeArg,
12229 const char *ClassName,
12230 ClassTemplateDecl **CachedDecl,
12231 const Decl **MalformedDecl) {
12232 // We're looking for implicit instantiations of
12233 // template <typename U> class std::{ClassName}.
12234
12235 if (!S.StdNamespace) // If we haven't seen namespace std yet, this can't be
12236 // it.
12237 return false;
12238
12239 auto ReportMatchingNameAsMalformed = [&](NamedDecl *D) {
12240 if (!MalformedDecl)
12241 return;
12242 if (!D)
12243 D = SugaredType->getAsTagDecl();
12244 if (!D || !D->isInStdNamespace())
12245 return;
12246 IdentifierInfo *II = D->getDeclName().getAsIdentifierInfo();
12247 if (II && II == &S.PP.getIdentifierTable().get(ClassName))
12248 *MalformedDecl = D;
12249 };
12250
12251 ClassTemplateDecl *Template = nullptr;
12253 if (const TemplateSpecializationType *TST =
12255 Template = dyn_cast_or_null<ClassTemplateDecl>(
12256 TST->getTemplateName().getAsTemplateDecl());
12257 Arguments = TST->template_arguments();
12258 } else if (const auto *TT = SugaredType->getAs<TagType>()) {
12259 Template = TT->getTemplateDecl();
12260 Arguments = TT->getTemplateArgs(S.Context);
12261 }
12262
12263 if (!Template) {
12264 ReportMatchingNameAsMalformed(SugaredType->getAsTagDecl());
12265 return false;
12266 }
12267
12268 if (!*CachedDecl) {
12269 // Haven't recognized std::{ClassName} yet, maybe this is it.
12270 // FIXME: It seems we should just reuse LookupStdClassTemplate but the
12271 // semantics of this are slightly different, most notably the existing
12272 // "lookup" semantics explicitly diagnose an invalid definition as an
12273 // error.
12274 CXXRecordDecl *TemplateClass = Template->getTemplatedDecl();
12275 if (TemplateClass->getIdentifier() !=
12276 &S.PP.getIdentifierTable().get(ClassName) ||
12278 TemplateClass->getNonTransparentDeclContext()))
12279 return false;
12280 // This is a template called std::{ClassName}, but is it the right
12281 // template?
12282 TemplateParameterList *Params = Template->getTemplateParameters();
12283 if (Params->getMinRequiredArguments() != 1 ||
12284 !isa<TemplateTypeParmDecl>(Params->getParam(0)) ||
12285 Params->getParam(0)->isTemplateParameterPack()) {
12286 if (MalformedDecl)
12287 *MalformedDecl = TemplateClass;
12288 return false;
12289 }
12290
12291 // It's the right template.
12292 *CachedDecl = Template;
12293 }
12294
12295 if (Template->getCanonicalDecl() != (*CachedDecl)->getCanonicalDecl())
12296 return false;
12297
12298 // This is an instance of std::{ClassName}. Find the argument type.
12299 if (TypeArg) {
12300 QualType ArgType = Arguments[0].getAsType();
12301 // FIXME: Since TST only has as-written arguments, we have to perform the
12302 // only kind of conversion applicable to type arguments; in Objective-C ARC:
12303 // - If an explicitly-specified template argument type is a lifetime type
12304 // with no lifetime qualifier, the __strong lifetime qualifier is
12305 // inferred.
12306 if (S.getLangOpts().ObjCAutoRefCount && ArgType->isObjCLifetimeType() &&
12307 !ArgType.getObjCLifetime()) {
12308 Qualifiers Qs;
12310 ArgType = S.Context.getQualifiedType(ArgType, Qs);
12311 }
12312 *TypeArg = ArgType;
12313 }
12314
12315 return true;
12316}
12317
12319 assert(getLangOpts().CPlusPlus &&
12320 "Looking for std::initializer_list outside of C++.");
12321
12322 // We're looking for implicit instantiations of
12323 // template <typename E> class std::initializer_list.
12324
12325 return isStdClassTemplate(*this, Ty, Element, "initializer_list",
12326 &StdInitializerList, /*MalformedDecl=*/nullptr);
12327}
12328
12330 const Decl **MalformedDecl) {
12331 assert(getLangOpts().CPlusPlus &&
12332 "Looking for std::type_identity outside of C++.");
12333
12334 // We're looking for implicit instantiations of
12335 // template <typename T> struct std::type_identity.
12336
12337 return isStdClassTemplate(*this, Ty, Element, "type_identity",
12338 &StdTypeIdentity, MalformedDecl);
12339}
12340
12342 const char *ClassName,
12343 bool *WasMalformed) {
12344 if (!S.StdNamespace)
12345 return nullptr;
12346
12347 LookupResult Result(S, &S.PP.getIdentifierTable().get(ClassName), Loc,
12349 if (!S.LookupQualifiedName(Result, S.getStdNamespace()))
12350 return nullptr;
12351
12352 ClassTemplateDecl *Template = Result.getAsSingle<ClassTemplateDecl>();
12353 if (!Template) {
12354 Result.suppressDiagnostics();
12355 // We found something weird. Complain about the first thing we found.
12356 NamedDecl *Found = *Result.begin();
12357 S.Diag(Found->getLocation(), diag::err_malformed_std_class_template)
12358 << ClassName;
12359 if (WasMalformed)
12360 *WasMalformed = true;
12361 return nullptr;
12362 }
12363
12364 // We found some template with the correct name. Now verify that it's
12365 // correct.
12366 TemplateParameterList *Params = Template->getTemplateParameters();
12367 if (Params->getMinRequiredArguments() != 1 ||
12368 !isa<TemplateTypeParmDecl>(Params->getParam(0))) {
12369 S.Diag(Template->getLocation(), diag::err_malformed_std_class_template)
12370 << ClassName;
12371 if (WasMalformed)
12372 *WasMalformed = true;
12373 return nullptr;
12374 }
12375
12376 return Template;
12377}
12378
12380 QualType TypeParam, SourceLocation Loc) {
12381 assert(S.getStdNamespace());
12382 TemplateArgumentListInfo Args(Loc, Loc);
12383 auto TSI = S.Context.getTrivialTypeSourceInfo(TypeParam, Loc);
12384 Args.addArgument(TemplateArgumentLoc(TemplateArgument(TypeParam), TSI));
12385
12387 Loc, Args, /*Scope=*/nullptr,
12388 /*ForNestedNameSpecifier=*/false);
12389}
12390
12392 if (!StdInitializerList) {
12393 bool WasMalformed = false;
12395 LookupStdClassTemplate(*this, Loc, "initializer_list", &WasMalformed);
12396 if (!StdInitializerList) {
12397 if (!WasMalformed)
12398 Diag(Loc, diag::err_implied_std_initializer_list_not_found);
12399 return QualType();
12400 }
12401 }
12402 return BuildStdClassTemplate(*this, StdInitializerList, Element, Loc);
12403}
12404
12406 if (!StdTypeIdentity) {
12407 StdTypeIdentity = LookupStdClassTemplate(*this, Loc, "type_identity",
12408 /*WasMalformed=*/nullptr);
12409 if (!StdTypeIdentity)
12410 return QualType();
12411 }
12412 return BuildStdClassTemplate(*this, StdTypeIdentity, Type, Loc);
12413}
12414
12416 // C++ [dcl.init.list]p2:
12417 // A constructor is an initializer-list constructor if its first parameter
12418 // is of type std::initializer_list<E> or reference to possibly cv-qualified
12419 // std::initializer_list<E> for some type E, and either there are no other
12420 // parameters or else all other parameters have default arguments.
12421 if (!Ctor->hasOneParamOrDefaultArgs())
12422 return false;
12423
12424 QualType ArgType = Ctor->getParamDecl(0)->getType();
12425 if (const ReferenceType *RT = ArgType->getAs<ReferenceType>())
12426 ArgType = RT->getPointeeType().getUnqualifiedType();
12427
12428 return isStdInitializerList(ArgType, nullptr);
12429}
12430
12431/// Determine whether a using statement is in a context where it will be
12432/// apply in all contexts.
12434 switch (CurContext->getDeclKind()) {
12435 case Decl::TranslationUnit:
12436 return true;
12437 case Decl::LinkageSpec:
12438 return IsUsingDirectiveInToplevelContext(CurContext->getParent());
12439 default:
12440 return false;
12441 }
12442}
12443
12444namespace {
12445
12446// Callback to only accept typo corrections that are namespaces.
12447class NamespaceValidatorCCC final : public CorrectionCandidateCallback {
12448public:
12449 bool ValidateCandidate(const TypoCorrection &candidate) override {
12450 if (NamedDecl *ND = candidate.getCorrectionDecl())
12452 return false;
12453 }
12454
12455 std::unique_ptr<CorrectionCandidateCallback> clone() override {
12456 return std::make_unique<NamespaceValidatorCCC>(*this);
12457 }
12458};
12459
12460}
12461
12462static void DiagnoseInvisibleNamespace(const TypoCorrection &Corrected,
12463 Sema &S) {
12464 auto *ND = cast<NamespaceDecl>(Corrected.getFoundDecl());
12465 Module *M = ND->getOwningModule();
12466 assert(M && "hidden namespace definition not in a module?");
12467
12468 if (M->isExplicitGlobalModule())
12469 S.Diag(Corrected.getCorrectionRange().getBegin(),
12470 diag::err_module_unimported_use_header)
12472 << /*Header Name*/ false;
12473 else
12474 S.Diag(Corrected.getCorrectionRange().getBegin(),
12475 diag::err_module_unimported_use)
12477 << M->getTopLevelModuleName();
12478}
12479
12481 CXXScopeSpec &SS,
12482 SourceLocation IdentLoc,
12483 IdentifierInfo *Ident) {
12484 R.clear();
12485 NamespaceValidatorCCC CCC{};
12486 if (TypoCorrection Corrected =
12487 S.CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC,
12489 // Generally we find it is confusing more than helpful to diagnose the
12490 // invisible namespace.
12491 // See https://github.com/llvm/llvm-project/issues/73893.
12492 //
12493 // However, we should diagnose when the users are trying to using an
12494 // invisible namespace. So we handle the case specially here.
12495 if (isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&
12496 Corrected.requiresImport()) {
12497 DiagnoseInvisibleNamespace(Corrected, S);
12498 } else if (DeclContext *DC = S.computeDeclContext(SS, false)) {
12499 std::string CorrectedStr(Corrected.getAsString(S.getLangOpts()));
12500 bool DroppedSpecifier =
12501 Corrected.WillReplaceSpecifier() && Ident->getName() == CorrectedStr;
12502 S.diagnoseTypo(Corrected,
12503 S.PDiag(diag::err_using_directive_member_suggest)
12504 << Ident << DC << DroppedSpecifier << SS.getRange(),
12505 S.PDiag(diag::note_namespace_defined_here));
12506 } else {
12507 S.diagnoseTypo(Corrected,
12508 S.PDiag(diag::err_using_directive_suggest) << Ident,
12509 S.PDiag(diag::note_namespace_defined_here));
12510 }
12511 R.addDecl(Corrected.getFoundDecl());
12512 return true;
12513 }
12514 return false;
12515}
12516
12518 SourceLocation NamespcLoc, CXXScopeSpec &SS,
12519 SourceLocation IdentLoc,
12520 IdentifierInfo *NamespcName,
12521 const ParsedAttributesView &AttrList) {
12522 assert(!SS.isInvalid() && "Invalid CXXScopeSpec.");
12523 assert(NamespcName && "Invalid NamespcName.");
12524 assert(IdentLoc.isValid() && "Invalid NamespceName location.");
12525
12526 // Get the innermost enclosing declaration scope.
12527 S = S->getDeclParent();
12528
12529 UsingDirectiveDecl *UDir = nullptr;
12530 NestedNameSpecifier Qualifier = SS.getScopeRep();
12531
12532 // Lookup namespace name.
12533 LookupResult R(*this, NamespcName, IdentLoc, LookupNamespaceName);
12534 LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
12535 if (R.isAmbiguous())
12536 return nullptr;
12537
12538 if (R.empty()) {
12539 R.clear();
12540 // Allow "using namespace std;" or "using namespace ::std;" even if
12541 // "std" hasn't been defined yet, for GCC compatibility.
12542 if ((!Qualifier ||
12543 Qualifier.getKind() == NestedNameSpecifier::Kind::Global) &&
12544 NamespcName->isStr("std")) {
12545 Diag(IdentLoc, diag::ext_using_undefined_std);
12547 R.resolveKind();
12548 }
12549 // Otherwise, attempt typo correction.
12550 else
12551 TryNamespaceTypoCorrection(*this, R, S, SS, IdentLoc, NamespcName);
12552 }
12553
12554 if (!R.empty()) {
12555 NamedDecl *Named = R.getRepresentativeDecl();
12557 assert(NS && "expected namespace decl");
12558
12559 // The use of a nested name specifier may trigger deprecation warnings.
12560 DiagnoseUseOfDecl(Named, IdentLoc);
12561
12562 // C++ [namespace.udir]p1:
12563 // A using-directive specifies that the names in the nominated
12564 // namespace can be used in the scope in which the
12565 // using-directive appears after the using-directive. During
12566 // unqualified name lookup (3.4.1), the names appear as if they
12567 // were declared in the nearest enclosing namespace which
12568 // contains both the using-directive and the nominated
12569 // namespace. [Note: in this context, "contains" means "contains
12570 // directly or indirectly". ]
12571
12572 // Find enclosing context containing both using-directive and
12573 // nominated namespace.
12574 DeclContext *CommonAncestor = NS;
12575 while (CommonAncestor && !CommonAncestor->Encloses(CurContext))
12576 CommonAncestor = CommonAncestor->getParent();
12577
12578 UDir = UsingDirectiveDecl::Create(Context, CurContext, UsingLoc, NamespcLoc,
12580 IdentLoc, Named, CommonAncestor);
12581
12583 !SourceMgr.isInMainFile(SourceMgr.getExpansionLoc(IdentLoc))) {
12584 Diag(IdentLoc, diag::warn_using_directive_in_header);
12585 }
12586
12587 PushUsingDirective(S, UDir);
12588 } else {
12589 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.getRange();
12590 }
12591
12592 if (UDir) {
12593 ProcessDeclAttributeList(S, UDir, AttrList);
12594 ProcessAPINotes(UDir);
12595 }
12596
12597 return UDir;
12598}
12599
12601 // If the scope has an associated entity and the using directive is at
12602 // namespace or translation unit scope, add the UsingDirectiveDecl into
12603 // its lookup structure so qualified name lookup can find it.
12604 DeclContext *Ctx = S->getEntity();
12605 if (Ctx && !Ctx->isFunctionOrMethod())
12606 Ctx->addDecl(UDir);
12607 else
12608 // Otherwise, it is at block scope. The using-directives will affect lookup
12609 // only to the end of the scope.
12610 S->PushUsingDirective(UDir);
12611}
12612
12614 SourceLocation UsingLoc,
12615 SourceLocation TypenameLoc, CXXScopeSpec &SS,
12616 UnqualifiedId &Name,
12617 SourceLocation EllipsisLoc,
12618 const ParsedAttributesView &AttrList) {
12619 assert(S->getFlags() & Scope::DeclScope && "Invalid Scope.");
12620
12621 if (SS.isEmpty()) {
12622 Diag(Name.getBeginLoc(), diag::err_using_requires_qualname);
12623 return nullptr;
12624 }
12625
12626 switch (Name.getKind()) {
12632 break;
12633
12636 // C++11 inheriting constructors.
12637 Diag(Name.getBeginLoc(),
12639 ? diag::warn_cxx98_compat_using_decl_constructor
12640 : diag::err_using_decl_constructor)
12641 << SS.getRange();
12642
12643 if (getLangOpts().CPlusPlus11) break;
12644
12645 return nullptr;
12646
12648 Diag(Name.getBeginLoc(), diag::err_using_decl_destructor) << SS.getRange();
12649 return nullptr;
12650
12652 Diag(Name.getBeginLoc(), diag::err_using_decl_template_id)
12654 return nullptr;
12655
12657 llvm_unreachable("cannot parse qualified deduction guide name");
12658 }
12659
12660 DeclarationNameInfo TargetNameInfo = GetNameFromUnqualifiedId(Name);
12661 DeclarationName TargetName = TargetNameInfo.getName();
12662 if (!TargetName)
12663 return nullptr;
12664
12665 // Warn about access declarations.
12666 if (UsingLoc.isInvalid()) {
12668 ? diag::err_access_decl
12669 : diag::warn_access_decl_deprecated)
12670 << FixItHint::CreateInsertion(SS.getRange().getBegin(), "using ");
12671 }
12672
12673 if (EllipsisLoc.isInvalid()) {
12676 return nullptr;
12677 } else {
12679 !TargetNameInfo.containsUnexpandedParameterPack()) {
12680 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
12681 << SourceRange(SS.getBeginLoc(), TargetNameInfo.getEndLoc());
12682 EllipsisLoc = SourceLocation();
12683 }
12684 }
12685
12686 NamedDecl *UD =
12687 BuildUsingDeclaration(S, AS, UsingLoc, TypenameLoc.isValid(), TypenameLoc,
12688 SS, TargetNameInfo, EllipsisLoc, AttrList,
12689 /*IsInstantiation*/ false,
12690 AttrList.hasAttribute(ParsedAttr::AT_UsingIfExists));
12691 if (UD)
12692 PushOnScopeChains(UD, S, /*AddToContext*/ false);
12693
12694 return UD;
12695}
12696
12698 SourceLocation UsingLoc,
12699 SourceLocation EnumLoc, SourceRange TyLoc,
12700 const IdentifierInfo &II, ParsedType Ty,
12701 const CXXScopeSpec &SS) {
12702 TypeSourceInfo *TSI = nullptr;
12703 SourceLocation IdentLoc = TyLoc.getBegin();
12704 QualType EnumTy = GetTypeFromParser(Ty, &TSI);
12705 if (EnumTy.isNull()) {
12706 Diag(IdentLoc, isDependentScopeSpecifier(SS)
12707 ? diag::err_using_enum_is_dependent
12708 : diag::err_unknown_typename)
12709 << II.getName()
12710 << SourceRange(SS.isValid() ? SS.getBeginLoc() : IdentLoc,
12711 TyLoc.getEnd());
12712 return nullptr;
12713 }
12714
12715 if (EnumTy->isDependentType()) {
12716 Diag(IdentLoc, diag::err_using_enum_is_dependent);
12717 return nullptr;
12718 }
12719
12720 auto *Enum = EnumTy->getAsEnumDecl();
12721 if (!Enum) {
12722 Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;
12723 return nullptr;
12724 }
12725
12726 if (TSI == nullptr)
12727 TSI = Context.getTrivialTypeSourceInfo(EnumTy, IdentLoc);
12728
12729 auto *UD =
12730 BuildUsingEnumDeclaration(S, AS, UsingLoc, EnumLoc, IdentLoc, TSI, Enum);
12731
12732 if (UD)
12733 PushOnScopeChains(UD, S, /*AddToContext*/ false);
12734
12735 return UD;
12736}
12737
12738/// Determine whether a using declaration considers the given
12739/// declarations as "equivalent", e.g., if they are redeclarations of
12740/// the same entity or are both typedefs of the same type.
12741static bool
12743 if (D1->getCanonicalDecl() == D2->getCanonicalDecl())
12744 return true;
12745
12746 if (TypedefNameDecl *TD1 = dyn_cast<TypedefNameDecl>(D1))
12747 if (TypedefNameDecl *TD2 = dyn_cast<TypedefNameDecl>(D2))
12748 return Context.hasSameType(TD1->getUnderlyingType(),
12749 TD2->getUnderlyingType());
12750
12751 // Two using_if_exists using-declarations are equivalent if both are
12752 // unresolved.
12755 return true;
12756
12757 return false;
12758}
12759
12761 const LookupResult &Previous,
12762 UsingShadowDecl *&PrevShadow) {
12763 // Diagnose finding a decl which is not from a base class of the
12764 // current class. We do this now because there are cases where this
12765 // function will silently decide not to build a shadow decl, which
12766 // will pre-empt further diagnostics.
12767 //
12768 // We don't need to do this in C++11 because we do the check once on
12769 // the qualifier.
12770 //
12771 // FIXME: diagnose the following if we care enough:
12772 // struct A { int foo; };
12773 // struct B : A { using A::foo; };
12774 // template <class T> struct C : A {};
12775 // template <class T> struct D : C<T> { using B::foo; } // <---
12776 // This is invalid (during instantiation) in C++03 because B::foo
12777 // resolves to the using decl in B, which is not a base class of D<T>.
12778 // We can't diagnose it immediately because C<T> is an unknown
12779 // specialization. The UsingShadowDecl in D<T> then points directly
12780 // to A::foo, which will look well-formed when we instantiate.
12781 // The right solution is to not collapse the shadow-decl chain.
12782 if (!getLangOpts().CPlusPlus11 && CurContext->isRecord())
12783 if (auto *Using = dyn_cast<UsingDecl>(BUD)) {
12784 DeclContext *OrigDC = Orig->getDeclContext();
12785
12786 // Handle enums and anonymous structs.
12787 if (isa<EnumDecl>(OrigDC))
12788 OrigDC = OrigDC->getParent();
12789 CXXRecordDecl *OrigRec = cast<CXXRecordDecl>(OrigDC);
12790 while (OrigRec->isAnonymousStructOrUnion())
12791 OrigRec = cast<CXXRecordDecl>(OrigRec->getDeclContext());
12792
12794 if (OrigDC == CurContext) {
12795 Diag(Using->getLocation(),
12796 diag::err_using_decl_nested_name_specifier_is_current_class)
12797 << Using->getQualifierLoc().getSourceRange();
12798 Diag(Orig->getLocation(), diag::note_using_decl_target);
12799 Using->setInvalidDecl();
12800 return true;
12801 }
12802
12803 Diag(Using->getQualifierLoc().getBeginLoc(),
12804 diag::err_using_decl_nested_name_specifier_is_not_base_class)
12805 << Using->getQualifier() << cast<CXXRecordDecl>(CurContext)
12806 << Using->getQualifierLoc().getSourceRange();
12807 Diag(Orig->getLocation(), diag::note_using_decl_target);
12808 Using->setInvalidDecl();
12809 return true;
12810 }
12811 }
12812
12813 if (Previous.empty()) return false;
12814
12815 NamedDecl *Target = Orig;
12817 Target = cast<UsingShadowDecl>(Target)->getTargetDecl();
12818
12819 // If the target happens to be one of the previous declarations, we
12820 // don't have a conflict.
12821 //
12822 // FIXME: but we might be increasing its access, in which case we
12823 // should redeclare it.
12824 NamedDecl *NonTag = nullptr, *Tag = nullptr;
12825 bool FoundEquivalentDecl = false;
12826 for (LookupResult::iterator I = Previous.begin(), E = Previous.end();
12827 I != E; ++I) {
12828 NamedDecl *D = (*I)->getUnderlyingDecl();
12829 // We can have UsingDecls in our Previous results because we use the same
12830 // LookupResult for checking whether the UsingDecl itself is a valid
12831 // redeclaration.
12833 continue;
12834
12835 if (auto *RD = dyn_cast<CXXRecordDecl>(D)) {
12836 // C++ [class.mem]p19:
12837 // If T is the name of a class, then [every named member other than
12838 // a non-static data member] shall have a name different from T
12839 if (RD->isInjectedClassName() && !isa<FieldDecl>(Target) &&
12843 CurContext,
12845 return true;
12846 }
12847
12849 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(*I))
12850 PrevShadow = Shadow;
12851 FoundEquivalentDecl = true;
12853 // We don't conflict with an existing using shadow decl of an equivalent
12854 // declaration, but we're not a redeclaration of it.
12855 FoundEquivalentDecl = true;
12856 }
12857
12858 if (isVisible(D))
12859 (isa<TagDecl>(D) ? Tag : NonTag) = D;
12860 }
12861
12862 if (FoundEquivalentDecl)
12863 return false;
12864
12865 // Always emit a diagnostic for a mismatch between an unresolved
12866 // using_if_exists and a resolved using declaration in either direction.
12868 (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
12869 if (!NonTag && !Tag)
12870 return false;
12871 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12872 Diag(Target->getLocation(), diag::note_using_decl_target);
12873 Diag((NonTag ? NonTag : Tag)->getLocation(),
12874 diag::note_using_decl_conflict);
12875 BUD->setInvalidDecl();
12876 return true;
12877 }
12878
12879 if (FunctionDecl *FD = Target->getAsFunction()) {
12880 NamedDecl *OldDecl = nullptr;
12881 switch (CheckOverload(nullptr, FD, Previous, OldDecl,
12882 /*IsForUsingDecl*/ true)) {
12884 return false;
12885
12887 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12888 break;
12889
12890 // We found a decl with the exact signature.
12892 // If we're in a record, we want to hide the target, so we
12893 // return true (without a diagnostic) to tell the caller not to
12894 // build a shadow decl.
12895 if (CurContext->isRecord())
12896 return true;
12897
12898 // If we're not in a record, this is an error.
12899 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12900 break;
12901 }
12902
12903 Diag(Target->getLocation(), diag::note_using_decl_target);
12904 Diag(OldDecl->getLocation(), diag::note_using_decl_conflict);
12905 BUD->setInvalidDecl();
12906 return true;
12907 }
12908
12909 // Target is not a function.
12910
12911 if (isa<TagDecl>(Target)) {
12912 // No conflict between a tag and a non-tag.
12913 if (!Tag) return false;
12914
12915 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12916 Diag(Target->getLocation(), diag::note_using_decl_target);
12917 Diag(Tag->getLocation(), diag::note_using_decl_conflict);
12918 BUD->setInvalidDecl();
12919 return true;
12920 }
12921
12922 // No conflict between a tag and a non-tag.
12923 if (!NonTag) return false;
12924
12925 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12926 Diag(Target->getLocation(), diag::note_using_decl_target);
12927 Diag(NonTag->getLocation(), diag::note_using_decl_conflict);
12928 BUD->setInvalidDecl();
12929 return true;
12930}
12931
12932/// Determine whether a direct base class is a virtual base class.
12934 if (!Derived->getNumVBases())
12935 return false;
12936 for (auto &B : Derived->bases())
12937 if (B.getType()->getAsCXXRecordDecl() == Base)
12938 return B.isVirtual();
12939 llvm_unreachable("not a direct base class");
12940}
12941
12943 NamedDecl *Orig,
12944 UsingShadowDecl *PrevDecl) {
12945 // If we resolved to another shadow declaration, just coalesce them.
12946 NamedDecl *Target = Orig;
12948 Target = cast<UsingShadowDecl>(Target)->getTargetDecl();
12949 assert(!isa<UsingShadowDecl>(Target) && "nested shadow declaration");
12950 }
12951
12952 NamedDecl *NonTemplateTarget = Target;
12953 if (auto *TargetTD = dyn_cast<TemplateDecl>(Target))
12954 NonTemplateTarget = TargetTD->getTemplatedDecl();
12955
12956 UsingShadowDecl *Shadow;
12957 if (NonTemplateTarget && isa<CXXConstructorDecl>(NonTemplateTarget)) {
12958 UsingDecl *Using = cast<UsingDecl>(BUD);
12959 bool IsVirtualBase =
12961 Using->getQualifier().getAsRecordDecl());
12963 Context, CurContext, Using->getLocation(), Using, Orig, IsVirtualBase);
12964 } else {
12966 Target->getDeclName(), BUD, Target);
12967 }
12968 BUD->addShadowDecl(Shadow);
12969
12970 Shadow->setAccess(BUD->getAccess());
12971 if (Orig->isInvalidDecl() || BUD->isInvalidDecl())
12972 Shadow->setInvalidDecl();
12973
12974 Shadow->setPreviousDecl(PrevDecl);
12975
12976 if (S)
12977 PushOnScopeChains(Shadow, S);
12978 else
12979 CurContext->addDecl(Shadow);
12980
12981
12982 return Shadow;
12983}
12984
12986 if (Shadow->getDeclName().getNameKind() ==
12988 cast<CXXRecordDecl>(Shadow->getDeclContext())->removeConversion(Shadow);
12989
12990 // Remove it from the DeclContext...
12991 Shadow->getDeclContext()->removeDecl(Shadow);
12992
12993 // ...and the scope, if applicable...
12994 if (S) {
12995 S->RemoveDecl(Shadow);
12996 IdResolver.RemoveDecl(Shadow);
12997 }
12998
12999 // ...and the using decl.
13000 Shadow->getIntroducer()->removeShadowDecl(Shadow);
13001
13002 // TODO: complain somehow if Shadow was used. It shouldn't
13003 // be possible for this to happen, because...?
13004}
13005
13006/// Find the base specifier for a base class with the given type.
13008 QualType DesiredBase,
13009 bool &AnyDependentBases) {
13010 // Check whether the named type is a direct base class.
13011 CanQualType CanonicalDesiredBase = DesiredBase->getCanonicalTypeUnqualified()
13013 for (auto &Base : Derived->bases()) {
13014 CanQualType BaseType = Base.getType()->getCanonicalTypeUnqualified();
13015 if (CanonicalDesiredBase == BaseType)
13016 return &Base;
13017 if (BaseType->isDependentType())
13018 AnyDependentBases = true;
13019 }
13020 return nullptr;
13021}
13022
13023namespace {
13024class UsingValidatorCCC final : public CorrectionCandidateCallback {
13025public:
13026 UsingValidatorCCC(bool HasTypenameKeyword, bool IsInstantiation,
13027 NestedNameSpecifier NNS, CXXRecordDecl *RequireMemberOf)
13028 : HasTypenameKeyword(HasTypenameKeyword),
13029 IsInstantiation(IsInstantiation), OldNNS(NNS),
13030 RequireMemberOf(RequireMemberOf) {}
13031
13032 bool ValidateCandidate(const TypoCorrection &Candidate) override {
13033 NamedDecl *ND = Candidate.getCorrectionDecl();
13034
13035 // Keywords are not valid here.
13036 if (!ND || isa<NamespaceDecl>(ND))
13037 return false;
13038
13039 // Completely unqualified names are invalid for a 'using' declaration.
13040 if (Candidate.WillReplaceSpecifier() && !Candidate.getCorrectionSpecifier())
13041 return false;
13042
13043 // FIXME: Don't correct to a name that CheckUsingDeclRedeclaration would
13044 // reject.
13045
13046 if (RequireMemberOf) {
13047 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13048 if (FoundRecord && FoundRecord->isInjectedClassName()) {
13049 // No-one ever wants a using-declaration to name an injected-class-name
13050 // of a base class, unless they're declaring an inheriting constructor.
13051 ASTContext &Ctx = ND->getASTContext();
13052 if (!Ctx.getLangOpts().CPlusPlus11)
13053 return false;
13054 CanQualType FoundType = Ctx.getCanonicalTagType(FoundRecord);
13055
13056 // Check that the injected-class-name is named as a member of its own
13057 // type; we don't want to suggest 'using Derived::Base;', since that
13058 // means something else.
13059 NestedNameSpecifier Specifier = Candidate.WillReplaceSpecifier()
13060 ? Candidate.getCorrectionSpecifier()
13061 : OldNNS;
13062 if (Specifier.getKind() != NestedNameSpecifier::Kind::Type ||
13063 !Ctx.hasSameType(QualType(Specifier.getAsType(), 0), FoundType))
13064 return false;
13065
13066 // Check that this inheriting constructor declaration actually names a
13067 // direct base class of the current class.
13068 bool AnyDependentBases = false;
13069 if (!findDirectBaseWithType(RequireMemberOf,
13070 Ctx.getCanonicalTagType(FoundRecord),
13071 AnyDependentBases) &&
13072 !AnyDependentBases)
13073 return false;
13074 } else {
13075 auto *RD = dyn_cast<CXXRecordDecl>(ND->getDeclContext());
13076 if (!RD || RequireMemberOf->isProvablyNotDerivedFrom(RD))
13077 return false;
13078
13079 // FIXME: Check that the base class member is accessible?
13080 }
13081 } else {
13082 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
13083 if (FoundRecord && FoundRecord->isInjectedClassName())
13084 return false;
13085 }
13086
13087 if (isa<TypeDecl>(ND))
13088 return HasTypenameKeyword || !IsInstantiation;
13089
13090 return !HasTypenameKeyword;
13091 }
13092
13093 std::unique_ptr<CorrectionCandidateCallback> clone() override {
13094 return std::make_unique<UsingValidatorCCC>(*this);
13095 }
13096
13097private:
13098 bool HasTypenameKeyword;
13099 bool IsInstantiation;
13100 NestedNameSpecifier OldNNS;
13101 CXXRecordDecl *RequireMemberOf;
13102};
13103} // end anonymous namespace
13104
13106 // It is really dumb that we have to do this.
13107 LookupResult::Filter F = Previous.makeFilter();
13108 while (F.hasNext()) {
13109 NamedDecl *D = F.next();
13110 if (!isDeclInScope(D, CurContext, S))
13111 F.erase();
13112 // If we found a local extern declaration that's not ordinarily visible,
13113 // and this declaration is being added to a non-block scope, ignore it.
13114 // We're only checking for scope conflicts here, not also for violations
13115 // of the linkage rules.
13116 else if (!CurContext->isFunctionOrMethod() && D->isLocalExternDecl() &&
13118 F.erase();
13119 }
13120 F.done();
13121}
13122
13124 Scope *S, AccessSpecifier AS, SourceLocation UsingLoc,
13125 bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS,
13126 DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc,
13127 const ParsedAttributesView &AttrList, bool IsInstantiation,
13128 bool IsUsingIfExists) {
13129 assert(!SS.isInvalid() && "Invalid CXXScopeSpec.");
13130 SourceLocation IdentLoc = NameInfo.getLoc();
13131 assert(IdentLoc.isValid() && "Invalid TargetName location.");
13132
13133 // FIXME: We ignore attributes for now.
13134
13135 // For an inheriting constructor declaration, the name of the using
13136 // declaration is the name of a constructor in this class, not in the
13137 // base class.
13138 DeclarationNameInfo UsingName = NameInfo;
13140 if (auto *RD = dyn_cast<CXXRecordDecl>(CurContext))
13141 UsingName.setName(Context.DeclarationNames.getCXXConstructorName(
13142 Context.getCanonicalTagType(RD)));
13143
13144 // Do the redeclaration lookup in the current scope.
13145 LookupResult Previous(*this, UsingName, LookupUsingDeclName,
13147 Previous.setHideTags(false);
13148 if (S) {
13149 LookupName(Previous, S);
13150
13152 } else {
13153 assert(IsInstantiation && "no scope in non-instantiation");
13154 if (CurContext->isRecord())
13156 else {
13157 // No redeclaration check is needed here; in non-member contexts we
13158 // diagnosed all possible conflicts with other using-declarations when
13159 // building the template:
13160 //
13161 // For a dependent non-type using declaration, the only valid case is
13162 // if we instantiate to a single enumerator. We check for conflicts
13163 // between shadow declarations we introduce, and we check in the template
13164 // definition for conflicts between a non-type using declaration and any
13165 // other declaration, which together covers all cases.
13166 //
13167 // A dependent typename using declaration will never successfully
13168 // instantiate, since it will always name a class member, so we reject
13169 // that in the template definition.
13170 }
13171 }
13172
13173 // Check for invalid redeclarations.
13174 if (CheckUsingDeclRedeclaration(UsingLoc, HasTypenameKeyword,
13175 SS, IdentLoc, Previous))
13176 return nullptr;
13177
13178 // 'using_if_exists' doesn't make sense on an inherited constructor.
13179 if (IsUsingIfExists && UsingName.getName().getNameKind() ==
13181 Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
13182 return nullptr;
13183 }
13184
13185 DeclContext *LookupContext = computeDeclContext(SS);
13187 if (!LookupContext || EllipsisLoc.isValid()) {
13188 NamedDecl *D;
13189 // Dependent scope, or an unexpanded pack
13190 if (!LookupContext && CheckUsingDeclQualifier(UsingLoc, HasTypenameKeyword,
13191 SS, NameInfo, IdentLoc))
13192 return nullptr;
13193
13194 if (Previous.isSingleResult() &&
13195 Previous.getFoundDecl()->isTemplateParameter())
13196 DiagnoseTemplateParameterShadow(IdentLoc, Previous.getFoundDecl());
13197
13198 if (HasTypenameKeyword) {
13199 // FIXME: not all declaration name kinds are legal here
13201 UsingLoc, TypenameLoc,
13202 QualifierLoc,
13203 IdentLoc, NameInfo.getName(),
13204 EllipsisLoc);
13205 } else {
13207 QualifierLoc, NameInfo, EllipsisLoc);
13208 }
13209 D->setAccess(AS);
13210 CurContext->addDecl(D);
13211 ProcessDeclAttributeList(S, D, AttrList);
13212 return D;
13213 }
13214
13215 auto Build = [&](bool Invalid) {
13216 UsingDecl *UD =
13217 UsingDecl::Create(Context, CurContext, UsingLoc, QualifierLoc,
13218 UsingName, HasTypenameKeyword);
13219 UD->setAccess(AS);
13220 CurContext->addDecl(UD);
13221 ProcessDeclAttributeList(S, UD, AttrList);
13223 return UD;
13224 };
13225 auto BuildInvalid = [&]{ return Build(true); };
13226 auto BuildValid = [&]{ return Build(false); };
13227
13228 if (RequireCompleteDeclContext(SS, LookupContext))
13229 return BuildInvalid();
13230
13231 // Look up the target name.
13232 LookupResult R(*this, NameInfo, LookupOrdinaryName);
13233
13234 // Unlike most lookups, we don't always want to hide tag
13235 // declarations: tag names are visible through the using declaration
13236 // even if hidden by ordinary names, *except* in a dependent context
13237 // where they may be used by two-phase lookup.
13238 if (!IsInstantiation)
13239 R.setHideTags(false);
13240
13241 // For the purposes of this lookup, we have a base object type
13242 // equal to that of the current context.
13243 if (CurContext->isRecord()) {
13245 Context.getCanonicalTagType(cast<CXXRecordDecl>(CurContext)));
13246 }
13247
13248 LookupQualifiedName(R, LookupContext);
13249
13250 // Validate the context, now we have a lookup
13251 if (CheckUsingDeclQualifier(UsingLoc, HasTypenameKeyword, SS, NameInfo,
13252 IdentLoc, &R))
13253 return nullptr;
13254
13255 if (R.empty() && IsUsingIfExists)
13257 UsingName.getName()),
13258 AS_public);
13259
13260 // Try to correct typos if possible. If constructor name lookup finds no
13261 // results, that means the named class has no explicit constructors, and we
13262 // suppressed declaring implicit ones (probably because it's dependent or
13263 // invalid).
13264 if (R.empty() &&
13266 // HACK 2017-01-08: Work around an issue with libstdc++'s detection of
13267 // ::gets. Sometimes it believes that glibc provides a ::gets in cases where
13268 // it does not. The issue was fixed in libstdc++ 6.3 (2016-12-21) and later.
13269 auto *II = NameInfo.getName().getAsIdentifierInfo();
13270 if (getLangOpts().CPlusPlus14 && II && II->isStr("gets") &&
13271 CurContext->isStdNamespace() &&
13272 isa<TranslationUnitDecl>(LookupContext) &&
13273 PP.NeedsStdLibCxxWorkaroundBefore(2016'12'21) &&
13274 getSourceManager().isInSystemHeader(UsingLoc))
13275 return nullptr;
13276 UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.getScopeRep(),
13277 dyn_cast<CXXRecordDecl>(CurContext));
13278 if (TypoCorrection Corrected =
13279 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
13281 // We reject candidates where DroppedSpecifier == true, hence the
13282 // literal '0' below.
13283 diagnoseTypo(Corrected, PDiag(diag::err_no_member_suggest)
13284 << NameInfo.getName() << LookupContext << 0
13285 << SS.getRange());
13286
13287 // If we picked a correction with no attached Decl we can't do anything
13288 // useful with it, bail out.
13289 NamedDecl *ND = Corrected.getCorrectionDecl();
13290 if (!ND)
13291 return BuildInvalid();
13292
13293 // If we corrected to an inheriting constructor, handle it as one.
13294 auto *RD = dyn_cast<CXXRecordDecl>(ND);
13295 if (RD && RD->isInjectedClassName()) {
13296 // The parent of the injected class name is the class itself.
13297 RD = cast<CXXRecordDecl>(RD->getParent());
13298
13299 // Fix up the information we'll use to build the using declaration.
13300 if (Corrected.WillReplaceSpecifier()) {
13302 Builder.MakeTrivial(Context, Corrected.getCorrectionSpecifier(),
13303 QualifierLoc.getSourceRange());
13304 QualifierLoc = Builder.getWithLocInContext(Context);
13305 }
13306
13307 // In this case, the name we introduce is the name of a derived class
13308 // constructor.
13309 auto *CurClass = cast<CXXRecordDecl>(CurContext);
13310 UsingName.setName(Context.DeclarationNames.getCXXConstructorName(
13311 Context.getCanonicalTagType(CurClass)));
13312 UsingName.setNamedTypeInfo(nullptr);
13313 for (auto *Ctor : LookupConstructors(RD))
13314 R.addDecl(Ctor);
13315 R.resolveKind();
13316 } else {
13317 // FIXME: Pick up all the declarations if we found an overloaded
13318 // function.
13319 UsingName.setName(ND->getDeclName());
13320 R.addDecl(ND);
13321 }
13322 } else {
13323 Diag(IdentLoc, diag::err_no_member)
13324 << NameInfo.getName() << LookupContext << SS.getRange();
13325 return BuildInvalid();
13326 }
13327 }
13328
13329 if (R.isAmbiguous())
13330 return BuildInvalid();
13331
13332 if (HasTypenameKeyword) {
13333 // If we asked for a typename and got a non-type decl, error out.
13334 if (!R.getAsSingle<TypeDecl>() &&
13336 Diag(IdentLoc, diag::err_using_typename_non_type);
13337 for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I)
13338 Diag((*I)->getUnderlyingDecl()->getLocation(),
13339 diag::note_using_decl_target);
13340 return BuildInvalid();
13341 }
13342 } else {
13343 // If we asked for a non-typename and we got a type, error out,
13344 // but only if this is an instantiation of an unresolved using
13345 // decl. Otherwise just silently find the type name.
13346 if (IsInstantiation && R.getAsSingle<TypeDecl>()) {
13347 Diag(IdentLoc, diag::err_using_dependent_value_is_type);
13348 Diag(R.getFoundDecl()->getLocation(), diag::note_using_decl_target);
13349 return BuildInvalid();
13350 }
13351 }
13352
13353 // C++14 [namespace.udecl]p6:
13354 // A using-declaration shall not name a namespace.
13355 if (R.getAsSingle<NamespaceDecl>()) {
13356 Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)
13357 << SS.getRange();
13358 // Suggest using 'using namespace ...' instead.
13359 Diag(SS.getBeginLoc(), diag::note_namespace_using_decl)
13360 << FixItHint::CreateInsertion(SS.getBeginLoc(), "namespace ");
13361 return BuildInvalid();
13362 }
13363
13364 UsingDecl *UD = BuildValid();
13365
13366 // Some additional rules apply to inheriting constructors.
13367 if (UsingName.getName().getNameKind() ==
13369 // Suppress access diagnostics; the access check is instead performed at the
13370 // point of use for an inheriting constructor.
13373 return UD;
13374 }
13375
13376 for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) {
13377 UsingShadowDecl *PrevDecl = nullptr;
13378 if (!CheckUsingShadowDecl(UD, *I, Previous, PrevDecl))
13379 BuildUsingShadowDecl(S, UD, *I, PrevDecl);
13380 }
13381
13382 return UD;
13383}
13384
13386 SourceLocation UsingLoc,
13387 SourceLocation EnumLoc,
13388 SourceLocation NameLoc,
13389 TypeSourceInfo *EnumType,
13390 EnumDecl *ED) {
13391 bool Invalid = false;
13392
13393 if (CurContext->getRedeclContext()->isRecord()) {
13394 /// In class scope, check if this is a duplicate, for better a diagnostic.
13395 DeclarationNameInfo UsingEnumName(ED->getDeclName(), NameLoc);
13396 LookupResult Previous(*this, UsingEnumName, LookupUsingDeclName,
13398
13400
13401 for (NamedDecl *D : Previous)
13402 if (UsingEnumDecl *UED = dyn_cast<UsingEnumDecl>(D))
13403 if (UED->getEnumDecl() == ED) {
13404 Diag(UsingLoc, diag::err_using_enum_decl_redeclaration)
13405 << SourceRange(EnumLoc, NameLoc);
13406 Diag(D->getLocation(), diag::note_using_enum_decl) << 1;
13407 Invalid = true;
13408 break;
13409 }
13410 }
13411
13412 if (RequireCompleteEnumDecl(ED, NameLoc))
13413 Invalid = true;
13414
13416 EnumLoc, NameLoc, EnumType);
13417 UD->setAccess(AS);
13418 CurContext->addDecl(UD);
13419
13420 if (Invalid) {
13421 UD->setInvalidDecl();
13422 return UD;
13423 }
13424
13425 // Create the shadow decls for each enumerator
13426 for (EnumConstantDecl *EC : ED->enumerators()) {
13427 UsingShadowDecl *PrevDecl = nullptr;
13428 DeclarationNameInfo DNI(EC->getDeclName(), EC->getLocation());
13431 LookupName(Previous, S);
13433
13434 if (!CheckUsingShadowDecl(UD, EC, Previous, PrevDecl))
13435 BuildUsingShadowDecl(S, UD, EC, PrevDecl);
13436 }
13437
13438 return UD;
13439}
13440
13442 ArrayRef<NamedDecl *> Expansions) {
13443 assert(isa<UnresolvedUsingValueDecl>(InstantiatedFrom) ||
13444 isa<UnresolvedUsingTypenameDecl>(InstantiatedFrom) ||
13445 isa<UsingPackDecl>(InstantiatedFrom));
13446
13447 auto *UPD =
13448 UsingPackDecl::Create(Context, CurContext, InstantiatedFrom, Expansions);
13449 UPD->setAccess(InstantiatedFrom->getAccess());
13450 CurContext->addDecl(UPD);
13451 return UPD;
13452}
13453
13455 assert(!UD->hasTypename() && "expecting a constructor name");
13456
13457 QualType SourceType(UD->getQualifier().getAsType(), 0);
13459
13460 // Check whether the named type is a direct base class.
13461 bool AnyDependentBases = false;
13462 auto *Base =
13463 findDirectBaseWithType(TargetClass, SourceType, AnyDependentBases);
13464 if (!Base && !AnyDependentBases) {
13465 Diag(UD->getUsingLoc(), diag::err_using_decl_constructor_not_in_direct_base)
13466 << UD->getNameInfo().getSourceRange() << SourceType << TargetClass;
13467 UD->setInvalidDecl();
13468 return true;
13469 }
13470
13471 if (Base)
13472 Base->setInheritConstructors();
13473
13474 return false;
13475}
13476
13478 bool HasTypenameKeyword,
13479 const CXXScopeSpec &SS,
13480 SourceLocation NameLoc,
13481 const LookupResult &Prev) {
13482 NestedNameSpecifier Qual = SS.getScopeRep();
13483
13484 // C++03 [namespace.udecl]p8:
13485 // C++0x [namespace.udecl]p10:
13486 // A using-declaration is a declaration and can therefore be used
13487 // repeatedly where (and only where) multiple declarations are
13488 // allowed.
13489 //
13490 // That's in non-member contexts.
13491 if (!CurContext->getRedeclContext()->isRecord()) {
13492 // A dependent qualifier outside a class can only ever resolve to an
13493 // enumeration type. Therefore it conflicts with any other non-type
13494 // declaration in the same scope.
13495 // FIXME: How should we check for dependent type-type conflicts at block
13496 // scope?
13497 if (Qual.isDependent() && !HasTypenameKeyword) {
13498 for (auto *D : Prev) {
13499 if (!isa<TypeDecl>(D) && !isa<UsingDecl>(D) && !isa<UsingPackDecl>(D)) {
13500 bool OldCouldBeEnumerator =
13502 Diag(NameLoc,
13503 OldCouldBeEnumerator ? diag::err_redefinition
13504 : diag::err_redefinition_different_kind)
13505 << Prev.getLookupName();
13506 Diag(D->getLocation(), diag::note_previous_definition);
13507 return true;
13508 }
13509 }
13510 }
13511 return false;
13512 }
13513
13514 NestedNameSpecifier CNNS = Qual.getCanonical();
13515 for (LookupResult::iterator I = Prev.begin(), E = Prev.end(); I != E; ++I) {
13516 NamedDecl *D = *I;
13517
13518 bool DTypename;
13519 NestedNameSpecifier DQual = std::nullopt;
13520 if (UsingDecl *UD = dyn_cast<UsingDecl>(D)) {
13521 DTypename = UD->hasTypename();
13522 DQual = UD->getQualifier();
13523 } else if (UnresolvedUsingValueDecl *UD
13524 = dyn_cast<UnresolvedUsingValueDecl>(D)) {
13525 DTypename = false;
13526 DQual = UD->getQualifier();
13527 } else if (UnresolvedUsingTypenameDecl *UD
13528 = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
13529 DTypename = true;
13530 DQual = UD->getQualifier();
13531 } else continue;
13532
13533 // using decls differ if one says 'typename' and the other doesn't.
13534 // FIXME: non-dependent using decls?
13535 if (HasTypenameKeyword != DTypename) continue;
13536
13537 // using decls differ if they name different scopes (but note that
13538 // template instantiation can cause this check to trigger when it
13539 // didn't before instantiation).
13540 if (CNNS != DQual.getCanonical())
13541 continue;
13542
13543 Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.getRange();
13544 Diag(D->getLocation(), diag::note_using_decl) << 1;
13545 return true;
13546 }
13547
13548 return false;
13549}
13550
13551bool Sema::CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
13552 const CXXScopeSpec &SS,
13553 const DeclarationNameInfo &NameInfo,
13554 SourceLocation NameLoc,
13555 const LookupResult *R, const UsingDecl *UD) {
13556 DeclContext *NamedContext = computeDeclContext(SS);
13557 assert(bool(NamedContext) == (R || UD) && !(R && UD) &&
13558 "resolvable context must have exactly one set of decls");
13559
13560 // C++ 20 permits using an enumerator that does not have a class-hierarchy
13561 // relationship.
13562 bool Cxx20Enumerator = false;
13563 if (NamedContext) {
13564 EnumConstantDecl *EC = nullptr;
13565 if (R)
13566 EC = R->getAsSingle<EnumConstantDecl>();
13567 else if (UD && UD->shadow_size() == 1)
13568 EC = dyn_cast<EnumConstantDecl>(UD->shadow_begin()->getTargetDecl());
13569 if (EC)
13570 Cxx20Enumerator = getLangOpts().CPlusPlus20;
13571
13572 if (auto *ED = dyn_cast<EnumDecl>(NamedContext)) {
13573 // C++14 [namespace.udecl]p7:
13574 // A using-declaration shall not name a scoped enumerator.
13575 // C++20 p1099 permits enumerators.
13576 if (EC && R && ED->isScoped())
13577 Diag(SS.getBeginLoc(),
13579 ? diag::warn_cxx17_compat_using_decl_scoped_enumerator
13580 : diag::ext_using_decl_scoped_enumerator)
13581 << SS.getRange();
13582
13583 // We want to consider the scope of the enumerator
13584 NamedContext = ED->getDeclContext();
13585 }
13586 }
13587
13588 if (!CurContext->isRecord()) {
13589 // C++03 [namespace.udecl]p3:
13590 // C++0x [namespace.udecl]p8:
13591 // A using-declaration for a class member shall be a member-declaration.
13592 // C++20 [namespace.udecl]p7
13593 // ... other than an enumerator ...
13594
13595 // If we weren't able to compute a valid scope, it might validly be a
13596 // dependent class or enumeration scope. If we have a 'typename' keyword,
13597 // the scope must resolve to a class type.
13598 if (NamedContext ? !NamedContext->getRedeclContext()->isRecord()
13599 : !HasTypename)
13600 return false; // OK
13601
13602 Diag(NameLoc,
13603 Cxx20Enumerator
13604 ? diag::warn_cxx17_compat_using_decl_class_member_enumerator
13605 : diag::err_using_decl_can_not_refer_to_class_member)
13606 << SS.getRange();
13607
13608 if (Cxx20Enumerator)
13609 return false; // OK
13610
13611 auto *RD = NamedContext
13612 ? cast<CXXRecordDecl>(NamedContext->getRedeclContext())
13613 : nullptr;
13614 if (RD && !RequireCompleteDeclContext(const_cast<CXXScopeSpec &>(SS), RD)) {
13615 // See if there's a helpful fixit
13616
13617 if (!R) {
13618 // We will have already diagnosed the problem on the template
13619 // definition, Maybe we should do so again?
13620 } else if (R->getAsSingle<TypeDecl>()) {
13621 if (getLangOpts().CPlusPlus11) {
13622 // Convert 'using X::Y;' to 'using Y = X::Y;'.
13623 Diag(SS.getBeginLoc(), diag::note_using_decl_class_member_workaround)
13624 << diag::MemClassWorkaround::AliasDecl
13626 NameInfo.getName().getAsString() +
13627 " = ");
13628 } else {
13629 // Convert 'using X::Y;' to 'typedef X::Y Y;'.
13630 SourceLocation InsertLoc = getLocForEndOfToken(NameInfo.getEndLoc());
13631 Diag(InsertLoc, diag::note_using_decl_class_member_workaround)
13632 << diag::MemClassWorkaround::TypedefDecl
13633 << FixItHint::CreateReplacement(UsingLoc, "typedef")
13635 InsertLoc, " " + NameInfo.getName().getAsString());
13636 }
13637 } else if (R->getAsSingle<VarDecl>()) {
13638 // Don't provide a fixit outside C++11 mode; we don't want to suggest
13639 // repeating the type of the static data member here.
13640 FixItHint FixIt;
13641 if (getLangOpts().CPlusPlus11) {
13642 // Convert 'using X::Y;' to 'auto &Y = X::Y;'.
13644 UsingLoc, "auto &" + NameInfo.getName().getAsString() + " = ");
13645 }
13646
13647 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13648 << diag::MemClassWorkaround::ReferenceDecl << FixIt;
13649 } else if (R->getAsSingle<EnumConstantDecl>()) {
13650 // Don't provide a fixit outside C++11 mode; we don't want to suggest
13651 // repeating the type of the enumeration here, and we can't do so if
13652 // the type is anonymous.
13653 FixItHint FixIt;
13654 if (getLangOpts().CPlusPlus11) {
13655 // Convert 'using X::Y;' to 'auto &Y = X::Y;'.
13657 UsingLoc,
13658 "constexpr auto " + NameInfo.getName().getAsString() + " = ");
13659 }
13660
13661 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13662 << (getLangOpts().CPlusPlus11
13663 ? diag::MemClassWorkaround::ConstexprVar
13664 : diag::MemClassWorkaround::ConstVar)
13665 << FixIt;
13666 }
13667 }
13668
13669 return true; // Fail
13670 }
13671
13672 // If the named context is dependent, we can't decide much.
13673 if (!NamedContext) {
13674 // FIXME: in C++0x, we can diagnose if we can prove that the
13675 // nested-name-specifier does not refer to a base class, which is
13676 // still possible in some cases.
13677
13678 // Otherwise we have to conservatively report that things might be
13679 // okay.
13680 return false;
13681 }
13682
13683 // The current scope is a record.
13684 if (!NamedContext->isRecord()) {
13685 // Ideally this would point at the last name in the specifier,
13686 // but we don't have that level of source info.
13687 Diag(SS.getBeginLoc(),
13688 Cxx20Enumerator
13689 ? diag::warn_cxx17_compat_using_decl_non_member_enumerator
13690 : diag::err_using_decl_nested_name_specifier_is_not_class)
13691 << SS.getScopeRep() << SS.getRange();
13692
13693 if (Cxx20Enumerator)
13694 return false; // OK
13695
13696 return true;
13697 }
13698
13699 if (!NamedContext->isDependentContext() &&
13700 RequireCompleteDeclContext(const_cast<CXXScopeSpec&>(SS), NamedContext))
13701 return true;
13702
13703 // C++26 [namespace.udecl]p3:
13704 // In a using-declaration used as a member-declaration, each
13705 // using-declarator shall either name an enumerator or have a
13706 // nested-name-specifier naming a base class of the current class
13707 // ([expr.prim.this]). ...
13708 // "have a nested-name-specifier naming a base class of the current class"
13709 // was introduced by CWG400.
13710
13713
13714 if (Cxx20Enumerator) {
13715 Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
13716 << SS.getScopeRep() << SS.getRange();
13717 return false;
13718 }
13719
13720 if (CurContext == NamedContext) {
13721 Diag(SS.getBeginLoc(),
13722 diag::err_using_decl_nested_name_specifier_is_current_class)
13723 << SS.getRange();
13724 return true;
13725 }
13726
13727 if (!cast<CXXRecordDecl>(NamedContext)->isInvalidDecl()) {
13728 Diag(SS.getBeginLoc(),
13729 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13731 << SS.getRange();
13732 }
13733 return true;
13734 }
13735
13736 return false;
13737}
13738
13740 MultiTemplateParamsArg TemplateParamLists,
13741 SourceLocation UsingLoc, UnqualifiedId &Name,
13742 const ParsedAttributesView &AttrList,
13743 TypeResult Type, Decl *DeclFromDeclSpec) {
13744
13745 if (Type.isInvalid())
13746 return nullptr;
13747
13748 bool Invalid = false;
13750 TypeSourceInfo *TInfo = nullptr;
13751 GetTypeFromParser(Type.get(), &TInfo);
13752
13753 if (DiagnoseClassNameShadow(CurContext, NameInfo))
13754 return nullptr;
13755
13758 Invalid = true;
13759 TInfo = Context.getTrivialTypeSourceInfo(Context.IntTy,
13760 TInfo->getTypeLoc().getBeginLoc());
13761 }
13762
13763 LookupResult Previous(*this, NameInfo, LookupOrdinaryName,
13764 TemplateParamLists.size()
13767 LookupName(Previous, S);
13768
13769 // Warn about shadowing the name of a template parameter.
13770 if (Previous.isSingleResult() &&
13771 Previous.getFoundDecl()->isTemplateParameter()) {
13773 Previous.clear();
13774 }
13775
13776 assert(Name.getKind() == UnqualifiedIdKind::IK_Identifier &&
13777 "name in alias declaration must be an identifier");
13779 Name.StartLocation,
13780 Name.Identifier, TInfo);
13781
13782 NewTD->setAccess(AS);
13783
13784 if (Invalid)
13785 NewTD->setInvalidDecl();
13786
13787 ProcessDeclAttributeList(S, NewTD, AttrList);
13788 AddPragmaAttributes(S, NewTD);
13789 ProcessAPINotes(NewTD);
13790
13792 Invalid |= NewTD->isInvalidDecl();
13793
13794 // Get the innermost enclosing declaration scope.
13795 S = S->getDeclParent();
13796
13797 bool Redeclaration = false;
13798
13799 NamedDecl *NewND;
13800 if (TemplateParamLists.size()) {
13801 TypeAliasTemplateDecl *OldDecl = nullptr;
13802 TemplateParameterList *OldTemplateParams = nullptr;
13803
13804 if (TemplateParamLists.size() != 1) {
13805 Diag(UsingLoc, diag::err_alias_template_extra_headers)
13806 << SourceRange(TemplateParamLists[1]->getTemplateLoc(),
13807 TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());
13808 Invalid = true;
13809 }
13810 TemplateParameterList *TemplateParams = TemplateParamLists[0];
13811
13812 // Check that we can declare a template here.
13813 if (CheckTemplateDeclScope(S, TemplateParams))
13814 return nullptr;
13815
13816 // Only consider previous declarations in the same scope.
13817 FilterLookupForScope(Previous, CurContext, S, /*ConsiderLinkage*/false,
13818 /*ExplicitInstantiationOrSpecialization*/false);
13819 if (!Previous.empty()) {
13820 Redeclaration = true;
13821
13822 OldDecl = Previous.getAsSingle<TypeAliasTemplateDecl>();
13823 if (!OldDecl && !Invalid) {
13824 Diag(UsingLoc, diag::err_redefinition_different_kind)
13825 << Name.Identifier;
13826
13827 NamedDecl *OldD = Previous.getRepresentativeDecl();
13828 if (OldD->getLocation().isValid())
13829 Diag(OldD->getLocation(), diag::note_previous_definition);
13830
13831 Invalid = true;
13832 }
13833
13834 if (!Invalid && OldDecl && !OldDecl->isInvalidDecl()) {
13835 if (TemplateParameterListsAreEqual(TemplateParams,
13836 OldDecl->getTemplateParameters(),
13837 /*Complain=*/true,
13839 OldTemplateParams =
13841 else
13842 Invalid = true;
13843
13844 TypeAliasDecl *OldTD = OldDecl->getTemplatedDecl();
13845 if (!Invalid &&
13846 !Context.hasSameType(OldTD->getUnderlyingType(),
13847 NewTD->getUnderlyingType())) {
13848 // FIXME: The C++0x standard does not clearly say this is ill-formed,
13849 // but we can't reasonably accept it.
13850 Diag(NewTD->getLocation(), diag::err_redefinition_different_typedef)
13851 << 2 << NewTD->getUnderlyingType() << OldTD->getUnderlyingType();
13852 if (OldTD->getLocation().isValid())
13853 Diag(OldTD->getLocation(), diag::note_previous_definition);
13854 Invalid = true;
13855 }
13856 }
13857 }
13858
13859 // Merge any previous default template arguments into our parameters,
13860 // and check the parameter list.
13861 if (CheckTemplateParameterList(TemplateParams, OldTemplateParams,
13862 TPC_Other))
13863 return nullptr;
13864
13865 TypeAliasTemplateDecl *NewDecl =
13867 Name.Identifier, TemplateParams,
13868 NewTD);
13869 NewTD->setDescribedAliasTemplate(NewDecl);
13870
13871 NewDecl->setAccess(AS);
13872
13873 if (Invalid)
13874 NewDecl->setInvalidDecl();
13875 else if (OldDecl) {
13876 NewDecl->setPreviousDecl(OldDecl);
13877 CheckRedeclarationInModule(NewDecl, OldDecl);
13878 }
13879
13880 NewND = NewDecl;
13881 } else {
13882 if (auto *TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {
13884 handleTagNumbering(TD, S);
13885 }
13887 NewND = NewTD;
13888 }
13889
13890 PushOnScopeChains(NewND, S);
13891 ActOnDocumentableDecl(NewND);
13892 return NewND;
13893}
13894
13896 SourceLocation AliasLoc,
13897 IdentifierInfo *Alias, CXXScopeSpec &SS,
13898 SourceLocation IdentLoc,
13899 IdentifierInfo *Ident) {
13900
13901 // Lookup the namespace name.
13902 LookupResult R(*this, Ident, IdentLoc, LookupNamespaceName);
13903 LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
13904
13905 if (R.isAmbiguous())
13906 return nullptr;
13907
13908 if (R.empty()) {
13909 if (!TryNamespaceTypoCorrection(*this, R, S, SS, IdentLoc, Ident)) {
13910 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.getRange();
13911 return nullptr;
13912 }
13913 }
13914 assert(!R.isAmbiguous() && !R.empty());
13916
13917 // Check if we have a previous declaration with the same name.
13918 LookupResult PrevR(*this, Alias, AliasLoc, LookupOrdinaryName,
13920 LookupName(PrevR, S);
13921
13922 // Check we're not shadowing a template parameter.
13923 if (PrevR.isSingleResult() && PrevR.getFoundDecl()->isTemplateParameter()) {
13925 PrevR.clear();
13926 }
13927
13928 // Filter out any other lookup result from an enclosing scope.
13929 FilterLookupForScope(PrevR, CurContext, S, /*ConsiderLinkage*/false,
13930 /*AllowInlineNamespace*/false);
13931
13932 // Find the previous declaration and check that we can redeclare it.
13933 NamespaceAliasDecl *Prev = nullptr;
13934 if (PrevR.isSingleResult()) {
13935 NamedDecl *PrevDecl = PrevR.getRepresentativeDecl();
13936 if (NamespaceAliasDecl *AD = dyn_cast<NamespaceAliasDecl>(PrevDecl)) {
13937 // We already have an alias with the same name that points to the same
13938 // namespace; check that it matches.
13939 if (AD->getNamespace()->Equals(getNamespaceDecl(ND))) {
13940 Prev = AD;
13941 } else if (isVisible(PrevDecl)) {
13942 Diag(AliasLoc, diag::err_redefinition_different_namespace_alias)
13943 << Alias;
13944 Diag(AD->getLocation(), diag::note_previous_namespace_alias)
13945 << AD->getNamespace();
13946 return nullptr;
13947 }
13948 } else if (isVisible(PrevDecl)) {
13949 unsigned DiagID = isa<NamespaceDecl>(PrevDecl->getUnderlyingDecl())
13950 ? diag::err_redefinition
13951 : diag::err_redefinition_different_kind;
13952 Diag(AliasLoc, DiagID) << Alias;
13953 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
13954 return nullptr;
13955 }
13956 }
13957
13958 // The use of a nested name specifier may trigger deprecation warnings.
13959 DiagnoseUseOfDecl(ND, IdentLoc);
13960
13962 NamespaceAliasDecl::Create(Context, CurContext, NamespaceLoc, AliasLoc,
13963 Alias, SS.getWithLocInContext(Context),
13964 IdentLoc, ND);
13965 if (Prev)
13966 AliasDecl->setPreviousDecl(Prev);
13967
13969 return AliasDecl;
13970}
13971
13972namespace {
13973struct SpecialMemberExceptionSpecInfo
13974 : SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {
13975 SourceLocation Loc;
13977
13978 SpecialMemberExceptionSpecInfo(Sema &S, CXXMethodDecl *MD,
13981 SourceLocation Loc)
13982 : SpecialMemberVisitor(S, MD, CSM, ICI), Loc(Loc), ExceptSpec(S) {}
13983
13984 bool visitBase(CXXBaseSpecifier *Base);
13985 bool visitField(FieldDecl *FD);
13986
13987 void visitClassSubobject(CXXRecordDecl *Class, Subobject Subobj,
13988 unsigned Quals);
13989
13990 void visitSubobjectCall(Subobject Subobj,
13992};
13993}
13994
13995bool SpecialMemberExceptionSpecInfo::visitBase(CXXBaseSpecifier *Base) {
13996 auto *BaseClass = Base->getType()->getAsCXXRecordDecl();
13997 if (!BaseClass)
13998 return false;
13999
14000 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
14001 if (auto *BaseCtor = SMOR.getMethod()) {
14002 visitSubobjectCall(Base, BaseCtor);
14003 return false;
14004 }
14005
14006 visitClassSubobject(BaseClass, Base, 0);
14007 return false;
14008}
14009
14010bool SpecialMemberExceptionSpecInfo::visitField(FieldDecl *FD) {
14011 if (CSM == CXXSpecialMemberKind::DefaultConstructor &&
14012 FD->hasInClassInitializer()) {
14013 Expr *E = FD->getInClassInitializer();
14014 if (!E)
14015 // FIXME: It's a little wasteful to build and throw away a
14016 // CXXDefaultInitExpr here.
14017 // FIXME: We should have a single context note pointing at Loc, and
14018 // this location should be MD->getLocation() instead, since that's
14019 // the location where we actually use the default init expression.
14020 E = S.BuildCXXDefaultInitExpr(Loc, FD).get();
14021 if (E)
14022 ExceptSpec.CalledExpr(E);
14023 } else if (auto *RD = S.Context.getBaseElementType(FD->getType())
14024 ->getAsCXXRecordDecl()) {
14025 visitClassSubobject(RD, FD, FD->getType().getCVRQualifiers());
14026 }
14027 return false;
14028}
14029
14030void SpecialMemberExceptionSpecInfo::visitClassSubobject(CXXRecordDecl *Class,
14031 Subobject Subobj,
14032 unsigned Quals) {
14033 FieldDecl *Field = Subobj.dyn_cast<FieldDecl*>();
14034 bool IsMutable = Field && Field->isMutable();
14035 visitSubobjectCall(Subobj, lookupIn(Class, Quals, IsMutable));
14036}
14037
14038void SpecialMemberExceptionSpecInfo::visitSubobjectCall(
14039 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR) {
14040 // Note, if lookup fails, it doesn't matter what exception specification we
14041 // choose because the special member will be deleted.
14042 if (CXXMethodDecl *MD = SMOR.getMethod())
14043 ExceptSpec.CalledDecl(getSubobjectLoc(Subobj), MD);
14044}
14045
14047 llvm::APSInt Result;
14049 ExplicitSpec.getExpr(), Context.BoolTy, Result, CCEKind::ExplicitBool);
14050 ExplicitSpec.setExpr(Converted.get());
14051 if (Converted.isUsable() && !Converted.get()->isValueDependent()) {
14052 ExplicitSpec.setKind(Result.getBoolValue()
14055 return true;
14056 }
14058 return false;
14059}
14060
14063 if (!ExplicitExpr->isTypeDependent())
14065 return ES;
14066}
14067
14072 ComputingExceptionSpec CES(S, MD, Loc);
14073
14074 CXXRecordDecl *ClassDecl = MD->getParent();
14075
14076 // C++ [except.spec]p14:
14077 // An implicitly declared special member function (Clause 12) shall have an
14078 // exception-specification. [...]
14079 SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->getLocation());
14080 if (ClassDecl->isInvalidDecl())
14081 return Info.ExceptSpec;
14082
14083 // FIXME: If this diagnostic fires, we're probably missing a check for
14084 // attempting to resolve an exception specification before it's known
14085 // at a higher level.
14086 if (S.RequireCompleteType(MD->getLocation(),
14087 S.Context.getCanonicalTagType(ClassDecl),
14088 diag::err_exception_spec_incomplete_type))
14089 return Info.ExceptSpec;
14090
14091 // C++1z [except.spec]p7:
14092 // [Look for exceptions thrown by] a constructor selected [...] to
14093 // initialize a potentially constructed subobject,
14094 // C++1z [except.spec]p8:
14095 // The exception specification for an implicitly-declared destructor, or a
14096 // destructor without a noexcept-specifier, is potentially-throwing if and
14097 // only if any of the destructors for any of its potentially constructed
14098 // subojects is potentially throwing.
14099 // FIXME: We respect the first rule but ignore the "potentially constructed"
14100 // in the second rule to resolve a core issue (no number yet) that would have
14101 // us reject:
14102 // struct A { virtual void f() = 0; virtual ~A() noexcept(false) = 0; };
14103 // struct B : A {};
14104 // struct C : B { void f(); };
14105 // ... due to giving B::~B() a non-throwing exception specification.
14106 Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases
14107 : Info.VisitAllBases);
14108
14109 return Info.ExceptSpec;
14110}
14111
14112namespace {
14113/// RAII object to register a special member as being currently declared.
14114struct DeclaringSpecialMember {
14115 Sema &S;
14117 Sema::ContextRAII SavedContext;
14118 bool WasAlreadyBeingDeclared;
14119
14120 DeclaringSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM)
14121 : S(S), D(RD, CSM), SavedContext(S, RD) {
14122 WasAlreadyBeingDeclared = !S.SpecialMembersBeingDeclared.insert(D).second;
14123 if (WasAlreadyBeingDeclared)
14124 // This almost never happens, but if it does, ensure that our cache
14125 // doesn't contain a stale result.
14126 S.SpecialMemberCache.clear();
14127 else {
14128 // Register a note to be produced if we encounter an error while
14129 // declaring the special member.
14130 Sema::CodeSynthesisContext Ctx;
14131 Ctx.Kind = Sema::CodeSynthesisContext::DeclaringSpecialMember;
14132 // FIXME: We don't have a location to use here. Using the class's
14133 // location maintains the fiction that we declare all special members
14134 // with the class, but (1) it's not clear that lying about that helps our
14135 // users understand what's going on, and (2) there may be outer contexts
14136 // on the stack (some of which are relevant) and printing them exposes
14137 // our lies.
14138 Ctx.PointOfInstantiation = RD->getLocation();
14139 Ctx.Entity = RD;
14140 Ctx.SpecialMember = CSM;
14141 S.pushCodeSynthesisContext(Ctx);
14142 }
14143 }
14144 ~DeclaringSpecialMember() {
14145 if (!WasAlreadyBeingDeclared) {
14146 S.SpecialMembersBeingDeclared.erase(D);
14148 }
14149 }
14150
14151 /// Are we already trying to declare this special member?
14152 bool isAlreadyBeingDeclared() const {
14153 return WasAlreadyBeingDeclared;
14154 }
14155};
14156}
14157
14159 // Look up any existing declarations, but don't trigger declaration of all
14160 // implicit special members with this name.
14161 DeclarationName Name = FD->getDeclName();
14164 for (auto *D : FD->getParent()->lookup(Name))
14165 if (auto *Acceptable = R.getAcceptableDecl(D))
14166 R.addDecl(Acceptable);
14167 R.resolveKind();
14169
14170 CheckFunctionDeclaration(S, FD, R, /*IsMemberSpecialization*/ false,
14172}
14173
14174void Sema::setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
14175 QualType ResultTy,
14176 ArrayRef<QualType> Args) {
14177 // Build an exception specification pointing back at this constructor.
14179
14180 LangAS AS = getDefaultCXXMethodAddrSpace();
14181 if (AS != LangAS::Default) {
14182 EPI.TypeQuals.addAddressSpace(AS);
14183 }
14184
14185 auto QT = Context.getFunctionType(ResultTy, Args, EPI);
14186 SpecialMem->setType(QT);
14187
14188 // During template instantiation of implicit special member functions we need
14189 // a reliable TypeSourceInfo for the function prototype in order to allow
14190 // functions to be substituted.
14191 if (inTemplateInstantiation() && isLambdaMethod(SpecialMem)) {
14192 TypeSourceInfo *TSI =
14193 Context.getTrivialTypeSourceInfo(SpecialMem->getType());
14194 SpecialMem->setTypeSourceInfo(TSI);
14195 }
14196}
14197
14199 CXXRecordDecl *ClassDecl) {
14200 // C++ [class.ctor]p5:
14201 // A default constructor for a class X is a constructor of class X
14202 // that can be called without an argument. If there is no
14203 // user-declared constructor for class X, a default constructor is
14204 // implicitly declared. An implicitly-declared default constructor
14205 // is an inline public member of its class.
14206 assert(ClassDecl->needsImplicitDefaultConstructor() &&
14207 "Should not build implicit default constructor!");
14208
14209 DeclaringSpecialMember DSM(*this, ClassDecl,
14211 if (DSM.isAlreadyBeingDeclared())
14212 return nullptr;
14213
14215 *this, ClassDecl, CXXSpecialMemberKind::DefaultConstructor, false);
14216
14217 // Create the actual constructor declaration.
14218 CanQualType ClassType = Context.getCanonicalTagType(ClassDecl);
14219 SourceLocation ClassLoc = ClassDecl->getLocation();
14220 DeclarationName Name
14221 = Context.DeclarationNames.getCXXConstructorName(ClassType);
14222 DeclarationNameInfo NameInfo(Name, ClassLoc);
14224 Context, ClassDecl, ClassLoc, NameInfo, /*Type*/ QualType(),
14225 /*TInfo=*/nullptr, ExplicitSpecifier(),
14226 getCurFPFeatures().isFPConstrained(),
14227 /*isInline=*/true, /*isImplicitlyDeclared=*/true,
14230 DefaultCon->setAccess(AS_public);
14231 DefaultCon->setDefaulted();
14232
14233 setupImplicitSpecialMemberType(DefaultCon, Context.VoidTy, {});
14234
14235 if (getLangOpts().CUDA)
14236 CUDA().inferTargetForImplicitSpecialMember(
14237 ClassDecl, CXXSpecialMemberKind::DefaultConstructor, DefaultCon,
14238 /* ConstRHS */ false,
14239 /* Diagnose */ false);
14240
14241 // We don't need to use SpecialMemberIsTrivial here; triviality for default
14242 // constructors is easy to compute.
14243 DefaultCon->setTrivial(ClassDecl->hasTrivialDefaultConstructor());
14244
14245 // Note that we have declared this constructor.
14246 ++getASTContext().NumImplicitDefaultConstructorsDeclared;
14247
14248 Scope *S = getScopeForContext(ClassDecl);
14250
14251 if (ShouldDeleteSpecialMember(DefaultCon,
14253 SetDeclDeleted(DefaultCon, ClassLoc);
14254
14255 if (S)
14256 PushOnScopeChains(DefaultCon, S, false);
14257 ClassDecl->addDecl(DefaultCon);
14258
14259 return DefaultCon;
14260}
14261
14264 assert((Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
14265 !Constructor->doesThisDeclarationHaveABody() &&
14266 !Constructor->isDeleted()) &&
14267 "DefineImplicitDefaultConstructor - call it for implicit default ctor");
14268 if (Constructor->willHaveBody() || Constructor->isInvalidDecl())
14269 return;
14270
14271 CXXRecordDecl *ClassDecl = Constructor->getParent();
14272 assert(ClassDecl && "DefineImplicitDefaultConstructor - invalid constructor");
14273 if (ClassDecl->isInvalidDecl()) {
14274 return;
14275 }
14276
14278
14279 // The exception specification is needed because we are defining the
14280 // function.
14281 ResolveExceptionSpec(CurrentLocation,
14282 Constructor->getType()->castAs<FunctionProtoType>());
14283 MarkVTableUsed(CurrentLocation, ClassDecl);
14284
14285 // Add a context note for diagnostics produced after this point.
14286 Scope.addContextNote(CurrentLocation);
14287
14288 if (SetCtorInitializers(Constructor, /*AnyErrors=*/false)) {
14289 Constructor->setInvalidDecl();
14290 return;
14291 }
14292
14293 SourceLocation Loc = Constructor->getEndLoc().isValid()
14294 ? Constructor->getEndLoc()
14295 : Constructor->getLocation();
14296 Constructor->setBody(new (Context) CompoundStmt(Loc));
14297 Constructor->markUsed(Context);
14298
14300 L->CompletedImplicitDefinition(Constructor);
14301 }
14302
14303 DiagnoseUninitializedFields(*this, Constructor);
14304}
14305
14307 // Perform any delayed checks on exception specifications.
14309}
14310
14311/// Find or create the fake constructor we synthesize to model constructing an
14312/// object of a derived class via a constructor of a base class.
14315 CXXConstructorDecl *BaseCtor,
14317 CXXRecordDecl *Derived = Shadow->getParent();
14318 SourceLocation UsingLoc = Shadow->getLocation();
14319
14320 // FIXME: Add a new kind of DeclarationName for an inherited constructor.
14321 // For now we use the name of the base class constructor as a member of the
14322 // derived class to indicate a (fake) inherited constructor name.
14323 DeclarationName Name = BaseCtor->getDeclName();
14324
14325 // Check to see if we already have a fake constructor for this inherited
14326 // constructor call.
14327 for (NamedDecl *Ctor : Derived->lookup(Name))
14329 ->getInheritedConstructor()
14330 .getConstructor(),
14331 BaseCtor))
14332 return cast<CXXConstructorDecl>(Ctor);
14333
14334 DeclarationNameInfo NameInfo(Name, UsingLoc);
14335 TypeSourceInfo *TInfo =
14336 Context.getTrivialTypeSourceInfo(BaseCtor->getType(), UsingLoc);
14337 FunctionProtoTypeLoc ProtoLoc =
14339
14340 // Check the inherited constructor is valid and find the list of base classes
14341 // from which it was inherited.
14342 InheritedConstructorInfo ICI(*this, Loc, Shadow);
14343
14344 bool Constexpr = BaseCtor->isConstexpr() &&
14347 false, BaseCtor, &ICI);
14348
14350 Context, Derived, UsingLoc, NameInfo, TInfo->getType(), TInfo,
14351 BaseCtor->getExplicitSpecifier(), getCurFPFeatures().isFPConstrained(),
14352 /*isInline=*/true,
14353 /*isImplicitlyDeclared=*/true,
14355 InheritedConstructor(Shadow, BaseCtor),
14356 BaseCtor->getTrailingRequiresClause());
14357 if (Shadow->isInvalidDecl())
14358 DerivedCtor->setInvalidDecl();
14359
14360 // Build an unevaluated exception specification for this fake constructor.
14361 const FunctionProtoType *FPT = TInfo->getType()->castAs<FunctionProtoType>();
14364 EPI.ExceptionSpec.SourceDecl = DerivedCtor;
14365 DerivedCtor->setType(Context.getFunctionType(FPT->getReturnType(),
14366 FPT->getParamTypes(), EPI));
14367
14368 // Build the parameter declarations.
14370 for (unsigned I = 0, N = FPT->getNumParams(); I != N; ++I) {
14371 TypeSourceInfo *TInfo =
14372 Context.getTrivialTypeSourceInfo(FPT->getParamType(I), UsingLoc);
14374 Context, DerivedCtor, UsingLoc, UsingLoc, /*IdentifierInfo=*/nullptr,
14375 FPT->getParamType(I), TInfo, SC_None, /*DefArg=*/nullptr);
14376 PD->setScopeInfo(0, I);
14377 PD->setImplicit();
14378 // Ensure attributes are propagated onto parameters (this matters for
14379 // format, pass_object_size, ...).
14380 mergeDeclAttributes(PD, BaseCtor->getParamDecl(I));
14381 ParamDecls.push_back(PD);
14382 ProtoLoc.setParam(I, PD);
14383 }
14384
14385 // Set up the new constructor.
14386 assert(!BaseCtor->isDeleted() && "should not use deleted constructor");
14387 DerivedCtor->setAccess(BaseCtor->getAccess());
14388 DerivedCtor->setParams(ParamDecls);
14389 Derived->addDecl(DerivedCtor);
14390
14391 if (ShouldDeleteSpecialMember(DerivedCtor,
14393 SetDeclDeleted(DerivedCtor, UsingLoc);
14394
14395 return DerivedCtor;
14396}
14397
14405
14408 CXXRecordDecl *ClassDecl = Constructor->getParent();
14409 assert(Constructor->getInheritedConstructor() &&
14410 !Constructor->doesThisDeclarationHaveABody() &&
14411 !Constructor->isDeleted());
14412 if (Constructor->willHaveBody() || Constructor->isInvalidDecl())
14413 return;
14414
14415 // Initializations are performed "as if by a defaulted default constructor",
14416 // so enter the appropriate scope.
14418
14419 // The exception specification is needed because we are defining the
14420 // function.
14421 ResolveExceptionSpec(CurrentLocation,
14422 Constructor->getType()->castAs<FunctionProtoType>());
14423 MarkVTableUsed(CurrentLocation, ClassDecl);
14424
14425 // Add a context note for diagnostics produced after this point.
14426 Scope.addContextNote(CurrentLocation);
14427
14429 Constructor->getInheritedConstructor().getShadowDecl();
14430 CXXConstructorDecl *InheritedCtor =
14431 Constructor->getInheritedConstructor().getConstructor();
14432
14433 // [class.inhctor.init]p1:
14434 // initialization proceeds as if a defaulted default constructor is used to
14435 // initialize the D object and each base class subobject from which the
14436 // constructor was inherited
14437
14438 InheritedConstructorInfo ICI(*this, CurrentLocation, Shadow);
14439 CXXRecordDecl *RD = Shadow->getParent();
14440 SourceLocation InitLoc = Shadow->getLocation();
14441
14442 // Build explicit initializers for all base classes from which the
14443 // constructor was inherited.
14445 for (bool VBase : {false, true}) {
14446 for (CXXBaseSpecifier &B : VBase ? RD->vbases() : RD->bases()) {
14447 if (B.isVirtual() != VBase)
14448 continue;
14449
14450 auto *BaseRD = B.getType()->getAsCXXRecordDecl();
14451 if (!BaseRD)
14452 continue;
14453
14454 auto BaseCtor = ICI.findConstructorForBase(BaseRD, InheritedCtor);
14455 if (!BaseCtor.first)
14456 continue;
14457
14458 MarkFunctionReferenced(CurrentLocation, BaseCtor.first);
14460 InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);
14461
14462 auto *TInfo = Context.getTrivialTypeSourceInfo(B.getType(), InitLoc);
14463 Inits.push_back(new (Context) CXXCtorInitializer(
14464 Context, TInfo, VBase, InitLoc, Init.get(), InitLoc,
14465 SourceLocation()));
14466 }
14467 }
14468
14469 // We now proceed as if for a defaulted default constructor, with the relevant
14470 // initializers replaced.
14471
14472 if (SetCtorInitializers(Constructor, /*AnyErrors*/false, Inits)) {
14473 Constructor->setInvalidDecl();
14474 return;
14475 }
14476
14477 Constructor->setBody(new (Context) CompoundStmt(InitLoc));
14478 Constructor->markUsed(Context);
14479
14481 L->CompletedImplicitDefinition(Constructor);
14482 }
14483
14484 DiagnoseUninitializedFields(*this, Constructor);
14485}
14486
14488 // C++ [class.dtor]p2:
14489 // If a class has no user-declared destructor, a destructor is
14490 // declared implicitly. An implicitly-declared destructor is an
14491 // inline public member of its class.
14492 assert(ClassDecl->needsImplicitDestructor());
14493
14494 DeclaringSpecialMember DSM(*this, ClassDecl,
14496 if (DSM.isAlreadyBeingDeclared())
14497 return nullptr;
14498
14500 *this, ClassDecl, CXXSpecialMemberKind::Destructor, false);
14501
14502 // Create the actual destructor declaration.
14503 CanQualType ClassType = Context.getCanonicalTagType(ClassDecl);
14504 SourceLocation ClassLoc = ClassDecl->getLocation();
14505 DeclarationName Name
14506 = Context.DeclarationNames.getCXXDestructorName(ClassType);
14507 DeclarationNameInfo NameInfo(Name, ClassLoc);
14509 Context, ClassDecl, ClassLoc, NameInfo, QualType(), nullptr,
14510 getCurFPFeatures().isFPConstrained(),
14511 /*isInline=*/true,
14512 /*isImplicitlyDeclared=*/true,
14515 Destructor->setAccess(AS_public);
14516 Destructor->setDefaulted();
14517
14518 setupImplicitSpecialMemberType(Destructor, Context.VoidTy, {});
14519
14520 if (getLangOpts().CUDA)
14521 CUDA().inferTargetForImplicitSpecialMember(
14523 /* ConstRHS */ false,
14524 /* Diagnose */ false);
14525
14526 // We don't need to use SpecialMemberIsTrivial here; triviality for
14527 // destructors is easy to compute.
14528 Destructor->setTrivial(ClassDecl->hasTrivialDestructor());
14529 Destructor->setTrivialForCall(ClassDecl->hasAttr<TrivialABIAttr>() ||
14530 ClassDecl->hasTrivialDestructorForCall());
14531
14532 // Note that we have declared this destructor.
14533 ++getASTContext().NumImplicitDestructorsDeclared;
14534
14535 Scope *S = getScopeForContext(ClassDecl);
14537
14538 // We can't check whether an implicit destructor is deleted before we complete
14539 // the definition of the class, because its validity depends on the alignment
14540 // of the class. We'll check this from ActOnFields once the class is complete.
14541 if (ClassDecl->isCompleteDefinition() &&
14543 SetDeclDeleted(Destructor, ClassLoc);
14544
14545 // Introduce this destructor into its scope.
14546 if (S)
14547 PushOnScopeChains(Destructor, S, false);
14548 ClassDecl->addDecl(Destructor);
14549
14550 return Destructor;
14551}
14552
14555 assert((Destructor->isDefaulted() &&
14556 !Destructor->doesThisDeclarationHaveABody() &&
14557 !Destructor->isDeleted()) &&
14558 "DefineImplicitDestructor - call it for implicit default dtor");
14559 if (Destructor->willHaveBody() || Destructor->isInvalidDecl())
14560 return;
14561
14562 CXXRecordDecl *ClassDecl = Destructor->getParent();
14563 assert(ClassDecl && "DefineImplicitDestructor - invalid destructor");
14564
14566
14567 // The exception specification is needed because we are defining the
14568 // function.
14569 ResolveExceptionSpec(CurrentLocation,
14570 Destructor->getType()->castAs<FunctionProtoType>());
14571 MarkVTableUsed(CurrentLocation, ClassDecl);
14572
14573 // Add a context note for diagnostics produced after this point.
14574 Scope.addContextNote(CurrentLocation);
14575
14577 Destructor->getParent());
14578
14580 Destructor->setInvalidDecl();
14581 return;
14582 }
14583
14584 SourceLocation Loc = Destructor->getEndLoc().isValid()
14585 ? Destructor->getEndLoc()
14586 : Destructor->getLocation();
14587 Destructor->setBody(new (Context) CompoundStmt(Loc));
14588 Destructor->markUsed(Context);
14589
14591 L->CompletedImplicitDefinition(Destructor);
14592 }
14593}
14594
14597 if (Destructor->isInvalidDecl())
14598 return;
14599
14600 CXXRecordDecl *ClassDecl = Destructor->getParent();
14601 assert(Context.getTargetInfo().getCXXABI().isMicrosoft() &&
14602 "implicit complete dtors unneeded outside MS ABI");
14603 assert(ClassDecl->getNumVBases() > 0 &&
14604 "complete dtor only exists for classes with vbases");
14605
14607
14608 // Add a context note for diagnostics produced after this point.
14609 Scope.addContextNote(CurrentLocation);
14610
14611 MarkVirtualBaseDestructorsReferenced(Destructor->getLocation(), ClassDecl);
14612}
14613
14615 // If the context is an invalid C++ class, just suppress these checks.
14616 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(CurContext)) {
14617 if (Record->isInvalidDecl()) {
14620 return;
14621 }
14623 }
14624}
14625
14628
14629 if (!DelayedDllExportMemberFunctions.empty()) {
14631 std::swap(DelayedDllExportMemberFunctions, WorkList);
14632 for (CXXMethodDecl *M : WorkList) {
14633 DefineDefaultedFunction(*this, M, M->getLocation());
14634
14635 // Pass the method to the consumer to get emitted. This is not necessary
14636 // for explicit instantiation definitions, as they will get emitted
14637 // anyway.
14638 if (M->getParent()->getTemplateSpecializationKind() !=
14641 }
14642 }
14643}
14644
14646 if (!DelayedDllExportClasses.empty()) {
14647 // Calling ReferenceDllExportedMembers might cause the current function to
14648 // be called again, so use a local copy of DelayedDllExportClasses.
14650 std::swap(DelayedDllExportClasses, WorkList);
14651 for (CXXRecordDecl *Class : WorkList)
14653 }
14654}
14655
14657 assert(getLangOpts().CPlusPlus11 &&
14658 "adjusting dtor exception specs was introduced in c++11");
14659
14660 if (Destructor->isDependentContext())
14661 return;
14662
14663 // C++11 [class.dtor]p3:
14664 // A declaration of a destructor that does not have an exception-
14665 // specification is implicitly considered to have the same exception-
14666 // specification as an implicit declaration.
14667 const auto *DtorType = Destructor->getType()->castAs<FunctionProtoType>();
14668 if (DtorType->hasExceptionSpec())
14669 return;
14670
14671 // Replace the destructor's type, building off the existing one. Fortunately,
14672 // the only thing of interest in the destructor type is its extended info.
14673 // The return and arguments are fixed.
14674 FunctionProtoType::ExtProtoInfo EPI = DtorType->getExtProtoInfo();
14677 Destructor->setType(Context.getFunctionType(Context.VoidTy, {}, EPI));
14678
14679 // FIXME: If the destructor has a body that could throw, and the newly created
14680 // spec doesn't allow exceptions, we should emit a warning, because this
14681 // change in behavior can break conforming C++03 programs at runtime.
14682 // However, we don't have a body or an exception specification yet, so it
14683 // needs to be done somewhere else.
14684}
14685
14686namespace {
14687/// An abstract base class for all helper classes used in building the
14688// copy/move operators. These classes serve as factory functions and help us
14689// avoid using the same Expr* in the AST twice.
14690class ExprBuilder {
14691 ExprBuilder(const ExprBuilder&) = delete;
14692 ExprBuilder &operator=(const ExprBuilder&) = delete;
14693
14694protected:
14695 static Expr *assertNotNull(Expr *E) {
14696 assert(E && "Expression construction must not fail.");
14697 return E;
14698 }
14699
14700public:
14701 ExprBuilder() {}
14702 virtual ~ExprBuilder() {}
14703
14704 virtual Expr *build(Sema &S, SourceLocation Loc) const = 0;
14705};
14706
14707class RefBuilder: public ExprBuilder {
14708 VarDecl *Var;
14709 QualType VarType;
14710
14711public:
14712 Expr *build(Sema &S, SourceLocation Loc) const override {
14713 return assertNotNull(S.BuildDeclRefExpr(Var, VarType, VK_LValue, Loc));
14714 }
14715
14716 RefBuilder(VarDecl *Var, QualType VarType)
14717 : Var(Var), VarType(VarType) {}
14718};
14719
14720class ThisBuilder: public ExprBuilder {
14721public:
14722 Expr *build(Sema &S, SourceLocation Loc) const override {
14723 return assertNotNull(S.ActOnCXXThis(Loc).getAs<Expr>());
14724 }
14725};
14726
14727class CastBuilder: public ExprBuilder {
14728 const ExprBuilder &Builder;
14729 QualType Type;
14731 const CXXCastPath &Path;
14732
14733public:
14734 Expr *build(Sema &S, SourceLocation Loc) const override {
14735 return assertNotNull(S.ImpCastExprToType(Builder.build(S, Loc), Type,
14736 CK_UncheckedDerivedToBase, Kind,
14737 &Path).get());
14738 }
14739
14740 CastBuilder(const ExprBuilder &Builder, QualType Type, ExprValueKind Kind,
14741 const CXXCastPath &Path)
14742 : Builder(Builder), Type(Type), Kind(Kind), Path(Path) {}
14743};
14744
14745class DerefBuilder: public ExprBuilder {
14746 const ExprBuilder &Builder;
14747
14748public:
14749 Expr *build(Sema &S, SourceLocation Loc) const override {
14750 return assertNotNull(
14751 S.CreateBuiltinUnaryOp(Loc, UO_Deref, Builder.build(S, Loc)).get());
14752 }
14753
14754 DerefBuilder(const ExprBuilder &Builder) : Builder(Builder) {}
14755};
14756
14757class MemberBuilder: public ExprBuilder {
14758 const ExprBuilder &Builder;
14759 QualType Type;
14760 CXXScopeSpec SS;
14761 bool IsArrow;
14762 LookupResult &MemberLookup;
14763
14764public:
14765 Expr *build(Sema &S, SourceLocation Loc) const override {
14766 return assertNotNull(S.BuildMemberReferenceExpr(
14767 Builder.build(S, Loc), Type, Loc, IsArrow, SS, SourceLocation(),
14768 nullptr, MemberLookup, nullptr, nullptr).get());
14769 }
14770
14771 MemberBuilder(const ExprBuilder &Builder, QualType Type, bool IsArrow,
14772 LookupResult &MemberLookup)
14773 : Builder(Builder), Type(Type), IsArrow(IsArrow),
14774 MemberLookup(MemberLookup) {}
14775};
14776
14777class MoveCastBuilder: public ExprBuilder {
14778 const ExprBuilder &Builder;
14779
14780public:
14781 Expr *build(Sema &S, SourceLocation Loc) const override {
14782 return assertNotNull(CastForMoving(S, Builder.build(S, Loc)));
14783 }
14784
14785 MoveCastBuilder(const ExprBuilder &Builder) : Builder(Builder) {}
14786};
14787
14788class LvalueConvBuilder: public ExprBuilder {
14789 const ExprBuilder &Builder;
14790
14791public:
14792 Expr *build(Sema &S, SourceLocation Loc) const override {
14793 return assertNotNull(
14794 S.DefaultLvalueConversion(Builder.build(S, Loc)).get());
14795 }
14796
14797 LvalueConvBuilder(const ExprBuilder &Builder) : Builder(Builder) {}
14798};
14799
14800class SubscriptBuilder: public ExprBuilder {
14801 const ExprBuilder &Base;
14802 const ExprBuilder &Index;
14803
14804public:
14805 Expr *build(Sema &S, SourceLocation Loc) const override {
14806 return assertNotNull(S.CreateBuiltinArraySubscriptExpr(
14807 Base.build(S, Loc), Loc, Index.build(S, Loc), Loc).get());
14808 }
14809
14810 SubscriptBuilder(const ExprBuilder &Base, const ExprBuilder &Index)
14811 : Base(Base), Index(Index) {}
14812};
14813
14814} // end anonymous namespace
14815
14816/// When generating a defaulted copy or move assignment operator, if a field
14817/// should be copied with __builtin_memcpy rather than via explicit assignments,
14818/// do so. This optimization only applies for arrays of scalars, and for arrays
14819/// of class type where the selected copy/move-assignment operator is trivial.
14820static StmtResult
14822 const ExprBuilder &ToB, const ExprBuilder &FromB) {
14823 // Compute the size of the memory buffer to be copied.
14824 QualType SizeType = S.Context.getSizeType();
14825 llvm::APInt Size(S.Context.getTypeSize(SizeType),
14827
14828 // Take the address of the field references for "from" and "to". We
14829 // directly construct UnaryOperators here because semantic analysis
14830 // does not permit us to take the address of an xvalue.
14831 Expr *From = FromB.build(S, Loc);
14832 From = UnaryOperator::Create(
14833 S.Context, From, UO_AddrOf, S.Context.getPointerType(From->getType()),
14834 VK_PRValue, OK_Ordinary, Loc, false, S.CurFPFeatureOverrides());
14835 Expr *To = ToB.build(S, Loc);
14837 S.Context, To, UO_AddrOf, S.Context.getPointerType(To->getType()),
14838 VK_PRValue, OK_Ordinary, Loc, false, S.CurFPFeatureOverrides());
14839
14840 bool NeedsCollectableMemCpy = false;
14841 if (auto *RD = T->getBaseElementTypeUnsafe()->getAsRecordDecl())
14842 NeedsCollectableMemCpy = RD->hasObjectMember();
14843
14844 // Create a reference to the __builtin_objc_memmove_collectable function
14845 StringRef MemCpyName = NeedsCollectableMemCpy ?
14846 "__builtin_objc_memmove_collectable" :
14847 "__builtin_memcpy";
14848 LookupResult R(S, &S.Context.Idents.get(MemCpyName), Loc,
14850 S.LookupName(R, S.TUScope, true);
14851
14852 FunctionDecl *MemCpy = R.getAsSingle<FunctionDecl>();
14853 if (!MemCpy)
14854 // Something went horribly wrong earlier, and we will have complained
14855 // about it.
14856 return StmtError();
14857
14858 ExprResult MemCpyRef = S.BuildDeclRefExpr(MemCpy, S.Context.BuiltinFnTy,
14859 VK_PRValue, Loc, nullptr);
14860 assert(MemCpyRef.isUsable() && "Builtin reference cannot fail");
14861
14862 Expr *CallArgs[] = {
14863 To, From, IntegerLiteral::Create(S.Context, Size, SizeType, Loc)
14864 };
14865 ExprResult Call = S.BuildCallExpr(/*Scope=*/nullptr, MemCpyRef.get(),
14866 Loc, CallArgs, Loc);
14867
14868 assert(!Call.isInvalid() && "Call to __builtin_memcpy cannot fail!");
14869 return Call.getAs<Stmt>();
14870}
14871
14872/// Builds a statement that copies/moves the given entity from \p From to
14873/// \c To.
14874///
14875/// This routine is used to copy/move the members of a class with an
14876/// implicitly-declared copy/move assignment operator. When the entities being
14877/// copied are arrays, this routine builds for loops to copy them.
14878///
14879/// \param S The Sema object used for type-checking.
14880///
14881/// \param Loc The location where the implicit copy/move is being generated.
14882///
14883/// \param T The type of the expressions being copied/moved. Both expressions
14884/// must have this type.
14885///
14886/// \param To The expression we are copying/moving to.
14887///
14888/// \param From The expression we are copying/moving from.
14889///
14890/// \param CopyingBaseSubobject Whether we're copying/moving a base subobject.
14891/// Otherwise, it's a non-static member subobject.
14892///
14893/// \param Copying Whether we're copying or moving.
14894///
14895/// \param Depth Internal parameter recording the depth of the recursion.
14896///
14897/// \returns A statement or a loop that copies the expressions, or StmtResult(0)
14898/// if a memcpy should be used instead.
14899static StmtResult
14901 const ExprBuilder &To, const ExprBuilder &From,
14902 bool CopyingBaseSubobject, bool Copying,
14903 unsigned Depth = 0) {
14904 // C++11 [class.copy]p28:
14905 // Each subobject is assigned in the manner appropriate to its type:
14906 //
14907 // - if the subobject is of class type, as if by a call to operator= with
14908 // the subobject as the object expression and the corresponding
14909 // subobject of x as a single function argument (as if by explicit
14910 // qualification; that is, ignoring any possible virtual overriding
14911 // functions in more derived classes);
14912 //
14913 // C++03 [class.copy]p13:
14914 // - if the subobject is of class type, the copy assignment operator for
14915 // the class is used (as if by explicit qualification; that is,
14916 // ignoring any possible virtual overriding functions in more derived
14917 // classes);
14918 if (auto *ClassDecl = T->getAsCXXRecordDecl()) {
14919 // Look for operator=.
14920 DeclarationName Name
14922 LookupResult OpLookup(S, Name, Loc, Sema::LookupOrdinaryName);
14923 S.LookupQualifiedName(OpLookup, ClassDecl, false);
14924
14925 // Prior to C++11, filter out any result that isn't a copy/move-assignment
14926 // operator.
14927 if (!S.getLangOpts().CPlusPlus11) {
14928 LookupResult::Filter F = OpLookup.makeFilter();
14929 while (F.hasNext()) {
14930 NamedDecl *D = F.next();
14931 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D))
14932 if (Method->isCopyAssignmentOperator() ||
14933 (!Copying && Method->isMoveAssignmentOperator()))
14934 continue;
14935
14936 F.erase();
14937 }
14938 F.done();
14939 }
14940
14941 // Suppress the protected check (C++ [class.protected]) for each of the
14942 // assignment operators we found. This strange dance is required when
14943 // we're assigning via a base classes's copy-assignment operator. To
14944 // ensure that we're getting the right base class subobject (without
14945 // ambiguities), we need to cast "this" to that subobject type; to
14946 // ensure that we don't go through the virtual call mechanism, we need
14947 // to qualify the operator= name with the base class (see below). However,
14948 // this means that if the base class has a protected copy assignment
14949 // operator, the protected member access check will fail. So, we
14950 // rewrite "protected" access to "public" access in this case, since we
14951 // know by construction that we're calling from a derived class.
14952 if (CopyingBaseSubobject) {
14953 for (LookupResult::iterator L = OpLookup.begin(), LEnd = OpLookup.end();
14954 L != LEnd; ++L) {
14955 if (L.getAccess() == AS_protected)
14956 L.setAccess(AS_public);
14957 }
14958 }
14959
14960 // Create the nested-name-specifier that will be used to qualify the
14961 // reference to operator=; this is required to suppress the virtual
14962 // call mechanism.
14963 CXXScopeSpec SS;
14964 // FIXME: Don't canonicalize this.
14965 const Type *CanonicalT = S.Context.getCanonicalType(T.getTypePtr());
14966 SS.MakeTrivial(S.Context, NestedNameSpecifier(CanonicalT), Loc);
14967
14968 // Create the reference to operator=.
14969 ExprResult OpEqualRef
14970 = S.BuildMemberReferenceExpr(To.build(S, Loc), T, Loc, /*IsArrow=*/false,
14971 SS, /*TemplateKWLoc=*/SourceLocation(),
14972 /*FirstQualifierInScope=*/nullptr,
14973 OpLookup,
14974 /*TemplateArgs=*/nullptr, /*S*/nullptr,
14975 /*SuppressQualifierCheck=*/true);
14976 if (OpEqualRef.isInvalid())
14977 return StmtError();
14978
14979 // Build the call to the assignment operator.
14980
14981 Expr *FromInst = From.build(S, Loc);
14982 ExprResult Call = S.BuildCallToMemberFunction(/*Scope=*/nullptr,
14983 OpEqualRef.getAs<Expr>(),
14984 Loc, FromInst, Loc);
14985 if (Call.isInvalid())
14986 return StmtError();
14987
14988 // If we built a call to a trivial 'operator=' while copying an array,
14989 // bail out. We'll replace the whole shebang with a memcpy.
14990 CXXMemberCallExpr *CE = dyn_cast<CXXMemberCallExpr>(Call.get());
14991 if (CE && CE->getMethodDecl()->isTrivial() && Depth)
14992 return StmtResult((Stmt*)nullptr);
14993
14994 // Convert to an expression-statement, and clean up any produced
14995 // temporaries.
14996 return S.ActOnExprStmt(Call);
14997 }
14998
14999 // - if the subobject is of scalar type, the built-in assignment
15000 // operator is used.
15002 if (!ArrayTy) {
15004 Loc, BO_Assign, To.build(S, Loc), From.build(S, Loc));
15005 if (Assignment.isInvalid())
15006 return StmtError();
15007 return S.ActOnExprStmt(Assignment);
15008 }
15009
15010 // - if the subobject is an array, each element is assigned, in the
15011 // manner appropriate to the element type;
15012
15013 // Construct a loop over the array bounds, e.g.,
15014 //
15015 // for (__SIZE_TYPE__ i0 = 0; i0 != array-size; ++i0)
15016 //
15017 // that will copy each of the array elements.
15018 QualType SizeType = S.Context.getSizeType();
15019
15020 // Create the iteration variable.
15021 IdentifierInfo *IterationVarName = nullptr;
15022 {
15023 SmallString<8> Str;
15024 llvm::raw_svector_ostream OS(Str);
15025 OS << "__i" << Depth;
15026 IterationVarName = &S.Context.Idents.get(OS.str());
15027 }
15028 VarDecl *IterationVar = VarDecl::Create(S.Context, S.CurContext, Loc, Loc,
15029 IterationVarName, SizeType,
15030 S.Context.getTrivialTypeSourceInfo(SizeType, Loc),
15031 SC_None);
15032
15033 // Initialize the iteration variable to zero.
15034 llvm::APInt Zero(S.Context.getTypeSize(SizeType), 0);
15035 IterationVar->setInit(IntegerLiteral::Create(S.Context, Zero, SizeType, Loc));
15036
15037 // Creates a reference to the iteration variable.
15038 RefBuilder IterationVarRef(IterationVar, SizeType);
15039 LvalueConvBuilder IterationVarRefRVal(IterationVarRef);
15040
15041 // Create the DeclStmt that holds the iteration variable.
15042 Stmt *InitStmt = new (S.Context) DeclStmt(DeclGroupRef(IterationVar),Loc,Loc);
15043
15044 // Subscript the "from" and "to" expressions with the iteration variable.
15045 SubscriptBuilder FromIndexCopy(From, IterationVarRefRVal);
15046 MoveCastBuilder FromIndexMove(FromIndexCopy);
15047 const ExprBuilder *FromIndex;
15048 if (Copying)
15049 FromIndex = &FromIndexCopy;
15050 else
15051 FromIndex = &FromIndexMove;
15052
15053 SubscriptBuilder ToIndex(To, IterationVarRefRVal);
15054
15055 // Build the copy/move for an individual element of the array.
15056 StmtResult Copy =
15058 ToIndex, *FromIndex, CopyingBaseSubobject,
15059 Copying, Depth + 1);
15060 // Bail out if copying fails or if we determined that we should use memcpy.
15061 if (Copy.isInvalid() || !Copy.get())
15062 return Copy;
15063
15064 // Create the comparison against the array bound.
15065 llvm::APInt Upper
15066 = ArrayTy->getSize().zextOrTrunc(S.Context.getTypeSize(SizeType));
15068 S.Context, IterationVarRefRVal.build(S, Loc),
15069 IntegerLiteral::Create(S.Context, Upper, SizeType, Loc), BO_NE,
15072
15073 // Create the pre-increment of the iteration variable. We can determine
15074 // whether the increment will overflow based on the value of the array
15075 // bound.
15076 Expr *Increment = UnaryOperator::Create(
15077 S.Context, IterationVarRef.build(S, Loc), UO_PreInc, SizeType, VK_LValue,
15078 OK_Ordinary, Loc, Upper.isMaxValue(), S.CurFPFeatureOverrides());
15079
15080 // Construct the loop that copies all elements of this array.
15081 return S.ActOnForStmt(
15082 Loc, Loc, InitStmt,
15084 S.MakeFullDiscardedValueExpr(Increment), Loc, Copy.get());
15085}
15086
15087static StmtResult
15089 const ExprBuilder &To, const ExprBuilder &From,
15090 bool CopyingBaseSubobject, bool Copying) {
15091 // Maybe we should use a memcpy?
15092 if (T->isArrayType() && !T.isConstQualified() && !T.isVolatileQualified() &&
15093 T.isTriviallyCopyableType(S.Context))
15094 return buildMemcpyForAssignmentOp(S, Loc, T, To, From);
15095
15096 StmtResult Result(buildSingleCopyAssignRecursively(S, Loc, T, To, From,
15097 CopyingBaseSubobject,
15098 Copying, 0));
15099
15100 // If we ended up picking a trivial assignment operator for an array of a
15101 // non-trivially-copyable class type, just emit a memcpy.
15102 if (!Result.isInvalid() && !Result.get())
15103 return buildMemcpyForAssignmentOp(S, Loc, T, To, From);
15104
15105 return Result;
15106}
15107
15109 // Note: The following rules are largely analoguous to the copy
15110 // constructor rules. Note that virtual bases are not taken into account
15111 // for determining the argument type of the operator. Note also that
15112 // operators taking an object instead of a reference are allowed.
15113 assert(ClassDecl->needsImplicitCopyAssignment());
15114
15115 DeclaringSpecialMember DSM(*this, ClassDecl,
15117 if (DSM.isAlreadyBeingDeclared())
15118 return nullptr;
15119
15121 /*Qualifier=*/std::nullopt, ClassDecl,
15122 /*OwnsTag=*/false);
15124 if (AS != LangAS::Default)
15125 ArgType = Context.getAddrSpaceQualType(ArgType, AS);
15126 QualType RetType = Context.getLValueReferenceType(ArgType);
15127 bool Const = ClassDecl->implicitCopyAssignmentHasConstParam();
15128 if (Const)
15129 ArgType = ArgType.withConst();
15130
15131 ArgType = Context.getLValueReferenceType(ArgType);
15132
15134 *this, ClassDecl, CXXSpecialMemberKind::CopyAssignment, Const);
15135
15136 // An implicitly-declared copy assignment operator is an inline public
15137 // member of its class.
15138 DeclarationName Name = Context.DeclarationNames.getCXXOperatorName(OO_Equal);
15139 SourceLocation ClassLoc = ClassDecl->getLocation();
15140 DeclarationNameInfo NameInfo(Name, ClassLoc);
15142 Context, ClassDecl, ClassLoc, NameInfo, QualType(),
15143 /*TInfo=*/nullptr, /*StorageClass=*/SC_None,
15144 getCurFPFeatures().isFPConstrained(),
15145 /*isInline=*/true,
15147 SourceLocation());
15148 CopyAssignment->setAccess(AS_public);
15149 CopyAssignment->setDefaulted();
15150 CopyAssignment->setImplicit();
15151
15152 setupImplicitSpecialMemberType(CopyAssignment, RetType, ArgType);
15153
15154 if (getLangOpts().CUDA)
15155 CUDA().inferTargetForImplicitSpecialMember(
15157 /* ConstRHS */ Const,
15158 /* Diagnose */ false);
15159
15160 // Add the parameter to the operator.
15162 ClassLoc, ClassLoc,
15163 /*Id=*/nullptr, ArgType,
15164 /*TInfo=*/nullptr, SC_None,
15165 nullptr);
15166 CopyAssignment->setParams(FromParam);
15167
15168 CopyAssignment->setTrivial(
15172 : ClassDecl->hasTrivialCopyAssignment());
15173
15174 // Note that we have added this copy-assignment operator.
15175 ++getASTContext().NumImplicitCopyAssignmentOperatorsDeclared;
15176
15177 Scope *S = getScopeForContext(ClassDecl);
15179
15183 SetDeclDeleted(CopyAssignment, ClassLoc);
15184 }
15185
15186 if (S)
15188 ClassDecl->addDecl(CopyAssignment);
15189
15190 return CopyAssignment;
15191}
15192
15193/// Diagnose an implicit copy operation for a class which is odr-used, but
15194/// which is deprecated because the class has a user-declared copy constructor,
15195/// copy assignment operator, or destructor.
15197 assert(CopyOp->isImplicit());
15198
15199 CXXRecordDecl *RD = CopyOp->getParent();
15200 CXXMethodDecl *UserDeclaredOperation = nullptr;
15201
15202 if (RD->hasUserDeclaredDestructor()) {
15203 UserDeclaredOperation = RD->getDestructor();
15204 } else if (!isa<CXXConstructorDecl>(CopyOp) &&
15206 // Find any user-declared copy constructor.
15207 for (auto *I : RD->ctors()) {
15208 if (I->isCopyConstructor()) {
15209 UserDeclaredOperation = I;
15210 break;
15211 }
15212 }
15213 assert(UserDeclaredOperation);
15214 } else if (isa<CXXConstructorDecl>(CopyOp) &&
15216 // Find any user-declared move assignment operator.
15217 for (auto *I : RD->methods()) {
15218 if (I->isCopyAssignmentOperator()) {
15219 UserDeclaredOperation = I;
15220 break;
15221 }
15222 }
15223 assert(UserDeclaredOperation);
15224 }
15225
15226 if (UserDeclaredOperation) {
15227 bool UDOIsUserProvided = UserDeclaredOperation->isUserProvided();
15228 bool UDOIsDestructor = isa<CXXDestructorDecl>(UserDeclaredOperation);
15229 bool IsCopyAssignment = !isa<CXXConstructorDecl>(CopyOp);
15230 unsigned DiagID =
15231 (UDOIsUserProvided && UDOIsDestructor)
15232 ? diag::warn_deprecated_copy_with_user_provided_dtor
15233 : (UDOIsUserProvided && !UDOIsDestructor)
15234 ? diag::warn_deprecated_copy_with_user_provided_copy
15235 : (!UDOIsUserProvided && UDOIsDestructor)
15236 ? diag::warn_deprecated_copy_with_dtor
15237 : diag::warn_deprecated_copy;
15238 S.Diag(UserDeclaredOperation->getLocation(), DiagID)
15239 << RD << IsCopyAssignment;
15240 }
15241}
15242
15244 CXXMethodDecl *CopyAssignOperator) {
15245 assert((CopyAssignOperator->isDefaulted() &&
15246 CopyAssignOperator->isOverloadedOperator() &&
15247 CopyAssignOperator->getOverloadedOperator() == OO_Equal &&
15248 !CopyAssignOperator->doesThisDeclarationHaveABody() &&
15249 !CopyAssignOperator->isDeleted()) &&
15250 "DefineImplicitCopyAssignment called for wrong function");
15251 if (CopyAssignOperator->willHaveBody() || CopyAssignOperator->isInvalidDecl())
15252 return;
15253
15254 CXXRecordDecl *ClassDecl = CopyAssignOperator->getParent();
15255 if (ClassDecl->isInvalidDecl()) {
15256 CopyAssignOperator->setInvalidDecl();
15257 return;
15258 }
15259
15260 SynthesizedFunctionScope Scope(*this, CopyAssignOperator);
15261
15262 // The exception specification is needed because we are defining the
15263 // function.
15264 ResolveExceptionSpec(CurrentLocation,
15265 CopyAssignOperator->getType()->castAs<FunctionProtoType>());
15266
15267 // Add a context note for diagnostics produced after this point.
15268 Scope.addContextNote(CurrentLocation);
15269
15270 // C++11 [class.copy]p18:
15271 // The [definition of an implicitly declared copy assignment operator] is
15272 // deprecated if the class has a user-declared copy constructor or a
15273 // user-declared destructor.
15274 if (getLangOpts().CPlusPlus11 && CopyAssignOperator->isImplicit())
15275 diagnoseDeprecatedCopyOperation(*this, CopyAssignOperator);
15276
15277 // C++0x [class.copy]p30:
15278 // The implicitly-defined or explicitly-defaulted copy assignment operator
15279 // for a non-union class X performs memberwise copy assignment of its
15280 // subobjects. The direct base classes of X are assigned first, in the
15281 // order of their declaration in the base-specifier-list, and then the
15282 // immediate non-static data members of X are assigned, in the order in
15283 // which they were declared in the class definition.
15284
15285 // The statements that form the synthesized function body.
15286 SmallVector<Stmt*, 8> Statements;
15287
15288 // The parameter for the "other" object, which we are copying from.
15289 ParmVarDecl *Other = CopyAssignOperator->getNonObjectParameter(0);
15290 Qualifiers OtherQuals = Other->getType().getQualifiers();
15291 QualType OtherRefType = Other->getType();
15292 if (OtherRefType->isLValueReferenceType()) {
15293 OtherRefType = OtherRefType->getPointeeType();
15294 OtherQuals = OtherRefType.getQualifiers();
15295 }
15296
15297 // Our location for everything implicitly-generated.
15298 SourceLocation Loc = CopyAssignOperator->getEndLoc().isValid()
15299 ? CopyAssignOperator->getEndLoc()
15300 : CopyAssignOperator->getLocation();
15301
15302 // Builds a DeclRefExpr for the "other" object.
15303 RefBuilder OtherRef(Other, OtherRefType);
15304
15305 // Builds the function object parameter.
15306 std::optional<ThisBuilder> This;
15307 std::optional<DerefBuilder> DerefThis;
15308 std::optional<RefBuilder> ExplicitObject;
15309 bool IsArrow = false;
15310 QualType ObjectType;
15311 if (CopyAssignOperator->isExplicitObjectMemberFunction()) {
15312 ObjectType = CopyAssignOperator->getParamDecl(0)->getType();
15313 if (ObjectType->isReferenceType())
15314 ObjectType = ObjectType->getPointeeType();
15315 ExplicitObject.emplace(CopyAssignOperator->getParamDecl(0), ObjectType);
15316 } else {
15317 ObjectType = getCurrentThisType();
15318 This.emplace();
15319 DerefThis.emplace(*This);
15320 IsArrow = !LangOpts.HLSL;
15321 }
15322 ExprBuilder &ObjectParameter =
15323 ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15324 : static_cast<ExprBuilder &>(*This);
15325
15326 // Assign base classes.
15327 bool Invalid = false;
15328 for (auto &Base : ClassDecl->bases()) {
15329 // Form the assignment:
15330 // static_cast<Base*>(this)->Base::operator=(static_cast<Base&>(other));
15331 QualType BaseType = Base.getType().getUnqualifiedType();
15332 if (!BaseType->isRecordType()) {
15333 Invalid = true;
15334 continue;
15335 }
15336
15337 CXXCastPath BasePath;
15338 BasePath.push_back(&Base);
15339
15340 // Construct the "from" expression, which is an implicit cast to the
15341 // appropriately-qualified base type.
15342 CastBuilder From(OtherRef, Context.getQualifiedType(BaseType, OtherQuals),
15343 VK_LValue, BasePath);
15344
15345 // Dereference "this".
15346 CastBuilder To(
15347 ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15348 : static_cast<ExprBuilder &>(*DerefThis),
15349 Context.getQualifiedType(BaseType, ObjectType.getQualifiers()),
15350 VK_LValue, BasePath);
15351
15352 // Build the copy.
15353 StmtResult Copy = buildSingleCopyAssign(*this, Loc, BaseType,
15354 To, From,
15355 /*CopyingBaseSubobject=*/true,
15356 /*Copying=*/true);
15357 if (Copy.isInvalid()) {
15358 CopyAssignOperator->setInvalidDecl();
15359 return;
15360 }
15361
15362 // Success! Record the copy.
15363 Statements.push_back(Copy.getAs<Expr>());
15364 }
15365
15366 // Assign non-static members.
15367 for (auto *Field : ClassDecl->fields()) {
15368 // FIXME: We should form some kind of AST representation for the implied
15369 // memcpy in a union copy operation.
15370 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15371 continue;
15372
15373 if (Field->isInvalidDecl()) {
15374 Invalid = true;
15375 continue;
15376 }
15377
15378 // Check for members of reference type; we can't copy those.
15379 if (Field->getType()->isReferenceType()) {
15380 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15381 << Context.getCanonicalTagType(ClassDecl) << 0
15382 << Field->getDeclName();
15383 Diag(Field->getLocation(), diag::note_declared_at);
15384 Invalid = true;
15385 continue;
15386 }
15387
15388 // Check for members of const-qualified, non-class type.
15389 QualType BaseType = Context.getBaseElementType(Field->getType());
15390 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15391 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15392 << Context.getCanonicalTagType(ClassDecl) << 1
15393 << Field->getDeclName();
15394 Diag(Field->getLocation(), diag::note_declared_at);
15395 Invalid = true;
15396 continue;
15397 }
15398
15399 // Suppress assigning zero-width bitfields.
15400 if (Field->isZeroLengthBitField())
15401 continue;
15402
15403 QualType FieldType = Field->getType().getNonReferenceType();
15404 if (FieldType->isIncompleteArrayType()) {
15405 assert(ClassDecl->hasFlexibleArrayMember() &&
15406 "Incomplete array type is not valid");
15407 continue;
15408 }
15409
15410 // Build references to the field in the object we're copying from and to.
15411 CXXScopeSpec SS; // Intentionally empty
15412 LookupResult MemberLookup(*this, Field->getDeclName(), Loc,
15414 MemberLookup.addDecl(Field);
15415 MemberLookup.resolveKind();
15416
15417 MemberBuilder From(OtherRef, OtherRefType, /*IsArrow=*/false, MemberLookup);
15418 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15419 // Build the copy of this field.
15420 StmtResult Copy = buildSingleCopyAssign(*this, Loc, FieldType,
15421 To, From,
15422 /*CopyingBaseSubobject=*/false,
15423 /*Copying=*/true);
15424 if (Copy.isInvalid()) {
15425 CopyAssignOperator->setInvalidDecl();
15426 return;
15427 }
15428
15429 // Success! Record the copy.
15430 Statements.push_back(Copy.getAs<Stmt>());
15431 }
15432
15433 if (!Invalid) {
15434 // Add a "return *this;"
15435 Expr *ThisExpr =
15436 (ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15437 : LangOpts.HLSL ? static_cast<ExprBuilder &>(*This)
15438 : static_cast<ExprBuilder &>(*DerefThis))
15439 .build(*this, Loc);
15440 StmtResult Return = BuildReturnStmt(Loc, ThisExpr);
15441 if (Return.isInvalid())
15442 Invalid = true;
15443 else
15444 Statements.push_back(Return.getAs<Stmt>());
15445 }
15446
15447 if (Invalid) {
15448 CopyAssignOperator->setInvalidDecl();
15449 return;
15450 }
15451
15452 StmtResult Body;
15453 {
15454 CompoundScopeRAII CompoundScope(*this);
15455 Body = ActOnCompoundStmt(Loc, Loc, Statements,
15456 /*isStmtExpr=*/false);
15457 assert(!Body.isInvalid() && "Compound statement creation cannot fail");
15458 }
15459 CopyAssignOperator->setBody(Body.getAs<Stmt>());
15460 CopyAssignOperator->markUsed(Context);
15461
15463 L->CompletedImplicitDefinition(CopyAssignOperator);
15464 }
15465}
15466
15468 assert(ClassDecl->needsImplicitMoveAssignment());
15469
15470 DeclaringSpecialMember DSM(*this, ClassDecl,
15472 if (DSM.isAlreadyBeingDeclared())
15473 return nullptr;
15474
15475 // Note: The following rules are largely analoguous to the move
15476 // constructor rules.
15477
15479 /*Qualifier=*/std::nullopt, ClassDecl,
15480 /*OwnsTag=*/false);
15482 if (AS != LangAS::Default)
15483 ArgType = Context.getAddrSpaceQualType(ArgType, AS);
15484 QualType RetType = Context.getLValueReferenceType(ArgType);
15485 ArgType = Context.getRValueReferenceType(ArgType);
15486
15488 *this, ClassDecl, CXXSpecialMemberKind::MoveAssignment, false);
15489
15490 // An implicitly-declared move assignment operator is an inline public
15491 // member of its class.
15492 DeclarationName Name = Context.DeclarationNames.getCXXOperatorName(OO_Equal);
15493 SourceLocation ClassLoc = ClassDecl->getLocation();
15494 DeclarationNameInfo NameInfo(Name, ClassLoc);
15496 Context, ClassDecl, ClassLoc, NameInfo, QualType(),
15497 /*TInfo=*/nullptr, /*StorageClass=*/SC_None,
15498 getCurFPFeatures().isFPConstrained(),
15499 /*isInline=*/true,
15501 SourceLocation());
15502 MoveAssignment->setAccess(AS_public);
15503 MoveAssignment->setDefaulted();
15504 MoveAssignment->setImplicit();
15505
15506 setupImplicitSpecialMemberType(MoveAssignment, RetType, ArgType);
15507
15508 if (getLangOpts().CUDA)
15509 CUDA().inferTargetForImplicitSpecialMember(
15511 /* ConstRHS */ false,
15512 /* Diagnose */ false);
15513
15514 // Add the parameter to the operator.
15516 ClassLoc, ClassLoc,
15517 /*Id=*/nullptr, ArgType,
15518 /*TInfo=*/nullptr, SC_None,
15519 nullptr);
15520 MoveAssignment->setParams(FromParam);
15521
15522 MoveAssignment->setTrivial(
15526 : ClassDecl->hasTrivialMoveAssignment());
15527
15528 // Note that we have added this copy-assignment operator.
15529 ++getASTContext().NumImplicitMoveAssignmentOperatorsDeclared;
15530
15531 Scope *S = getScopeForContext(ClassDecl);
15533
15537 SetDeclDeleted(MoveAssignment, ClassLoc);
15538 }
15539
15540 if (S)
15542 ClassDecl->addDecl(MoveAssignment);
15543
15544 return MoveAssignment;
15545}
15546
15547/// Check if we're implicitly defining a move assignment operator for a class
15548/// with virtual bases. Such a move assignment might move-assign the virtual
15549/// base multiple times.
15551 SourceLocation CurrentLocation) {
15552 assert(!Class->isDependentContext() && "should not define dependent move");
15553
15554 // Only a virtual base could get implicitly move-assigned multiple times.
15555 // Only a non-trivial move assignment can observe this. We only want to
15556 // diagnose if we implicitly define an assignment operator that assigns
15557 // two base classes, both of which move-assign the same virtual base.
15558 if (Class->getNumVBases() == 0 || Class->hasTrivialMoveAssignment() ||
15559 Class->getNumBases() < 2)
15560 return;
15561
15563 typedef llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;
15564 VBaseMap VBases;
15565
15566 for (auto &BI : Class->bases()) {
15567 Worklist.push_back(&BI);
15568 while (!Worklist.empty()) {
15569 CXXBaseSpecifier *BaseSpec = Worklist.pop_back_val();
15570 CXXRecordDecl *Base = BaseSpec->getType()->getAsCXXRecordDecl();
15571
15572 // If the base has no non-trivial move assignment operators,
15573 // we don't care about moves from it.
15574 if (!Base->hasNonTrivialMoveAssignment())
15575 continue;
15576
15577 // If there's nothing virtual here, skip it.
15578 if (!BaseSpec->isVirtual() && !Base->getNumVBases())
15579 continue;
15580
15581 // If we're not actually going to call a move assignment for this base,
15582 // or the selected move assignment is trivial, skip it.
15585 /*ConstArg*/ false, /*VolatileArg*/ false,
15586 /*RValueThis*/ true, /*ConstThis*/ false,
15587 /*VolatileThis*/ false);
15588 if (!SMOR.getMethod() || SMOR.getMethod()->isTrivial() ||
15590 continue;
15591
15592 if (BaseSpec->isVirtual()) {
15593 // We're going to move-assign this virtual base, and its move
15594 // assignment operator is not trivial. If this can happen for
15595 // multiple distinct direct bases of Class, diagnose it. (If it
15596 // only happens in one base, we'll diagnose it when synthesizing
15597 // that base class's move assignment operator.)
15598 CXXBaseSpecifier *&Existing =
15599 VBases.insert(std::make_pair(Base->getCanonicalDecl(), &BI))
15600 .first->second;
15601 if (Existing && Existing != &BI) {
15602 S.Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times)
15603 << Class << Base;
15604 S.Diag(Existing->getBeginLoc(), diag::note_vbase_moved_here)
15605 << (Base->getCanonicalDecl() ==
15607 << Base << Existing->getType() << Existing->getSourceRange();
15608 S.Diag(BI.getBeginLoc(), diag::note_vbase_moved_here)
15609 << (Base->getCanonicalDecl() ==
15610 BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())
15611 << Base << BI.getType() << BaseSpec->getSourceRange();
15612
15613 // Only diagnose each vbase once.
15614 Existing = nullptr;
15615 }
15616 } else {
15617 // Only walk over bases that have defaulted move assignment operators.
15618 // We assume that any user-provided move assignment operator handles
15619 // the multiple-moves-of-vbase case itself somehow.
15620 if (!SMOR.getMethod()->isDefaulted())
15621 continue;
15622
15623 // We're going to move the base classes of Base. Add them to the list.
15624 llvm::append_range(Worklist, llvm::make_pointer_range(Base->bases()));
15625 }
15626 }
15627 }
15628}
15629
15631 CXXMethodDecl *MoveAssignOperator) {
15632 assert((MoveAssignOperator->isDefaulted() &&
15633 MoveAssignOperator->isOverloadedOperator() &&
15634 MoveAssignOperator->getOverloadedOperator() == OO_Equal &&
15635 !MoveAssignOperator->doesThisDeclarationHaveABody() &&
15636 !MoveAssignOperator->isDeleted()) &&
15637 "DefineImplicitMoveAssignment called for wrong function");
15638 if (MoveAssignOperator->willHaveBody() || MoveAssignOperator->isInvalidDecl())
15639 return;
15640
15641 CXXRecordDecl *ClassDecl = MoveAssignOperator->getParent();
15642 if (ClassDecl->isInvalidDecl()) {
15643 MoveAssignOperator->setInvalidDecl();
15644 return;
15645 }
15646
15647 // C++0x [class.copy]p28:
15648 // The implicitly-defined or move assignment operator for a non-union class
15649 // X performs memberwise move assignment of its subobjects. The direct base
15650 // classes of X are assigned first, in the order of their declaration in the
15651 // base-specifier-list, and then the immediate non-static data members of X
15652 // are assigned, in the order in which they were declared in the class
15653 // definition.
15654
15655 // Issue a warning if our implicit move assignment operator will move
15656 // from a virtual base more than once.
15657 checkMoveAssignmentForRepeatedMove(*this, ClassDecl, CurrentLocation);
15658
15659 SynthesizedFunctionScope Scope(*this, MoveAssignOperator);
15660
15661 // The exception specification is needed because we are defining the
15662 // function.
15663 ResolveExceptionSpec(CurrentLocation,
15664 MoveAssignOperator->getType()->castAs<FunctionProtoType>());
15665
15666 // Add a context note for diagnostics produced after this point.
15667 Scope.addContextNote(CurrentLocation);
15668
15669 // The statements that form the synthesized function body.
15670 SmallVector<Stmt*, 8> Statements;
15671
15672 // The parameter for the "other" object, which we are move from.
15673 ParmVarDecl *Other = MoveAssignOperator->getNonObjectParameter(0);
15674 QualType OtherRefType =
15675 Other->getType()->castAs<RValueReferenceType>()->getPointeeType();
15676
15677 // Our location for everything implicitly-generated.
15678 SourceLocation Loc = MoveAssignOperator->getEndLoc().isValid()
15679 ? MoveAssignOperator->getEndLoc()
15680 : MoveAssignOperator->getLocation();
15681
15682 // Builds a reference to the "other" object.
15683 RefBuilder OtherRef(Other, OtherRefType);
15684 // Cast to rvalue.
15685 MoveCastBuilder MoveOther(OtherRef);
15686
15687 // Builds the function object parameter.
15688 std::optional<ThisBuilder> This;
15689 std::optional<DerefBuilder> DerefThis;
15690 std::optional<RefBuilder> ExplicitObject;
15691 QualType ObjectType;
15692 bool IsArrow = false;
15693 if (MoveAssignOperator->isExplicitObjectMemberFunction()) {
15694 ObjectType = MoveAssignOperator->getParamDecl(0)->getType();
15695 if (ObjectType->isReferenceType())
15696 ObjectType = ObjectType->getPointeeType();
15697 ExplicitObject.emplace(MoveAssignOperator->getParamDecl(0), ObjectType);
15698 } else {
15699 ObjectType = getCurrentThisType();
15700 This.emplace();
15701 DerefThis.emplace(*This);
15702 IsArrow = !getLangOpts().HLSL;
15703 }
15704 ExprBuilder &ObjectParameter =
15705 ExplicitObject ? *ExplicitObject : static_cast<ExprBuilder &>(*This);
15706
15707 // Assign base classes.
15708 bool Invalid = false;
15709 for (auto &Base : ClassDecl->bases()) {
15710 // C++11 [class.copy]p28:
15711 // It is unspecified whether subobjects representing virtual base classes
15712 // are assigned more than once by the implicitly-defined copy assignment
15713 // operator.
15714 // FIXME: Do not assign to a vbase that will be assigned by some other base
15715 // class. For a move-assignment, this can result in the vbase being moved
15716 // multiple times.
15717
15718 // Form the assignment:
15719 // static_cast<Base*>(this)->Base::operator=(static_cast<Base&&>(other));
15720 QualType BaseType = Base.getType().getUnqualifiedType();
15721 if (!BaseType->isRecordType()) {
15722 Invalid = true;
15723 continue;
15724 }
15725
15726 CXXCastPath BasePath;
15727 BasePath.push_back(&Base);
15728
15729 // Construct the "from" expression, which is an implicit cast to the
15730 // appropriately-qualified base type.
15731 CastBuilder From(OtherRef, BaseType, VK_XValue, BasePath);
15732
15733 // Implicitly cast "this" to the appropriately-qualified base type.
15734 // Dereference "this".
15735 CastBuilder To(
15736 ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15737 : static_cast<ExprBuilder &>(*DerefThis),
15738 Context.getQualifiedType(BaseType, ObjectType.getQualifiers()),
15739 VK_LValue, BasePath);
15740
15741 // Build the move.
15742 StmtResult Move = buildSingleCopyAssign(*this, Loc, BaseType,
15743 To, From,
15744 /*CopyingBaseSubobject=*/true,
15745 /*Copying=*/false);
15746 if (Move.isInvalid()) {
15747 MoveAssignOperator->setInvalidDecl();
15748 return;
15749 }
15750
15751 // Success! Record the move.
15752 Statements.push_back(Move.getAs<Expr>());
15753 }
15754
15755 // Assign non-static members.
15756 for (auto *Field : ClassDecl->fields()) {
15757 // FIXME: We should form some kind of AST representation for the implied
15758 // memcpy in a union copy operation.
15759 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15760 continue;
15761
15762 if (Field->isInvalidDecl()) {
15763 Invalid = true;
15764 continue;
15765 }
15766
15767 // Check for members of reference type; we can't move those.
15768 if (Field->getType()->isReferenceType()) {
15769 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15770 << Context.getCanonicalTagType(ClassDecl) << 0
15771 << Field->getDeclName();
15772 Diag(Field->getLocation(), diag::note_declared_at);
15773 Invalid = true;
15774 continue;
15775 }
15776
15777 // Check for members of const-qualified, non-class type.
15778 QualType BaseType = Context.getBaseElementType(Field->getType());
15779 if (!BaseType->isRecordType() && BaseType.isConstQualified()) {
15780 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15781 << Context.getCanonicalTagType(ClassDecl) << 1
15782 << Field->getDeclName();
15783 Diag(Field->getLocation(), diag::note_declared_at);
15784 Invalid = true;
15785 continue;
15786 }
15787
15788 // Suppress assigning zero-width bitfields.
15789 if (Field->isZeroLengthBitField())
15790 continue;
15791
15792 QualType FieldType = Field->getType().getNonReferenceType();
15793 if (FieldType->isIncompleteArrayType()) {
15794 assert(ClassDecl->hasFlexibleArrayMember() &&
15795 "Incomplete array type is not valid");
15796 continue;
15797 }
15798
15799 // Build references to the field in the object we're copying from and to.
15800 LookupResult MemberLookup(*this, Field->getDeclName(), Loc,
15802 MemberLookup.addDecl(Field);
15803 MemberLookup.resolveKind();
15804 MemberBuilder From(MoveOther, OtherRefType,
15805 /*IsArrow=*/false, MemberLookup);
15806 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15807
15808 assert(!From.build(*this, Loc)->isLValue() && // could be xvalue or prvalue
15809 "Member reference with rvalue base must be rvalue except for reference "
15810 "members, which aren't allowed for move assignment.");
15811
15812 // Build the move of this field.
15813 StmtResult Move = buildSingleCopyAssign(*this, Loc, FieldType,
15814 To, From,
15815 /*CopyingBaseSubobject=*/false,
15816 /*Copying=*/false);
15817 if (Move.isInvalid()) {
15818 MoveAssignOperator->setInvalidDecl();
15819 return;
15820 }
15821
15822 // Success! Record the copy.
15823 Statements.push_back(Move.getAs<Stmt>());
15824 }
15825
15826 if (!Invalid) {
15827 // Add a "return *this;"
15828 Expr *ThisExpr =
15829 (ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15830 : LangOpts.HLSL ? static_cast<ExprBuilder &>(*This)
15831 : static_cast<ExprBuilder &>(*DerefThis))
15832 .build(*this, Loc);
15833
15834 StmtResult Return = BuildReturnStmt(Loc, ThisExpr);
15835 if (Return.isInvalid())
15836 Invalid = true;
15837 else
15838 Statements.push_back(Return.getAs<Stmt>());
15839 }
15840
15841 if (Invalid) {
15842 MoveAssignOperator->setInvalidDecl();
15843 return;
15844 }
15845
15846 StmtResult Body;
15847 {
15848 CompoundScopeRAII CompoundScope(*this);
15849 Body = ActOnCompoundStmt(Loc, Loc, Statements,
15850 /*isStmtExpr=*/false);
15851 assert(!Body.isInvalid() && "Compound statement creation cannot fail");
15852 }
15853 MoveAssignOperator->setBody(Body.getAs<Stmt>());
15854 MoveAssignOperator->markUsed(Context);
15855
15857 L->CompletedImplicitDefinition(MoveAssignOperator);
15858 }
15859}
15860
15862 CXXRecordDecl *ClassDecl) {
15863 // C++ [class.copy]p4:
15864 // If the class definition does not explicitly declare a copy
15865 // constructor, one is declared implicitly.
15866 assert(ClassDecl->needsImplicitCopyConstructor());
15867
15868 DeclaringSpecialMember DSM(*this, ClassDecl,
15870 if (DSM.isAlreadyBeingDeclared())
15871 return nullptr;
15872
15873 QualType ClassType = Context.getTagType(ElaboratedTypeKeyword::None,
15874 /*Qualifier=*/std::nullopt, ClassDecl,
15875 /*OwnsTag=*/false);
15876 QualType ArgType = ClassType;
15877 bool Const = ClassDecl->implicitCopyConstructorHasConstParam();
15878 if (Const)
15879 ArgType = ArgType.withConst();
15880
15882 if (AS != LangAS::Default)
15883 ArgType = Context.getAddrSpaceQualType(ArgType, AS);
15884
15885 ArgType = Context.getLValueReferenceType(ArgType);
15886
15888 *this, ClassDecl, CXXSpecialMemberKind::CopyConstructor, Const);
15889
15890 DeclarationName Name
15891 = Context.DeclarationNames.getCXXConstructorName(
15892 Context.getCanonicalType(ClassType));
15893 SourceLocation ClassLoc = ClassDecl->getLocation();
15894 DeclarationNameInfo NameInfo(Name, ClassLoc);
15895
15896 // An implicitly-declared copy constructor is an inline public
15897 // member of its class.
15899 Context, ClassDecl, ClassLoc, NameInfo, QualType(), /*TInfo=*/nullptr,
15900 ExplicitSpecifier(), getCurFPFeatures().isFPConstrained(),
15901 /*isInline=*/true,
15902 /*isImplicitlyDeclared=*/true,
15905 CopyConstructor->setAccess(AS_public);
15906 CopyConstructor->setDefaulted();
15907
15908 setupImplicitSpecialMemberType(CopyConstructor, Context.VoidTy, ArgType);
15909
15910 if (getLangOpts().CUDA)
15911 CUDA().inferTargetForImplicitSpecialMember(
15913 /* ConstRHS */ Const,
15914 /* Diagnose */ false);
15915
15916 // During template instantiation of special member functions we need a
15917 // reliable TypeSourceInfo for the parameter types in order to allow functions
15918 // to be substituted.
15919 TypeSourceInfo *TSI = nullptr;
15920 if (inTemplateInstantiation() && ClassDecl->isLambda())
15921 TSI = Context.getTrivialTypeSourceInfo(ArgType);
15922
15923 // Add the parameter to the constructor.
15924 ParmVarDecl *FromParam =
15925 ParmVarDecl::Create(Context, CopyConstructor, ClassLoc, ClassLoc,
15926 /*IdentifierInfo=*/nullptr, ArgType,
15927 /*TInfo=*/TSI, SC_None, nullptr);
15928 CopyConstructor->setParams(FromParam);
15929
15930 CopyConstructor->setTrivial(
15934 : ClassDecl->hasTrivialCopyConstructor());
15935
15936 CopyConstructor->setTrivialForCall(
15937 ClassDecl->hasAttr<TrivialABIAttr>() ||
15942 : ClassDecl->hasTrivialCopyConstructorForCall()));
15943
15944 // Note that we have declared this constructor.
15945 ++getASTContext().NumImplicitCopyConstructorsDeclared;
15946
15947 Scope *S = getScopeForContext(ClassDecl);
15949
15954 }
15955
15956 if (S)
15958 ClassDecl->addDecl(CopyConstructor);
15959
15960 return CopyConstructor;
15961}
15962
15965 assert((CopyConstructor->isDefaulted() &&
15966 CopyConstructor->isCopyConstructor() &&
15967 !CopyConstructor->doesThisDeclarationHaveABody() &&
15968 !CopyConstructor->isDeleted()) &&
15969 "DefineImplicitCopyConstructor - call it for implicit copy ctor");
15970 if (CopyConstructor->willHaveBody() || CopyConstructor->isInvalidDecl())
15971 return;
15972
15973 CXXRecordDecl *ClassDecl = CopyConstructor->getParent();
15974 assert(ClassDecl && "DefineImplicitCopyConstructor - invalid constructor");
15975
15977
15978 // The exception specification is needed because we are defining the
15979 // function.
15980 ResolveExceptionSpec(CurrentLocation,
15981 CopyConstructor->getType()->castAs<FunctionProtoType>());
15982 MarkVTableUsed(CurrentLocation, ClassDecl);
15983
15984 // Add a context note for diagnostics produced after this point.
15985 Scope.addContextNote(CurrentLocation);
15986
15987 // C++11 [class.copy]p7:
15988 // The [definition of an implicitly declared copy constructor] is
15989 // deprecated if the class has a user-declared copy assignment operator
15990 // or a user-declared destructor.
15991 if (getLangOpts().CPlusPlus11 && CopyConstructor->isImplicit())
15993
15994 if (SetCtorInitializers(CopyConstructor, /*AnyErrors=*/false)) {
15995 CopyConstructor->setInvalidDecl();
15996 } else {
15997 SourceLocation Loc = CopyConstructor->getEndLoc().isValid()
15998 ? CopyConstructor->getEndLoc()
15999 : CopyConstructor->getLocation();
16000 Sema::CompoundScopeRAII CompoundScope(*this);
16001 CopyConstructor->setBody(
16002 ActOnCompoundStmt(Loc, Loc, {}, /*isStmtExpr=*/false).getAs<Stmt>());
16003 CopyConstructor->markUsed(Context);
16004 }
16005
16007 L->CompletedImplicitDefinition(CopyConstructor);
16008 }
16009}
16010
16012 CXXRecordDecl *ClassDecl) {
16013 assert(ClassDecl->needsImplicitMoveConstructor());
16014
16015 DeclaringSpecialMember DSM(*this, ClassDecl,
16017 if (DSM.isAlreadyBeingDeclared())
16018 return nullptr;
16019
16020 QualType ClassType = Context.getTagType(ElaboratedTypeKeyword::None,
16021 /*Qualifier=*/std::nullopt, ClassDecl,
16022 /*OwnsTag=*/false);
16023
16024 QualType ArgType = ClassType;
16026 if (AS != LangAS::Default)
16027 ArgType = Context.getAddrSpaceQualType(ClassType, AS);
16028 ArgType = Context.getRValueReferenceType(ArgType);
16029
16031 *this, ClassDecl, CXXSpecialMemberKind::MoveConstructor, false);
16032
16033 DeclarationName Name
16034 = Context.DeclarationNames.getCXXConstructorName(
16035 Context.getCanonicalType(ClassType));
16036 SourceLocation ClassLoc = ClassDecl->getLocation();
16037 DeclarationNameInfo NameInfo(Name, ClassLoc);
16038
16039 // C++11 [class.copy]p11:
16040 // An implicitly-declared copy/move constructor is an inline public
16041 // member of its class.
16043 Context, ClassDecl, ClassLoc, NameInfo, QualType(), /*TInfo=*/nullptr,
16044 ExplicitSpecifier(), getCurFPFeatures().isFPConstrained(),
16045 /*isInline=*/true,
16046 /*isImplicitlyDeclared=*/true,
16049 MoveConstructor->setAccess(AS_public);
16050 MoveConstructor->setDefaulted();
16051
16052 setupImplicitSpecialMemberType(MoveConstructor, Context.VoidTy, ArgType);
16053
16054 if (getLangOpts().CUDA)
16055 CUDA().inferTargetForImplicitSpecialMember(
16057 /* ConstRHS */ false,
16058 /* Diagnose */ false);
16059
16060 // Add the parameter to the constructor.
16062 ClassLoc, ClassLoc,
16063 /*IdentifierInfo=*/nullptr,
16064 ArgType, /*TInfo=*/nullptr,
16065 SC_None, nullptr);
16066 MoveConstructor->setParams(FromParam);
16067
16068 MoveConstructor->setTrivial(
16072 : ClassDecl->hasTrivialMoveConstructor());
16073
16074 MoveConstructor->setTrivialForCall(
16075 ClassDecl->hasAttr<TrivialABIAttr>() ||
16080 : ClassDecl->hasTrivialMoveConstructorForCall()));
16081
16082 // Note that we have declared this constructor.
16083 ++getASTContext().NumImplicitMoveConstructorsDeclared;
16084
16085 Scope *S = getScopeForContext(ClassDecl);
16087
16092 }
16093
16094 if (S)
16096 ClassDecl->addDecl(MoveConstructor);
16097
16098 return MoveConstructor;
16099}
16100
16103 assert((MoveConstructor->isDefaulted() &&
16104 MoveConstructor->isMoveConstructor() &&
16105 !MoveConstructor->doesThisDeclarationHaveABody() &&
16106 !MoveConstructor->isDeleted()) &&
16107 "DefineImplicitMoveConstructor - call it for implicit move ctor");
16108 if (MoveConstructor->willHaveBody() || MoveConstructor->isInvalidDecl())
16109 return;
16110
16111 CXXRecordDecl *ClassDecl = MoveConstructor->getParent();
16112 assert(ClassDecl && "DefineImplicitMoveConstructor - invalid constructor");
16113
16115
16116 // The exception specification is needed because we are defining the
16117 // function.
16118 ResolveExceptionSpec(CurrentLocation,
16119 MoveConstructor->getType()->castAs<FunctionProtoType>());
16120 MarkVTableUsed(CurrentLocation, ClassDecl);
16121
16122 // Add a context note for diagnostics produced after this point.
16123 Scope.addContextNote(CurrentLocation);
16124
16125 if (SetCtorInitializers(MoveConstructor, /*AnyErrors=*/false)) {
16126 MoveConstructor->setInvalidDecl();
16127 } else {
16128 SourceLocation Loc = MoveConstructor->getEndLoc().isValid()
16129 ? MoveConstructor->getEndLoc()
16130 : MoveConstructor->getLocation();
16131 Sema::CompoundScopeRAII CompoundScope(*this);
16132 MoveConstructor->setBody(
16133 ActOnCompoundStmt(Loc, Loc, {}, /*isStmtExpr=*/false).getAs<Stmt>());
16134 MoveConstructor->markUsed(Context);
16135 }
16136
16138 L->CompletedImplicitDefinition(MoveConstructor);
16139 }
16140}
16141
16143 return FD->isDeleted() && FD->isDefaulted() && isa<CXXMethodDecl>(FD);
16144}
16145
16147 SourceLocation CurrentLocation,
16148 CXXConversionDecl *Conv) {
16149 SynthesizedFunctionScope Scope(*this, Conv);
16150 assert(!Conv->getReturnType()->isUndeducedType());
16151
16152 QualType ConvRT = Conv->getType()->castAs<FunctionType>()->getReturnType();
16153 CallingConv CC =
16154 ConvRT->getPointeeType()->castAs<FunctionType>()->getCallConv();
16155
16156 CXXRecordDecl *Lambda = Conv->getParent();
16157 FunctionDecl *CallOp = Lambda->getLambdaCallOperator();
16158 FunctionDecl *Invoker =
16159 CallOp->hasCXXExplicitFunctionObjectParameter() || CallOp->isStatic()
16160 ? CallOp
16161 : Lambda->getLambdaStaticInvoker(CC);
16162
16163 if (auto *TemplateArgs = Conv->getTemplateSpecializationArgs()) {
16165 CallOp->getDescribedFunctionTemplate(), TemplateArgs, CurrentLocation);
16166 if (!CallOp)
16167 return;
16168
16169 if (CallOp != Invoker) {
16171 Invoker->getDescribedFunctionTemplate(), TemplateArgs,
16172 CurrentLocation);
16173 if (!Invoker)
16174 return;
16175 }
16176 }
16177
16178 if (CallOp->isInvalidDecl())
16179 return;
16180
16181 // Mark the call operator referenced (and add to pending instantiations
16182 // if necessary).
16183 // For both the conversion and static-invoker template specializations
16184 // we construct their body's in this function, so no need to add them
16185 // to the PendingInstantiations.
16186 MarkFunctionReferenced(CurrentLocation, CallOp);
16187
16188 if (Invoker != CallOp) {
16189 // Fill in the __invoke function with a dummy implementation. IR generation
16190 // will fill in the actual details. Update its type in case it contained
16191 // an 'auto'.
16192 Invoker->markUsed(Context);
16193 Invoker->setReferenced();
16194 Invoker->setType(Conv->getReturnType()->getPointeeType());
16195 Invoker->setBody(new (Context) CompoundStmt(Conv->getLocation()));
16196 }
16197
16198 // Construct the body of the conversion function { return __invoke; }.
16199 Expr *FunctionRef = BuildDeclRefExpr(Invoker, Invoker->getType(), VK_LValue,
16200 Conv->getLocation());
16201 assert(FunctionRef && "Can't refer to __invoke function?");
16202 Stmt *Return = BuildReturnStmt(Conv->getLocation(), FunctionRef).get();
16204 Conv->getLocation(), Conv->getLocation()));
16205 Conv->markUsed(Context);
16206 Conv->setReferenced();
16207
16209 L->CompletedImplicitDefinition(Conv);
16210 if (Invoker != CallOp)
16211 L->CompletedImplicitDefinition(Invoker);
16212 }
16213}
16214
16216 SourceLocation CurrentLocation, CXXConversionDecl *Conv) {
16217 assert(!Conv->getParent()->isGenericLambda());
16218
16219 SynthesizedFunctionScope Scope(*this, Conv);
16220
16221 // Copy-initialize the lambda object as needed to capture it.
16222 Expr *This = ActOnCXXThis(CurrentLocation).get();
16223 Expr *DerefThis =CreateBuiltinUnaryOp(CurrentLocation, UO_Deref, This).get();
16224
16225 ExprResult BuildBlock = BuildBlockForLambdaConversion(CurrentLocation,
16226 Conv->getLocation(),
16227 Conv, DerefThis);
16228
16229 // If we're not under ARC, make sure we still get the _Block_copy/autorelease
16230 // behavior. Note that only the general conversion function does this
16231 // (since it's unusable otherwise); in the case where we inline the
16232 // block literal, it has block literal lifetime semantics.
16233 if (!BuildBlock.isInvalid() && !getLangOpts().ObjCAutoRefCount)
16234 BuildBlock = ImplicitCastExpr::Create(
16235 Context, BuildBlock.get()->getType(), CK_CopyAndAutoreleaseBlockObject,
16236 BuildBlock.get(), nullptr, VK_PRValue, FPOptionsOverride());
16237
16238 if (BuildBlock.isInvalid()) {
16239 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16240 Conv->setInvalidDecl();
16241 return;
16242 }
16243
16244 // Create the return statement that returns the block from the conversion
16245 // function.
16246 StmtResult Return = BuildReturnStmt(Conv->getLocation(), BuildBlock.get());
16247 if (Return.isInvalid()) {
16248 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
16249 Conv->setInvalidDecl();
16250 return;
16251 }
16252
16253 // Set the body of the conversion function.
16254 Stmt *ReturnS = Return.get();
16256 Conv->getLocation(), Conv->getLocation()));
16257 Conv->markUsed(Context);
16258
16259 // We're done; notify the mutation listener, if any.
16261 L->CompletedImplicitDefinition(Conv);
16262 }
16263}
16264
16265/// Determine whether the given list arguments contains exactly one
16266/// "real" (non-default) argument.
16268 switch (Args.size()) {
16269 case 0:
16270 return false;
16271
16272 default:
16273 if (!Args[1]->isDefaultArgument())
16274 return false;
16275
16276 [[fallthrough]];
16277 case 1:
16278 return !Args[0]->isDefaultArgument();
16279 }
16280
16281 return false;
16282}
16283
16285 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
16287 bool HadMultipleCandidates, bool IsListInitialization,
16288 bool IsStdInitListInitialization, bool RequiresZeroInit,
16289 CXXConstructionKind ConstructKind, SourceRange ParenRange) {
16290 bool Elidable = false;
16291
16292 // C++0x [class.copy]p34:
16293 // When certain criteria are met, an implementation is allowed to
16294 // omit the copy/move construction of a class object, even if the
16295 // copy/move constructor and/or destructor for the object have
16296 // side effects. [...]
16297 // - when a temporary class object that has not been bound to a
16298 // reference (12.2) would be copied/moved to a class object
16299 // with the same cv-unqualified type, the copy/move operation
16300 // can be omitted by constructing the temporary object
16301 // directly into the target of the omitted copy/move
16302 if (ConstructKind == CXXConstructionKind::Complete && Constructor &&
16303 // FIXME: Converting constructors should also be accepted.
16304 // But to fix this, the logic that digs down into a CXXConstructExpr
16305 // to find the source object needs to handle it.
16306 // Right now it assumes the source object is passed directly as the
16307 // first argument.
16308 Constructor->isCopyOrMoveConstructor() && hasOneRealArgument(ExprArgs)) {
16309 Expr *SubExpr = ExprArgs[0];
16310 // FIXME: Per above, this is also incorrect if we want to accept
16311 // converting constructors, as isTemporaryObject will
16312 // reject temporaries with different type from the
16313 // CXXRecord itself.
16314 Elidable = SubExpr->isTemporaryObject(
16316 }
16317
16318 return BuildCXXConstructExpr(ConstructLoc, DeclInitType,
16319 FoundDecl, Constructor,
16320 Elidable, ExprArgs, HadMultipleCandidates,
16321 IsListInitialization,
16322 IsStdInitListInitialization, RequiresZeroInit,
16323 ConstructKind, ParenRange);
16324}
16325
16327 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
16328 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg ExprArgs,
16329 bool HadMultipleCandidates, bool IsListInitialization,
16330 bool IsStdInitListInitialization, bool RequiresZeroInit,
16331 CXXConstructionKind ConstructKind, SourceRange ParenRange) {
16332 if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {
16333 Constructor = findInheritingConstructor(ConstructLoc, Constructor, Shadow);
16334 // The only way to get here is if we did overload resolution to find the
16335 // shadow decl, so we don't need to worry about re-checking the trailing
16336 // requires clause.
16337 if (DiagnoseUseOfOverloadedDecl(Constructor, ConstructLoc))
16338 return ExprError();
16339 }
16340
16341 return BuildCXXConstructExpr(
16342 ConstructLoc, DeclInitType, Constructor, Elidable, ExprArgs,
16343 HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,
16344 RequiresZeroInit, ConstructKind, ParenRange);
16345}
16346
16347/// BuildCXXConstructExpr - Creates a complete call to a constructor,
16348/// including handling of its default argument expressions.
16350 SourceLocation ConstructLoc, QualType DeclInitType,
16351 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg ExprArgs,
16352 bool HadMultipleCandidates, bool IsListInitialization,
16353 bool IsStdInitListInitialization, bool RequiresZeroInit,
16354 CXXConstructionKind ConstructKind, SourceRange ParenRange) {
16355 assert(declaresSameEntity(
16356 Constructor->getParent(),
16357 DeclInitType->getBaseElementTypeUnsafe()->getAsCXXRecordDecl()) &&
16358 "given constructor for wrong type");
16359 MarkFunctionReferenced(ConstructLoc, Constructor);
16360 if (getLangOpts().CUDA && !CUDA().CheckCall(ConstructLoc, Constructor))
16361 return ExprError();
16362
16365 Context, DeclInitType, ConstructLoc, Constructor, Elidable, ExprArgs,
16366 HadMultipleCandidates, IsListInitialization,
16367 IsStdInitListInitialization, RequiresZeroInit,
16368 static_cast<CXXConstructionKind>(ConstructKind), ParenRange),
16369 Constructor);
16370}
16371
16373 if (VD->isInvalidDecl()) return;
16374 // If initializing the variable failed, don't also diagnose problems with
16375 // the destructor, they're likely related.
16376 if (VD->getInit() && VD->getInit()->containsErrors())
16377 return;
16378
16379 ClassDecl = ClassDecl->getDefinitionOrSelf();
16380 if (ClassDecl->isInvalidDecl()) return;
16381 if (ClassDecl->hasIrrelevantDestructor()) return;
16382 if (ClassDecl->isDependentContext()) return;
16383
16384 if (VD->isNoDestroy(getASTContext()))
16385 return;
16386
16388 // The result of `LookupDestructor` might be nullptr if the destructor is
16389 // invalid, in which case it is marked as `IneligibleOrNotSelected` and
16390 // will not be selected by `CXXRecordDecl::getDestructor()`.
16391 if (!Destructor)
16392 return;
16393 // If this is an array, we'll require the destructor during initialization, so
16394 // we can skip over this. We still want to emit exit-time destructor warnings
16395 // though.
16396 if (!VD->getType()->isArrayType()) {
16399 PDiag(diag::err_access_dtor_var)
16400 << VD->getDeclName() << VD->getType());
16402 }
16403
16404 if (Destructor->isTrivial()) return;
16405
16406 // If the destructor is constexpr, check whether the variable has constant
16407 // destruction now.
16408 if (Destructor->isConstexpr()) {
16409 bool HasConstantInit = false;
16410 if (VD->getInit() && !VD->getInit()->isValueDependent())
16411 HasConstantInit = VD->evaluateValue();
16413 if (!VD->evaluateDestruction(Notes) && VD->isConstexpr() &&
16414 HasConstantInit) {
16415 Diag(VD->getLocation(),
16416 diag::err_constexpr_var_requires_const_destruction) << VD;
16417 for (unsigned I = 0, N = Notes.size(); I != N; ++I)
16418 Diag(Notes[I].first, Notes[I].second);
16419 }
16420 }
16421
16422 if (!VD->hasGlobalStorage() || !VD->needsDestruction(Context))
16423 return;
16424
16425 // Emit warning for non-trivial dtor in global scope (a real global,
16426 // class-static, function-static).
16427 if (!VD->hasAttr<AlwaysDestroyAttr>())
16428 Diag(VD->getLocation(), diag::warn_exit_time_destructor);
16429
16430 // TODO: this should be re-enabled for static locals by !CXAAtExit
16431 if (!VD->isStaticLocal())
16432 Diag(VD->getLocation(), diag::warn_global_destructor);
16433}
16434
16436 QualType DeclInitType, MultiExprArg ArgsPtr,
16437 SourceLocation Loc,
16438 SmallVectorImpl<Expr *> &ConvertedArgs,
16439 bool AllowExplicit,
16440 bool IsListInitialization) {
16441 // FIXME: This duplicates a lot of code from Sema::ConvertArgumentsForCall.
16442 unsigned NumArgs = ArgsPtr.size();
16443 Expr **Args = ArgsPtr.data();
16444
16445 const auto *Proto = Constructor->getType()->castAs<FunctionProtoType>();
16446 unsigned NumParams = Proto->getNumParams();
16447
16448 // If too few arguments are available, we'll fill in the rest with defaults.
16449 if (NumArgs < NumParams)
16450 ConvertedArgs.reserve(NumParams);
16451 else
16452 ConvertedArgs.reserve(NumArgs);
16453
16454 VariadicCallType CallType = Proto->isVariadic()
16457 SmallVector<Expr *, 8> AllArgs;
16459 Loc, Constructor, Proto, 0, llvm::ArrayRef(Args, NumArgs), AllArgs,
16460 CallType, AllowExplicit, IsListInitialization);
16461 ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
16462
16463 DiagnoseSentinelCalls(Constructor, Loc, AllArgs);
16464
16465 CheckConstructorCall(Constructor, DeclInitType, llvm::ArrayRef(AllArgs),
16466 Proto, Loc);
16467
16468 return Invalid;
16469}
16470
16472 bool SeenTypedOperators = Context.hasSeenTypeAwareOperatorNewOrDelete();
16473 return typeAwareAllocationModeFromBool(SeenTypedOperators);
16474}
16475
16478 QualType DeallocType, SourceLocation Loc) {
16479 if (DeallocType.isNull())
16480 return nullptr;
16481
16482 FunctionDecl *FnDecl = FnTemplateDecl->getTemplatedDecl();
16483 if (!FnDecl->isTypeAwareOperatorNewOrDelete())
16484 return nullptr;
16485
16486 if (FnDecl->isVariadic())
16487 return nullptr;
16488
16489 unsigned NumParams = FnDecl->getNumParams();
16490 constexpr unsigned RequiredParameterCount =
16492 // A usual deallocation function has no placement parameters
16493 if (NumParams != RequiredParameterCount)
16494 return nullptr;
16495
16496 // A type aware allocation is only usual if the only dependent parameter is
16497 // the first parameter.
16498 if (llvm::any_of(FnDecl->parameters().drop_front(),
16499 [](const ParmVarDecl *ParamDecl) {
16500 return ParamDecl->getType()->isDependentType();
16501 }))
16502 return nullptr;
16503
16504 QualType SpecializedTypeIdentity = tryBuildStdTypeIdentity(DeallocType, Loc);
16505 if (SpecializedTypeIdentity.isNull())
16506 return nullptr;
16507
16509 ArgTypes.reserve(NumParams);
16510
16511 // The first parameter to a type aware operator delete is by definition the
16512 // type-identity argument, so we explicitly set this to the target
16513 // type-identity type, the remaining usual parameters should then simply match
16514 // the type declared in the function template.
16515 ArgTypes.push_back(SpecializedTypeIdentity);
16516 for (unsigned ParamIdx = 1; ParamIdx < RequiredParameterCount; ++ParamIdx)
16517 ArgTypes.push_back(FnDecl->getParamDecl(ParamIdx)->getType());
16518
16520 QualType ExpectedFunctionType =
16521 Context.getFunctionType(Context.VoidTy, ArgTypes, EPI);
16524 if (DeduceTemplateArguments(FnTemplateDecl, nullptr, ExpectedFunctionType,
16526 return nullptr;
16527 return Result;
16528}
16529
16530static inline bool
16532 const FunctionDecl *FnDecl) {
16533 const DeclContext *DC = FnDecl->getDeclContext()->getRedeclContext();
16534 if (isa<NamespaceDecl>(DC)) {
16535 return SemaRef.Diag(FnDecl->getLocation(),
16536 diag::err_operator_new_delete_declared_in_namespace)
16537 << FnDecl->getDeclName();
16538 }
16539
16540 if (isa<TranslationUnitDecl>(DC) &&
16541 FnDecl->getStorageClass() == SC_Static) {
16542 return SemaRef.Diag(FnDecl->getLocation(),
16543 diag::err_operator_new_delete_declared_static)
16544 << FnDecl->getDeclName();
16545 }
16546
16547 return false;
16548}
16549
16551 const PointerType *PtrTy) {
16552 auto &Ctx = SemaRef.Context;
16553 Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
16554 PtrQuals.removeAddressSpace();
16556 PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
16557}
16558
16560
16562 const FunctionDecl *FD,
16563 bool *WasMalformed) {
16564 const Decl *MalformedDecl = nullptr;
16565 if (FD->getNumParams() > 0 &&
16566 SemaRef.isStdTypeIdentity(FD->getParamDecl(0)->getType(),
16567 /*TypeArgument=*/nullptr, &MalformedDecl))
16568 return true;
16569
16570 if (!MalformedDecl)
16571 return false;
16572
16573 if (WasMalformed)
16574 *WasMalformed = true;
16575
16576 return true;
16577}
16578
16580 auto *RD = Type->getAsCXXRecordDecl();
16581 return RD && RD->isInStdNamespace() && RD->getIdentifier() &&
16582 RD->getIdentifier()->isStr("destroying_delete_t");
16583}
16584
16586 const FunctionDecl *FD) {
16587 // C++ P0722:
16588 // Within a class C, a single object deallocation function with signature
16589 // (T, std::destroying_delete_t, <more params>)
16590 // is a destroying operator delete.
16591 bool IsPotentiallyTypeAware = IsPotentiallyTypeAwareOperatorNewOrDelete(
16592 SemaRef, FD, /*WasMalformed=*/nullptr);
16593 unsigned DestroyingDeleteIdx = IsPotentiallyTypeAware + /* address */ 1;
16594 return isa<CXXMethodDecl>(FD) && FD->getOverloadedOperator() == OO_Delete &&
16595 FD->getNumParams() > DestroyingDeleteIdx &&
16596 isDestroyingDeleteT(FD->getParamDecl(DestroyingDeleteIdx)->getType());
16597}
16598
16600 Sema &SemaRef, FunctionDecl *FnDecl, AllocationOperatorKind OperatorKind,
16601 CanQualType ExpectedResultType, CanQualType ExpectedSizeOrAddressParamType,
16602 unsigned DependentParamTypeDiag, unsigned InvalidParamTypeDiag) {
16603 auto NormalizeType = [&SemaRef](QualType T) {
16604 if (SemaRef.getLangOpts().OpenCLCPlusPlus) {
16605 // The operator is valid on any address space for OpenCL.
16606 // Drop address space from actual and expected result types.
16607 if (const auto PtrTy = T->template getAs<PointerType>())
16608 T = RemoveAddressSpaceFromPtr(SemaRef, PtrTy);
16609 }
16610 return SemaRef.Context.getCanonicalType(T);
16611 };
16612
16613 const unsigned NumParams = FnDecl->getNumParams();
16614 unsigned FirstNonTypeParam = 0;
16615 bool MalformedTypeIdentity = false;
16616 bool IsPotentiallyTypeAware = IsPotentiallyTypeAwareOperatorNewOrDelete(
16617 SemaRef, FnDecl, &MalformedTypeIdentity);
16618 unsigned MinimumMandatoryArgumentCount = 1;
16619 unsigned SizeParameterIndex = 0;
16620 if (IsPotentiallyTypeAware) {
16621 // We don't emit this diagnosis for template instantiations as we will
16622 // have already emitted it for the original template declaration.
16623 if (!FnDecl->isTemplateInstantiation())
16624 SemaRef.Diag(FnDecl->getLocation(), diag::warn_ext_type_aware_allocators);
16625
16626 if (OperatorKind == AllocationOperatorKind::New) {
16627 SizeParameterIndex = 1;
16628 MinimumMandatoryArgumentCount =
16630 } else {
16631 SizeParameterIndex = 2;
16632 MinimumMandatoryArgumentCount =
16634 }
16635 FirstNonTypeParam = 1;
16636 }
16637
16638 bool IsPotentiallyDestroyingDelete =
16640
16641 if (IsPotentiallyDestroyingDelete) {
16642 ++MinimumMandatoryArgumentCount;
16643 ++SizeParameterIndex;
16644 }
16645
16646 if (NumParams < MinimumMandatoryArgumentCount)
16647 return SemaRef.Diag(FnDecl->getLocation(),
16648 diag::err_operator_new_delete_too_few_parameters)
16649 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16650 << FnDecl->getDeclName() << MinimumMandatoryArgumentCount;
16651
16652 for (unsigned Idx = 0; Idx < MinimumMandatoryArgumentCount; ++Idx) {
16653 const ParmVarDecl *ParamDecl = FnDecl->getParamDecl(Idx);
16654 if (ParamDecl->hasDefaultArg())
16655 return SemaRef.Diag(FnDecl->getLocation(),
16656 diag::err_operator_new_default_arg)
16657 << FnDecl->getDeclName() << Idx << ParamDecl->getDefaultArgRange();
16658 }
16659
16660 auto *FnType = FnDecl->getType()->castAs<FunctionType>();
16661 QualType CanResultType = NormalizeType(FnType->getReturnType());
16662 QualType CanExpectedResultType = NormalizeType(ExpectedResultType);
16663 QualType CanExpectedSizeOrAddressParamType =
16664 NormalizeType(ExpectedSizeOrAddressParamType);
16665
16666 // Check that the result type is what we expect.
16667 if (CanResultType != CanExpectedResultType) {
16668 // Reject even if the type is dependent; an operator delete function is
16669 // required to have a non-dependent result type.
16670 return SemaRef.Diag(
16671 FnDecl->getLocation(),
16672 CanResultType->isDependentType()
16673 ? diag::err_operator_new_delete_dependent_result_type
16674 : diag::err_operator_new_delete_invalid_result_type)
16675 << FnDecl->getDeclName() << ExpectedResultType;
16676 }
16677
16678 // A function template must have at least 2 parameters.
16679 if (FnDecl->getDescribedFunctionTemplate() && NumParams < 2)
16680 return SemaRef.Diag(FnDecl->getLocation(),
16681 diag::err_operator_new_delete_template_too_few_parameters)
16682 << FnDecl->getDeclName();
16683
16684 auto CheckType = [&](unsigned ParamIdx, QualType ExpectedType,
16685 auto FallbackType) -> bool {
16686 const ParmVarDecl *ParamDecl = FnDecl->getParamDecl(ParamIdx);
16687 if (ExpectedType.isNull()) {
16688 return SemaRef.Diag(FnDecl->getLocation(), InvalidParamTypeDiag)
16689 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16690 << FnDecl->getDeclName() << (1 + ParamIdx) << FallbackType
16691 << ParamDecl->getSourceRange();
16692 }
16693 CanQualType CanExpectedTy =
16694 NormalizeType(SemaRef.Context.getCanonicalType(ExpectedType));
16695 auto ActualParamType =
16696 NormalizeType(ParamDecl->getType().getUnqualifiedType());
16697 if (ActualParamType == CanExpectedTy)
16698 return false;
16699 unsigned Diagnostic = ActualParamType->isDependentType()
16700 ? DependentParamTypeDiag
16701 : InvalidParamTypeDiag;
16702 return SemaRef.Diag(FnDecl->getLocation(), Diagnostic)
16703 << IsPotentiallyTypeAware << IsPotentiallyDestroyingDelete
16704 << FnDecl->getDeclName() << (1 + ParamIdx) << ExpectedType
16705 << FallbackType << ParamDecl->getSourceRange();
16706 };
16707
16708 // Check that the first parameter type is what we expect.
16709 if (CheckType(FirstNonTypeParam, CanExpectedSizeOrAddressParamType, "size_t"))
16710 return true;
16711
16712 FnDecl->setIsDestroyingOperatorDelete(IsPotentiallyDestroyingDelete);
16713
16714 // If the first parameter type is not a type-identity we're done, otherwise
16715 // we need to ensure the size and alignment parameters have the correct type
16716 if (!IsPotentiallyTypeAware)
16717 return false;
16718
16719 if (CheckType(SizeParameterIndex, SemaRef.Context.getSizeType(), "size_t"))
16720 return true;
16721 TagDecl *StdAlignValTDecl = SemaRef.getStdAlignValT();
16722 CanQualType StdAlignValT =
16723 StdAlignValTDecl ? SemaRef.Context.getCanonicalTagType(StdAlignValTDecl)
16724 : CanQualType();
16725 if (CheckType(SizeParameterIndex + 1, StdAlignValT, "std::align_val_t"))
16726 return true;
16727
16729 return MalformedTypeIdentity;
16730}
16731
16732static bool CheckOperatorNewDeclaration(Sema &SemaRef, FunctionDecl *FnDecl) {
16733 // C++ [basic.stc.dynamic.allocation]p1:
16734 // A program is ill-formed if an allocation function is declared in a
16735 // namespace scope other than global scope or declared static in global
16736 // scope.
16737 if (CheckOperatorNewDeleteDeclarationScope(SemaRef, FnDecl))
16738 return true;
16739
16740 CanQualType SizeTy =
16741 SemaRef.Context.getCanonicalType(SemaRef.Context.getSizeType());
16742
16743 // C++ [basic.stc.dynamic.allocation]p1:
16744 // The return type shall be void*. The first parameter shall have type
16745 // std::size_t.
16747 SemaRef, FnDecl, AllocationOperatorKind::New, SemaRef.Context.VoidPtrTy,
16748 SizeTy, diag::err_operator_new_dependent_param_type,
16749 diag::err_operator_new_param_type);
16750}
16751
16752static bool
16754 // C++ [basic.stc.dynamic.deallocation]p1:
16755 // A program is ill-formed if deallocation functions are declared in a
16756 // namespace scope other than global scope or declared static in global
16757 // scope.
16758 if (CheckOperatorNewDeleteDeclarationScope(SemaRef, FnDecl))
16759 return true;
16760
16761 auto *MD = dyn_cast<CXXMethodDecl>(FnDecl);
16762 auto ConstructDestroyingDeleteAddressType = [&]() {
16763 assert(MD);
16764 return SemaRef.Context.getPointerType(
16765 SemaRef.Context.getCanonicalTagType(MD->getParent()));
16766 };
16767
16768 // C++ P2719: A destroying operator delete cannot be type aware
16769 // so for QoL we actually check for this explicitly by considering
16770 // an destroying-delete appropriate address type and the presence of
16771 // any parameter of type destroying_delete_t as an erroneous attempt
16772 // to declare a type aware destroying delete, rather than emitting a
16773 // pile of incorrect parameter type errors.
16775 SemaRef, MD, /*WasMalformed=*/nullptr)) {
16776 QualType AddressParamType =
16777 SemaRef.Context.getCanonicalType(MD->getParamDecl(1)->getType());
16778 if (AddressParamType != SemaRef.Context.VoidPtrTy &&
16779 AddressParamType == ConstructDestroyingDeleteAddressType()) {
16780 // The address parameter type implies an author trying to construct a
16781 // type aware destroying delete, so we'll see if we can find a parameter
16782 // of type `std::destroying_delete_t`, and if we find it we'll report
16783 // this as being an attempt at a type aware destroying delete just stop
16784 // here. If we don't do this, the resulting incorrect parameter ordering
16785 // results in a pile mismatched argument type errors that don't explain
16786 // the core problem.
16787 for (auto Param : MD->parameters()) {
16788 if (isDestroyingDeleteT(Param->getType())) {
16789 SemaRef.Diag(MD->getLocation(),
16790 diag::err_type_aware_destroying_operator_delete)
16791 << Param->getSourceRange();
16792 return true;
16793 }
16794 }
16795 }
16796 }
16797
16798 // C++ P0722:
16799 // Within a class C, the first parameter of a destroying operator delete
16800 // shall be of type C *. The first parameter of any other deallocation
16801 // function shall be of type void *.
16802 CanQualType ExpectedAddressParamType =
16803 MD && IsPotentiallyDestroyingOperatorDelete(SemaRef, MD)
16804 ? SemaRef.Context.getPointerType(
16805 SemaRef.Context.getCanonicalTagType(MD->getParent()))
16806 : SemaRef.Context.VoidPtrTy;
16807
16808 // C++ [basic.stc.dynamic.deallocation]p2:
16809 // Each deallocation function shall return void
16811 SemaRef, FnDecl, AllocationOperatorKind::Delete,
16812 SemaRef.Context.VoidTy, ExpectedAddressParamType,
16813 diag::err_operator_delete_dependent_param_type,
16814 diag::err_operator_delete_param_type))
16815 return true;
16816
16817 // C++ P0722:
16818 // A destroying operator delete shall be a usual deallocation function.
16819 if (MD && !MD->getParent()->isDependentContext() &&
16821 if (!SemaRef.isUsualDeallocationFunction(MD)) {
16822 SemaRef.Diag(MD->getLocation(),
16823 diag::err_destroying_operator_delete_not_usual);
16824 return true;
16825 }
16826 }
16827
16828 return false;
16829}
16830
16832 assert(FnDecl && FnDecl->isOverloadedOperator() &&
16833 "Expected an overloaded operator declaration");
16834
16836
16837 // C++ [over.oper]p5:
16838 // The allocation and deallocation functions, operator new,
16839 // operator new[], operator delete and operator delete[], are
16840 // described completely in 3.7.3. The attributes and restrictions
16841 // found in the rest of this subclause do not apply to them unless
16842 // explicitly stated in 3.7.3.
16843 if (Op == OO_Delete || Op == OO_Array_Delete)
16844 return CheckOperatorDeleteDeclaration(*this, FnDecl);
16845
16846 if (Op == OO_New || Op == OO_Array_New)
16847 return CheckOperatorNewDeclaration(*this, FnDecl);
16848
16849 // C++ [over.oper]p7:
16850 // An operator function shall either be a member function or
16851 // be a non-member function and have at least one parameter
16852 // whose type is a class, a reference to a class, an enumeration,
16853 // or a reference to an enumeration.
16854 // Note: Before C++23, a member function could not be static. The only member
16855 // function allowed to be static is the call operator function.
16856 if (CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {
16857 if (MethodDecl->isStatic()) {
16858 if (Op == OO_Call || Op == OO_Subscript)
16859 Diag(FnDecl->getLocation(),
16860 (LangOpts.CPlusPlus23
16861 ? diag::warn_cxx20_compat_operator_overload_static
16862 : diag::ext_operator_overload_static))
16863 << FnDecl;
16864 else
16865 return Diag(FnDecl->getLocation(), diag::err_operator_overload_static)
16866 << FnDecl;
16867 }
16868 } else {
16869 bool ClassOrEnumParam = false;
16870 for (auto *Param : FnDecl->parameters()) {
16871 QualType ParamType = Param->getType().getNonReferenceType();
16872 if (ParamType->isDependentType() || ParamType->isRecordType() ||
16873 ParamType->isEnumeralType()) {
16874 ClassOrEnumParam = true;
16875 break;
16876 }
16877 }
16878
16879 if (!ClassOrEnumParam)
16880 return Diag(FnDecl->getLocation(),
16881 diag::err_operator_overload_needs_class_or_enum)
16882 << FnDecl->getDeclName();
16883 }
16884
16885 // C++ [over.oper]p8:
16886 // An operator function cannot have default arguments (8.3.6),
16887 // except where explicitly stated below.
16888 //
16889 // Only the function-call operator (C++ [over.call]p1) and the subscript
16890 // operator (CWG2507) allow default arguments.
16891 if (Op != OO_Call) {
16892 ParmVarDecl *FirstDefaultedParam = nullptr;
16893 for (auto *Param : FnDecl->parameters()) {
16894 if (Param->hasDefaultArg()) {
16895 FirstDefaultedParam = Param;
16896 break;
16897 }
16898 }
16899 if (FirstDefaultedParam) {
16900 if (Op == OO_Subscript) {
16901 Diag(FnDecl->getLocation(), LangOpts.CPlusPlus23
16902 ? diag::ext_subscript_overload
16903 : diag::error_subscript_overload)
16904 << FnDecl->getDeclName() << 1
16905 << FirstDefaultedParam->getDefaultArgRange();
16906 } else {
16907 return Diag(FirstDefaultedParam->getLocation(),
16908 diag::err_operator_overload_default_arg)
16909 << FnDecl->getDeclName()
16910 << FirstDefaultedParam->getDefaultArgRange();
16911 }
16912 }
16913 }
16914
16915 static const bool OperatorUses[NUM_OVERLOADED_OPERATORS][3] = {
16916 { false, false, false }
16917#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
16918 , { Unary, Binary, MemberOnly }
16919#include "clang/Basic/OperatorKinds.def"
16920 };
16921
16922 bool CanBeUnaryOperator = OperatorUses[Op][0];
16923 bool CanBeBinaryOperator = OperatorUses[Op][1];
16924 bool MustBeMemberOperator = OperatorUses[Op][2];
16925
16926 // C++ [over.oper]p8:
16927 // [...] Operator functions cannot have more or fewer parameters
16928 // than the number required for the corresponding operator, as
16929 // described in the rest of this subclause.
16930 unsigned NumParams = FnDecl->getNumParams() +
16931 (isa<CXXMethodDecl>(FnDecl) &&
16933 ? 1
16934 : 0);
16935 if (Op != OO_Call && Op != OO_Subscript &&
16936 ((NumParams == 1 && !CanBeUnaryOperator) ||
16937 (NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||
16938 (NumParams > 2))) {
16939 // We have the wrong number of parameters.
16940 unsigned ErrorKind;
16941 if (CanBeUnaryOperator && CanBeBinaryOperator) {
16942 ErrorKind = 2; // 2 -> unary or binary.
16943 } else if (CanBeUnaryOperator) {
16944 ErrorKind = 0; // 0 -> unary
16945 } else {
16946 assert(CanBeBinaryOperator &&
16947 "All non-call overloaded operators are unary or binary!");
16948 ErrorKind = 1; // 1 -> binary
16949 }
16950 return Diag(FnDecl->getLocation(), diag::err_operator_overload_must_be)
16951 << FnDecl->getDeclName() << NumParams << ErrorKind;
16952 }
16953
16954 if (Op == OO_Subscript && NumParams != 2) {
16955 Diag(FnDecl->getLocation(), LangOpts.CPlusPlus23
16956 ? diag::ext_subscript_overload
16957 : diag::error_subscript_overload)
16958 << FnDecl->getDeclName() << (NumParams == 1 ? 0 : 2);
16959 }
16960
16961 // Overloaded operators other than operator() and operator[] cannot be
16962 // variadic.
16963 if (Op != OO_Call &&
16964 FnDecl->getType()->castAs<FunctionProtoType>()->isVariadic()) {
16965 return Diag(FnDecl->getLocation(), diag::err_operator_overload_variadic)
16966 << FnDecl->getDeclName();
16967 }
16968
16969 // Some operators must be member functions.
16970 if (MustBeMemberOperator && !isa<CXXMethodDecl>(FnDecl)) {
16971 return Diag(FnDecl->getLocation(),
16972 diag::err_operator_overload_must_be_member)
16973 << FnDecl->getDeclName();
16974 }
16975
16976 // C++ [over.inc]p1:
16977 // The user-defined function called operator++ implements the
16978 // prefix and postfix ++ operator. If this function is a member
16979 // function with no parameters, or a non-member function with one
16980 // parameter of class or enumeration type, it defines the prefix
16981 // increment operator ++ for objects of that type. If the function
16982 // is a member function with one parameter (which shall be of type
16983 // int) or a non-member function with two parameters (the second
16984 // of which shall be of type int), it defines the postfix
16985 // increment operator ++ for objects of that type.
16986 if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
16987 ParmVarDecl *LastParam = FnDecl->getParamDecl(FnDecl->getNumParams() - 1);
16988 QualType ParamType = LastParam->getType();
16989
16990 if (!ParamType->isSpecificBuiltinType(BuiltinType::Int) &&
16991 !ParamType->isDependentType())
16992 return Diag(LastParam->getLocation(),
16993 diag::err_operator_overload_post_incdec_must_be_int)
16994 << LastParam->getType() << (Op == OO_MinusMinus);
16995 }
16996
16997 return false;
16998}
16999
17000static bool
17002 FunctionTemplateDecl *TpDecl) {
17003 TemplateParameterList *TemplateParams = TpDecl->getTemplateParameters();
17004
17005 // Must have one or two template parameters.
17006 if (TemplateParams->size() == 1) {
17007 NonTypeTemplateParmDecl *PmDecl =
17008 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->getParam(0));
17009
17010 // The template parameter must be a char parameter pack.
17011 if (PmDecl && PmDecl->isTemplateParameterPack() &&
17012 SemaRef.Context.hasSameType(PmDecl->getType(), SemaRef.Context.CharTy))
17013 return false;
17014
17015 // C++20 [over.literal]p5:
17016 // A string literal operator template is a literal operator template
17017 // whose template-parameter-list comprises a single non-type
17018 // template-parameter of class type.
17019 //
17020 // As a DR resolution, we also allow placeholders for deduced class
17021 // template specializations.
17022 if (SemaRef.getLangOpts().CPlusPlus20 && PmDecl &&
17023 !PmDecl->isTemplateParameterPack() &&
17024 (PmDecl->getType()->isRecordType() ||
17025 PmDecl->getType()->getAs<DeducedTemplateSpecializationType>()))
17026 return false;
17027 } else if (TemplateParams->size() == 2) {
17028 TemplateTypeParmDecl *PmType =
17029 dyn_cast<TemplateTypeParmDecl>(TemplateParams->getParam(0));
17030 NonTypeTemplateParmDecl *PmArgs =
17031 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->getParam(1));
17032
17033 // The second template parameter must be a parameter pack with the
17034 // first template parameter as its type.
17035 if (PmType && PmArgs && !PmType->isTemplateParameterPack() &&
17036 PmArgs->isTemplateParameterPack()) {
17037 if (const auto *TArgs =
17038 PmArgs->getType()->getAsCanonical<TemplateTypeParmType>();
17039 TArgs && TArgs->getDepth() == PmType->getDepth() &&
17040 TArgs->getIndex() == PmType->getIndex()) {
17041 if (!SemaRef.inTemplateInstantiation())
17042 SemaRef.Diag(TpDecl->getLocation(),
17043 diag::ext_string_literal_operator_template);
17044 return false;
17045 }
17046 }
17047 }
17048
17049 SemaRef.Diag(TpDecl->getTemplateParameters()->getSourceRange().getBegin(),
17050 diag::err_literal_operator_template)
17051 << TpDecl->getTemplateParameters()->getSourceRange();
17052 return true;
17053}
17054
17056 if (isa<CXXMethodDecl>(FnDecl)) {
17057 Diag(FnDecl->getLocation(), diag::err_literal_operator_outside_namespace)
17058 << FnDecl->getDeclName();
17059 return true;
17060 }
17061
17062 if (FnDecl->isExternC()) {
17063 Diag(FnDecl->getLocation(), diag::err_literal_operator_extern_c);
17064 if (const LinkageSpecDecl *LSD =
17065 FnDecl->getDeclContext()->getExternCContext())
17066 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
17067 return true;
17068 }
17069
17070 // This might be the definition of a literal operator template.
17072
17073 // This might be a specialization of a literal operator template.
17074 if (!TpDecl)
17075 TpDecl = FnDecl->getPrimaryTemplate();
17076
17077 // template <char...> type operator "" name() and
17078 // template <class T, T...> type operator "" name() are the only valid
17079 // template signatures, and the only valid signatures with no parameters.
17080 //
17081 // C++20 also allows template <SomeClass T> type operator "" name().
17082 if (TpDecl) {
17083 if (FnDecl->param_size() != 0) {
17084 Diag(FnDecl->getLocation(),
17085 diag::err_literal_operator_template_with_params);
17086 return true;
17087 }
17088
17090 return true;
17091
17092 } else if (FnDecl->param_size() == 1) {
17093 const ParmVarDecl *Param = FnDecl->getParamDecl(0);
17094
17095 QualType ParamType = Param->getType().getUnqualifiedType();
17096
17097 // Only unsigned long long int, long double, any character type, and const
17098 // char * are allowed as the only parameters.
17099 if (ParamType->isSpecificBuiltinType(BuiltinType::ULongLong) ||
17100 ParamType->isSpecificBuiltinType(BuiltinType::LongDouble) ||
17101 Context.hasSameType(ParamType, Context.CharTy) ||
17102 Context.hasSameType(ParamType, Context.WideCharTy) ||
17103 Context.hasSameType(ParamType, Context.Char8Ty) ||
17104 Context.hasSameType(ParamType, Context.Char16Ty) ||
17105 Context.hasSameType(ParamType, Context.Char32Ty)) {
17106 } else if (const PointerType *Ptr = ParamType->getAs<PointerType>()) {
17107 QualType InnerType = Ptr->getPointeeType();
17108
17109 // Pointer parameter must be a const char *.
17110 if (!(Context.hasSameType(InnerType.getUnqualifiedType(),
17111 Context.CharTy) &&
17112 InnerType.isConstQualified() && !InnerType.isVolatileQualified())) {
17113 Diag(Param->getSourceRange().getBegin(),
17114 diag::err_literal_operator_param)
17115 << ParamType << "'const char *'" << Param->getSourceRange();
17116 return true;
17117 }
17118
17119 } else if (ParamType->isRealFloatingType()) {
17120 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17121 << ParamType << Context.LongDoubleTy << Param->getSourceRange();
17122 return true;
17123
17124 } else if (ParamType->isIntegerType()) {
17125 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
17126 << ParamType << Context.UnsignedLongLongTy << Param->getSourceRange();
17127 return true;
17128
17129 } else {
17130 Diag(Param->getSourceRange().getBegin(),
17131 diag::err_literal_operator_invalid_param)
17132 << ParamType << Param->getSourceRange();
17133 return true;
17134 }
17135
17136 } else if (FnDecl->param_size() == 2) {
17137 FunctionDecl::param_iterator Param = FnDecl->param_begin();
17138
17139 // First, verify that the first parameter is correct.
17140
17141 QualType FirstParamType = (*Param)->getType().getUnqualifiedType();
17142
17143 // Two parameter function must have a pointer to const as a
17144 // first parameter; let's strip those qualifiers.
17145 const PointerType *PT = FirstParamType->getAs<PointerType>();
17146
17147 if (!PT) {
17148 Diag((*Param)->getSourceRange().getBegin(),
17149 diag::err_literal_operator_param)
17150 << FirstParamType << "'const char *'" << (*Param)->getSourceRange();
17151 return true;
17152 }
17153
17154 QualType PointeeType = PT->getPointeeType();
17155 // First parameter must be const
17156 if (!PointeeType.isConstQualified() || PointeeType.isVolatileQualified()) {
17157 Diag((*Param)->getSourceRange().getBegin(),
17158 diag::err_literal_operator_param)
17159 << FirstParamType << "'const char *'" << (*Param)->getSourceRange();
17160 return true;
17161 }
17162
17163 QualType InnerType = PointeeType.getUnqualifiedType();
17164 // Only const char *, const wchar_t*, const char8_t*, const char16_t*, and
17165 // const char32_t* are allowed as the first parameter to a two-parameter
17166 // function
17167 if (!(Context.hasSameType(InnerType, Context.CharTy) ||
17168 Context.hasSameType(InnerType, Context.WideCharTy) ||
17169 Context.hasSameType(InnerType, Context.Char8Ty) ||
17170 Context.hasSameType(InnerType, Context.Char16Ty) ||
17171 Context.hasSameType(InnerType, Context.Char32Ty))) {
17172 Diag((*Param)->getSourceRange().getBegin(),
17173 diag::err_literal_operator_param)
17174 << FirstParamType << "'const char *'" << (*Param)->getSourceRange();
17175 return true;
17176 }
17177
17178 // Move on to the second and final parameter.
17179 ++Param;
17180
17181 // The second parameter must be a std::size_t.
17182 QualType SecondParamType = (*Param)->getType().getUnqualifiedType();
17183 if (!Context.hasSameType(SecondParamType, Context.getSizeType())) {
17184 Diag((*Param)->getSourceRange().getBegin(),
17185 diag::err_literal_operator_param)
17186 << SecondParamType << Context.getSizeType()
17187 << (*Param)->getSourceRange();
17188 return true;
17189 }
17190 } else {
17191 Diag(FnDecl->getLocation(), diag::err_literal_operator_bad_param_count);
17192 return true;
17193 }
17194
17195 // Parameters are good.
17196
17197 // A parameter-declaration-clause containing a default argument is not
17198 // equivalent to any of the permitted forms.
17199 for (auto *Param : FnDecl->parameters()) {
17200 if (Param->hasDefaultArg()) {
17201 Diag(Param->getDefaultArgRange().getBegin(),
17202 diag::err_literal_operator_default_argument)
17203 << Param->getDefaultArgRange();
17204 break;
17205 }
17206 }
17207
17208 const IdentifierInfo *II = FnDecl->getDeclName().getCXXLiteralIdentifier();
17211 !getSourceManager().isInSystemHeader(FnDecl->getLocation())) {
17212 // C++23 [usrlit.suffix]p1:
17213 // Literal suffix identifiers that do not start with an underscore are
17214 // reserved for future standardization. Literal suffix identifiers that
17215 // contain a double underscore __ are reserved for use by C++
17216 // implementations.
17217 Diag(FnDecl->getLocation(), diag::warn_user_literal_reserved)
17218 << static_cast<int>(Status)
17220 }
17221
17222 return false;
17223}
17224
17226 Expr *LangStr,
17227 SourceLocation LBraceLoc) {
17228 StringLiteral *Lit = cast<StringLiteral>(LangStr);
17229 assert(Lit->isUnevaluated() && "Unexpected string literal kind");
17230
17231 StringRef Lang = Lit->getString();
17233 if (Lang == "C")
17235 else if (Lang == "C++")
17237 else {
17238 Diag(LangStr->getExprLoc(), diag::err_language_linkage_spec_unknown)
17239 << LangStr->getSourceRange();
17240 return nullptr;
17241 }
17242
17243 // FIXME: Add all the various semantics of linkage specifications
17244
17246 LangStr->getExprLoc(), Language,
17247 LBraceLoc.isValid());
17248
17249 /// C++ [module.unit]p7.2.3
17250 /// - Otherwise, if the declaration
17251 /// - ...
17252 /// - ...
17253 /// - appears within a linkage-specification,
17254 /// it is attached to the global module.
17255 ///
17256 /// If the declaration is already in global module fragment, we don't
17257 /// need to attach it again.
17258 if (getLangOpts().CPlusPlusModules && isCurrentModulePurview()) {
17259 Module *GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);
17260 D->setLocalOwningModule(GlobalModule);
17261 }
17262
17263 CurContext->addDecl(D);
17264 PushDeclContext(S, D);
17265 return D;
17266}
17267
17269 Decl *LinkageSpec,
17270 SourceLocation RBraceLoc) {
17271 if (RBraceLoc.isValid()) {
17272 LinkageSpecDecl* LSDecl = cast<LinkageSpecDecl>(LinkageSpec);
17273 LSDecl->setRBraceLoc(RBraceLoc);
17274 }
17275
17276 // If the current module doesn't has Parent, it implies that the
17277 // LinkageSpec isn't in the module created by itself. So we don't
17278 // need to pop it.
17279 if (getLangOpts().CPlusPlusModules && getCurrentModule() &&
17280 getCurrentModule()->isImplicitGlobalModule() &&
17281 getCurrentModule()->Parent)
17282 PopImplicitGlobalModuleFragment();
17283
17285 return LinkageSpec;
17286}
17287
17289 const ParsedAttributesView &AttrList,
17290 SourceLocation SemiLoc) {
17291 Decl *ED = EmptyDecl::Create(Context, CurContext, SemiLoc);
17292 // Attribute declarations appertain to empty declaration so we handle
17293 // them here.
17294 ProcessDeclAttributeList(S, ED, AttrList);
17295
17296 CurContext->addDecl(ED);
17297 return ED;
17298}
17299
17301 SourceLocation StartLoc,
17302 SourceLocation Loc,
17303 const IdentifierInfo *Name) {
17304 bool Invalid = false;
17305 QualType ExDeclType = TInfo->getType();
17306
17307 // Arrays and functions decay.
17308 if (ExDeclType->isArrayType())
17309 ExDeclType = Context.getArrayDecayedType(ExDeclType);
17310 else if (ExDeclType->isFunctionType())
17311 ExDeclType = Context.getPointerType(ExDeclType);
17312
17313 // C++ 15.3p1: The exception-declaration shall not denote an incomplete type.
17314 // The exception-declaration shall not denote a pointer or reference to an
17315 // incomplete type, other than [cv] void*.
17316 // N2844 forbids rvalue references.
17317 if (!ExDeclType->isDependentType() && ExDeclType->isRValueReferenceType()) {
17318 Diag(Loc, diag::err_catch_rvalue_ref);
17319 Invalid = true;
17320 }
17321
17322 if (ExDeclType->isVariablyModifiedType()) {
17323 Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
17324 Invalid = true;
17325 }
17326
17327 QualType BaseType = ExDeclType;
17328 int Mode = 0; // 0 for direct type, 1 for pointer, 2 for reference
17329 unsigned DK = diag::err_catch_incomplete;
17330 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
17331 BaseType = Ptr->getPointeeType();
17332 Mode = 1;
17333 DK = diag::err_catch_incomplete_ptr;
17334 } else if (const ReferenceType *Ref = BaseType->getAs<ReferenceType>()) {
17335 // For the purpose of error recovery, we treat rvalue refs like lvalue refs.
17336 BaseType = Ref->getPointeeType();
17337 Mode = 2;
17338 DK = diag::err_catch_incomplete_ref;
17339 }
17340 if (!Invalid && (Mode == 0 || !BaseType->isVoidType()) &&
17341 !BaseType->isDependentType() && RequireCompleteType(Loc, BaseType, DK))
17342 Invalid = true;
17343
17344 if (!Invalid && BaseType.isWebAssemblyReferenceType()) {
17345 Diag(Loc, diag::err_wasm_reftype_tc) << 1;
17346 Invalid = true;
17347 }
17348
17349 if (!Invalid && Mode != 1 && BaseType->isSizelessType()) {
17350 Diag(Loc, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;
17351 Invalid = true;
17352 }
17353
17354 if (!Invalid && !ExDeclType->isDependentType() &&
17355 RequireNonAbstractType(Loc, ExDeclType,
17356 diag::err_abstract_type_in_decl,
17358 Invalid = true;
17359
17360 // Only the non-fragile NeXT runtime currently supports C++ catches
17361 // of ObjC types, and no runtime supports catching ObjC types by value.
17362 if (!Invalid && getLangOpts().ObjC) {
17363 QualType T = ExDeclType;
17364 if (const ReferenceType *RT = T->getAs<ReferenceType>())
17365 T = RT->getPointeeType();
17366
17367 if (T->isObjCObjectType()) {
17368 Diag(Loc, diag::err_objc_object_catch);
17369 Invalid = true;
17370 } else if (T->isObjCObjectPointerType()) {
17371 // FIXME: should this be a test for macosx-fragile specifically?
17373 Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
17374 }
17375 }
17376
17377 VarDecl *ExDecl = VarDecl::Create(Context, CurContext, StartLoc, Loc, Name,
17378 ExDeclType, TInfo, SC_None);
17379 ExDecl->setExceptionVariable(true);
17380
17381 // In ARC, infer 'retaining' for variables of retainable type.
17382 if (getLangOpts().ObjCAutoRefCount && ObjC().inferObjCARCLifetime(ExDecl))
17383 Invalid = true;
17384
17385 if (!Invalid && !ExDeclType->isDependentType()) {
17386 if (auto *ClassDecl = ExDeclType->getAsCXXRecordDecl()) {
17387 // Insulate this from anything else we might currently be parsing.
17390
17391 // C++ [except.handle]p16:
17392 // The object declared in an exception-declaration or, if the
17393 // exception-declaration does not specify a name, a temporary (12.2) is
17394 // copy-initialized (8.5) from the exception object. [...]
17395 // The object is destroyed when the handler exits, after the destruction
17396 // of any automatic objects initialized within the handler.
17397 //
17398 // We just pretend to initialize the object with itself, then make sure
17399 // it can be destroyed later.
17400 QualType initType = Context.getExceptionObjectType(ExDeclType);
17401
17402 InitializedEntity entity =
17404 InitializationKind initKind =
17406
17407 Expr *opaqueValue =
17408 new (Context) OpaqueValueExpr(Loc, initType, VK_LValue, OK_Ordinary);
17409 InitializationSequence sequence(*this, entity, initKind, opaqueValue);
17410 ExprResult result = sequence.Perform(*this, entity, initKind, opaqueValue);
17411 if (result.isInvalid())
17412 Invalid = true;
17413 else {
17414 // If the constructor used was non-trivial, set this as the
17415 // "initializer".
17416 CXXConstructExpr *construct = result.getAs<CXXConstructExpr>();
17417 if (!construct->getConstructor()->isTrivial()) {
17418 Expr *init = MaybeCreateExprWithCleanups(construct);
17419 ExDecl->setInit(init);
17420 }
17421
17422 // And make sure it's destructable.
17423 FinalizeVarWithDestructor(ExDecl, ClassDecl);
17424 }
17425 }
17426 }
17427
17428 if (Invalid)
17429 ExDecl->setInvalidDecl();
17430
17431 return ExDecl;
17432}
17433
17436 bool Invalid = D.isInvalidType();
17437
17438 // Check for unexpanded parameter packs.
17441 TInfo = Context.getTrivialTypeSourceInfo(Context.IntTy,
17442 D.getIdentifierLoc());
17443 Invalid = true;
17444 }
17445
17446 const IdentifierInfo *II = D.getIdentifier();
17447 if (NamedDecl *PrevDecl =
17450 // The scope should be freshly made just for us. There is just no way
17451 // it contains any previous declaration, except for function parameters in
17452 // a function-try-block's catch statement.
17453 assert(!S->isDeclScope(PrevDecl));
17454 if (isDeclInScope(PrevDecl, CurContext, S)) {
17455 Diag(D.getIdentifierLoc(), diag::err_redefinition)
17456 << D.getIdentifier();
17457 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
17458 Invalid = true;
17459 } else if (PrevDecl->isTemplateParameter())
17460 // Maybe we will complain about the shadowed template parameter.
17462 }
17463
17464 if (D.getCXXScopeSpec().isSet() && !Invalid) {
17465 Diag(D.getIdentifierLoc(), diag::err_qualified_catch_declarator)
17466 << D.getCXXScopeSpec().getRange();
17467 Invalid = true;
17468 }
17469
17471 S, TInfo, D.getBeginLoc(), D.getIdentifierLoc(), D.getIdentifier());
17472 if (Invalid)
17473 ExDecl->setInvalidDecl();
17474
17475 // Add the exception declaration into this scope.
17476 if (II)
17477 PushOnScopeChains(ExDecl, S);
17478 else
17479 CurContext->addDecl(ExDecl);
17480
17481 ProcessDeclAttributes(S, ExDecl, D);
17482 return ExDecl;
17483}
17484
17486 Expr *AssertExpr,
17487 Expr *AssertMessageExpr,
17488 SourceLocation RParenLoc) {
17490 return nullptr;
17491
17492 return BuildStaticAssertDeclaration(StaticAssertLoc, AssertExpr,
17493 AssertMessageExpr, RParenLoc, false);
17494}
17495
17496static void WriteCharTypePrefix(BuiltinType::Kind BTK, llvm::raw_ostream &OS) {
17497 switch (BTK) {
17498 case BuiltinType::Char_S:
17499 case BuiltinType::Char_U:
17500 break;
17501 case BuiltinType::Char8:
17502 OS << "u8";
17503 break;
17504 case BuiltinType::Char16:
17505 OS << 'u';
17506 break;
17507 case BuiltinType::Char32:
17508 OS << 'U';
17509 break;
17510 case BuiltinType::WChar_S:
17511 case BuiltinType::WChar_U:
17512 OS << 'L';
17513 break;
17514 default:
17515 llvm_unreachable("Non-character type");
17516 }
17517}
17518
17519/// Convert character's value, interpreted as a code unit, to a string.
17520/// The value needs to be zero-extended to 32-bits.
17521/// FIXME: This assumes Unicode literal encodings
17522static void WriteCharValueForDiagnostic(uint32_t Value, const BuiltinType *BTy,
17523 unsigned TyWidth,
17524 SmallVectorImpl<char> &Str) {
17525 char Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
17526 char *Ptr = Arr;
17527 BuiltinType::Kind K = BTy->getKind();
17528 llvm::raw_svector_ostream OS(Str);
17529
17530 // This should catch Char_S, Char_U, Char8, and use of escaped characters in
17531 // other types.
17532 if (K == BuiltinType::Char_S || K == BuiltinType::Char_U ||
17533 K == BuiltinType::Char8 || Value <= 0x7F) {
17534 StringRef Escaped = escapeCStyle<EscapeChar::Single>(Value);
17535 if (!Escaped.empty())
17536 EscapeStringForDiagnostic(Escaped, Str);
17537 else
17538 OS << static_cast<char>(Value);
17539 return;
17540 }
17541
17542 switch (K) {
17543 case BuiltinType::Char16:
17544 case BuiltinType::Char32:
17545 case BuiltinType::WChar_S:
17546 case BuiltinType::WChar_U: {
17547 if (llvm::ConvertCodePointToUTF8(Value, Ptr))
17548 EscapeStringForDiagnostic(StringRef(Arr, Ptr - Arr), Str);
17549 else
17550 OS << "\\x"
17551 << llvm::format_hex_no_prefix(Value, TyWidth / 4, /*Upper=*/true);
17552 break;
17553 }
17554 default:
17555 llvm_unreachable("Non-character type is passed");
17556 }
17557}
17558
17559/// Convert \V to a string we can present to the user in a diagnostic
17560/// \T is the type of the expression that has been evaluated into \V
17563 ASTContext &Context) {
17564 if (!V.hasValue())
17565 return false;
17566
17567 switch (V.getKind()) {
17569 if (T->isBooleanType()) {
17570 // Bools are reduced to ints during evaluation, but for
17571 // diagnostic purposes we want to print them as
17572 // true or false.
17573 int64_t BoolValue = V.getInt().getExtValue();
17574 assert((BoolValue == 0 || BoolValue == 1) &&
17575 "Bool type, but value is not 0 or 1");
17576 llvm::raw_svector_ostream OS(Str);
17577 OS << (BoolValue ? "true" : "false");
17578 } else {
17579 llvm::raw_svector_ostream OS(Str);
17580 // Same is true for chars.
17581 // We want to print the character representation for textual types
17582 const auto *BTy = T->getAs<BuiltinType>();
17583 if (BTy) {
17584 switch (BTy->getKind()) {
17585 case BuiltinType::Char_S:
17586 case BuiltinType::Char_U:
17587 case BuiltinType::Char8:
17588 case BuiltinType::Char16:
17589 case BuiltinType::Char32:
17590 case BuiltinType::WChar_S:
17591 case BuiltinType::WChar_U: {
17592 unsigned TyWidth = Context.getIntWidth(T);
17593 assert(8 <= TyWidth && TyWidth <= 32 && "Unexpected integer width");
17594 uint32_t CodeUnit = static_cast<uint32_t>(V.getInt().getZExtValue());
17595 WriteCharTypePrefix(BTy->getKind(), OS);
17596 OS << '\'';
17597 WriteCharValueForDiagnostic(CodeUnit, BTy, TyWidth, Str);
17598 OS << "' (0x"
17599 << llvm::format_hex_no_prefix(CodeUnit, /*Width=*/2,
17600 /*Upper=*/true)
17601 << ", " << V.getInt() << ')';
17602 return true;
17603 }
17604 default:
17605 break;
17606 }
17607 }
17608 V.getInt().toString(Str);
17609 }
17610
17611 break;
17612
17614 V.getFloat().toString(Str);
17615 break;
17616
17618 if (V.isNullPointer()) {
17619 llvm::raw_svector_ostream OS(Str);
17620 OS << "nullptr";
17621 } else
17622 return false;
17623 break;
17624
17626 llvm::raw_svector_ostream OS(Str);
17627 OS << '(';
17628 V.getComplexFloatReal().toString(Str);
17629 OS << " + ";
17630 V.getComplexFloatImag().toString(Str);
17631 OS << "i)";
17632 } break;
17633
17635 llvm::raw_svector_ostream OS(Str);
17636 OS << '(';
17637 V.getComplexIntReal().toString(Str);
17638 OS << " + ";
17639 V.getComplexIntImag().toString(Str);
17640 OS << "i)";
17641 } break;
17642
17643 default:
17644 return false;
17645 }
17646
17647 return true;
17648}
17649
17650/// Some Expression types are not useful to print notes about,
17651/// e.g. literals and values that have already been expanded
17652/// before such as int-valued template parameters.
17653static bool UsefulToPrintExpr(const Expr *E) {
17654 E = E->IgnoreParenImpCasts();
17655 // Literals are pretty easy for humans to understand.
17658 return false;
17659
17660 // These have been substituted from template parameters
17661 // and appear as literals in the static assert error.
17663 return false;
17664
17665 // -5 is also simple to understand.
17666 if (const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
17667 return UsefulToPrintExpr(UnaryOp->getSubExpr());
17668
17669 // Only print nested arithmetic operators.
17670 if (const auto *BO = dyn_cast<BinaryOperator>(E))
17671 return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
17672 BO->isBitwiseOp());
17673
17674 return true;
17675}
17676
17678 if (const auto *Op = dyn_cast<BinaryOperator>(E);
17679 Op && Op->getOpcode() != BO_LOr) {
17680 const Expr *LHS = Op->getLHS()->IgnoreParenImpCasts();
17681 const Expr *RHS = Op->getRHS()->IgnoreParenImpCasts();
17682
17683 // Ignore comparisons of boolean expressions with a boolean literal.
17684 if ((isa<CXXBoolLiteralExpr>(LHS) && RHS->getType()->isBooleanType()) ||
17685 (isa<CXXBoolLiteralExpr>(RHS) && LHS->getType()->isBooleanType()))
17686 return;
17687
17688 // Don't print obvious expressions.
17689 if (!UsefulToPrintExpr(LHS) && !UsefulToPrintExpr(RHS))
17690 return;
17691
17692 struct {
17693 const clang::Expr *Cond;
17695 SmallString<12> ValueString;
17696 bool Print;
17697 } DiagSide[2] = {{LHS, Expr::EvalResult(), {}, false},
17698 {RHS, Expr::EvalResult(), {}, false}};
17699 for (unsigned I = 0; I < 2; I++) {
17700 const Expr *Side = DiagSide[I].Cond;
17701
17702 Side->EvaluateAsRValue(DiagSide[I].Result, Context, true);
17703
17704 DiagSide[I].Print =
17705 ConvertAPValueToString(DiagSide[I].Result.Val, Side->getType(),
17706 DiagSide[I].ValueString, Context);
17707 }
17708 if (DiagSide[0].Print && DiagSide[1].Print) {
17709 Diag(Op->getExprLoc(), diag::note_expr_evaluates_to)
17710 << DiagSide[0].ValueString << Op->getOpcodeStr()
17711 << DiagSide[1].ValueString << Op->getSourceRange();
17712 }
17713 } else {
17715 }
17716}
17717
17718template <typename ResultType>
17719static bool EvaluateAsStringImpl(Sema &SemaRef, Expr *Message,
17720 ResultType &Result, ASTContext &Ctx,
17722 bool ErrorOnInvalidMessage) {
17723
17724 assert(Message);
17725 assert(!Message->isTypeDependent() && !Message->isValueDependent() &&
17726 "can't evaluate a dependant static assert message");
17727
17728 if (const auto *SL = dyn_cast<StringLiteral>(Message)) {
17729 assert(SL->isUnevaluated() && "expected an unevaluated string");
17730 if constexpr (std::is_same_v<APValue, ResultType>) {
17731 Result =
17732 APValue(APValue::UninitArray{}, SL->getLength(), SL->getLength());
17733 const ConstantArrayType *CAT =
17734 SemaRef.getASTContext().getAsConstantArrayType(SL->getType());
17735 assert(CAT && "string literal isn't an array");
17736 QualType CharType = CAT->getElementType();
17737 llvm::APSInt Value(SemaRef.getASTContext().getTypeSize(CharType),
17738 CharType->isUnsignedIntegerType());
17739 for (unsigned I = 0; I < SL->getLength(); I++) {
17740 Value = SL->getCodeUnit(I);
17741 Result.getArrayInitializedElt(I) = APValue(Value);
17742 }
17743 } else {
17744 Result.assign(SL->getString().begin(), SL->getString().end());
17745 }
17746 return true;
17747 }
17748
17749 SourceLocation Loc = Message->getBeginLoc();
17750 QualType T = Message->getType().getNonReferenceType();
17751 auto *RD = T->getAsCXXRecordDecl();
17752 if (!RD) {
17753 SemaRef.Diag(Loc, diag::err_user_defined_msg_invalid) << EvalContext;
17754 return false;
17755 }
17756
17757 auto FindMember = [&](StringRef Member) -> std::optional<LookupResult> {
17759 LookupResult MemberLookup(SemaRef, DN, Loc, Sema::LookupMemberName);
17760 SemaRef.LookupQualifiedName(MemberLookup, RD);
17761 OverloadCandidateSet Candidates(MemberLookup.getNameLoc(),
17763 if (MemberLookup.empty())
17764 return std::nullopt;
17765 return std::move(MemberLookup);
17766 };
17767
17768 std::optional<LookupResult> SizeMember = FindMember("size");
17769 std::optional<LookupResult> DataMember = FindMember("data");
17770 if (!SizeMember || !DataMember) {
17771 SemaRef.Diag(Loc, diag::err_user_defined_msg_missing_member_function)
17772 << EvalContext
17773 << ((!SizeMember && !DataMember) ? 2
17774 : !SizeMember ? 0
17775 : 1);
17776 return false;
17777 }
17778
17779 auto BuildExpr = [&](LookupResult &LR) {
17781 Message, Message->getType(), Message->getBeginLoc(), false,
17782 CXXScopeSpec(), SourceLocation(), nullptr, LR, nullptr, nullptr);
17783 if (Res.isInvalid())
17784 return ExprError();
17785 Res = SemaRef.BuildCallExpr(nullptr, Res.get(), Loc, {}, Loc, nullptr,
17786 false, true);
17787 if (Res.isInvalid())
17788 return ExprError();
17789 if (Res.get()->isTypeDependent() || Res.get()->isValueDependent())
17790 return ExprError();
17791 return SemaRef.TemporaryMaterializationConversion(Res.get());
17792 };
17793
17794 ExprResult SizeE = BuildExpr(*SizeMember);
17795 ExprResult DataE = BuildExpr(*DataMember);
17796
17797 QualType SizeT = SemaRef.Context.getSizeType();
17798 QualType ConstCharPtr = SemaRef.Context.getPointerType(
17799 SemaRef.Context.getConstType(SemaRef.Context.CharTy));
17800
17801 ExprResult EvaluatedSize =
17802 SizeE.isInvalid()
17803 ? ExprError()
17806 if (EvaluatedSize.isInvalid()) {
17807 SemaRef.Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17808 << EvalContext << /*size*/ 0;
17809 return false;
17810 }
17811
17812 ExprResult EvaluatedData =
17813 DataE.isInvalid()
17814 ? ExprError()
17816 DataE.get(), ConstCharPtr, CCEKind::StaticAssertMessageData);
17817 if (EvaluatedData.isInvalid()) {
17818 SemaRef.Diag(Loc, diag::err_user_defined_msg_invalid_mem_fn_ret_ty)
17819 << EvalContext << /*data*/ 1;
17820 return false;
17821 }
17822
17823 if (!ErrorOnInvalidMessage &&
17824 SemaRef.Diags.isIgnored(diag::warn_user_defined_msg_constexpr, Loc))
17825 return true;
17826
17827 Expr::EvalResult Status;
17829 Status.Diag = &Notes;
17830 if (!Message->EvaluateCharRangeAsString(Result, EvaluatedSize.get(),
17831 EvaluatedData.get(), Ctx, Status) ||
17832 !Notes.empty()) {
17833 SemaRef.Diag(Message->getBeginLoc(),
17834 ErrorOnInvalidMessage ? diag::err_user_defined_msg_constexpr
17835 : diag::warn_user_defined_msg_constexpr)
17836 << EvalContext;
17837 for (const auto &Note : Notes)
17838 SemaRef.Diag(Note.first, Note.second);
17839 return !ErrorOnInvalidMessage;
17840 }
17841 return true;
17842}
17843
17845 StringEvaluationContext EvalContext,
17846 bool ErrorOnInvalidMessage) {
17847 return EvaluateAsStringImpl(*this, Message, Result, Ctx, EvalContext,
17848 ErrorOnInvalidMessage);
17849}
17850
17851bool Sema::EvaluateAsString(Expr *Message, std::string &Result, ASTContext &Ctx,
17852 StringEvaluationContext EvalContext,
17853 bool ErrorOnInvalidMessage) {
17854 return EvaluateAsStringImpl(*this, Message, Result, Ctx, EvalContext,
17855 ErrorOnInvalidMessage);
17856}
17857
17859 Expr *AssertExpr, Expr *AssertMessage,
17860 SourceLocation RParenLoc,
17861 bool Failed) {
17862 assert(AssertExpr != nullptr && "Expected non-null condition");
17863 if (!AssertExpr->isTypeDependent() && !AssertExpr->isValueDependent() &&
17864 (!AssertMessage || (!AssertMessage->isTypeDependent() &&
17865 !AssertMessage->isValueDependent())) &&
17866 !Failed) {
17867 // In a static_assert-declaration, the constant-expression shall be a
17868 // constant expression that can be contextually converted to bool.
17869 ExprResult Converted = PerformContextuallyConvertToBool(AssertExpr);
17870 if (Converted.isInvalid())
17871 Failed = true;
17872
17873 ExprResult FullAssertExpr =
17874 ActOnFinishFullExpr(Converted.get(), StaticAssertLoc,
17875 /*DiscardedValue*/ false,
17876 /*IsConstexpr*/ true);
17877 if (FullAssertExpr.isInvalid())
17878 Failed = true;
17879 else
17880 AssertExpr = FullAssertExpr.get();
17881
17882 llvm::APSInt Cond;
17883 Expr *BaseExpr = AssertExpr;
17885
17886 if (!getLangOpts().CPlusPlus) {
17887 // In C mode, allow folding as an extension for better compatibility with
17888 // C++ in terms of expressions like static_assert("test") or
17889 // static_assert(nullptr).
17890 FoldKind = AllowFoldKind::Allow;
17891 }
17892
17893 if (!Failed && VerifyIntegerConstantExpression(
17894 BaseExpr, &Cond,
17895 diag::err_static_assert_expression_is_not_constant,
17896 FoldKind).isInvalid())
17897 Failed = true;
17898
17899 // If the static_assert passes, only verify that
17900 // the message is grammatically valid without evaluating it.
17901 if (!Failed && AssertMessage && Cond.getBoolValue()) {
17902 std::string Str;
17903 EvaluateAsString(AssertMessage, Str, Context,
17905 /*ErrorOnInvalidMessage=*/false);
17906 }
17907
17908 // CWG2518
17909 // [dcl.pre]/p10 If [...] the expression is evaluated in the context of a
17910 // template definition, the declaration has no effect.
17911 bool InTemplateDefinition =
17912 getLangOpts().CPlusPlus && CurContext->isDependentContext();
17913
17914 if (!Failed && !Cond && !InTemplateDefinition) {
17915 SmallString<256> MsgBuffer;
17916 llvm::raw_svector_ostream Msg(MsgBuffer);
17917 bool HasMessage = AssertMessage;
17918 if (AssertMessage) {
17919 std::string Str;
17920 HasMessage = EvaluateAsString(AssertMessage, Str, Context,
17922 /*ErrorOnInvalidMessage=*/true) ||
17923 !Str.empty();
17924 Msg << Str;
17925 }
17926 Expr *InnerCond = nullptr;
17927 std::string InnerCondDescription;
17928 std::tie(InnerCond, InnerCondDescription) =
17929 findFailedBooleanCondition(Converted.get());
17930 if (const auto *ConceptIDExpr =
17931 dyn_cast_or_null<ConceptSpecializationExpr>(InnerCond)) {
17932 const ASTConstraintSatisfaction &Satisfaction =
17933 ConceptIDExpr->getSatisfaction();
17934 if (!Satisfaction.ContainsErrors || Satisfaction.NumRecords) {
17935 Diag(AssertExpr->getBeginLoc(), diag::err_static_assert_failed)
17936 << !HasMessage << Msg.str() << AssertExpr->getSourceRange();
17937 // Drill down into concept specialization expressions to see why they
17938 // weren't satisfied.
17939 DiagnoseUnsatisfiedConstraint(ConceptIDExpr);
17940 }
17941 } else if (InnerCond && !isa<CXXBoolLiteralExpr>(InnerCond) &&
17942 !isa<IntegerLiteral>(InnerCond)) {
17943 Diag(InnerCond->getBeginLoc(),
17944 diag::err_static_assert_requirement_failed)
17945 << InnerCondDescription << !HasMessage << Msg.str()
17946 << InnerCond->getSourceRange();
17947 DiagnoseStaticAssertDetails(InnerCond);
17948 } else {
17949 Diag(AssertExpr->getBeginLoc(), diag::err_static_assert_failed)
17950 << !HasMessage << Msg.str() << AssertExpr->getSourceRange();
17952 }
17953 Failed = true;
17954 }
17955 } else {
17956 ExprResult FullAssertExpr = ActOnFinishFullExpr(AssertExpr, StaticAssertLoc,
17957 /*DiscardedValue*/false,
17958 /*IsConstexpr*/true);
17959 if (FullAssertExpr.isInvalid())
17960 Failed = true;
17961 else
17962 AssertExpr = FullAssertExpr.get();
17963 }
17964
17966 AssertExpr, AssertMessage, RParenLoc,
17967 Failed);
17968
17969 CurContext->addDecl(Decl);
17970 return Decl;
17971}
17972
17974 Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc,
17975 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
17976 SourceLocation EllipsisLoc, const ParsedAttributesView &Attr,
17977 MultiTemplateParamsArg TempParamLists) {
17979
17980 bool IsMemberSpecialization = false;
17981 bool Invalid = false;
17982
17983 if (TemplateParameterList *TemplateParams =
17985 TagLoc, NameLoc, SS, nullptr, TempParamLists, /*friend*/ true,
17986 IsMemberSpecialization, Invalid)) {
17987 if (TemplateParams->size() > 0) {
17988 // This is a declaration of a class template.
17989 if (Invalid)
17990 return true;
17991
17992 return CheckClassTemplate(S, TagSpec, TagUseKind::Friend, TagLoc, SS,
17993 Name, NameLoc, Attr, TemplateParams, AS_public,
17994 /*ModulePrivateLoc=*/SourceLocation(),
17995 FriendLoc, TempParamLists.size() - 1,
17996 TempParamLists.data())
17997 .get();
17998 } else {
17999 // The "template<>" header is extraneous.
18000 Diag(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams)
18001 << TypeWithKeyword::getTagTypeKindName(Kind) << Name;
18002 IsMemberSpecialization = true;
18003 }
18004 }
18005
18006 if (Invalid) return true;
18007
18008 bool isAllExplicitSpecializations = true;
18009 for (unsigned I = TempParamLists.size(); I-- > 0; ) {
18010 if (TempParamLists[I]->size()) {
18011 isAllExplicitSpecializations = false;
18012 break;
18013 }
18014 }
18015
18016 // FIXME: don't ignore attributes.
18017
18018 // If it's explicit specializations all the way down, just forget
18019 // about the template header and build an appropriate non-templated
18020 // friend. TODO: for source fidelity, remember the headers.
18022 if (isAllExplicitSpecializations) {
18023 if (SS.isEmpty()) {
18024 bool Owned = false;
18025 bool IsDependent = false;
18026 return ActOnTag(S, TagSpec, TagUseKind::Friend, TagLoc, SS, Name, NameLoc,
18027 Attr, AS_public,
18028 /*ModulePrivateLoc=*/SourceLocation(),
18029 MultiTemplateParamsArg(), Owned, IsDependent,
18030 /*ScopedEnumKWLoc=*/SourceLocation(),
18031 /*ScopedEnumUsesClassTag=*/false,
18032 /*UnderlyingType=*/TypeResult(),
18033 /*IsTypeSpecifier=*/false,
18034 /*IsTemplateParamOrArg=*/false,
18035 /*OOK=*/OffsetOfKind::Outside);
18036 }
18037
18038 TypeSourceInfo *TSI = nullptr;
18041 QualType T = CheckTypenameType(Keyword, TagLoc, QualifierLoc, *Name,
18042 NameLoc, &TSI, /*DeducedTSTContext=*/true);
18043 if (T.isNull())
18044 return true;
18045
18047 FriendDecl::Create(Context, CurContext, NameLoc, TSI, FriendLoc,
18048 EllipsisLoc, TempParamLists);
18049 Friend->setAccess(AS_public);
18050 CurContext->addDecl(Friend);
18051 return Friend;
18052 }
18053
18054 assert(SS.isNotEmpty() && "valid templated tag with no SS and no direct?");
18055
18056 // CWG 2917: if it (= the friend-type-specifier) is a pack expansion
18057 // (13.7.4 [temp.variadic]), any packs expanded by that pack expansion
18058 // shall not have been introduced by the template-declaration.
18060 collectUnexpandedParameterPacks(QualifierLoc, Unexpanded);
18061 unsigned FriendDeclDepth = TempParamLists.front()->getDepth();
18062 for (UnexpandedParameterPack &U : Unexpanded) {
18063 if (std::optional<std::pair<unsigned, unsigned>> DI = getDepthAndIndex(U);
18064 DI && DI->first >= FriendDeclDepth) {
18065 auto *ND = dyn_cast<NamedDecl *>(U.first);
18066 if (!ND)
18067 ND = cast<const TemplateTypeParmType *>(U.first)->getDecl();
18068 Diag(U.second, diag::friend_template_decl_malformed_pack_expansion)
18069 << ND->getDeclName() << SourceRange(SS.getBeginLoc(), EllipsisLoc);
18070 return true;
18071 }
18072 }
18073
18074 // Handle the case of a templated-scope friend class. e.g.
18075 // template <class T> class A<T>::B;
18076 // FIXME: we don't support these right now.
18077 Diag(NameLoc, diag::warn_template_qualified_friend_unsupported)
18080 QualType T = Context.getDependentNameType(ETK, SS.getScopeRep(), Name);
18081 TypeSourceInfo *TSI = Context.CreateTypeSourceInfo(T);
18083 TL.setElaboratedKeywordLoc(TagLoc);
18085 TL.setNameLoc(NameLoc);
18086
18088 FriendDecl::Create(Context, CurContext, NameLoc, TSI, FriendLoc,
18089 EllipsisLoc, TempParamLists);
18090 Friend->setAccess(AS_public);
18091 Friend->setUnsupportedFriend(true);
18092 CurContext->addDecl(Friend);
18093 return Friend;
18094}
18095
18097 MultiTemplateParamsArg TempParams,
18098 SourceLocation EllipsisLoc) {
18099 SourceLocation Loc = DS.getBeginLoc();
18100 SourceLocation FriendLoc = DS.getFriendSpecLoc();
18101
18102 assert(DS.isFriendSpecified());
18104
18105 // C++ [class.friend]p3:
18106 // A friend declaration that does not declare a function shall have one of
18107 // the following forms:
18108 // friend elaborated-type-specifier ;
18109 // friend simple-type-specifier ;
18110 // friend typename-specifier ;
18111 //
18112 // If the friend keyword isn't first, or if the declarations has any type
18113 // qualifiers, then the declaration doesn't have that form.
18115 Diag(FriendLoc, diag::err_friend_not_first_in_declaration);
18116 if (DS.getTypeQualifiers()) {
18118 Diag(DS.getConstSpecLoc(), diag::err_friend_decl_spec) << "const";
18120 Diag(DS.getVolatileSpecLoc(), diag::err_friend_decl_spec) << "volatile";
18122 Diag(DS.getRestrictSpecLoc(), diag::err_friend_decl_spec) << "restrict";
18124 Diag(DS.getAtomicSpecLoc(), diag::err_friend_decl_spec) << "_Atomic";
18126 Diag(DS.getUnalignedSpecLoc(), diag::err_friend_decl_spec) << "__unaligned";
18127 }
18128
18129 // Try to convert the decl specifier to a type. This works for
18130 // friend templates because ActOnTag never produces a ClassTemplateDecl
18131 // for a TagUseKind::Friend.
18132 Declarator TheDeclarator(DS, ParsedAttributesView::none(),
18134 TypeSourceInfo *TSI = GetTypeForDeclarator(TheDeclarator);
18135 QualType T = TSI->getType();
18136 if (TheDeclarator.isInvalidType())
18137 return nullptr;
18138
18139 // If '...' is present, the type must contain an unexpanded parameter
18140 // pack, and vice versa.
18141 bool Invalid = false;
18142 if (EllipsisLoc.isInvalid() &&
18144 return nullptr;
18145 if (EllipsisLoc.isValid() &&
18147 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
18148 << TSI->getTypeLoc().getSourceRange();
18149 Invalid = true;
18150 }
18151
18152 if (!T->isElaboratedTypeSpecifier()) {
18153 if (TempParams.size()) {
18154 // C++23 [dcl.pre]p5:
18155 // In a simple-declaration, the optional init-declarator-list can be
18156 // omitted only when declaring a class or enumeration, that is, when
18157 // the decl-specifier-seq contains either a class-specifier, an
18158 // elaborated-type-specifier with a class-key, or an enum-specifier.
18159 //
18160 // The declaration of a template-declaration or explicit-specialization
18161 // is never a member-declaration, so this must be a simple-declaration
18162 // with no init-declarator-list. Therefore, this is ill-formed.
18163 Diag(Loc, diag::err_tagless_friend_type_template) << DS.getSourceRange();
18164 return nullptr;
18165 } else if (const RecordDecl *RD = T->getAsRecordDecl()) {
18166 SmallString<16> InsertionText(" ");
18167 InsertionText += RD->getKindName();
18168
18170 ? diag::warn_cxx98_compat_unelaborated_friend_type
18171 : diag::ext_unelaborated_friend_type)
18172 << (unsigned)RD->getTagKind() << T
18174 InsertionText);
18175 } else {
18176 DiagCompat(FriendLoc, diag_compat::nonclass_type_friend)
18177 << T << DS.getSourceRange();
18178 }
18179 }
18180
18181 // C++98 [class.friend]p1: A friend of a class is a function
18182 // or class that is not a member of the class . . .
18183 // This is fixed in DR77, which just barely didn't make the C++03
18184 // deadline. It's also a very silly restriction that seriously
18185 // affects inner classes and which nobody else seems to implement;
18186 // thus we never diagnose it, not even in -pedantic.
18187 //
18188 // But note that we could warn about it: it's always useless to
18189 // friend one of your own members (it's not, however, worthless to
18190 // friend a member of an arbitrary specialization of your template).
18191
18192 Decl *D;
18193 if (!TempParams.empty())
18194 // TODO: Support variadic friend template decls?
18195 D = FriendTemplateDecl::Create(Context, CurContext, Loc, TempParams, TSI,
18196 FriendLoc);
18197 else
18199 TSI, FriendLoc, EllipsisLoc);
18200
18201 if (!D)
18202 return nullptr;
18203
18204 D->setAccess(AS_public);
18205 CurContext->addDecl(D);
18206
18207 if (Invalid)
18208 D->setInvalidDecl();
18209
18210 return D;
18211}
18212
18214 MultiTemplateParamsArg TemplateParams) {
18215 const DeclSpec &DS = D.getDeclSpec();
18216
18217 assert(DS.isFriendSpecified());
18219
18222
18223 // C++ [class.friend]p1
18224 // A friend of a class is a function or class....
18225 // Note that this sees through typedefs, which is intended.
18226 // It *doesn't* see through dependent types, which is correct
18227 // according to [temp.arg.type]p3:
18228 // If a declaration acquires a function type through a
18229 // type dependent on a template-parameter and this causes
18230 // a declaration that does not use the syntactic form of a
18231 // function declarator to have a function type, the program
18232 // is ill-formed.
18233 if (!TInfo->getType()->isFunctionType()) {
18234 Diag(Loc, diag::err_unexpected_friend);
18235
18236 // It might be worthwhile to try to recover by creating an
18237 // appropriate declaration.
18238 return nullptr;
18239 }
18240
18241 // C++ [namespace.memdef]p3
18242 // - If a friend declaration in a non-local class first declares a
18243 // class or function, the friend class or function is a member
18244 // of the innermost enclosing namespace.
18245 // - The name of the friend is not found by simple name lookup
18246 // until a matching declaration is provided in that namespace
18247 // scope (either before or after the class declaration granting
18248 // friendship).
18249 // - If a friend function is called, its name may be found by the
18250 // name lookup that considers functions from namespaces and
18251 // classes associated with the types of the function arguments.
18252 // - When looking for a prior declaration of a class or a function
18253 // declared as a friend, scopes outside the innermost enclosing
18254 // namespace scope are not considered.
18255
18256 CXXScopeSpec &SS = D.getCXXScopeSpec();
18258 assert(NameInfo.getName());
18259
18260 // Check for unexpanded parameter packs.
18264 return nullptr;
18265
18266 // The context we found the declaration in, or in which we should
18267 // create the declaration.
18268 DeclContext *DC;
18269 Scope *DCScope = S;
18270 LookupResult Previous(*this, NameInfo, LookupOrdinaryName,
18272
18273 bool isTemplateId = D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId;
18274
18275 // There are five cases here.
18276 // - There's no scope specifier and we're in a local class. Only look
18277 // for functions declared in the immediately-enclosing block scope.
18278 // We recover from invalid scope qualifiers as if they just weren't there.
18279 FunctionDecl *FunctionContainingLocalClass = nullptr;
18280 if ((SS.isInvalid() || !SS.isSet()) &&
18281 (FunctionContainingLocalClass =
18282 cast<CXXRecordDecl>(CurContext)->isLocalClass())) {
18283 // C++11 [class.friend]p11:
18284 // If a friend declaration appears in a local class and the name
18285 // specified is an unqualified name, a prior declaration is
18286 // looked up without considering scopes that are outside the
18287 // innermost enclosing non-class scope. For a friend function
18288 // declaration, if there is no prior declaration, the program is
18289 // ill-formed.
18290
18291 // Find the innermost enclosing non-class scope. This is the block
18292 // scope containing the local class definition (or for a nested class,
18293 // the outer local class).
18294 DCScope = S->getFnParent();
18295
18296 // Look up the function name in the scope.
18298 LookupName(Previous, S, /*AllowBuiltinCreation*/false);
18299
18300 if (!Previous.empty()) {
18301 // All possible previous declarations must have the same context:
18302 // either they were declared at block scope or they are members of
18303 // one of the enclosing local classes.
18304 DC = Previous.getRepresentativeDecl()->getDeclContext();
18305 } else {
18306 // This is ill-formed, but provide the context that we would have
18307 // declared the function in, if we were permitted to, for error recovery.
18308 DC = FunctionContainingLocalClass;
18309 }
18311
18312 // - There's no scope specifier, in which case we just go to the
18313 // appropriate scope and look for a function or function template
18314 // there as appropriate.
18315 } else if (SS.isInvalid() || !SS.isSet()) {
18316 // C++11 [namespace.memdef]p3:
18317 // If the name in a friend declaration is neither qualified nor
18318 // a template-id and the declaration is a function or an
18319 // elaborated-type-specifier, the lookup to determine whether
18320 // the entity has been previously declared shall not consider
18321 // any scopes outside the innermost enclosing namespace.
18322
18323 // Find the appropriate context according to the above.
18324 DC = CurContext;
18325
18326 // Skip class contexts. If someone can cite chapter and verse
18327 // for this behavior, that would be nice --- it's what GCC and
18328 // EDG do, and it seems like a reasonable intent, but the spec
18329 // really only says that checks for unqualified existing
18330 // declarations should stop at the nearest enclosing namespace,
18331 // not that they should only consider the nearest enclosing
18332 // namespace.
18333 while (DC->isRecord())
18334 DC = DC->getParent();
18335
18336 DeclContext *LookupDC = DC->getNonTransparentContext();
18337 while (true) {
18338 LookupQualifiedName(Previous, LookupDC);
18339
18340 if (!Previous.empty()) {
18341 DC = LookupDC;
18342 break;
18343 }
18344
18345 if (isTemplateId) {
18346 if (isa<TranslationUnitDecl>(LookupDC)) break;
18347 } else {
18348 if (LookupDC->isFileContext()) break;
18349 }
18350 LookupDC = LookupDC->getParent();
18351 }
18352
18353 DCScope = getScopeForDeclContext(S, DC);
18354
18355 // - There's a non-dependent scope specifier, in which case we
18356 // compute it and do a previous lookup there for a function
18357 // or function template.
18358 } else if (!SS.getScopeRep().isDependent()) {
18359 DC = computeDeclContext(SS);
18360 if (!DC) return nullptr;
18361
18362 if (RequireCompleteDeclContext(SS, DC)) return nullptr;
18363
18365
18366 // C++ [class.friend]p1: A friend of a class is a function or
18367 // class that is not a member of the class . . .
18368 if (DC->Equals(CurContext))
18371 diag::warn_cxx98_compat_friend_is_member :
18372 diag::err_friend_is_member);
18373
18374 // - There's a scope specifier that does not match any template
18375 // parameter lists, in which case we use some arbitrary context,
18376 // create a method or method template, and wait for instantiation.
18377 // - There's a scope specifier that does match some template
18378 // parameter lists, which we don't handle right now.
18379 } else {
18380 DC = CurContext;
18381 assert(isa<CXXRecordDecl>(DC) && "friend declaration not in class?");
18382 }
18383
18384 if (!DC->isRecord()) {
18385 int DiagArg = -1;
18386 switch (D.getName().getKind()) {
18389 DiagArg = 0;
18390 break;
18392 DiagArg = 1;
18393 break;
18395 DiagArg = 2;
18396 break;
18398 DiagArg = 3;
18399 break;
18405 break;
18406 }
18407 // This implies that it has to be an operator or function.
18408 if (DiagArg >= 0) {
18409 Diag(Loc, diag::err_introducing_special_friend) << DiagArg;
18410 return nullptr;
18411 }
18412 }
18413
18414 // FIXME: This is an egregious hack to cope with cases where the scope stack
18415 // does not contain the declaration context, i.e., in an out-of-line
18416 // definition of a class.
18417 Scope FakeDCScope(S, Scope::DeclScope, Diags);
18418 if (!DCScope) {
18419 FakeDCScope.setEntity(DC);
18420 DCScope = &FakeDCScope;
18421 }
18422
18423 bool AddToScope = true;
18424 NamedDecl *ND = ActOnFunctionDeclarator(DCScope, D, DC, TInfo, Previous,
18425 TemplateParams, AddToScope);
18426 if (!ND) return nullptr;
18427
18428 assert(ND->getLexicalDeclContext() == CurContext);
18429
18430 // If we performed typo correction, we might have added a scope specifier
18431 // and changed the decl context.
18432 DC = ND->getDeclContext();
18433
18434 // Add the function declaration to the appropriate lookup tables,
18435 // adjusting the redeclarations list as necessary. We don't
18436 // want to do this yet if the friending class is dependent.
18437 //
18438 // Also update the scope-based lookup if the target context's
18439 // lookup context is in lexical scope.
18440 if (!CurContext->isDependentContext()) {
18441 DC = DC->getRedeclContext();
18443 if (Scope *EnclosingScope = getScopeForDeclContext(S, DC))
18444 PushOnScopeChains(ND, EnclosingScope, /*AddToContext=*/ false);
18445 }
18446
18448 D.getIdentifierLoc(), ND,
18449 DS.getFriendSpecLoc());
18450 FrD->setAccess(AS_public);
18451 CurContext->addDecl(FrD);
18452
18453 if (ND->isInvalidDecl()) {
18454 FrD->setInvalidDecl();
18455 } else {
18456 if (DC->isRecord()) CheckFriendAccess(ND);
18457
18458 FunctionDecl *FD;
18459 if (FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(ND))
18460 FD = FTD->getTemplatedDecl();
18461 else
18462 FD = cast<FunctionDecl>(ND);
18463
18464 // C++ [class.friend]p6:
18465 // A function may be defined in a friend declaration of a class if and
18466 // only if the class is a non-local class, and the function name is
18467 // unqualified.
18468 if (D.isFunctionDefinition()) {
18469 // Qualified friend function definition.
18470 if (SS.isNotEmpty()) {
18471 // FIXME: We should only do this if the scope specifier names the
18472 // innermost enclosing namespace; otherwise the fixit changes the
18473 // meaning of the code.
18475 Diag(SS.getRange().getBegin(), diag::err_qualified_friend_def);
18476
18477 DB << SS.getScopeRep();
18478 if (DC->isFileContext())
18480
18481 // Friend function defined in a local class.
18482 } else if (FunctionContainingLocalClass) {
18483 Diag(NameInfo.getBeginLoc(), diag::err_friend_def_in_local_class);
18484
18485 // Per [basic.pre]p4, a template-id is not a name. Therefore, if we have
18486 // a template-id, the function name is not unqualified because these is
18487 // no name. While the wording requires some reading in-between the
18488 // lines, GCC, MSVC, and EDG all consider a friend function
18489 // specialization definitions to be de facto explicit specialization
18490 // and diagnose them as such.
18491 } else if (isTemplateId) {
18492 Diag(NameInfo.getBeginLoc(), diag::err_friend_specialization_def);
18493 }
18494 }
18495
18496 // C++11 [dcl.fct.default]p4: If a friend declaration specifies a
18497 // default argument expression, that declaration shall be a definition
18498 // and shall be the only declaration of the function or function
18499 // template in the translation unit.
18501 // We can't look at FD->getPreviousDecl() because it may not have been set
18502 // if we're in a dependent context. If the function is known to be a
18503 // redeclaration, we will have narrowed Previous down to the right decl.
18504 if (D.isRedeclaration()) {
18505 Diag(FD->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
18506 Diag(Previous.getRepresentativeDecl()->getLocation(),
18507 diag::note_previous_declaration);
18508 } else if (!D.isFunctionDefinition())
18509 Diag(FD->getLocation(), diag::err_friend_decl_with_def_arg_must_be_def);
18510 }
18511
18512 // Mark templated-scope function declarations as unsupported.
18513 if (FD->getNumTemplateParameterLists() && SS.isValid()) {
18514 Diag(FD->getLocation(), diag::warn_template_qualified_friend_unsupported)
18515 << SS.getScopeRep() << SS.getRange()
18517 FrD->setUnsupportedFriend(true);
18518 }
18519 }
18520
18522
18523 return ND;
18524}
18525
18527 StringLiteral *Message) {
18529
18530 FunctionDecl *Fn = dyn_cast_or_null<FunctionDecl>(Dcl);
18531 if (!Fn) {
18532 Diag(DelLoc, diag::err_deleted_non_function);
18533 return;
18534 }
18535
18536 // Deleted function does not have a body.
18537 Fn->setWillHaveBody(false);
18538
18539 if (const FunctionDecl *Prev = Fn->getPreviousDecl()) {
18540 // Don't consider the implicit declaration we generate for explicit
18541 // specializations. FIXME: Do not generate these implicit declarations.
18542 if ((Prev->getTemplateSpecializationKind() != TSK_ExplicitSpecialization ||
18543 Prev->getPreviousDecl()) &&
18544 !Prev->isDefined()) {
18545 Diag(DelLoc, diag::err_deleted_decl_not_first);
18546 Diag(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),
18547 Prev->isImplicit() ? diag::note_previous_implicit_declaration
18548 : diag::note_previous_declaration);
18549 // We can't recover from this; the declaration might have already
18550 // been used.
18551 Fn->setInvalidDecl();
18552 return;
18553 }
18554
18555 // To maintain the invariant that functions are only deleted on their first
18556 // declaration, mark the implicitly-instantiated declaration of the
18557 // explicitly-specialized function as deleted instead of marking the
18558 // instantiated redeclaration.
18559 Fn = Fn->getCanonicalDecl();
18560 }
18561
18562 // dllimport/dllexport cannot be deleted.
18563 if (const InheritableAttr *DLLAttr = getDLLAttr(Fn)) {
18564 Diag(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;
18565 Fn->setInvalidDecl();
18566 }
18567
18568 // C++11 [basic.start.main]p3:
18569 // A program that defines main as deleted [...] is ill-formed.
18570 if (Fn->isMain())
18571 Diag(DelLoc, diag::err_deleted_main);
18572
18573 // C++11 [dcl.fct.def.delete]p4:
18574 // A deleted function is implicitly inline.
18575 Fn->setImplicitlyInline();
18576 Fn->setDeletedAsWritten(true, Message);
18577}
18578
18580 if (!Dcl || Dcl->isInvalidDecl())
18581 return;
18582
18583 auto *FD = dyn_cast<FunctionDecl>(Dcl);
18584 if (!FD) {
18585 if (auto *FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {
18586 if (getDefaultedFunctionKind(FTD->getTemplatedDecl()).isComparison()) {
18587 Diag(DefaultLoc, diag::err_defaulted_comparison_template);
18588 return;
18589 }
18590 }
18591
18592 Diag(DefaultLoc, diag::err_default_special_members)
18593 << getLangOpts().CPlusPlus20;
18594 return;
18595 }
18596
18597 // Reject if this can't possibly be a defaultable function.
18599 if (!DefKind &&
18600 // A dependent function that doesn't locally look defaultable can
18601 // still instantiate to a defaultable function if it's a constructor
18602 // or assignment operator.
18603 (!FD->isDependentContext() ||
18605 FD->getDeclName().getCXXOverloadedOperator() != OO_Equal))) {
18606 Diag(DefaultLoc, diag::err_default_special_members)
18607 << getLangOpts().CPlusPlus20;
18608 return;
18609 }
18610
18611 // Issue compatibility warning. We already warned if the operator is
18612 // 'operator<=>' when parsing the '<=>' token.
18613 if (DefKind.isComparison() &&
18615 Diag(DefaultLoc, getLangOpts().CPlusPlus20
18616 ? diag::warn_cxx17_compat_defaulted_comparison
18617 : diag::ext_defaulted_comparison);
18618 }
18619
18620 FD->setDefaulted();
18621 FD->setExplicitlyDefaulted();
18622 FD->setDefaultLoc(DefaultLoc);
18623
18624 // Defer checking functions that are defaulted in a dependent context.
18625 if (FD->isDependentContext())
18626 return;
18627
18628 // Unset that we will have a body for this function. We might not,
18629 // if it turns out to be trivial, and we don't need this marking now
18630 // that we've marked it as defaulted.
18631 FD->setWillHaveBody(false);
18632
18633 if (DefKind.isComparison()) {
18634 // If this comparison's defaulting occurs within the definition of its
18635 // lexical class context, we have to do the checking when complete.
18636 if (auto const *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalDeclContext()))
18637 if (!RD->isCompleteDefinition())
18638 return;
18639 }
18640
18641 // If this member fn was defaulted on its first declaration, we will have
18642 // already performed the checking in CheckCompletedCXXClass. Such a
18643 // declaration doesn't trigger an implicit definition.
18644 if (isa<CXXMethodDecl>(FD)) {
18645 const FunctionDecl *Primary = FD;
18646 if (const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern())
18647 // Ask the template instantiation pattern that actually had the
18648 // '= default' on it.
18649 Primary = Pattern;
18650 if (Primary->getCanonicalDecl()->isDefaulted())
18651 return;
18652 }
18653
18654 if (DefKind.isComparison()) {
18655 if (CheckExplicitlyDefaultedComparison(nullptr, FD, DefKind.asComparison()))
18656 FD->setInvalidDecl();
18657 else
18658 DefineDefaultedComparison(DefaultLoc, FD, DefKind.asComparison());
18659 } else {
18660 auto *MD = cast<CXXMethodDecl>(FD);
18661
18663 DefaultLoc))
18664 MD->setInvalidDecl();
18665 else
18666 DefineDefaultedFunction(*this, MD, DefaultLoc);
18667 }
18668}
18669
18671 for (Stmt *SubStmt : S->children()) {
18672 if (!SubStmt)
18673 continue;
18674 if (isa<ReturnStmt>(SubStmt))
18675 Self.Diag(SubStmt->getBeginLoc(),
18676 diag::err_return_in_constructor_handler);
18677 if (!isa<Expr>(SubStmt))
18678 SearchForReturnInStmt(Self, SubStmt);
18679 }
18680}
18681
18683 for (unsigned I = 0, E = TryBlock->getNumHandlers(); I != E; ++I) {
18684 CXXCatchStmt *Handler = TryBlock->getHandler(I);
18685 SearchForReturnInStmt(*this, Handler);
18686 }
18687}
18688
18690 StringLiteral *DeletedMessage) {
18691 switch (BodyKind) {
18692 case FnBodyKind::Delete:
18693 SetDeclDeleted(D, Loc, DeletedMessage);
18694 break;
18696 SetDeclDefaulted(D, Loc);
18697 break;
18698 case FnBodyKind::Other:
18699 llvm_unreachable(
18700 "Parsed function body should be '= delete;' or '= default;'");
18701 }
18702}
18703
18705 const CXXMethodDecl *Old) {
18706 const auto *NewFT = New->getType()->castAs<FunctionProtoType>();
18707 const auto *OldFT = Old->getType()->castAs<FunctionProtoType>();
18708
18709 if (OldFT->hasExtParameterInfos()) {
18710 for (unsigned I = 0, E = OldFT->getNumParams(); I != E; ++I)
18711 // A parameter of the overriding method should be annotated with noescape
18712 // if the corresponding parameter of the overridden method is annotated.
18713 if (OldFT->getExtParameterInfo(I).isNoEscape() &&
18714 !NewFT->getExtParameterInfo(I).isNoEscape()) {
18715 Diag(New->getParamDecl(I)->getLocation(),
18716 diag::warn_overriding_method_missing_noescape);
18717 Diag(Old->getParamDecl(I)->getLocation(),
18718 diag::note_overridden_marked_noescape);
18719 }
18720 }
18721
18722 // SME attributes must match when overriding a function declaration.
18723 if (IsInvalidSMECallConversion(Old->getType(), New->getType())) {
18724 Diag(New->getLocation(), diag::err_conflicting_overriding_attributes)
18725 << New << New->getType() << Old->getType();
18726 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
18727 return true;
18728 }
18729
18730 // Virtual overrides must have the same code_seg.
18731 const auto *OldCSA = Old->getAttr<CodeSegAttr>();
18732 const auto *NewCSA = New->getAttr<CodeSegAttr>();
18733 if ((NewCSA || OldCSA) &&
18734 (!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {
18735 Diag(New->getLocation(), diag::err_mismatched_code_seg_override);
18736 Diag(Old->getLocation(), diag::note_previous_declaration);
18737 return true;
18738 }
18739
18740 // Virtual overrides: check for matching effects.
18741 if (Context.hasAnyFunctionEffects()) {
18742 const auto OldFX = Old->getFunctionEffects();
18743 const auto NewFXOrig = New->getFunctionEffects();
18744
18745 if (OldFX != NewFXOrig) {
18746 FunctionEffectSet NewFX(NewFXOrig);
18747 const auto Diffs = FunctionEffectDiffVector(OldFX, NewFX);
18749 for (const auto &Diff : Diffs) {
18750 switch (Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *New, NewFX)) {
18752 break;
18754 Diag(New->getLocation(), diag::warn_conflicting_func_effect_override)
18755 << Diff.effectName();
18756 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18757 << Old->getReturnTypeSourceRange();
18758 break;
18760 NewFX.insert(Diff.Old.value(), Errs);
18761 const auto *NewFT = New->getType()->castAs<FunctionProtoType>();
18762 FunctionProtoType::ExtProtoInfo EPI = NewFT->getExtProtoInfo();
18764 QualType ModQT = Context.getFunctionType(NewFT->getReturnType(),
18765 NewFT->getParamTypes(), EPI);
18766 New->setType(ModQT);
18767 if (Errs.empty()) {
18768 // A warning here is somewhat pedantic. Skip this if there was
18769 // already a merge conflict, which is more serious.
18770 Diag(New->getLocation(), diag::warn_mismatched_func_effect_override)
18771 << Diff.effectName();
18772 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18773 << Old->getReturnTypeSourceRange();
18774 }
18775 break;
18776 }
18777 }
18778 }
18779 if (!Errs.empty())
18780 diagnoseFunctionEffectMergeConflicts(Errs, New->getLocation(),
18781 Old->getLocation());
18782 }
18783 }
18784
18785 CallingConv NewCC = NewFT->getCallConv(), OldCC = OldFT->getCallConv();
18786
18787 // If the calling conventions match, everything is fine
18788 if (NewCC == OldCC)
18789 return false;
18790
18791 // If the calling conventions mismatch because the new function is static,
18792 // suppress the calling convention mismatch error; the error about static
18793 // function override (err_static_overrides_virtual from
18794 // Sema::CheckFunctionDeclaration) is more clear.
18795 if (New->getStorageClass() == SC_Static)
18796 return false;
18797
18798 Diag(New->getLocation(),
18799 diag::err_conflicting_overriding_cc_attributes)
18800 << New->getDeclName() << New->getType() << Old->getType();
18801 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
18802 return true;
18803}
18804
18806 const CXXMethodDecl *Old) {
18807 // CWG2553
18808 // A virtual function shall not be an explicit object member function.
18809 if (!New->isExplicitObjectMemberFunction())
18810 return true;
18811 Diag(New->getParamDecl(0)->getBeginLoc(),
18812 diag::err_explicit_object_parameter_nonmember)
18813 << New->getSourceRange() << /*virtual*/ 1 << /*IsLambda*/ false;
18814 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
18815 New->setInvalidDecl();
18816 return false;
18817}
18818
18820 const CXXMethodDecl *Old) {
18821 QualType NewTy = New->getType()->castAs<FunctionType>()->getReturnType();
18822 QualType OldTy = Old->getType()->castAs<FunctionType>()->getReturnType();
18823
18824 if (Context.hasSameType(NewTy, OldTy) ||
18825 NewTy->isDependentType() || OldTy->isDependentType())
18826 return false;
18827
18828 // Check if the return types are covariant
18829 QualType NewClassTy, OldClassTy;
18830
18831 /// Both types must be pointers or references to classes.
18832 if (const PointerType *NewPT = NewTy->getAs<PointerType>()) {
18833 if (const PointerType *OldPT = OldTy->getAs<PointerType>()) {
18834 NewClassTy = NewPT->getPointeeType();
18835 OldClassTy = OldPT->getPointeeType();
18836 }
18837 } else if (const ReferenceType *NewRT = NewTy->getAs<ReferenceType>()) {
18838 if (const ReferenceType *OldRT = OldTy->getAs<ReferenceType>()) {
18839 if (NewRT->getTypeClass() == OldRT->getTypeClass()) {
18840 NewClassTy = NewRT->getPointeeType();
18841 OldClassTy = OldRT->getPointeeType();
18842 }
18843 }
18844 }
18845
18846 // The return types aren't either both pointers or references to a class type.
18847 if (NewClassTy.isNull() || !NewClassTy->isStructureOrClassType()) {
18848 Diag(New->getLocation(),
18849 diag::err_different_return_type_for_overriding_virtual_function)
18850 << New->getDeclName() << NewTy << OldTy
18851 << New->getReturnTypeSourceRange();
18852 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18853 << Old->getReturnTypeSourceRange();
18854
18855 return true;
18856 }
18857
18858 if (!Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
18859 // C++14 [class.virtual]p8:
18860 // If the class type in the covariant return type of D::f differs from
18861 // that of B::f, the class type in the return type of D::f shall be
18862 // complete at the point of declaration of D::f or shall be the class
18863 // type D.
18864 if (const auto *RD = NewClassTy->getAsCXXRecordDecl()) {
18865 if (!RD->isBeingDefined() &&
18866 RequireCompleteType(New->getLocation(), NewClassTy,
18867 diag::err_covariant_return_incomplete,
18868 New->getDeclName()))
18869 return true;
18870 }
18871
18872 // Check if the new class derives from the old class.
18873 if (!IsDerivedFrom(New->getLocation(), NewClassTy, OldClassTy)) {
18874 Diag(New->getLocation(), diag::err_covariant_return_not_derived)
18875 << New->getDeclName() << NewTy << OldTy
18876 << New->getReturnTypeSourceRange();
18877 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18878 << Old->getReturnTypeSourceRange();
18879 return true;
18880 }
18881
18882 // Check if we the conversion from derived to base is valid.
18884 NewClassTy, OldClassTy,
18885 diag::err_covariant_return_inaccessible_base,
18886 diag::err_covariant_return_ambiguous_derived_to_base_conv,
18887 New->getLocation(), New->getReturnTypeSourceRange(),
18888 New->getDeclName(), nullptr)) {
18889 // FIXME: this note won't trigger for delayed access control
18890 // diagnostics, and it's impossible to get an undelayed error
18891 // here from access control during the original parse because
18892 // the ParsingDeclSpec/ParsingDeclarator are still in scope.
18893 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18894 << Old->getReturnTypeSourceRange();
18895 return true;
18896 }
18897 }
18898
18899 // The qualifiers of the return types must be the same.
18900 if (NewTy.getLocalCVRQualifiers() != OldTy.getLocalCVRQualifiers()) {
18901 Diag(New->getLocation(),
18902 diag::err_covariant_return_type_different_qualifications)
18903 << New->getDeclName() << NewTy << OldTy
18904 << New->getReturnTypeSourceRange();
18905 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18906 << Old->getReturnTypeSourceRange();
18907 return true;
18908 }
18909
18910
18911 // The new class type must have the same or less qualifiers as the old type.
18912 if (!OldClassTy.isAtLeastAsQualifiedAs(NewClassTy, getASTContext())) {
18913 Diag(New->getLocation(),
18914 diag::err_covariant_return_type_class_type_not_same_or_less_qualified)
18915 << New->getDeclName() << NewTy << OldTy
18916 << New->getReturnTypeSourceRange();
18917 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18918 << Old->getReturnTypeSourceRange();
18919 return true;
18920 }
18921
18922 return false;
18923}
18924
18926 SourceLocation EndLoc = InitRange.getEnd();
18927 if (EndLoc.isValid())
18928 Method->setRangeEnd(EndLoc);
18929
18930 if (Method->isVirtual() || Method->getParent()->isDependentContext()) {
18931 Method->setIsPureVirtual();
18932 return false;
18933 }
18934
18935 if (!Method->isInvalidDecl())
18936 Diag(Method->getLocation(), diag::err_non_virtual_pure)
18937 << Method->getDeclName() << InitRange;
18938 return true;
18939}
18940
18942 if (D->getFriendObjectKind())
18943 Diag(D->getLocation(), diag::err_pure_friend);
18944 else if (auto *M = dyn_cast<CXXMethodDecl>(D))
18945 CheckPureMethod(M, ZeroLoc);
18946 else
18947 Diag(D->getLocation(), diag::err_illegal_initializer);
18948}
18949
18950/// Invoked when we are about to parse an initializer for the declaration
18951/// 'Dcl'.
18952///
18953/// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
18954/// static data member of class X, names should be looked up in the scope of
18955/// class X. If the declaration had a scope specifier, a scope will have
18956/// been created and passed in for this purpose. Otherwise, S will be null.
18958 assert(D && !D->isInvalidDecl());
18959
18960 // We will always have a nested name specifier here, but this declaration
18961 // might not be out of line if the specifier names the current namespace:
18962 // extern int n;
18963 // int ::n = 0;
18964 if (S && D->isOutOfLine())
18966
18970}
18971
18973 assert(D);
18974
18975 if (S && D->isOutOfLine())
18977
18979}
18980
18982 // C++ 6.4p2:
18983 // The declarator shall not specify a function or an array.
18984 // The type-specifier-seq shall not contain typedef and shall not declare a
18985 // new class or enumeration.
18987 "Parser allowed 'typedef' as storage class of condition decl.");
18988
18989 Decl *Dcl = ActOnDeclarator(S, D);
18990 if (!Dcl)
18991 return true;
18992
18993 if (isa<FunctionDecl>(Dcl)) { // The declarator shall not specify a function.
18994 Diag(Dcl->getLocation(), diag::err_invalid_use_of_function_type)
18995 << D.getSourceRange();
18996 return true;
18997 }
18998
18999 if (auto *VD = dyn_cast<VarDecl>(Dcl))
19000 VD->setCXXCondDecl();
19001
19002 return Dcl;
19003}
19004
19006 if (!ExternalSource)
19007 return;
19008
19010 ExternalSource->ReadUsedVTables(VTables);
19012 for (unsigned I = 0, N = VTables.size(); I != N; ++I) {
19013 llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos
19014 = VTablesUsed.find(VTables[I].Record);
19015 // Even if a definition wasn't required before, it may be required now.
19016 if (Pos != VTablesUsed.end()) {
19017 if (!Pos->second && VTables[I].DefinitionRequired)
19018 Pos->second = true;
19019 continue;
19020 }
19021
19022 VTablesUsed[VTables[I].Record] = VTables[I].DefinitionRequired;
19023 NewUses.push_back(VTableUse(VTables[I].Record, VTables[I].Location));
19024 }
19025
19026 VTableUses.insert(VTableUses.begin(), NewUses.begin(), NewUses.end());
19027}
19028
19030 bool DefinitionRequired) {
19031 // Ignore any vtable uses in unevaluated operands or for classes that do
19032 // not have a vtable.
19033 if (!Class->isDynamicClass() || Class->isDependentContext() ||
19034 CurContext->isDependentContext() || isUnevaluatedContext())
19035 return;
19036 // Do not mark as used if compiling for the device outside of the target
19037 // region.
19038 if (TUKind != TU_Prefix && LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice &&
19039 !OpenMP().isInOpenMPDeclareTargetContext() &&
19040 !OpenMP().isInOpenMPTargetExecutionDirective()) {
19041 if (!DefinitionRequired)
19043 return;
19044 }
19045
19046 // Try to insert this class into the map.
19048 Class = Class->getCanonicalDecl();
19049 std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator, bool>
19050 Pos = VTablesUsed.insert(std::make_pair(Class, DefinitionRequired));
19051 if (!Pos.second) {
19052 // If we already had an entry, check to see if we are promoting this vtable
19053 // to require a definition. If so, we need to reappend to the VTableUses
19054 // list, since we may have already processed the first entry.
19055 if (DefinitionRequired && !Pos.first->second) {
19056 Pos.first->second = true;
19057 } else {
19058 // Otherwise, we can early exit.
19059 return;
19060 }
19061 } else {
19062 // The Microsoft ABI requires that we perform the destructor body
19063 // checks (i.e. operator delete() lookup) when the vtable is marked used, as
19064 // the deleting destructor is emitted with the vtable, not with the
19065 // destructor definition as in the Itanium ABI.
19066 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
19067 CXXDestructorDecl *DD = Class->getDestructor();
19068 if (DD && DD->isVirtual() && !DD->isDeleted()) {
19069 if (Class->hasUserDeclaredDestructor() && !DD->isDefined()) {
19070 // If this is an out-of-line declaration, marking it referenced will
19071 // not do anything. Manually call CheckDestructor to look up operator
19072 // delete().
19073 ContextRAII SavedContext(*this, DD);
19074 CheckDestructor(DD);
19075 } else {
19076 MarkFunctionReferenced(Loc, Class->getDestructor());
19077 }
19078 }
19079 }
19080 }
19081
19082 // Local classes need to have their virtual members marked
19083 // immediately. For all other classes, we mark their virtual members
19084 // at the end of the translation unit.
19085 if (Class->isLocalClass())
19086 MarkVirtualMembersReferenced(Loc, Class->getDefinition());
19087 else
19088 VTableUses.push_back(std::make_pair(Class, Loc));
19089}
19090
19093 if (VTableUses.empty())
19094 return false;
19095
19096 // Note: The VTableUses vector could grow as a result of marking
19097 // the members of a class as "used", so we check the size each
19098 // time through the loop and prefer indices (which are stable) to
19099 // iterators (which are not).
19100 bool DefinedAnything = false;
19101 for (unsigned I = 0; I != VTableUses.size(); ++I) {
19102 CXXRecordDecl *Class = VTableUses[I].first->getDefinition();
19103 if (!Class)
19104 continue;
19106 Class->getTemplateSpecializationKind();
19107
19108 SourceLocation Loc = VTableUses[I].second;
19109
19110 bool DefineVTable = true;
19111
19112 const CXXMethodDecl *KeyFunction = Context.getCurrentKeyFunction(Class);
19113 // V-tables for non-template classes with an owning module are always
19114 // uniquely emitted in that module.
19115 if (Class->isInCurrentModuleUnit()) {
19116 DefineVTable = true;
19117 } else if (KeyFunction && !KeyFunction->hasBody()) {
19118 // If this class has a key function, but that key function is
19119 // defined in another translation unit, we don't need to emit the
19120 // vtable even though we're using it.
19121 // The key function is in another translation unit.
19122 DefineVTable = false;
19124 KeyFunction->getTemplateSpecializationKind();
19127 "Instantiations don't have key functions");
19128 (void)TSK;
19129 } else if (!KeyFunction) {
19130 // If we have a class with no key function that is the subject
19131 // of an explicit instantiation declaration, suppress the
19132 // vtable; it will live with the explicit instantiation
19133 // definition.
19134 bool IsExplicitInstantiationDeclaration =
19136 for (auto *R : Class->redecls()) {
19138 = cast<CXXRecordDecl>(R)->getTemplateSpecializationKind();
19140 IsExplicitInstantiationDeclaration = true;
19141 else if (TSK == TSK_ExplicitInstantiationDefinition) {
19142 IsExplicitInstantiationDeclaration = false;
19143 break;
19144 }
19145 }
19146
19147 if (IsExplicitInstantiationDeclaration)
19148 DefineVTable = false;
19149 }
19150
19151 // The exception specifications for all virtual members may be needed even
19152 // if we are not providing an authoritative form of the vtable in this TU.
19153 // We may choose to emit it available_externally anyway.
19154 if (!DefineVTable) {
19156 continue;
19157 }
19158
19159 // Mark all of the virtual members of this class as referenced, so
19160 // that we can build a vtable. Then, tell the AST consumer that a
19161 // vtable for this class is required.
19162 DefinedAnything = true;
19164 CXXRecordDecl *Canonical = Class->getCanonicalDecl();
19165 if (VTablesUsed[Canonical] && !Class->shouldEmitInExternalSource())
19166 Consumer.HandleVTable(Class);
19167
19168 // Warn if we're emitting a weak vtable. The vtable will be weak if there is
19169 // no key function or the key function is inlined. Don't warn in C++ ABIs
19170 // that lack key functions, since the user won't be able to make one.
19171 if (Context.getTargetInfo().getCXXABI().hasKeyFunctions() &&
19172 Class->isExternallyVisible() && ClassTSK != TSK_ImplicitInstantiation &&
19174 const FunctionDecl *KeyFunctionDef = nullptr;
19175 if (!KeyFunction || (KeyFunction->hasBody(KeyFunctionDef) &&
19176 KeyFunctionDef->isInlined()))
19177 Diag(Class->getLocation(), diag::warn_weak_vtable) << Class;
19178 }
19179 }
19180 VTableUses.clear();
19181
19182 return DefinedAnything;
19183}
19184
19186 const CXXRecordDecl *RD) {
19187 for (const auto *I : RD->methods())
19188 if (I->isVirtual() && !I->isPureVirtual())
19189 ResolveExceptionSpec(Loc, I->getType()->castAs<FunctionProtoType>());
19190}
19191
19193 const CXXRecordDecl *RD,
19194 bool ConstexprOnly) {
19195 // Mark all functions which will appear in RD's vtable as used.
19196 CXXFinalOverriderMap FinalOverriders;
19197 RD->getFinalOverriders(FinalOverriders);
19198 for (CXXFinalOverriderMap::const_iterator I = FinalOverriders.begin(),
19199 E = FinalOverriders.end();
19200 I != E; ++I) {
19201 for (OverridingMethods::const_iterator OI = I->second.begin(),
19202 OE = I->second.end();
19203 OI != OE; ++OI) {
19204 assert(OI->second.size() > 0 && "no final overrider");
19205 CXXMethodDecl *Overrider = OI->second.front().Method;
19206
19207 // C++ [basic.def.odr]p2:
19208 // [...] A virtual member function is used if it is not pure. [...]
19209 if (!Overrider->isPureVirtual() &&
19210 (!ConstexprOnly || Overrider->isConstexpr()))
19211 MarkFunctionReferenced(Loc, Overrider);
19212 }
19213 }
19214
19215 // Only classes that have virtual bases need a VTT.
19216 if (RD->getNumVBases() == 0)
19217 return;
19218
19219 for (const auto &I : RD->bases()) {
19220 const auto *Base = I.getType()->castAsCXXRecordDecl();
19221 if (Base->getNumVBases() == 0)
19222 continue;
19224 }
19225}
19226
19227static
19232 Sema &S) {
19233 if (Ctor->isInvalidDecl())
19234 return;
19235
19237
19238 // Target may not be determinable yet, for instance if this is a dependent
19239 // call in an uninstantiated template.
19240 if (Target) {
19241 const FunctionDecl *FNTarget = nullptr;
19242 (void)Target->hasBody(FNTarget);
19243 Target = const_cast<CXXConstructorDecl*>(
19244 cast_or_null<CXXConstructorDecl>(FNTarget));
19245 }
19246
19247 CXXConstructorDecl *Canonical = Ctor->getCanonicalDecl(),
19248 // Avoid dereferencing a null pointer here.
19249 *TCanonical = Target? Target->getCanonicalDecl() : nullptr;
19250
19251 if (!Current.insert(Canonical).second)
19252 return;
19253
19254 // We know that beyond here, we aren't chaining into a cycle.
19255 if (!Target || !Target->isDelegatingConstructor() ||
19256 Target->isInvalidDecl() || Valid.count(TCanonical)) {
19257 Valid.insert_range(Current);
19258 Current.clear();
19259 // We've hit a cycle.
19260 } else if (TCanonical == Canonical || Invalid.count(TCanonical) ||
19261 Current.count(TCanonical)) {
19262 // If we haven't diagnosed this cycle yet, do so now.
19263 if (!Invalid.count(TCanonical)) {
19264 S.Diag((*Ctor->init_begin())->getSourceLocation(),
19265 diag::warn_delegating_ctor_cycle)
19266 << Ctor;
19267
19268 // Don't add a note for a function delegating directly to itself.
19269 if (TCanonical != Canonical)
19270 S.Diag(Target->getLocation(), diag::note_it_delegates_to);
19271
19273 while (C->getCanonicalDecl() != Canonical) {
19274 const FunctionDecl *FNTarget = nullptr;
19275 (void)C->getTargetConstructor()->hasBody(FNTarget);
19276 assert(FNTarget && "Ctor cycle through bodiless function");
19277
19278 C = const_cast<CXXConstructorDecl*>(
19279 cast<CXXConstructorDecl>(FNTarget));
19280 S.Diag(C->getLocation(), diag::note_which_delegates_to);
19281 }
19282 }
19283
19284 Invalid.insert_range(Current);
19285 Current.clear();
19286 } else {
19288 }
19289}
19290
19291
19294
19295 for (DelegatingCtorDeclsType::iterator
19296 I = DelegatingCtorDecls.begin(ExternalSource.get()),
19297 E = DelegatingCtorDecls.end();
19298 I != E; ++I)
19299 DelegatingCycleHelper(*I, Valid, Invalid, Current, *this);
19300
19301 for (auto CI = Invalid.begin(), CE = Invalid.end(); CI != CE; ++CI)
19302 (*CI)->setInvalidDecl();
19303}
19304
19305namespace {
19306 /// AST visitor that finds references to the 'this' expression.
19307class FindCXXThisExpr : public DynamicRecursiveASTVisitor {
19308 Sema &S;
19309
19310public:
19311 explicit FindCXXThisExpr(Sema &S) : S(S) {}
19312
19313 bool VisitCXXThisExpr(CXXThisExpr *E) override {
19314 S.Diag(E->getLocation(), diag::err_this_static_member_func)
19315 << E->isImplicit();
19316 return false;
19317 }
19318};
19319}
19320
19322 TypeSourceInfo *TSInfo = Method->getTypeSourceInfo();
19323 if (!TSInfo)
19324 return false;
19325
19326 TypeLoc TL = TSInfo->getTypeLoc();
19328 if (!ProtoTL)
19329 return false;
19330
19331 // C++11 [expr.prim.general]p3:
19332 // [The expression this] shall not appear before the optional
19333 // cv-qualifier-seq and it shall not appear within the declaration of a
19334 // static member function (although its type and value category are defined
19335 // within a static member function as they are within a non-static member
19336 // function). [ Note: this is because declaration matching does not occur
19337 // until the complete declarator is known. - end note ]
19338 const FunctionProtoType *Proto = ProtoTL.getTypePtr();
19339 FindCXXThisExpr Finder(*this);
19340
19341 // If the return type came after the cv-qualifier-seq, check it now.
19342 if (Proto->hasTrailingReturn() &&
19343 !Finder.TraverseTypeLoc(ProtoTL.getReturnLoc()))
19344 return true;
19345
19346 // Check the exception specification.
19348 return true;
19349
19350 // Check the trailing requires clause
19351 if (const AssociatedConstraint &TRC = Method->getTrailingRequiresClause())
19352 if (!Finder.TraverseStmt(const_cast<Expr *>(TRC.ConstraintExpr)))
19353 return true;
19354
19356}
19357
19359 TypeSourceInfo *TSInfo = Method->getTypeSourceInfo();
19360 if (!TSInfo)
19361 return false;
19362
19363 TypeLoc TL = TSInfo->getTypeLoc();
19365 if (!ProtoTL)
19366 return false;
19367
19368 const FunctionProtoType *Proto = ProtoTL.getTypePtr();
19369 FindCXXThisExpr Finder(*this);
19370
19371 switch (Proto->getExceptionSpecType()) {
19372 case EST_Unparsed:
19373 case EST_Uninstantiated:
19374 case EST_Unevaluated:
19375 case EST_BasicNoexcept:
19376 case EST_NoThrow:
19377 case EST_DynamicNone:
19378 case EST_MSAny:
19379 case EST_None:
19380 break;
19381
19383 case EST_NoexceptFalse:
19384 case EST_NoexceptTrue:
19385 if (!Finder.TraverseStmt(Proto->getNoexceptExpr()))
19386 return true;
19387 [[fallthrough]];
19388
19389 case EST_Dynamic:
19390 for (const auto &E : Proto->exceptions()) {
19391 if (!Finder.TraverseType(E))
19392 return true;
19393 }
19394 break;
19395 }
19396
19397 return false;
19398}
19399
19401 FindCXXThisExpr Finder(*this);
19402
19403 // Check attributes.
19404 for (const auto *A : Method->attrs()) {
19405 // FIXME: This should be emitted by tblgen.
19406 Expr *Arg = nullptr;
19407 ArrayRef<Expr *> Args;
19408 if (const auto *G = dyn_cast<GuardedByAttr>(A))
19409 Arg = G->getArg();
19410 else if (const auto *G = dyn_cast<PtGuardedByAttr>(A))
19411 Arg = G->getArg();
19412 else if (const auto *AA = dyn_cast<AcquiredAfterAttr>(A))
19413 Args = llvm::ArrayRef(AA->args_begin(), AA->args_size());
19414 else if (const auto *AB = dyn_cast<AcquiredBeforeAttr>(A))
19415 Args = llvm::ArrayRef(AB->args_begin(), AB->args_size());
19416 else if (const auto *LR = dyn_cast<LockReturnedAttr>(A))
19417 Arg = LR->getArg();
19418 else if (const auto *LE = dyn_cast<LocksExcludedAttr>(A))
19419 Args = llvm::ArrayRef(LE->args_begin(), LE->args_size());
19420 else if (const auto *RC = dyn_cast<RequiresCapabilityAttr>(A))
19421 Args = llvm::ArrayRef(RC->args_begin(), RC->args_size());
19422 else if (const auto *AC = dyn_cast<AcquireCapabilityAttr>(A))
19423 Args = llvm::ArrayRef(AC->args_begin(), AC->args_size());
19424 else if (const auto *AC = dyn_cast<TryAcquireCapabilityAttr>(A)) {
19425 Arg = AC->getSuccessValue();
19426 Args = llvm::ArrayRef(AC->args_begin(), AC->args_size());
19427 } else if (const auto *RC = dyn_cast<ReleaseCapabilityAttr>(A))
19428 Args = llvm::ArrayRef(RC->args_begin(), RC->args_size());
19429
19430 if (Arg && !Finder.TraverseStmt(Arg))
19431 return true;
19432
19433 for (unsigned I = 0, N = Args.size(); I != N; ++I) {
19434 if (!Finder.TraverseStmt(Args[I]))
19435 return true;
19436 }
19437 }
19438
19439 return false;
19440}
19441
19443 bool IsTopLevel, ExceptionSpecificationType EST,
19444 ArrayRef<ParsedType> DynamicExceptions,
19445 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr,
19446 SmallVectorImpl<QualType> &Exceptions,
19448 Exceptions.clear();
19449 ESI.Type = EST;
19450 if (EST == EST_Dynamic) {
19451 Exceptions.reserve(DynamicExceptions.size());
19452 for (unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {
19453 // FIXME: Preserve type source info.
19454 QualType ET = GetTypeFromParser(DynamicExceptions[ei]);
19455
19456 if (IsTopLevel) {
19458 collectUnexpandedParameterPacks(ET, Unexpanded);
19459 if (!Unexpanded.empty()) {
19461 DynamicExceptionRanges[ei].getBegin(), UPPC_ExceptionType,
19462 Unexpanded);
19463 continue;
19464 }
19465 }
19466
19467 // Check that the type is valid for an exception spec, and
19468 // drop it if not.
19469 if (!CheckSpecifiedExceptionType(ET, DynamicExceptionRanges[ei]))
19470 Exceptions.push_back(ET);
19471 }
19472 ESI.Exceptions = Exceptions;
19473 return;
19474 }
19475
19476 if (isComputedNoexcept(EST)) {
19477 assert((NoexceptExpr->isTypeDependent() ||
19478 NoexceptExpr->getType()->getCanonicalTypeUnqualified() ==
19479 Context.BoolTy) &&
19480 "Parser should have made sure that the expression is boolean");
19481 if (IsTopLevel && DiagnoseUnexpandedParameterPack(NoexceptExpr)) {
19482 ESI.Type = EST_BasicNoexcept;
19483 return;
19484 }
19485
19486 ESI.NoexceptExpr = NoexceptExpr;
19487 return;
19488 }
19489}
19490
19492 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
19493 ArrayRef<ParsedType> DynamicExceptions,
19494 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr) {
19495 if (!D)
19496 return;
19497
19498 // Dig out the function we're referring to.
19499 if (FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D))
19500 D = FTD->getTemplatedDecl();
19501
19502 FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
19503 if (!FD)
19504 return;
19505
19506 // Check the exception specification.
19509 checkExceptionSpecification(/*IsTopLevel=*/true, EST, DynamicExceptions,
19510 DynamicExceptionRanges, NoexceptExpr, Exceptions,
19511 ESI);
19512
19513 // Update the exception specification on the function type.
19514 Context.adjustExceptionSpec(FD, ESI, /*AsWritten=*/true);
19515
19516 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
19517 if (MD->isStatic())
19519
19520 if (MD->isVirtual()) {
19521 // Check overrides, which we previously had to delay.
19522 for (const CXXMethodDecl *O : MD->overridden_methods())
19524 }
19525 }
19526}
19527
19528/// HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
19529///
19531 SourceLocation DeclStart, Declarator &D,
19532 Expr *BitWidth,
19533 InClassInitStyle InitStyle,
19534 AccessSpecifier AS,
19535 const ParsedAttr &MSPropertyAttr) {
19536 const IdentifierInfo *II = D.getIdentifier();
19537 if (!II) {
19538 Diag(DeclStart, diag::err_anonymous_property);
19539 return nullptr;
19540 }
19542
19544 QualType T = TInfo->getType();
19545 if (getLangOpts().CPlusPlus) {
19547
19550 D.setInvalidType();
19551 T = Context.IntTy;
19552 TInfo = Context.getTrivialTypeSourceInfo(T, Loc);
19553 }
19554 }
19555
19557
19559 Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
19560 << getLangOpts().CPlusPlus17;
19563 diag::err_invalid_thread)
19565
19566 // Check to see if this name was declared as a member previously
19567 NamedDecl *PrevDecl = nullptr;
19568 LookupResult Previous(*this, II, Loc, LookupMemberName,
19570 LookupName(Previous, S);
19571 switch (Previous.getResultKind()) {
19574 PrevDecl = Previous.getAsSingle<NamedDecl>();
19575 break;
19576
19578 PrevDecl = Previous.getRepresentativeDecl();
19579 break;
19580
19584 break;
19585 }
19586
19587 if (PrevDecl && PrevDecl->isTemplateParameter()) {
19588 // Maybe we will complain about the shadowed template parameter.
19590 // Just pretend that we didn't see the previous declaration.
19591 PrevDecl = nullptr;
19592 }
19593
19594 if (PrevDecl && !isDeclInScope(PrevDecl, Record, S))
19595 PrevDecl = nullptr;
19596
19597 SourceLocation TSSL = D.getBeginLoc();
19598 MSPropertyDecl *NewPD =
19599 MSPropertyDecl::Create(Context, Record, Loc, II, T, TInfo, TSSL,
19600 MSPropertyAttr.getPropertyDataGetter(),
19601 MSPropertyAttr.getPropertyDataSetter());
19602 ProcessDeclAttributes(TUScope, NewPD, D);
19603 NewPD->setAccess(AS);
19604
19605 if (NewPD->isInvalidDecl())
19606 Record->setInvalidDecl();
19607
19609 NewPD->setModulePrivate();
19610
19611 if (NewPD->isInvalidDecl() && PrevDecl) {
19612 // Don't introduce NewFD into scope; there's already something
19613 // with the same name in the same scope.
19614 } else if (II) {
19615 PushOnScopeChains(NewPD, S);
19616 } else
19617 Record->addDecl(NewPD);
19618
19619 return NewPD;
19620}
19621
19623 Declarator &Declarator, unsigned TemplateParameterDepth) {
19624 auto &Info = InventedParameterInfos.emplace_back();
19625 TemplateParameterList *ExplicitParams = nullptr;
19626 ArrayRef<TemplateParameterList *> ExplicitLists =
19628 if (!ExplicitLists.empty()) {
19629 bool IsMemberSpecialization, IsInvalid;
19632 Declarator.getCXXScopeSpec(), /*TemplateId=*/nullptr,
19633 ExplicitLists, /*IsFriend=*/false, IsMemberSpecialization, IsInvalid,
19634 /*SuppressDiagnostic=*/true);
19635 }
19636 // C++23 [dcl.fct]p23:
19637 // An abbreviated function template can have a template-head. The invented
19638 // template-parameters are appended to the template-parameter-list after
19639 // the explicitly declared template-parameters.
19640 //
19641 // A template-head must have one or more template-parameters (read:
19642 // 'template<>' is *not* a template-head). Only append the invented
19643 // template parameters if we matched the nested-name-specifier to a non-empty
19644 // TemplateParameterList.
19645 if (ExplicitParams && !ExplicitParams->empty()) {
19646 Info.AutoTemplateParameterDepth = ExplicitParams->getDepth();
19647 llvm::append_range(Info.TemplateParams, *ExplicitParams);
19648 Info.NumExplicitTemplateParams = ExplicitParams->size();
19649 } else {
19650 Info.AutoTemplateParameterDepth = TemplateParameterDepth;
19651 Info.NumExplicitTemplateParams = 0;
19652 }
19653}
19654
19656 auto &FSI = InventedParameterInfos.back();
19657 if (FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {
19658 if (FSI.NumExplicitTemplateParams != 0) {
19659 TemplateParameterList *ExplicitParams =
19663 Context, ExplicitParams->getTemplateLoc(),
19664 ExplicitParams->getLAngleLoc(), FSI.TemplateParams,
19665 ExplicitParams->getRAngleLoc(),
19666 ExplicitParams->getRequiresClause()));
19667 } else {
19670 Context, SourceLocation(), SourceLocation(), FSI.TemplateParams,
19671 SourceLocation(), /*RequiresClause=*/nullptr));
19672 }
19673 }
19674 InventedParameterInfos.pop_back();
19675}
Defines the clang::ASTContext interface.
#define V(N, I)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static bool CheckLiteralType(EvalInfo &Info, const Expr *E, const LValue *This=nullptr)
Check that this core constant expression is of literal type, and if not, produce an appropriate diagn...
TokenType getType() const
Returns the token's type, e.g.
FormatToken * Previous
The previous token in the unwrapped line.
FormatToken * Next
The next token in the unwrapped line.
static DiagnosticBuilder Diag(DiagnosticsEngine *Diags, const LangOptions &Features, FullSourceLoc TokLoc, const char *TokBegin, const char *TokRangeBegin, const char *TokRangeEnd, unsigned DiagID)
Produce a diagnostic highlighting some portion of a literal.
llvm::MachO::Target Target
Definition MachO.h:51
llvm::MachO::Record Record
Definition MachO.h:31
Implements a partial diagnostic that can be emitted anwyhere in a DiagnosticBuilder stream.
Defines the clang::Preprocessor interface.
@ ForExternalRedeclaration
The lookup results will be used for redeclaration of a name with external linkage; non-visible lookup...
@ ForVisibleRedeclaration
The lookup results will be used for redeclaration of a name, if an entity by that name already exists...
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static void ProcessAPINotes(Sema &S, Decl *D, const api_notes::CommonEntityInfo &Info, VersionedInfoMetadata Metadata)
This file declares semantic analysis for CUDA constructs.
static void DiagnoseUnsatisfiedConstraint(Sema &S, ArrayRef< UnsatisfiedConstraintRecord > Records, SourceLocation Loc, bool First=true, concepts::NestedRequirement *Req=nullptr)
static LookupResult lookupMember(Sema &S, const char *Name, CXXRecordDecl *RD, SourceLocation Loc, bool &Res)
static bool findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, TrivialABIHandling TAH, CXXMethodDecl **Selected)
Perform lookup for a special member of the specified kind, and determine whether it is trivial.
static void checkMoveAssignmentForRepeatedMove(Sema &S, CXXRecordDecl *Class, SourceLocation CurrentLocation)
Check if we're implicitly defining a move assignment operator for a class with virtual bases.
static void checkMethodTypeQualifiers(Sema &S, Declarator &D, unsigned DiagID)
static void DelegatingCycleHelper(CXXConstructorDecl *Ctor, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Valid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Invalid, llvm::SmallPtrSet< CXXConstructorDecl *, 4 > &Current, Sema &S)
static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *Body, Sema::CheckConstexprKind Kind)
Check the body for the given constexpr function declaration only contains the permitted types of stat...
llvm::SmallPtrSet< QualType, 4 > IndirectBaseSet
Use small set to collect indirect bases.
static void checkCUDADeviceBuiltinSurfaceClassTemplate(Sema &S, CXXRecordDecl *Class)
static bool checkVectorDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const VectorType *VT)
static void SearchForReturnInStmt(Sema &Self, Stmt *S)
static bool checkSimpleDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElemsAPS, QualType ElemType, llvm::function_ref< ExprResult(SourceLocation, Expr *, unsigned)> GetInit)
static CXXDestructorDecl * LookupDestructorIfRelevant(Sema &S, CXXRecordDecl *Class)
static void extendRight(SourceRange &R, SourceRange After)
static void DiagnoseNamespaceInlineMismatch(Sema &S, SourceLocation KeywordLoc, SourceLocation Loc, IdentifierInfo *II, bool *IsInline, NamespaceDecl *PrevNS)
Diagnose a mismatch in 'inline' qualifiers when a namespace is reopened.
static bool IsPotentiallyTypeAwareOperatorNewOrDelete(Sema &SemaRef, const FunctionDecl *FD, bool *WasMalformed)
static bool RefersToRValueRef(Expr *MemRef)
static bool CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallPtrSet< Decl *, 16 > &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind)
Check that the given field is initialized within a constexpr constructor.
static CanQualType RemoveAddressSpaceFromPtr(Sema &SemaRef, const PointerType *PtrTy)
static bool isVirtualDirectBase(CXXRecordDecl *Derived, CXXRecordDecl *Base)
Determine whether a direct base class is a virtual base class.
#define CheckPolymorphic(Type)
static void BuildBasePathArray(const CXXBasePath &Path, CXXCastPath &BasePathArray)
static void WriteCharValueForDiagnostic(uint32_t Value, const BuiltinType *BTy, unsigned TyWidth, SmallVectorImpl< char > &Str)
Convert character's value, interpreted as a code unit, to a string.
static void CheckAbstractClassUsage(AbstractUsageInfo &Info, FunctionDecl *FD)
Check for invalid uses of an abstract type in a function declaration.
static unsigned getRecordDiagFromTagKind(TagTypeKind Tag)
Get diagnostic select index for tag kind for record diagnostic message.
static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T, unsigned &OutSize)
static Expr * CastForMoving(Sema &SemaRef, Expr *E)
static bool IsPotentiallyDestroyingOperatorDelete(Sema &SemaRef, const FunctionDecl *FD)
static void extendLeft(SourceRange &R, SourceRange Before)
static bool specialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Is the special member function which would be selected to perform the specified operation on the spec...
static void diagnoseInvalidDeclaratorChunks(Sema &S, Declarator &D, unsigned Kind)
static bool canPassInRegisters(Sema &S, CXXRecordDecl *D, TargetInfo::CallingConvKind CCK)
Determine whether a type is permitted to be passed or returned in registers, per C++ [class....
static void lookupOperatorsForDefaultedComparison(Sema &Self, Scope *S, UnresolvedSetImpl &Operators, OverloadedOperatorKind Op)
Perform the unqualified lookups that might be needed to form a defaulted comparison function for the ...
static void WriteCharTypePrefix(BuiltinType::Kind BTK, llvm::raw_ostream &OS)
static bool EvaluateAsStringImpl(Sema &SemaRef, Expr *Message, ResultType &Result, ASTContext &Ctx, Sema::StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
static void diagnoseDeprecatedCopyOperation(Sema &S, CXXMethodDecl *CopyOp)
Diagnose an implicit copy operation for a class which is odr-used, but which is deprecated because th...
static void AddMostOverridenMethods(const CXXMethodDecl *MD, llvm::SmallPtrSetImpl< const CXXMethodDecl * > &Methods)
Add the most overridden methods from MD to Methods.
static DeclAccessPair findDecomposableBaseClass(Sema &S, SourceLocation Loc, const CXXRecordDecl *RD, CXXCastPath &BasePath)
Find the base class to decompose in a built-in decomposition of a class type.
static const void * GetKeyForBase(ASTContext &Context, QualType BaseType)
static QualType BuildStdClassTemplate(Sema &S, ClassTemplateDecl *CTD, QualType TypeParam, SourceLocation Loc)
AllocationOperatorKind
static NamespaceDecl * getNamespaceDecl(NamespaceBaseDecl *D)
getNamespaceDecl - Returns the namespace a decl represents.
static Sema::ImplicitExceptionSpecification ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD, Sema::DefaultedComparisonKind DCK)
static bool isDestroyingDeleteT(QualType Type)
static StmtResult buildSingleCopyAssignRecursively(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying, unsigned Depth=0)
Builds a statement that copies/moves the given entity from From to To.
static void checkCUDADeviceBuiltinTextureClassTemplate(Sema &S, CXXRecordDecl *Class)
static void AddInitializerToDiag(const Sema::SemaDiagnosticBuilder &Diag, const CXXCtorInitializer *Previous, const CXXCtorInitializer *Current)
static bool BuildImplicitBaseInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, CXXBaseSpecifier *BaseSpec, bool IsInheritedVirtualBase, CXXCtorInitializer *&CXXBaseInit)
static bool IsUnusedPrivateField(const FieldDecl *FD)
static void NoteIndirectBases(ASTContext &Context, IndirectBaseSet &Set, const QualType &Type)
Recursively add the bases of Type. Don't add Type itself.
static bool CheckConstexprMissingReturn(Sema &SemaRef, const FunctionDecl *Dcl)
static bool CheckConstexprFunctionStmt(Sema &SemaRef, const FunctionDecl *Dcl, Stmt *S, SmallVectorImpl< SourceLocation > &ReturnStmts, SourceLocation &Cxx1yLoc, SourceLocation &Cxx2aLoc, SourceLocation &Cxx2bLoc, Sema::CheckConstexprKind Kind)
Check the provided statement is allowed in a constexpr function definition.
static bool functionDeclHasDefaultArgument(const FunctionDecl *FD)
static bool CheckConstexprParameterTypes(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's parameter types are all literal types.
static bool IsUsingDirectiveInToplevelContext(DeclContext *CurContext)
Determine whether a using statement is in a context where it will be apply in all contexts.
static bool checkTupleLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, VarDecl *Src, QualType DecompType, unsigned NumElems)
static CXXConstructorDecl * findUserDeclaredCtor(CXXRecordDecl *RD)
static bool checkMemberDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const CXXRecordDecl *OrigRD)
static bool HasAttribute(const QualType &T)
static bool CheckOperatorNewDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static void checkForMultipleExportedDefaultConstructors(Sema &S, CXXRecordDecl *Class)
static bool CheckOperatorNewDeleteTypes(Sema &SemaRef, FunctionDecl *FnDecl, AllocationOperatorKind OperatorKind, CanQualType ExpectedResultType, CanQualType ExpectedSizeOrAddressParamType, unsigned DependentParamTypeDiag, unsigned InvalidParamTypeDiag)
static bool checkTrivialClassMembers(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, bool ConstArg, TrivialABIHandling TAH, bool Diagnose)
Check whether the members of a class type allow a special member to be trivial.
static TemplateArgumentLoc getTrivialTypeTemplateArgument(Sema &S, SourceLocation Loc, QualType T)
static void findImplicitlyDeclaredEqualityComparisons(ASTContext &Ctx, CXXRecordDecl *RD, llvm::SmallVectorImpl< FunctionDecl * > &Spaceships)
Find the equality comparison functions that should be implicitly declared in a given class definition...
static void PopulateKeysForFields(FieldDecl *Field, SmallVectorImpl< const void * > &IdealInits)
ImplicitInitializerKind
ImplicitInitializerKind - How an implicit base or member initializer should initialize its base or me...
@ IIK_Default
@ IIK_Move
@ IIK_Inherit
@ IIK_Copy
static bool ConvertAPValueToString(const APValue &V, QualType T, SmallVectorImpl< char > &Str, ASTContext &Context)
Convert \V to a string we can present to the user in a diagnostic \T is the type of the expression th...
static bool checkArrayDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ConstantArrayType *CAT)
static ClassTemplateDecl * LookupStdClassTemplate(Sema &S, SourceLocation Loc, const char *ClassName, bool *WasMalformed)
static void ReferenceDllExportedMembers(Sema &S, CXXRecordDecl *Class)
static bool UsefulToPrintExpr(const Expr *E)
Some Expression types are not useful to print notes about, e.g.
static bool FindBaseInitializer(Sema &SemaRef, CXXRecordDecl *ClassDecl, QualType BaseType, const CXXBaseSpecifier *&DirectBaseSpec, const CXXBaseSpecifier *&VirtualBaseSpec)
Find the direct and/or virtual base specifiers that correspond to the given base type,...
static bool checkLiteralOperatorTemplateParameterList(Sema &SemaRef, FunctionTemplateDecl *TpDecl)
static bool ReportOverrides(Sema &S, unsigned DiagID, const CXXMethodDecl *MD, llvm::function_ref< bool(const CXXMethodDecl *)> Report)
Report an error regarding overriding, along with any relevant overridden methods.
static bool CheckBindingsCount(Sema &S, DecompositionDecl *DD, QualType DecompType, ArrayRef< BindingDecl * > Bindings, unsigned MemberCount)
static bool CheckOperatorDeleteDeclaration(Sema &SemaRef, FunctionDecl *FnDecl)
static const void * GetKeyForMember(ASTContext &Context, CXXCtorInitializer *Member)
static std::string printTemplateArgs(const PrintingPolicy &PrintingPolicy, TemplateArgumentListInfo &Args, const TemplateParameterList *Params)
static bool CheckConstexprReturnType(Sema &SemaRef, const FunctionDecl *FD, Sema::CheckConstexprKind Kind)
Check whether a function's return type is a literal type.
static void DiagnoseBaseOrMemInitializerOrder(Sema &SemaRef, const CXXConstructorDecl *Constructor, ArrayRef< CXXCtorInitializer * > Inits)
static Sema::ImplicitExceptionSpecification computeImplicitExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD)
static bool isIncompleteOrZeroLengthArrayType(ASTContext &Context, QualType T)
Determine whether the given type is an incomplete or zero-lenfgth array type.
static void MarkFieldDestructorReferenced(Sema &S, SourceLocation Location, FieldDecl *Field)
TrivialSubobjectKind
The kind of subobject we are checking for triviality.
@ TSK_CompleteObject
The object is actually the complete object.
@ TSK_Field
The subobject is a non-static data member.
@ TSK_BaseClass
The subobject is a base class.
static bool hasOneRealArgument(MultiExprArg Args)
Determine whether the given list arguments contains exactly one "real" (non-default) argument.
static StmtResult buildMemcpyForAssignmentOp(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &ToB, const ExprBuilder &FromB)
When generating a defaulted copy or move assignment operator, if a field should be copied with __buil...
static bool isStdClassTemplate(Sema &S, QualType SugaredType, QualType *TypeArg, const char *ClassName, ClassTemplateDecl **CachedDecl, const Decl **MalformedDecl)
static void DefineDefaultedFunction(Sema &S, FunctionDecl *FD, SourceLocation DefaultLoc)
static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit)
static void MarkBaseDestructorsReferenced(Sema &S, SourceLocation Location, CXXRecordDecl *ClassDecl)
static bool CheckMemberDecompositionFields(Sema &S, SourceLocation Loc, const CXXRecordDecl *OrigRD, QualType DecompType, DeclAccessPair BasePair)
static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info, FieldDecl *Field, IndirectFieldDecl *Indirect=nullptr)
static CXXBaseSpecifier * findDirectBaseWithType(CXXRecordDecl *Derived, QualType DesiredBase, bool &AnyDependentBases)
Find the base specifier for a base class with the given type.
static Sema::SpecialMemberOverloadResult lookupCallFromSpecialMember(Sema &S, CXXRecordDecl *Class, CXXSpecialMemberKind CSM, unsigned FieldQuals, bool ConstRHS)
Look up the special member function that would be called by a special member function for a subobject...
static bool defaultedSpecialMemberIsConstexpr(Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, bool ConstArg, CXXConstructorDecl *InheritedCtor=nullptr, Sema::InheritedConstructorInfo *Inherited=nullptr)
Determine whether the specified special member function would be constexpr if it were implicitly defi...
static bool checkTrivialSubobjectCall(Sema &S, SourceLocation SubobjLoc, QualType SubType, bool ConstRHS, CXXSpecialMemberKind CSM, TrivialSubobjectKind Kind, TrivialABIHandling TAH, bool Diagnose)
Check whether the special member selected for a given type would be trivial.
static void DiagnoseInvisibleNamespace(const TypoCorrection &Corrected, Sema &S)
static StmtResult buildSingleCopyAssign(Sema &S, SourceLocation Loc, QualType T, const ExprBuilder &To, const ExprBuilder &From, bool CopyingBaseSubobject, bool Copying)
static FunctionProtoType::ExtProtoInfo getImplicitMethodEPI(Sema &S, CXXMethodDecl *MD)
static QualType getTupleLikeElementType(Sema &S, SourceLocation Loc, unsigned I, QualType T)
static Sema::ImplicitExceptionSpecification ComputeDefaultedSpecialMemberExceptionSpec(Sema &S, SourceLocation Loc, CXXMethodDecl *MD, CXXSpecialMemberKind CSM, Sema::InheritedConstructorInfo *ICI)
static QualType getStdTrait(Sema &S, SourceLocation Loc, StringRef Trait, TemplateArgumentListInfo &Args, unsigned DiagID)
static bool checkComplexDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ComplexType *CT)
static bool TryNamespaceTypoCorrection(Sema &S, LookupResult &R, Scope *Sc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
static bool InitializationHasSideEffects(const FieldDecl &FD)
static bool CheckOperatorNewDeleteDeclarationScope(Sema &SemaRef, const FunctionDecl *FnDecl)
static bool checkArrayLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElems, QualType ElemType)
static bool CheckConstexprDeclStmt(Sema &SemaRef, const FunctionDecl *Dcl, DeclStmt *DS, SourceLocation &Cxx1yLoc, Sema::CheckConstexprKind Kind)
Check the given declaration statement is legal within a constexpr function body.
static bool IsEquivalentForUsingDecl(ASTContext &Context, NamedDecl *D1, NamedDecl *D2)
Determine whether a using declaration considers the given declarations as "equivalent",...
static TemplateArgumentLoc getTrivialIntegralTemplateArgument(Sema &S, SourceLocation Loc, QualType T, uint64_t I)
static bool CheckConstexprDestructorSubobjects(Sema &SemaRef, const CXXDestructorDecl *DD, Sema::CheckConstexprKind Kind)
Determine whether a destructor cannot be constexpr due to.
static bool isProvablyNotDerivedFrom(Sema &SemaRef, CXXRecordDecl *Record, const BaseSet &Bases)
Determines if the given class is provably not derived from all of the prospective base classes.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
static ExprResult CheckConvertedConstantExpression(Sema &S, Expr *From, QualType T, APValue &Value, CCEKind CCE, bool RequireInt, NamedDecl *Dest)
CheckConvertedConstantExpression - Check that the expression From is a converted constant expression ...
static TemplateDeductionResult DeduceTemplateArguments(Sema &S, TemplateParameterList *TemplateParams, ArrayRef< TemplateArgument > Ps, ArrayRef< TemplateArgument > As, TemplateDeductionInfo &Info, SmallVectorImpl< DeducedTemplateArgument > &Deduced, bool NumberOfArgumentsMustMatch, bool PartialOrdering, PackFold PackFold, bool *HasDeducedAnyParam)
static void collectUnexpandedParameterPacks(Sema &S, TemplateParameterList *Params, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
static bool DiagnoseUnexpandedParameterPacks(Sema &S, TemplateTemplateParmDecl *TTP)
Check for unexpanded parameter packs within the template parameters of a template template parameter,...
static bool isInvalid(LocType Loc, bool *Invalid)
Defines various enumerations that describe declaration and type specifiers.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TypeLoc interface and its subclasses.
Allows QualTypes to be sorted and hence used in maps and sets.
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
std::pair< CXXConstructorDecl *, bool > findConstructorForBase(CXXRecordDecl *Base, CXXConstructorDecl *Ctor) const
Find the constructor to use for inherited construction of a base class, and whether that base class c...
InheritedConstructorInfo(Sema &S, SourceLocation UseLoc, ConstructorUsingShadowDecl *Shadow)
a trap message and trap category.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition APValue.h:122
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:220
const ConstantArrayType * getAsConstantArrayType(QualType T) const
static CanQualType getCanonicalType(QualType T)
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
DeclarationNameTable DeclarationNames
Definition ASTContext.h:795
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
CanQualType VoidPtrTy
CanQualType DependentTy
IdentifierTable & Idents
Definition ASTContext.h:791
const LangOptions & getLangOpts() const
Definition ASTContext.h:945
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod) const
Retrieves the default calling convention for the current context.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
ComparisonCategories CompCategories
Types and expressions required to build C++2a three-way comparisons using operator<=>,...
CanQualType BoolTy
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
CanQualType CharTy
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
const clang::PrintingPolicy & getPrintingPolicy() const
Definition ASTContext.h:844
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
QualType getTypeDeclType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier Qualifier, const TypeDecl *Decl) const
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
CanQualType BuiltinFnTy
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
CanQualType VoidTy
QualType getPackExpansionType(QualType Pattern, UnsignedOrNone NumExpansions, bool ExpectPackInType=true) const
Form a pack expansion type with the given pattern.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
llvm::APSInt MakeIntValue(uint64_t Value, QualType Type) const
Make an APSInt of the appropriate width and signedness for the given Value and integer Type.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:910
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.
An abstract interface that should be implemented by listeners that want to be notified when an AST en...
Represents an access specifier followed by colon ':'.
Definition DeclCXX.h:86
static AccessSpecDecl * Create(ASTContext &C, AccessSpecifier AS, DeclContext *DC, SourceLocation ASLoc, SourceLocation ColonLoc)
Definition DeclCXX.h:117
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
TypeLoc getElementLoc() const
Definition TypeLoc.h:1778
QualType getElementType() const
Definition TypeBase.h:3735
Attr - This represents one attribute.
Definition Attr.h:45
attr::Kind getKind() const
Definition Attr.h:91
bool isInherited() const
Definition Attr.h:100
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
Definition Attr.h:98
Represents a C++ declaration that introduces decls from somewhere else.
Definition DeclCXX.h:3492
unsigned shadow_size() const
Return the number of shadowed declarations associated with this using declaration.
Definition DeclCXX.h:3570
void addShadowDecl(UsingShadowDecl *S)
Definition DeclCXX.cpp:3456
shadow_iterator shadow_begin() const
Definition DeclCXX.h:3562
void removeShadowDecl(UsingShadowDecl *S)
Definition DeclCXX.cpp:3465
Expr * getLHS() const
Definition Expr.h:4022
Expr * getRHS() const
Definition Expr.h:4024
static BinaryOperator * Create(const ASTContext &C, Expr *lhs, Expr *rhs, Opcode opc, QualType ResTy, ExprValueKind VK, ExprObjectKind OK, SourceLocation opLoc, FPOptionsOverride FPFeatures)
Definition Expr.cpp:4981
static bool isCompoundAssignmentOp(Opcode Opc)
Definition Expr.h:4113
Opcode getOpcode() const
Definition Expr.h:4017
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
Definition Expr.cpp:2141
A binding in a decomposition declaration.
Definition DeclCXX.h:4181
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id, QualType T)
Definition DeclCXX.cpp:3647
void setBinding(QualType DeclaredType, Expr *Binding)
Set the binding for this BindingDecl, along with its declared type (which should be a possibly-cv-qua...
Definition DeclCXX.h:4219
void setDecomposedDecl(ValueDecl *Decomposed)
Set the decomposed variable for this BindingDecl.
Definition DeclCXX.h:4225
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition Expr.h:6558
Wrapper for source info for block pointers.
Definition TypeLoc.h:1497
This class is used for builtin types like 'int'.
Definition TypeBase.h:3165
Kind getKind() const
Definition TypeBase.h:3213
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
DeclContext::lookup_iterator Decls
The declarations found inside this base class subobject.
AccessSpecifier Access
The access along this inheritance path.
BasePaths - Represents the set of paths from a derived class to one of its (direct or indirect) bases...
const CXXRecordDecl * getOrigin() const
Retrieve the type from which this base-paths search began.
CXXBasePath & front()
bool isRecordingPaths() const
Whether we are recording paths.
paths_iterator begin()
paths_iterator end()
void setRecordingPaths(bool RP)
Specify whether we should be recording paths or not.
void setOrigin(const CXXRecordDecl *Rec)
void clear()
Clear the base-paths results.
std::list< CXXBasePath >::iterator paths_iterator
bool isAmbiguous(CanQualType BaseType) const
Determine whether the path from the most-derived type to the given base type is ambiguous (i....
Represents a base class of a C++ class.
Definition DeclCXX.h:146
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclCXX.h:194
bool isVirtual() const
Determines whether the base class is a virtual base class (or not).
Definition DeclCXX.h:203
QualType getType() const
Retrieves the type of the base class.
Definition DeclCXX.h:249
SourceRange getSourceRange() const LLVM_READONLY
Retrieves the source range that contains the entire base specifier.
Definition DeclCXX.h:193
AccessSpecifier getAccessSpecifier() const
Returns the access specifier for this base specifier.
Definition DeclCXX.h:230
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition ExprCXX.h:723
CXXCatchStmt - This represents a C++ catch block.
Definition StmtCXX.h:28
Represents a call to a C++ constructor.
Definition ExprCXX.h:1548
static CXXConstructExpr * Create(const ASTContext &Ctx, QualType Ty, SourceLocation Loc, CXXConstructorDecl *Ctor, bool Elidable, ArrayRef< Expr * > Args, bool HadMultipleCandidates, bool ListInitialization, bool StdInitListInitialization, bool ZeroInitialization, CXXConstructionKind ConstructKind, SourceRange ParenOrBraceRange)
Create a C++ construction expression.
Definition ExprCXX.cpp:1180
Expr * getArg(unsigned Arg)
Return the specified argument.
Definition ExprCXX.h:1691
bool isImmediateEscalating() const
Definition ExprCXX.h:1706
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition ExprCXX.h:1611
Represents a C++ constructor within a class.
Definition DeclCXX.h:2604
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2847
bool isMoveConstructor(unsigned &TypeQuals) const
Determine whether this constructor is a move constructor (C++11 [class.copy]p3), which can be used to...
Definition DeclCXX.cpp:3013
ExplicitSpecifier getExplicitSpecifier()
Definition DeclCXX.h:2676
init_iterator init_begin()
Retrieve an iterator to the first initializer.
Definition DeclCXX.h:2701
CXXConstructorDecl * getTargetConstructor() const
When this constructor delegates to another, retrieve the target.
Definition DeclCXX.cpp:2990
bool isCopyConstructor(unsigned &TypeQuals) const
Whether this constructor is a copy constructor (C++ [class.copy]p2, which can be used to copy the cla...
Definition DeclCXX.cpp:3008
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
Definition DeclCXX.cpp:2999
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
Definition DeclCXX.h:2842
static CXXConstructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, ExplicitSpecifier ES, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, InheritedConstructor Inherited=InheritedConstructor(), const AssociatedConstraint &TrailingRequiresClause={})
Definition DeclCXX.cpp:2968
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2939
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Definition DeclCXX.h:2979
Represents a C++ base or member initializer.
Definition DeclCXX.h:2369
bool isWritten() const
Determine whether this initializer is explicitly written in the source code.
Definition DeclCXX.h:2541
SourceRange getSourceRange() const LLVM_READONLY
Determine the source range covering the entire initializer.
Definition DeclCXX.cpp:2916
SourceLocation getSourceLocation() const
Determine the source location of the initializer.
Definition DeclCXX.cpp:2903
bool isAnyMemberInitializer() const
Definition DeclCXX.h:2449
TypeSourceInfo * getTypeSourceInfo() const
Returns the declarator information for a base class or delegating initializer.
Definition DeclCXX.h:2503
FieldDecl * getAnyMember() const
Definition DeclCXX.h:2515
Represents a C++ destructor within a class.
Definition DeclCXX.h:2869
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, const AssociatedConstraint &TrailingRequiresClause={})
Definition DeclCXX.cpp:3098
A mapping from each virtual member function to its set of final overriders.
Represents a call to an inherited base class constructor from an inheriting constructor.
Definition ExprCXX.h:1751
Represents a call to a member function that may be written either with member call syntax (e....
Definition ExprCXX.h:179
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Definition ExprCXX.cpp:741
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2129
bool isExplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An explicit object member function is a non-static member function with an explic...
Definition DeclCXX.cpp:2703
bool isVirtual() const
Definition DeclCXX.h:2184
static CXXMethodDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin, bool isInline, ConstexprSpecKind ConstexprKind, SourceLocation EndLocation, const AssociatedConstraint &TrailingRequiresClause={})
Definition DeclCXX.cpp:2488
unsigned getNumExplicitParams() const
Definition DeclCXX.h:2283
CXXMethodDecl * getMostRecentDecl()
Definition DeclCXX.h:2232
overridden_method_range overridden_methods() const
Definition DeclCXX.cpp:2778
unsigned size_overridden_methods() const
Definition DeclCXX.cpp:2772
method_iterator begin_overridden_methods() const
Definition DeclCXX.cpp:2762
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2255
bool isInstance() const
Definition DeclCXX.h:2156
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Definition DeclCXX.cpp:2735
QualType getFunctionObjectParameterType() const
Definition DeclCXX.h:2279
bool isStatic() const
Definition DeclCXX.cpp:2401
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:2225
The null pointer literal (C++11 [lex.nullptr])
Definition ExprCXX.h:768
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
bool hasConstexprDefaultConstructor() const
Determine whether this class has a constexpr default constructor.
Definition DeclCXX.h:1270
friend_range friends() const
Definition DeclFriend.h:258
bool hasTrivialMoveAssignment() const
Determine whether this class has a trivial move assignment operator (C++11 [class....
Definition DeclCXX.h:1341
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
Definition DeclCXX.cpp:607
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
Definition DeclCXX.h:1240
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
Definition DeclCXX.cpp:1673
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
Definition DeclCXX.h:1366
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
Definition DeclCXX.h:1001
bool implicitCopyConstructorHasConstParam() const
Determine whether an implicit copy constructor for this type would have a parameter with a const-qual...
Definition DeclCXX.h:820
bool defaultedDestructorIsDeleted() const
true if a defaulted destructor for this class would be deleted.
Definition DeclCXX.h:714
bool hasInheritedAssignment() const
Determine whether this class has a using-declaration that names a base class assignment operator.
Definition DeclCXX.h:1420
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
Definition DeclCXX.h:1391
bool hasTrivialDestructorForCall() const
Definition DeclCXX.h:1370
bool defaultedMoveConstructorIsDeleted() const
true if a defaulted move constructor for this class would be deleted.
Definition DeclCXX.h:706
bool isLiteral() const
Determine whether this class is a literal type.
Definition DeclCXX.cpp:1500
bool hasUserDeclaredMoveAssignment() const
Determine whether this class has had a move assignment declared by the user.
Definition DeclCXX.h:961
bool defaultedDestructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
Definition DeclCXX.h:1356
base_class_range bases()
Definition DeclCXX.h:608
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
Definition DeclCXX.cpp:600
bool isLambda() const
Determine whether this class describes a lambda function object.
Definition DeclCXX.h:1018
bool hasTrivialMoveConstructor() const
Determine whether this class has a trivial move constructor (C++11 [class.copy]p12)
Definition DeclCXX.h:1301
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
Definition DeclCXX.h:766
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
Definition DeclCXX.h:892
bool hasUserDeclaredCopyAssignment() const
Determine whether this class has a user-declared copy assignment operator.
Definition DeclCXX.h:910
bool isProvablyNotDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is provably not derived from the type Base.
method_range methods() const
Definition DeclCXX.h:650
CXXRecordDecl * getDefinition() const
Definition DeclCXX.h:548
bool needsOverloadResolutionForCopyAssignment() const
Determine whether we need to eagerly declare a defaulted copy assignment operator for this class.
Definition DeclCXX.h:931
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
Definition DeclCXX.h:1721
bool defaultedDefaultConstructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
Definition DeclCXX.h:1263
bool hasTrivialCopyConstructor() const
Determine whether this class has a trivial copy constructor (C++ [class.copy]p6, C++11 [class....
Definition DeclCXX.h:1278
void setImplicitMoveAssignmentIsDeleted()
Set that we attempted to declare an implicit move assignment operator, but overload resolution failed...
Definition DeclCXX.h:973
bool hasConstexprDestructor() const
Determine whether this class has a constexpr destructor.
Definition DeclCXX.cpp:595
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
Definition DeclCXX.h:1214
unsigned getNumBases() const
Retrieves the number of base classes of this class.
Definition DeclCXX.h:602
bool defaultedCopyConstructorIsDeleted() const
true if a defaulted copy constructor for this class would be deleted.
Definition DeclCXX.h:697
bool hasTrivialCopyConstructorForCall() const
Definition DeclCXX.h:1282
bool lookupInBases(BaseMatchesCallback BaseMatches, CXXBasePaths &Paths, bool LookupInDependent=false) const
Look for entities within the base classes of this C++ class, transitively searching all base class su...
bool lambdaIsDefaultConstructibleAndAssignable() const
Determine whether this lambda should have an implicit default constructor and copy and move assignmen...
Definition DeclCXX.cpp:726
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
Definition DeclCXX.cpp:2050
bool hasTrivialCopyAssignment() const
Determine whether this class has a trivial copy assignment operator (C++ [class.copy]p11,...
Definition DeclCXX.h:1328
base_class_range vbases()
Definition DeclCXX.h:625
base_class_iterator vbases_begin()
Definition DeclCXX.h:632
ctor_range ctors() const
Definition DeclCXX.h:670
void setImplicitMoveConstructorIsDeleted()
Set that we attempted to declare an implicit move constructor, but overload resolution failed so we d...
Definition DeclCXX.h:867
bool isAbstract() const
Determine whether this class has a pure virtual function.
Definition DeclCXX.h:1221
bool hasVariantMembers() const
Determine whether this class has any variant members.
Definition DeclCXX.h:1236
void setImplicitCopyConstructorIsDeleted()
Set that we attempted to declare an implicit copy constructor, but overload resolution failed so we d...
Definition DeclCXX.h:858
bool isDynamicClass() const
Definition DeclCXX.h:574
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
Definition DeclCXX.h:1148
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
Definition DeclCXX.h:799
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
Definition DeclCXX.h:1402
bool hasNonTrivialCopyConstructorForCall() const
Definition DeclCXX.h:1293
bool hasDirectFields() const
Determine whether this class has direct non-static data members.
Definition DeclCXX.h:1200
bool hasUserDeclaredCopyConstructor() const
Determine whether this class has a user-declared copy constructor.
Definition DeclCXX.h:793
bool hasDefinition() const
Definition DeclCXX.h:561
void setImplicitCopyAssignmentIsDeleted()
Set that we attempted to declare an implicit copy assignment operator, but overload resolution failed...
Definition DeclCXX.h:916
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
Definition DeclCXX.h:1007
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
Definition DeclCXX.cpp:2042
void getFinalOverriders(CXXFinalOverriderMap &FinaOverriders) const
Retrieve the final overriders for each virtual member function in the class hierarchy where this clas...
bool needsOverloadResolutionForMoveConstructor() const
Determine whether we need to eagerly declare a defaulted move constructor for this class.
Definition DeclCXX.h:902
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
Definition DeclCXX.cpp:2146
bool needsOverloadResolutionForMoveAssignment() const
Determine whether we need to eagerly declare a move assignment operator for this class.
Definition DeclCXX.h:994
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
Definition DeclCXX.cpp:2121
bool hasNonTrivialDestructorForCall() const
Definition DeclCXX.h:1380
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
Definition DeclCXX.h:1013
bool hasInheritedConstructor() const
Determine whether this class has a using-declaration that names a user-declared base class constructo...
Definition DeclCXX.h:1414
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
Definition DeclCXX.cpp:1748
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
Definition DeclCXX.h:805
CXXRecordDecl * getDefinitionOrSelf() const
Definition DeclCXX.h:555
bool hasUserDeclaredMoveConstructor() const
Determine whether this class has had a move constructor declared by the user.
Definition DeclCXX.h:846
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
Definition DeclCXX.h:983
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
Definition DeclCXX.h:925
bool hasTrivialMoveConstructorForCall() const
Definition DeclCXX.h:1306
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Definition DeclCXX.cpp:1736
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition DeclCXX.h:522
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
Definition DeclCXX.h:623
bool isDerivedFrom(const CXXRecordDecl *Base) const
Determine whether this class is derived from the class Base.
bool implicitCopyAssignmentHasConstParam() const
Determine whether an implicit copy assignment operator for this type would have a parameter with a co...
Definition DeclCXX.h:946
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:73
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
Definition DeclSpec.h:180
bool isValid() const
A scope specifier is present, and it refers to a real scope.
Definition DeclSpec.h:185
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
Definition DeclSpec.cpp:97
SourceRange getRange() const
Definition DeclSpec.h:79
SourceLocation getBeginLoc() const
Definition DeclSpec.h:83
bool isSet() const
Deprecated.
Definition DeclSpec.h:198
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
Definition DeclSpec.h:94
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
Definition DeclSpec.cpp:123
bool isInvalid() const
An error occurred during parsing of the scope specifier.
Definition DeclSpec.h:183
bool isEmpty() const
No scope specifier.
Definition DeclSpec.h:178
Represents the this expression in C++.
Definition ExprCXX.h:1154
SourceLocation getBeginLoc() const
Definition ExprCXX.h:1174
bool isImplicit() const
Definition ExprCXX.h:1177
SourceLocation getLocation() const
Definition ExprCXX.h:1171
CXXTryStmt - A C++ try block, including all handlers.
Definition StmtCXX.h:69
CXXCatchStmt * getHandler(unsigned i)
Definition StmtCXX.h:108
unsigned getNumHandlers() const
Definition StmtCXX.h:107
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2877
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition Expr.h:3081
FunctionDecl * getDirectCallee()
If the callee is a FunctionDecl, return it. Otherwise return null.
Definition Expr.h:3060
bool isCallToStdMove() const
Definition Expr.cpp:3623
Expr * getCallee()
Definition Expr.h:3024
arg_range arguments()
Definition Expr.h:3129
QualType withConst() const
Retrieves a version of this type with const applied.
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CastKind getCastKind() const
Definition Expr.h:3654
Expr * getSubExpr()
Definition Expr.h:3660
static CharSourceRange getTokenRange(SourceRange R)
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
Definition CharUnits.h:185
Declaration of a class template.
CXXRecordDecl * getTemplatedDecl() const
Get the underlying class declarations of the template.
Represents a class template specialization, which refers to a class template with a given set of temp...
TemplateSpecializationKind getSpecializationKind() const
Determine the kind of specialization that this declaration represents.
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
SourceLocation getPointOfInstantiation() const
Get the point of instantiation (if any), or null if none.
const ComparisonCategoryInfo * lookupInfoForType(QualType Ty) const
static StringRef getCategoryString(ComparisonCategoryType Kind)
static StringRef getResultString(ComparisonCategoryResult Kind)
static std::vector< ComparisonCategoryResult > getPossibleResultsForType(ComparisonCategoryType Type)
Return the list of results which are valid for the specified comparison category type.
const CXXRecordDecl * Record
The declaration for the comparison category type from the standard library.
ComparisonCategoryType Kind
The Kind of the comparison category type.
Complex values, per C99 6.2.5p11.
Definition TypeBase.h:3276
QualType getElementType() const
Definition TypeBase.h:3286
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1730
body_range body()
Definition Stmt.h:1793
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
Definition Stmt.cpp:394
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3761
llvm::APInt getSize() const
Return the constant array size as an APInt.
Definition TypeBase.h:3817
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition DeclCXX.h:3673
const CXXRecordDecl * getParent() const
Returns the parent of this using shadow declaration, which is the class in which this is declared.
Definition DeclCXX.h:3737
static ConstructorUsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target, bool IsVirtual)
Definition DeclCXX.cpp:3438
Base class for callback objects used by Sema::CorrectTypo to check the validity of a potential typo c...
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
NamedDecl * getDecl() const
AccessSpecifier getAccess() const
The results of name lookup within a DeclContext.
Definition DeclBase.h:1382
DeclListNode::iterator iterator
Definition DeclBase.h:1392
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition DeclBase.h:2393
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1449
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2109
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition DeclBase.h:2238
lookup_result::iterator lookup_iterator
Definition DeclBase.h:2578
bool isFileContext() const
Definition DeclBase.h:2180
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
DeclContextLookupResult lookup_result
Definition DeclBase.h:2577
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
bool InEnclosingNamespaceSetOf(const DeclContext *NS) const
Test if this context is part of the enclosing namespace set of the context NS, as defined in C++0x [n...
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isTranslationUnit() const
Definition DeclBase.h:2185
bool isRecord() const
Definition DeclBase.h:2189
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
void removeDecl(Decl *D)
Removes a declaration from this context.
void addDecl(Decl *D)
Add the declaration D into this context.
decl_iterator decls_end() const
Definition DeclBase.h:2375
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition DeclBase.h:2373
bool isFunctionOrMethod() const
Definition DeclBase.h:2161
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context semantically encloses the declaration context DC.
Decl::Kind getDeclKind() const
Definition DeclBase.h:2102
DeclContext * getNonTransparentContext()
decl_iterator decls_begin() const
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1270
static DeclRefExpr * Create(const ASTContext &Context, NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc, ValueDecl *D, bool RefersToEnclosingVariableOrCapture, SourceLocation NameLoc, QualType T, ExprValueKind VK, NamedDecl *FoundD=nullptr, const TemplateArgumentListInfo *TemplateArgs=nullptr, NonOdrUseReason NOUR=NOUR_None)
Definition Expr.cpp:487
ValueDecl * getDecl()
Definition Expr.h:1338
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Definition Expr.h:1468
SourceLocation getBeginLoc() const
Definition Expr.h:1349
bool isImmediateEscalating() const
Definition Expr.h:1478
Captures information about "declaration specifiers".
Definition DeclSpec.h:217
bool isVirtualSpecified() const
Definition DeclSpec.h:618
bool isModulePrivateSpecified() const
Definition DeclSpec.h:799
bool hasTypeSpecifier() const
Return true if any type-specifier has been found.
Definition DeclSpec.h:661
bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy)
These methods set the specified attribute of the DeclSpec and return false if there was no error.
Definition DeclSpec.cpp:619
ThreadStorageClassSpecifier TSCS
Definition DeclSpec.h:234
Expr * getPackIndexingExpr() const
Definition DeclSpec.h:530
void ClearStorageClassSpecs()
Definition DeclSpec.h:485
TST getTypeSpecType() const
Definition DeclSpec.h:507
SourceLocation getStorageClassSpecLoc() const
Definition DeclSpec.h:480
SCS getStorageClassSpec() const
Definition DeclSpec.h:471
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclSpec.h:545
SourceRange getSourceRange() const LLVM_READONLY
Definition DeclSpec.h:544
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
Definition DeclSpec.h:586
SourceLocation getExplicitSpecLoc() const
Definition DeclSpec.h:624
SourceLocation getFriendSpecLoc() const
Definition DeclSpec.h:797
ParsedType getRepAsType() const
Definition DeclSpec.h:517
TSCS getThreadStorageClassSpec() const
Definition DeclSpec.h:472
bool isFriendSpecifiedFirst() const
Definition DeclSpec.h:795
ParsedAttributes & getAttributes()
Definition DeclSpec.h:843
SourceLocation getEllipsisLoc() const
Definition DeclSpec.h:593
SourceLocation getConstSpecLoc() const
Definition DeclSpec.h:587
SourceRange getExplicitSpecRange() const
Definition DeclSpec.h:625
Expr * getRepAsExpr() const
Definition DeclSpec.h:525
bool isInlineSpecified() const
Definition DeclSpec.h:607
SourceLocation getRestrictSpecLoc() const
Definition DeclSpec.h:588
TypeSpecifierType TST
Definition DeclSpec.h:247
bool SetTypeQual(TQ T, SourceLocation Loc)
Definition DeclSpec.cpp:991
void ClearConstexprSpec()
Definition DeclSpec.h:811
static const char * getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy)
Turn a type-specifier-type into a string like "_Bool" or "union".
Definition DeclSpec.cpp:532
SourceLocation getThreadStorageClassSpecLoc() const
Definition DeclSpec.h:481
SourceLocation getAtomicSpecLoc() const
Definition DeclSpec.h:590
SourceLocation getVirtualSpecLoc() const
Definition DeclSpec.h:619
SourceLocation getConstexprSpecLoc() const
Definition DeclSpec.h:806
SourceLocation getTypeSpecTypeLoc() const
Definition DeclSpec.h:552
void forEachQualifier(llvm::function_ref< void(TQ, StringRef, SourceLocation)> Handle)
This method calls the passed in handler on each qual being set.
Definition DeclSpec.cpp:427
SourceLocation getInlineSpecLoc() const
Definition DeclSpec.h:610
SourceLocation getUnalignedSpecLoc() const
Definition DeclSpec.h:591
SourceLocation getVolatileSpecLoc() const
Definition DeclSpec.h:589
FriendSpecified isFriendSpecified() const
Definition DeclSpec.h:791
bool hasExplicitSpecifier() const
Definition DeclSpec.h:621
bool hasConstexprSpecifier() const
Definition DeclSpec.h:807
static const TST TST_auto
Definition DeclSpec.h:288
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition Stmt.h:1621
decl_range decls()
Definition Stmt.h:1669
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.h:1647
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
Decl * getPreviousDecl()
Retrieve the previous declaration that declares the same entity as this declaration,...
Definition DeclBase.h:1061
bool isInStdNamespace() const
Definition DeclBase.cpp:449
SourceLocation getEndLoc() const LLVM_READONLY
Definition DeclBase.h:435
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition DeclBase.h:1226
T * getAttr() const
Definition DeclBase.h:573
ASTContext & getASTContext() const LLVM_READONLY
Definition DeclBase.cpp:546
void addAttr(Attr *A)
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:593
virtual bool isOutOfLine() const
Determine whether this declaration is declared out of line (outside its semantic context).
Definition Decl.cpp:99
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
Kind
Lists the kind of concrete classes of Decl.
Definition DeclBase.h:89
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition DeclBase.cpp:590
@ FOK_Undeclared
A friend of a previously-undeclared entity.
Definition DeclBase.h:1219
@ FOK_None
Not a friend object.
Definition DeclBase.h:1217
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition DeclBase.cpp:273
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition DeclBase.h:2793
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
bool isInvalidDecl() const
Definition DeclBase.h:588
unsigned getIdentifierNamespace() const
Definition DeclBase.h:889
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
Definition DeclBase.h:1169
void setAccess(AccessSpecifier AS)
Definition DeclBase.h:502
SourceLocation getLocation() const
Definition DeclBase.h:439
@ IDNS_Ordinary
Ordinary names.
Definition DeclBase.h:144
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
Definition DeclBase.cpp:256
void setLocalOwningModule(Module *M)
Definition DeclBase.h:829
void setImplicit(bool I=true)
Definition DeclBase.h:594
void setReferenced(bool R=true)
Definition DeclBase.h:623
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition DeclBase.cpp:575
DeclContext * getDeclContext()
Definition DeclBase.h:448
AccessSpecifier getAccess() const
Definition DeclBase.h:507
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclBase.h:431
void dropAttr()
Definition DeclBase.h:556
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition DeclBase.h:918
bool hasAttr() const
Definition DeclBase.h:577
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition DeclBase.h:978
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
Definition DeclBase.h:229
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition DeclBase.h:881
DeclarationName getCXXOperatorName(OverloadedOperatorKind Op)
Get the name of the overloadable C++ operator corresponding to Op.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
bool isAnyOperatorNewOrDelete() const
std::string getAsString() const
Retrieve the human-readable string for this name.
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
NameKind getNameKind() const
Determine what kind of name this is.
bool isIdentifier() const
Predicate functions for querying what type of name this is.
Represents a ValueDecl that came out of a declarator.
Definition Decl.h:780
SourceLocation getTypeSpecStartLoc() const
Definition Decl.cpp:1995
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:831
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
Definition Decl.h:855
unsigned getNumTemplateParameterLists() const
Definition Decl.h:862
void setTypeSourceInfo(TypeSourceInfo *TI)
Definition Decl.h:814
TypeSourceInfo * getTypeSourceInfo() const
Definition Decl.h:809
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1874
bool isFunctionDeclarator(unsigned &idx) const
isFunctionDeclarator - This method returns true if the declarator is a function declarator (looking t...
Definition DeclSpec.h:2430
bool isDeclarationOfFunction() const
Determine whether the declaration that will be produced from this declaration will be a function.
Definition DeclSpec.cpp:296
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
Definition DeclSpec.h:2372
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Definition DeclSpec.h:2021
bool isFunctionDeclarationContext() const
Return true if this declaration appears in a context where a function declarator would be a function ...
Definition DeclSpec.h:2484
SourceLocation getIdentifierLoc() const
Definition DeclSpec.h:2310
void SetIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc)
Set the name of this declarator to be the given identifier.
Definition DeclSpec.h:2313
type_object_range type_objects() const
Returns the range of type objects, from the identifier outwards.
Definition DeclSpec.h:2385
bool hasGroupingParens() const
Definition DeclSpec.h:2693
void setInvalidType(bool Val=true)
Definition DeclSpec.h:2687
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
Definition DeclSpec.h:2368
bool isRedeclaration() const
Definition DeclSpec.h:2739
DeclaratorContext getContext() const
Definition DeclSpec.h:2046
const DecompositionDeclarator & getDecompositionDeclarator() const
Definition DeclSpec.h:2042
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclSpec.h:2057
bool isFunctionDefinition() const
Definition DeclSpec.h:2711
UnqualifiedId & getName()
Retrieve the name specified by this declarator.
Definition DeclSpec.h:2040
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
Definition DeclSpec.h:2036
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
The template parameter lists that preceded the declarator.
Definition DeclSpec.h:2623
void setInventedTemplateParameterList(TemplateParameterList *Invented)
Sets the template parameter list generated from the explicit template parameters along with any inven...
Definition DeclSpec.h:2630
bool mayHaveDecompositionDeclarator() const
Return true if the context permits a C++17 decomposition declarator.
Definition DeclSpec.h:2185
bool isInvalidType() const
Definition DeclSpec.h:2688
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
Definition DeclSpec.h:2056
bool isDecompositionDeclarator() const
Return whether this declarator is a decomposition declarator.
Definition DeclSpec.h:2300
bool isStaticMember()
Returns true if this declares a static member.
Definition DeclSpec.cpp:389
DeclSpec & getMutableDeclSpec()
getMutableDeclSpec - Return a non-const version of the DeclSpec.
Definition DeclSpec.h:2028
DeclaratorChunk::FunctionTypeInfo & getFunctionTypeInfo()
getFunctionTypeInfo - Retrieves the function type info object (looking through parentheses).
Definition DeclSpec.h:2461
const IdentifierInfo * getIdentifier() const
Definition DeclSpec.h:2304
A decomposition declaration.
Definition DeclCXX.h:4245
ArrayRef< BindingDecl * > bindings() const
Definition DeclCXX.h:4283
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
Definition DeclSpec.h:1762
ArrayRef< Binding > bindings() const
Definition DeclSpec.h:1802
SourceRange getSourceRange() const
Definition DeclSpec.h:1810
SourceLocation getLSquareLoc() const
Definition DeclSpec.h:1808
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:2572
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:2552
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition TypeLoc.h:2561
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition Diagnostic.h:951
virtual bool TraverseConstructorInitializer(MaybeConst< CXXCtorInitializer > *Init)
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition Decl.cpp:5824
RAII object that enters a new expression evaluation context.
An instance of this object exists for each enum constant that is defined.
Definition Decl.h:3423
Represents an enum.
Definition Decl.h:4007
enumerator_range enumerators() const
Definition Decl.h:4153
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
Definition DeclCXX.h:1924
const Expr * getExpr() const
Definition DeclCXX.h:1933
void setExpr(Expr *E)
Definition DeclCXX.h:1958
void setKind(ExplicitSpecKind Kind)
Definition DeclCXX.h:1957
This represents one expression.
Definition Expr.h:112
static bool isPotentialConstantExpr(const FunctionDecl *FD, SmallVectorImpl< PartialDiagnosticAt > &Diags)
isPotentialConstantExpr - Return true if this function's definition might be usable in a constant exp...
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
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Definition Expr.cpp:3089
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3077
bool containsErrors() const
Whether this expression contains subexpressions which had errors.
Definition Expr.h:246
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3085
bool isPRValue() const
Definition Expr.h:285
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
Definition Expr.h:284
bool EvaluateAsRValue(EvalResult &Result, const ASTContext &Ctx, bool InConstantContext=false) const
EvaluateAsRValue - Return true if this is a constant which we can fold to an rvalue using any crazy t...
bool isTemporaryObject(ASTContext &Ctx, const CXXRecordDecl *TempTy) const
Determine whether the result of this expression is a temporary object of the given class type.
Definition Expr.cpp:3252
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:276
QualType getType() const
Definition Expr.h:144
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3160
bool isMutable() const
Determines whether this field is mutable (C++ only).
Definition Decl.h:3260
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Definition Decl.cpp:4721
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition Decl.h:3340
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
Definition Decl.cpp:4711
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
Definition Decl.h:3334
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Definition Decl.cpp:4731
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition Decl.h:3396
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
Definition Decl.h:3407
bool isUnnamedBitField() const
Determines whether this is an unnamed bitfield.
Definition Decl.h:3266
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
Definition Diagnostic.h:79
static FixItHint CreateInsertionFromRange(SourceLocation InsertionLoc, CharSourceRange FromRange, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code from FromRange at a specific location.
Definition Diagnostic.h:116
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:140
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
Definition Diagnostic.h:129
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Definition Diagnostic.h:103
FriendDecl - Represents the declaration of a friend entity, which can be a function,...
Definition DeclFriend.h:54
static FriendDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, FriendUnion Friend_, SourceLocation FriendL, SourceLocation EllipsisLoc={}, ArrayRef< TemplateParameterList * > FriendTypeTPLists={})
void setUnsupportedFriend(bool Unsupported)
Definition DeclFriend.h:186
static FriendTemplateDecl * Create(ASTContext &Context, DeclContext *DC, SourceLocation Loc, MutableArrayRef< TemplateParameterList * > Params, FriendUnion Friend, SourceLocation FriendLoc)
static DefaultedOrDeletedFunctionInfo * Create(ASTContext &Context, ArrayRef< DeclAccessPair > Lookups, StringLiteral *DeletedMessage=nullptr)
Definition Decl.cpp:3136
Represents a function declaration or definition.
Definition Decl.h:2000
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
Definition Decl.h:2642
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2797
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition Decl.cpp:3275
ExceptionSpecificationType getExceptionSpecType() const
Gets the ExceptionSpecificationType as declared.
Definition Decl.h:2869
bool isTrivialForCall() const
Definition Decl.h:2380
ConstexprSpecKind getConstexprKind() const
Definition Decl.h:2476
DefaultedOrDeletedFunctionInfo * getDefaultedOrDeletedInfo() const
Definition Decl.cpp:3190
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition Decl.cpp:3843
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition Decl.cpp:4189
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
Definition Decl.h:2314
bool isImmediateFunction() const
Definition Decl.cpp:3336
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition Decl.cpp:3156
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
Definition Decl.cpp:4020
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition Decl.cpp:3547
bool hasCXXExplicitFunctionObjectParameter() const
Definition Decl.cpp:3861
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition Decl.h:2921
SourceLocation getDefaultLoc() const
Definition Decl.h:2398
QualType getReturnType() const
Definition Decl.h:2845
ArrayRef< ParmVarDecl * > parameters() const
Definition Decl.h:2774
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
Definition Decl.h:2389
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition Decl.h:2377
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition Decl.cpp:4309
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
Definition Decl.h:2782
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:3743
param_iterator param_begin()
Definition Decl.h:2786
const ParmVarDecl * getNonObjectParameter(unsigned I) const
Definition Decl.h:2823
bool isVariadic() const
Whether this function is variadic.
Definition Decl.cpp:3129
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Definition Decl.h:2326
bool isDeleted() const
Whether this function has been deleted.
Definition Decl.h:2540
void setBodyContainsImmediateEscalatingExpressions(bool Set)
Definition Decl.h:2486
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition Decl.cpp:4325
FunctionEffectsRef getFunctionEffects() const
Definition Decl.h:3134
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
Definition Decl.cpp:4253
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:2888
void setTrivial(bool IT)
Definition Decl.h:2378
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition Decl.cpp:4140
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
Definition Decl.h:2470
static constexpr unsigned RequiredTypeAwareNewParameterCount
Count of mandatory parameters for type aware operator new.
Definition Decl.h:2638
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
Definition Decl.h:2353
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Definition Decl.cpp:3614
FunctionDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
bool isImmediateEscalating() const
Definition Decl.cpp:3307
void setIsDestroyingOperatorDelete(bool IsDestroyingDelete)
Definition Decl.cpp:3551
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
Definition Decl.cpp:3555
void setIsTypeAwareOperatorNewOrDelete(bool IsTypeAwareOperator=true)
Definition Decl.cpp:3559
bool isDefaulted() const
Whether this function is defaulted.
Definition Decl.h:2385
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:2933
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition Decl.cpp:4126
void setConstexprKind(ConstexprSpecKind CSK)
Definition Decl.h:2473
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition Decl.cpp:4413
void setDefaulted(bool D=true)
Definition Decl.h:2386
bool isConsteval() const
Definition Decl.h:2482
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
Definition Decl.h:2410
QualType getDeclaredReturnType() const
Get the declared return type, which may differ from the actual return type if the return type is dedu...
Definition Decl.h:2862
void setBody(Stmt *B)
Definition Decl.cpp:3287
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
Definition Decl.h:2344
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
Definition Decl.cpp:3875
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3822
size_t param_size() const
Definition Decl.h:2790
DeclarationNameInfo getNameInfo() const
Definition Decl.h:2211
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
Definition Decl.cpp:3195
bool isDefined(const FunctionDecl *&Definition, bool CheckForPendingFriendDefinition=false) const
Returns true if the function has a definition that does not need to be instantiated.
Definition Decl.cpp:3242
FunctionDecl * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition Decl.h:2805
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Definition Decl.h:2685
A mutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5205
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
Definition Type.cpp:5584
SmallVector< Conflict > Conflicts
Definition TypeBase.h:5237
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition TypeBase.h:5069
static FunctionParmPackExpr * Create(const ASTContext &Context, QualType T, ValueDecl *ParamPack, SourceLocation NameLoc, ArrayRef< ValueDecl * > Params)
Definition ExprCXX.cpp:1816
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5269
ExtParameterInfo getExtParameterInfo(unsigned I) const
Definition TypeBase.h:5773
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Definition TypeBase.h:5576
unsigned getNumParams() const
Definition TypeBase.h:5547
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
Definition TypeBase.h:5689
const QualType * param_type_iterator
Definition TypeBase.h:5707
QualType getParamType(unsigned i) const
Definition TypeBase.h:5549
bool isVariadic() const
Whether this function prototype is variadic.
Definition TypeBase.h:5673
ExtProtoInfo getExtProtoInfo() const
Definition TypeBase.h:5558
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
Definition TypeBase.h:5634
ArrayRef< QualType > getParamTypes() const
Definition TypeBase.h:5554
ArrayRef< QualType > exceptions() const
Definition TypeBase.h:5723
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Definition TypeBase.h:5738
Declaration of a template function.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Wrapper for source info for functions.
Definition TypeLoc.h:1615
unsigned getNumParams() const
Definition TypeLoc.h:1687
ParmVarDecl * getParam(unsigned i) const
Definition TypeLoc.h:1693
void setParam(unsigned i, ParmVarDecl *VD)
Definition TypeLoc.h:1694
TypeLoc getReturnLoc() const
Definition TypeLoc.h:1696
ExtInfo withCallingConv(CallingConv cc) const
Definition TypeBase.h:4688
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4465
CallingConv getCallConv() const
Definition TypeBase.h:4820
QualType getReturnType() const
Definition TypeBase.h:4805
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
ReservedLiteralSuffixIdStatus isReservedLiteralSuffixId() const
Determine whether this is a name reserved for future standardization or the implementation (C++ [usrl...
StringRef getName() const
Return the actual identifier string.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
IfStmt - This represents an if/then/else.
Definition Stmt.h:2249
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
Definition Expr.h:1731
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition Expr.cpp:2072
Represents an implicitly-generated value initialization of an object of a given type.
Definition Expr.h:5991
Represents a field injected from an anonymous union/struct into the parent scope.
Definition Decl.h:3467
ArrayRef< NamedDecl * > chain() const
Definition Decl.h:3488
void setInherited(bool I)
Definition Attr.h:157
Description of a constructor that was inherited from a base class.
Definition DeclCXX.h:2575
ConstructorUsingShadowDecl * getShadowDecl() const
Definition DeclCXX.h:2587
const TypeClass * getTypePtr() const
Definition TypeLoc.h:526
Describes an C or C++ initializer list.
Definition Expr.h:5233
unsigned getNumInits() const
Definition Expr.h:5263
const Expr * getInit(unsigned Init) const
Definition Expr.h:5287
child_range children()
Definition Expr.h:5432
Describes the kind of initialization being performed, along with location information for tokens rela...
static InitializationKind CreateDefault(SourceLocation InitLoc)
Create a default initialization.
static InitializationKind CreateDirect(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc)
Create a direct initialization.
static InitializationKind CreateCopy(SourceLocation InitLoc, SourceLocation EqualLoc, bool AllowExplicitConvs=false)
Create a copy initialization.
static InitializationKind CreateDirectList(SourceLocation InitLoc)
Describes the sequence of initializations required to initialize a given object or reference with a s...
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 InitializeBase(ASTContext &Context, const CXXBaseSpecifier *Base, bool IsInheritedVirtualBase, const InitializedEntity *Parent=nullptr)
Create the initialization entity for a base class subobject.
static InitializedEntity InitializeMember(FieldDecl *Member, const InitializedEntity *Parent=nullptr, bool Implicit=false)
Create the initialization entity for a member subobject.
static InitializedEntity InitializeBinding(VarDecl *Binding)
Create the initialization entity for a structured binding.
static InitializedEntity InitializeMemberFromDefaultMemberInitializer(FieldDecl *Member)
Create the initialization entity for a default member initializer.
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 InitializedEntity InitializeDelegation(QualType Type)
Create the initialization entity for a delegated constructor.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Definition Expr.cpp:974
An lvalue reference type, per C++11 [dcl.ref].
Definition TypeBase.h:3618
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
Definition ExprCXX.cpp:1358
capture_range captures() const
Retrieve this lambda's captures.
Definition ExprCXX.cpp:1371
@ Default
Use default layout rules of the target.
static StringRef getSourceText(CharSourceRange Range, const SourceManager &SM, const LangOptions &LangOpts, bool *Invalid=nullptr)
Returns a string for the source that the range encompasses.
Definition Lexer.cpp:1020
Represents a linkage specification.
Definition DeclCXX.h:3011
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
Definition DeclCXX.cpp:3253
void setRBraceLoc(SourceLocation L)
Definition DeclCXX.h:3053
A class for iterating through a result set and possibly filtering out results.
Definition Lookup.h:677
void erase()
Erase the last element returned from this iterator.
Definition Lookup.h:723
Represents the results of name lookup.
Definition Lookup.h:147
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
Definition Lookup.h:607
void setBaseObjectType(QualType T)
Sets the base object type for this lookup.
Definition Lookup.h:469
DeclClass * getAsSingle() const
Definition Lookup.h:558
void addDecl(NamedDecl *D)
Add a declaration to these results with its natural access.
Definition Lookup.h:475
void setLookupName(DeclarationName Name)
Sets the name to look up.
Definition Lookup.h:270
bool empty() const
Return true if no decls were found.
Definition Lookup.h:362
void resolveKind()
Resolves the result kind of the lookup, possibly hiding decls.
SourceLocation getNameLoc() const
Gets the location of the identifier.
Definition Lookup.h:666
Filter makeFilter()
Create a filter for this result set.
Definition Lookup.h:751
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
Definition Lookup.h:569
void setHideTags(bool Hide)
Sets whether tag declarations should be hidden by non-tag declarations during resolution.
Definition Lookup.h:311
bool isAmbiguous() const
Definition Lookup.h:324
NamedDecl * getAcceptableDecl(NamedDecl *D) const
Retrieve the accepted (re)declaration of the given declaration, if there is one.
Definition Lookup.h:408
bool isSingleResult() const
Determines if this names a single result which is not an unresolved value using decl.
Definition Lookup.h:331
Sema::LookupNameKind getLookupKind() const
Gets the kind of lookup to perform.
Definition Lookup.h:275
UnresolvedSetImpl::iterator iterator
Definition Lookup.h:154
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
Definition Lookup.h:576
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
Definition Lookup.h:636
iterator end() const
Definition Lookup.h:359
static bool isVisible(Sema &SemaRef, NamedDecl *D)
Determine whether the given declaration is visible to the program.
iterator begin() const
Definition Lookup.h:358
const DeclarationNameInfo & getLookupNameInfo() const
Gets the name info to look up.
Definition Lookup.h:255
An instance of this class represents the declaration of a property member.
Definition DeclCXX.h:4340
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
Definition DeclCXX.cpp:3722
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3298
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition Expr.h:3381
Expr * getBase() const
Definition Expr.h:3375
SourceLocation getExprLoc() const LLVM_READONLY
Definition Expr.h:3493
Wrapper for source info for member pointers.
Definition TypeLoc.h:1515
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3654
Describes a module or submodule.
Definition Module.h:144
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition Module.h:732
bool isExplicitGlobalModule() const
Definition Module.h:242
This represents a decl that may have a name.
Definition Decl.h:274
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Definition Decl.h:487
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:295
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition Decl.cpp:1095
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:340
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
Definition DeclBase.h:706
Represents a C++ namespace alias.
Definition DeclCXX.h:3197
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamespaceBaseDecl *Namespace)
Definition DeclCXX.cpp:3354
Represents C++ namespaces and their aliases.
Definition Decl.h:573
NamespaceDecl * getNamespace()
Definition DeclCXX.cpp:3291
Represent a C++ namespace.
Definition Decl.h:592
bool isInline() const
Returns true if this is an inline namespace declaration.
Definition Decl.h:648
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
Definition DeclCXX.cpp:3314
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
Definition Decl.h:675
void setRBraceLoc(SourceLocation L)
Definition Decl.h:694
Class that aids in the construction of nested-name-specifiers along with source-location information ...
void MakeTrivial(ASTContext &Context, NestedNameSpecifier Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
A C++ nested-name-specifier augmented with source location information.
SourceRange getSourceRange() const LLVM_READONLY
Retrieve the source range covering the entirety of this nested-name-specifier.
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
NestedNameSpecifier getCanonical() const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
bool containsUnexpandedParameterPack() const
Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic template...
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
@ Global
The global specifier '::'. There is no stored value.
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
The basic abstraction for the target Objective-C runtime.
Definition ObjCRuntime.h:28
bool isFragile() const
The inverse of isNonFragile(): does this runtime follow the set of implied behaviors for a "fragile" ...
Definition ObjCRuntime.h:97
PtrTy get() const
Definition Ownership.h:81
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition Expr.h:1178
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition Overload.h:1159
@ CSK_Normal
Normal lookup.
Definition Overload.h:1163
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
Definition Overload.h:1170
SmallVectorImpl< OverloadCandidate >::iterator iterator
Definition Overload.h:1375
MapType::iterator iterator
MapType::const_iterator const_iterator
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Definition Attr.h:273
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
Definition Expr.cpp:4853
Represents a parameter to a function.
Definition Decl.h:1790
void setDefaultArg(Expr *defarg)
Definition Decl.cpp:3018
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
Definition Decl.h:1931
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
Definition Decl.h:1919
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
Definition Decl.cpp:3023
void setUninstantiatedDefaultArg(Expr *arg)
Definition Decl.cpp:3043
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition Decl.h:1823
bool hasUninstantiatedDefaultArg() const
Definition Decl.h:1923
bool hasInheritedDefaultArg() const
Definition Decl.h:1935
static ParmVarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S, Expr *DefArg)
Definition Decl.cpp:2953
Expr * getUninstantiatedDefaultArg()
Definition Decl.cpp:3048
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
Definition Decl.cpp:3054
void setHasInheritedDefaultArg(bool I=true)
Definition Decl.h:1939
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2976
ParsedAttr - Represents a syntactic attribute.
Definition ParsedAttr.h:119
IdentifierInfo * getPropertyDataSetter() const
Definition ParsedAttr.h:470
IdentifierInfo * getPropertyDataGetter() const
Definition ParsedAttr.h:464
static const ParsedAttributesView & none()
Definition ParsedAttr.h:817
const ParsedAttr * getMSPropertyAttr() const
Definition ParsedAttr.h:903
bool hasAttribute(ParsedAttr::Kind K) const
Definition ParsedAttr.h:897
bool isAddressDiscriminated() const
Definition TypeBase.h:265
Wrapper for source info for pointers.
Definition TypeLoc.h:1484
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3329
QualType getPointeeType() const
Definition TypeBase.h:3339
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
IdentifierTable & getIdentifierTable()
ArrayRef< Expr * > semantics()
Definition Expr.h:6762
A (possibly-)qualified type.
Definition TypeBase.h:937
bool hasAddressDiscriminatedPointerAuth() const
Definition TypeBase.h:1457
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8377
bool hasQualifiers() const
Determine whether this type has any qualifiers.
Definition TypeBase.h:8382
PointerAuthQualifier getPointerAuth() const
Definition TypeBase.h:1453
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
Definition TypeBase.h:1225
void addConst()
Add the const type qualifier to this QualType.
Definition TypeBase.h:1156
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1004
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8293
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8333
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition TypeBase.h:1438
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:8478
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8387
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
Definition TypeBase.h:1089
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8366
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
Definition TypeBase.h:8339
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Definition TypeBase.h:1332
bool hasNonTrivialObjCLifetime() const
Definition TypeBase.h:1442
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
Definition Type.cpp:2694
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Definition TypeBase.h:8458
Represents a template name as written in source code.
The collection of all-type qualifiers we support.
Definition TypeBase.h:331
void removeCVRQualifiers(unsigned mask)
Definition TypeBase.h:495
void addAddressSpace(LangAS space)
Definition TypeBase.h:597
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
Definition TypeBase.h:361
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Definition TypeBase.h:364
void removeAddressSpace()
Definition TypeBase.h:596
void removeVolatile()
Definition TypeBase.h:469
LangAS getAddressSpace() const
Definition TypeBase.h:571
void setObjCLifetime(ObjCLifetime type)
Definition TypeBase.h:548
An rvalue reference type, per C++11 [dcl.ref].
Definition TypeBase.h:3636
Represents a struct/union/class.
Definition Decl.h:4321
bool hasFlexibleArrayMember() const
Definition Decl.h:4354
bool hasObjectMember() const
Definition Decl.h:4381
field_iterator field_end() const
Definition Decl.h:4527
field_range fields() const
Definition Decl.h:4524
specific_decl_iterator< FieldDecl > field_iterator
Definition Decl.h:4521
RecordDecl * getDefinitionOrSelf() const
Definition Decl.h:4509
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Definition Decl.h:4373
bool field_empty() const
Definition Decl.h:4532
field_iterator field_begin() const
Definition Decl.cpp:5209
RedeclarableTemplateDecl * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Definition Decl.h:5326
Base for LValueReferenceType and RValueReferenceType.
Definition TypeBase.h:3574
QualType getPointeeType() const
Definition TypeBase.h:3592
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
void setEntity(DeclContext *E)
Definition Scope.h:409
const Scope * getFnParent() const
getFnParent - Return the closest scope that is a function body.
Definition Scope.h:291
void AddDecl(Decl *D)
Definition Scope.h:362
unsigned getFlags() const
getFlags - Return the flags for this scope.
Definition Scope.h:271
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
Definition Scope.h:398
void RemoveDecl(Decl *D)
Definition Scope.h:370
DeclContext * getEntity() const
Get the entity corresponding to this scope.
Definition Scope.h:401
Scope * getDeclParent()
Definition Scope.h:335
const Scope * getParent() const
getParent - Return the scope that this is nested in.
Definition Scope.h:287
@ DeclScope
This is a scope that can contain a declaration.
Definition Scope.h:63
void PushUsingDirective(UsingDirectiveDecl *UDir)
Definition Scope.h:643
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
Sema & SemaRef
Definition SemaBase.h:40
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
Definition SemaBase.cpp:90
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
A RAII object to enter scope of a compound statement.
Definition Sema.h:1290
A RAII object to temporarily push a declaration context.
Definition Sema.h:3467
For a defaulted function, the kind of defaulted function that it is.
Definition Sema.h:6343
DefaultedComparisonKind asComparison() const
Definition Sema.h:6375
CXXSpecialMemberKind asSpecialMember() const
Definition Sema.h:6372
Helper class that collects exception specifications for implicitly-declared special member functions.
Definition Sema.h:5441
void CalledStmt(Stmt *S)
Integrate an invoked statement into the collected data.
void CalledExpr(Expr *E)
Integrate an invoked expression into the collected data.
Definition Sema.h:5483
void CalledDecl(SourceLocation CallLoc, const CXXMethodDecl *Method)
Integrate another called method into the collected data.
SpecialMemberOverloadResult - The overloading result for a special member function.
Definition Sema.h:9277
CXXMethodDecl * getMethod() const
Definition Sema.h:9289
RAII object to handle the state changes required to synthesize a function body.
Definition Sema.h:13501
Abstract base class used for diagnosing integer constant expression violations.
Definition Sema.h:7703
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:854
void DefineImplicitLambdaToFunctionPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a function pointer.
QualType SubstAutoType(QualType TypeWithAuto, QualType Replacement)
Substitute Replacement for auto in TypeWithAuto.
CXXConstructorDecl * DeclareImplicitDefaultConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit default constructor for the given class.
bool MergeCXXFunctionDecl(FunctionDecl *New, FunctionDecl *Old, Scope *S)
MergeCXXFunctionDecl - Merge two declarations of the same C++ function, once we already know that the...
Attr * getImplicitCodeSegOrSectionAttrForFunction(const FunctionDecl *FD, bool IsDefinition)
Returns an implicit CodeSegAttr if a __declspec(code_seg) is found on a containing class.
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool CheckSpecifiedExceptionType(QualType &T, SourceRange Range)
CheckSpecifiedExceptionType - Check if the given type is valid in an exception specification.
ExprResult BuildBlockForLambdaConversion(SourceLocation CurrentLocation, SourceLocation ConvLocation, CXXConversionDecl *Conv, Expr *Src)
LocalInstantiationScope * CurrentInstantiationScope
The current instantiation scope used to store local variables.
Definition Sema.h:13030
Decl * ActOnAliasDeclaration(Scope *CurScope, AccessSpecifier AS, MultiTemplateParamsArg TemplateParams, SourceLocation UsingLoc, UnqualifiedId &Name, const ParsedAttributesView &AttrList, TypeResult Type, Decl *DeclFromDeclSpec)
TemplateArgumentLoc getTrivialTemplateArgumentLoc(const TemplateArgument &Arg, QualType NTTPType, SourceLocation Loc, NamedDecl *TemplateParam=nullptr)
Allocate a TemplateArgumentLoc where all locations have been initialized to the given location.
NamedDecl * ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope)
void DiagnoseAbstractType(const CXXRecordDecl *RD)
void HideUsingShadowDecl(Scope *S, UsingShadowDecl *Shadow)
Hides a using shadow declaration.
bool CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename, const CXXScopeSpec &SS, const DeclarationNameInfo &NameInfo, SourceLocation NameLoc, const LookupResult *R=nullptr, const UsingDecl *UD=nullptr)
Checks that the given nested-name qualifier used in a using decl in the current context is appropriat...
bool CheckExplicitObjectOverride(CXXMethodDecl *New, const CXXMethodDecl *Old)
llvm::SmallPtrSet< SpecialMemberDecl, 4 > SpecialMembersBeingDeclared
The C++ special members which we are currently in the process of declaring.
Definition Sema.h:6532
void ActOnParamUnparsedDefaultArgument(Decl *param, SourceLocation EqualLoc, SourceLocation ArgLoc)
ActOnParamUnparsedDefaultArgument - We've seen a default argument for a function parameter,...
DefaultedFunctionKind getDefaultedFunctionKind(const FunctionDecl *FD)
Determine the kind of defaulting that would be done for a given function.
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)
bool isDeclInScope(NamedDecl *D, DeclContext *Ctx, Scope *S=nullptr, bool AllowInlineNamespace=false) const
isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true if 'D' is in Scope 'S',...
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
void BuildBasePathArray(const CXXBasePaths &Paths, CXXCastPath &BasePath)
void MergeVarDeclExceptionSpecs(VarDecl *New, VarDecl *Old)
Merge the exception specifications of two variable declarations.
CXXSpecialMemberKind getSpecialMember(const CXXMethodDecl *MD)
Definition Sema.h:6294
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9319
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition Sema.h:9346
@ LookupLocalFriendName
Look up a friend of a local class.
Definition Sema.h:9354
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition Sema.h:9342
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition Sema.h:9327
void DiagnoseSentinelCalls(const NamedDecl *D, SourceLocation Loc, ArrayRef< Expr * > Args)
DiagnoseSentinelCalls - This routine checks whether a call or message-send is to a declaration with t...
Definition SemaExpr.cpp:411
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
Decl * BuildStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc, bool Failed)
void EvaluateImplicitExceptionSpec(SourceLocation Loc, FunctionDecl *FD)
Evaluate the implicit exception specification for a defaulted special member function.
void PrintContextStack(InstantiationContextDiagFuncRef DiagFunc)
Definition Sema.h:13623
ExplicitSpecifier ActOnExplicitBoolSpecifier(Expr *E)
ActOnExplicitBoolSpecifier - Build an ExplicitSpecifier from an expression found in an explicit(bool)...
bool DiagRedefinedPlaceholderFieldDecl(SourceLocation Loc, RecordDecl *ClassDecl, const IdentifierInfo *Name)
void ActOnFinishCXXNonNestedClass()
MemInitResult BuildBaseInitializer(QualType BaseType, TypeSourceInfo *BaseTInfo, Expr *Init, CXXRecordDecl *ClassDecl, SourceLocation EllipsisLoc)
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, ImplicitDeallocationParameters, bool Diagnose=true)
void ForceDeclarationOfImplicitMembers(CXXRecordDecl *Class)
Force the declaration of any implicitly-declared members of this class.
void ActOnParamDefaultArgumentError(Decl *param, SourceLocation EqualLoc, Expr *DefaultArg)
ActOnParamDefaultArgumentError - Parsing or semantic analysis of the default argument for the paramet...
bool diagnoseQualifiedDeclaration(CXXScopeSpec &SS, DeclContext *DC, DeclarationName Name, SourceLocation Loc, TemplateIdAnnotation *TemplateId, bool IsMemberSpecialization)
Diagnose a declaration whose declarator-id has the given nested-name-specifier.
void DiagnoseStaticAssertDetails(const Expr *E)
Try to print more useful information about a failed static_assert with expression \E.
void DefineImplicitMoveAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared move assignment operator.
void ActOnFinishDelayedMemberInitializers(Decl *Record)
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr, bool ForFoldExpression=false)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
SemaOpenMP & OpenMP()
Definition Sema.h:1501
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition Sema.h:6269
void CheckExplicitObjectMemberFunction(Declarator &D, DeclarationName Name, QualType R, bool IsLambda, DeclContext *DC=nullptr)
bool DiagnoseClassNameShadow(DeclContext *DC, DeclarationNameInfo Info)
DiagnoseClassNameShadow - Implement C++ [class.mem]p13: If T is the name of a class,...
AccessResult CheckFriendAccess(NamedDecl *D)
Checks access to the target of a friend declaration.
void MarkBaseAndMemberDestructorsReferenced(SourceLocation Loc, CXXRecordDecl *Record)
MarkBaseAndMemberDestructorsReferenced - Given a record decl, mark all the non-trivial destructors of...
const TranslationUnitKind TUKind
The kind of translation unit we are processing.
Definition Sema.h:1241
QualType tryBuildStdTypeIdentity(QualType Type, SourceLocation Loc)
Looks for the std::type_identity template and instantiates it with Type, or returns a null type if ty...
DeclResult ActOnCXXConditionDeclaration(Scope *S, Declarator &D)
ActOnCXXConditionDeclarationExpr - Parsed a condition declaration of a C++ if/switch/while/for statem...
void LookupOverloadedBinOp(OverloadCandidateSet &CandidateSet, OverloadedOperatorKind Op, const UnresolvedSetImpl &Fns, ArrayRef< Expr * > Args, bool RequiresADL=true)
Perform lookup for an overloaded binary operator.
DelegatingCtorDeclsType DelegatingCtorDecls
All the delegating constructors seen so far in the file, used for cycle detection at the end of the T...
Definition Sema.h:6505
bool ActOnAccessSpecifier(AccessSpecifier Access, SourceLocation ASLoc, SourceLocation ColonLoc, const ParsedAttributesView &Attrs)
ActOnAccessSpecifier - Parsed an access specifier followed by a colon.
std::unique_ptr< CXXFieldCollector > FieldCollector
FieldCollector - Collects CXXFieldDecls during parsing of C++ classes.
Definition Sema.h:6486
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
SemaCUDA & CUDA()
Definition Sema.h:1441
TemplateDecl * AdjustDeclIfTemplate(Decl *&Decl)
AdjustDeclIfTemplate - If the given decl happens to be a template, reset the parameter D to reference...
bool isImplicitlyDeleted(FunctionDecl *FD)
Determine whether the given function is an implicitly-deleted special member function.
void CheckImplicitSpecialMemberDeclaration(Scope *S, FunctionDecl *FD)
Check a completed declaration of an implicit special member.
void PushExpressionEvaluationContext(ExpressionEvaluationContext NewContext, Decl *LambdaContextDecl=nullptr, ExpressionEvaluationContextRecord::ExpressionKind Type=ExpressionEvaluationContextRecord::EK_Other)
bool CompleteConstructorCall(CXXConstructorDecl *Constructor, QualType DeclInitType, MultiExprArg ArgsPtr, SourceLocation Loc, SmallVectorImpl< Expr * > &ConvertedArgs, bool AllowExplicit=false, bool IsListInitialization=false)
Given a constructor and the set of arguments provided for the constructor, convert the arguments and ...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
Definition Sema.h:7824
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool TemplateParameterListsAreEqual(const TemplateCompareNewDeclInfo &NewInstFrom, TemplateParameterList *New, const NamedDecl *OldInstFrom, TemplateParameterList *Old, bool Complain, TemplateParameterListEqualKind Kind, SourceLocation TemplateArgLoc=SourceLocation())
Determine whether the given template parameter lists are equivalent.
Decl * ActOnNamespaceAliasDef(Scope *CurScope, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *Ident)
void CheckOverrideControl(NamedDecl *D)
CheckOverrideControl - Check C++11 override control semantics.
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
bool ShouldDeleteSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, InheritedConstructorInfo *ICI=nullptr, bool Diagnose=false)
Determine if a special member function should have a deleted definition when it is defaulted.
@ AR_dependent
Definition Sema.h:1656
@ AR_accessible
Definition Sema.h:1654
@ AR_inaccessible
Definition Sema.h:1655
@ AR_delayed
Definition Sema.h:1657
PoppedFunctionScopePtr PopFunctionScopeInfo(const sema::AnalysisBasedWarnings::Policy *WP=nullptr, const Decl *D=nullptr, QualType BlockType=QualType())
Pop a function (or block or lambda or captured region) scope from the stack.
Definition Sema.cpp:2443
DeclResult ActOnTemplatedFriendTag(Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, SourceLocation EllipsisLoc, const ParsedAttributesView &Attr, MultiTemplateParamsArg TempParamLists)
Handle a friend tag declaration where the scope specifier was templated.
Scope * getScopeForContext(DeclContext *Ctx)
Determines the active Scope associated with the given declaration context.
Definition Sema.cpp:2312
CXXConstructorDecl * DeclareImplicitMoveConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit move constructor for the given class.
bool ProcessAccessDeclAttributeList(AccessSpecDecl *ASDecl, const ParsedAttributesView &AttrList)
Annotation attributes are the only attributes allowed after an access specifier.
FunctionDecl * InstantiateFunctionDeclaration(FunctionTemplateDecl *FTD, const TemplateArgumentList *Args, SourceLocation Loc, CodeSynthesisContext::SynthesisKind CSC=CodeSynthesisContext::ExplicitTemplateArgumentSubstitution)
Instantiate (or find existing instantiation of) a function template with a given set of template argu...
void SetFunctionBodyKind(Decl *D, SourceLocation Loc, FnBodyKind BodyKind, StringLiteral *DeletedMessage=nullptr)
void referenceDLLExportedClassMethods()
void CheckCompleteDestructorVariant(SourceLocation CurrentLocation, CXXDestructorDecl *Dtor)
Do semantic checks to allow the complete destructor variant to be emitted when the destructor is defi...
NamedDecl * ActOnCXXMemberDeclarator(Scope *S, AccessSpecifier AS, Declarator &D, MultiTemplateParamsArg TemplateParameterLists, Expr *BitfieldWidth, const VirtSpecifiers &VS, InClassInitStyle InitStyle)
ActOnCXXMemberDeclarator - This is invoked when a C++ class member declarator is parsed.
bool CheckIfOverriddenFunctionIsMarkedFinal(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckIfOverriddenFunctionIsMarkedFinal - Checks whether a virtual member function overrides a virtual...
NamedDecl * HandleDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParameterLists)
bool CheckOverridingFunctionAttributes(CXXMethodDecl *New, const CXXMethodDecl *Old)
TemplateParameterList * MatchTemplateParametersToScopeSpecifier(SourceLocation DeclStartLoc, SourceLocation DeclLoc, const CXXScopeSpec &SS, TemplateIdAnnotation *TemplateId, ArrayRef< TemplateParameterList * > ParamLists, bool IsFriend, bool &IsMemberSpecialization, bool &Invalid, bool SuppressDiagnostic=false)
Match the given template parameter lists to the given scope specifier, returning the template paramet...
void handleTagNumbering(const TagDecl *Tag, Scope *TagScope)
void AddImplicitlyDeclaredMembersToClass(CXXRecordDecl *ClassDecl)
AddImplicitlyDeclaredMembersToClass - Adds any implicitly-declared special functions,...
bool tryResolveExplicitSpecifier(ExplicitSpecifier &ExplicitSpec)
tryResolveExplicitSpecifier - Attempt to resolve the explict specifier.
Decl * ActOnConversionDeclarator(CXXConversionDecl *Conversion)
ActOnConversionDeclarator - Called by ActOnDeclarator to complete the declaration of the given C++ co...
bool IsCXXTriviallyRelocatableType(QualType T)
Determines if a type is trivially relocatable according to the C++26 rules.
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
Definition Sema.h:4130
@ Default
= default ;
Definition Sema.h:4132
@ Delete
deleted-function-body
Definition Sema.h:4138
QualType BuildStdInitializerList(QualType Element, SourceLocation Loc)
Looks for the std::initializer_list template and instantiates it with Element, or emits an error if i...
MemInitResult BuildMemberInitializer(ValueDecl *Member, Expr *Init, SourceLocation IdLoc)
StmtResult ActOnExprStmt(ExprResult Arg, bool DiscardedValue=true)
Definition SemaStmt.cpp:48
FieldDecl * HandleField(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS)
HandleField - Analyze a field of a C struct or a C++ data member.
FPOptionsOverride CurFPFeatureOverrides()
Definition Sema.h:2045
void DiagnoseHiddenVirtualMethods(CXXMethodDecl *MD)
Diagnose methods which overload virtual methods in a base class without overriding any.
UsingShadowDecl * BuildUsingShadowDecl(Scope *S, BaseUsingDecl *BUD, NamedDecl *Target, UsingShadowDecl *PrevDecl)
Builds a shadow declaration corresponding to a 'using' declaration.
ExprResult BuildCallToMemberFunction(Scope *S, Expr *MemExpr, SourceLocation LParenLoc, MultiExprArg Args, SourceLocation RParenLoc, Expr *ExecConfig=nullptr, bool IsExecConfig=false, bool AllowRecovery=false)
BuildCallToMemberFunction - Build a call to a member function.
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
NamedDecl * LookupSingleName(Scope *S, DeclarationName Name, SourceLocation Loc, LookupNameKind NameKind, RedeclarationKind Redecl=RedeclarationKind::NotForRedeclaration)
Look up a name, looking for a single declaration.
bool isMemberAccessibleForDeletion(CXXRecordDecl *NamingClass, DeclAccessPair Found, QualType ObjectType, SourceLocation Loc, const PartialDiagnostic &Diag)
Is the given member accessible for the purposes of deciding whether to define a special member functi...
BaseResult ActOnBaseSpecifier(Decl *classdecl, SourceRange SpecifierRange, const ParsedAttributesView &Attrs, bool Virtual, AccessSpecifier Access, ParsedType basetype, SourceLocation BaseLoc, SourceLocation EllipsisLoc)
ActOnBaseSpecifier - Parsed a base specifier.
void ActOnFinishFunctionDeclarationDeclarator(Declarator &D)
Called after parsing a function declarator belonging to a function declaration.
void ActOnParamDefaultArgument(Decl *param, SourceLocation EqualLoc, Expr *defarg)
ActOnParamDefaultArgument - Check whether the default argument provided for a function parameter is w...
void CheckConversionDeclarator(Declarator &D, QualType &R, StorageClass &SC)
CheckConversionDeclarator - Called by ActOnDeclarator to check the well-formednes of the conversion f...
bool DeduceReturnType(FunctionDecl *FD, SourceLocation Loc, bool Diagnose=true)
ASTContext & Context
Definition Sema.h:1283
void ActOnFinishDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnFinishDelayedCXXMethodDeclaration - We have finished processing the delayed method declaration f...
DeclarationNameInfo GetNameForDeclarator(Declarator &D)
GetNameForDeclarator - Determine the full declaration name for the given Declarator.
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:922
void DiagnoseTypeTraitDetails(const Expr *E)
If E represents a built-in type trait, or a known standard type trait, try to print more information ...
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument, const Decl **MalformedDecl=nullptr)
Tests whether Ty is an instance of std::type_identity and, if it is and TypeArgument is not NULL,...
SemaObjC & ObjC()
Definition Sema.h:1486
void propagateDLLAttrToBaseClassTemplate(CXXRecordDecl *Class, Attr *ClassAttr, ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc)
Perform propagation of DLL attributes from a derived class to a templated base class for MS compatibi...
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TrivialABIHandling::IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
void CheckDelayedMemberExceptionSpecs()
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ASTContext & getASTContext() const
Definition Sema.h:925
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
Definition Sema.h:6512
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
void CheckExplicitlyDefaultedFunction(Scope *S, FunctionDecl *MD)
bool isCurrentClassName(const IdentifierInfo &II, Scope *S, const CXXScopeSpec *SS=nullptr)
isCurrentClassName - Determine whether the identifier II is the name of the class type currently bein...
void MarkVariableReferenced(SourceLocation Loc, VarDecl *Var)
Mark a variable referenced, and check whether it is odr-used (C++ [basic.def.odr]p2,...
void checkExceptionSpecification(bool IsTopLevel, ExceptionSpecificationType EST, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr, SmallVectorImpl< QualType > &Exceptions, FunctionProtoType::ExceptionSpecInfo &ESI)
Check the given exception-specification and update the exception specification information with the r...
SmallVector< std::pair< FunctionDecl *, FunctionDecl * >, 2 > DelayedEquivalentExceptionSpecChecks
All the function redeclarations seen during a class definition that had their exception spec checks d...
Definition Sema.h:6596
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void PopExpressionEvaluationContext()
NamespaceDecl * getOrCreateStdNamespace()
Retrieve the special "std" namespace, which may require us to implicitly define the namespace.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition Sema.cpp:756
bool isInitListConstructor(const FunctionDecl *Ctor)
Determine whether Ctor is an initializer-list constructor, as defined in [dcl.init....
void ActOnStartFunctionDeclarationDeclarator(Declarator &D, unsigned TemplateParameterDepth)
Called before parsing a function declarator belonging to a function declaration.
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths)
Builds a string representing ambiguous paths from a specific derived class to different subobjects of...
DefaultedComparisonKind
Kinds of defaulted comparison operator functions.
Definition Sema.h:6064
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
Definition Sema.h:6078
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
Definition Sema.h:6075
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
Definition Sema.h:6072
@ None
This is not a defaultable comparison operator.
Definition Sema.h:6066
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
Definition Sema.h:6069
OverloadKind CheckOverload(Scope *S, FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool UseMemberUsingDeclRules)
Determine whether the given New declaration is an overload of the declarations in Old.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition Sema.h:6527
void ActOnStartCXXInClassMemberInitializer()
Enter a new C++ default initializer scope.
ValueDecl * tryLookupCtorInitMemberDecl(CXXRecordDecl *ClassDecl, CXXScopeSpec &SS, ParsedType TemplateTypeTy, IdentifierInfo *MemberOrBase)
NamedDecl * BuildUsingDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS, DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList, bool IsInstantiation, bool IsUsingIfExists)
Builds a using declaration.
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1191
bool pushCodeSynthesisContext(CodeSynthesisContext Ctx)
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
void DefineImplicitMoveConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitMoveConstructor - Checks for feasibility of defining this constructor as the move const...
@ TPL_TemplateMatch
We are matching the template parameter lists of two templates that might be redeclarations.
Definition Sema.h:12136
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition Sema.cpp:1673
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
Definition Sema.h:8346
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
void PushFunctionScope()
Enter a new function scope.
Definition Sema.cpp:2331
void SetDeclDefaulted(Decl *dcl, SourceLocation DefaultLoc)
void DefineImplicitCopyConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitCopyConstructor - Checks for feasibility of defining this constructor as the copy const...
FPOptions & getCurFPFeatures()
Definition Sema.h:920
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:272
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:83
@ UPPC_RequiresClause
Definition Sema.h:14412
@ UPPC_UsingDeclaration
A using declaration.
Definition Sema.h:14367
@ UPPC_ExceptionType
The type of an exception.
Definition Sema.h:14385
@ UPPC_Initializer
An initializer.
Definition Sema.h:14376
@ UPPC_BaseType
The base type of a class type.
Definition Sema.h:14346
@ UPPC_FriendDeclaration
A friend declaration.
Definition Sema.h:14370
@ UPPC_DefaultArgument
A default argument.
Definition Sema.h:14379
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition Sema.h:14349
@ UPPC_DataMemberType
The type of a data member.
Definition Sema.h:14352
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition Sema.h:14358
Decl * ActOnStartNamespaceDef(Scope *S, SourceLocation InlineLoc, SourceLocation NamespaceLoc, SourceLocation IdentLoc, IdentifierInfo *Ident, SourceLocation LBrace, const ParsedAttributesView &AttrList, UsingDirectiveDecl *&UsingDecl, bool IsNested)
ActOnStartNamespaceDef - This is called at the start of a namespace definition.
const LangOptions & getLangOpts() const
Definition Sema.h:918
void DiagnoseTemplateParameterShadow(SourceLocation Loc, Decl *PrevDecl, bool SupportedForCompatibility=false)
DiagnoseTemplateParameterShadow - Produce a diagnostic complaining that the template parameter 'PrevD...
TypoCorrection CorrectTypo(const DeclarationNameInfo &Typo, Sema::LookupNameKind LookupKind, Scope *S, CXXScopeSpec *SS, CorrectionCandidateCallback &CCC, CorrectTypoKind Mode, DeclContext *MemberContext=nullptr, bool EnteringContext=false, const ObjCObjectPointerType *OPT=nullptr, bool RecordFailure=true)
Try to "correct" a typo in the source code by finding visible declarations whose names are similar to...
QualType CheckComparisonCategoryType(ComparisonCategoryType Kind, SourceLocation Loc, ComparisonCategoryUsage Usage)
Lookup the specified comparison category types in the standard library, an check the VarDecls possibl...
void DiagnoseAbsenceOfOverrideControl(NamedDecl *D, bool Inconsistent)
DiagnoseAbsenceOfOverrideControl - Diagnose if 'override' keyword was not used in the declaration of ...
SmallVector< VTableUse, 16 > VTableUses
The list of vtables that are required but have not yet been materialized.
Definition Sema.h:5843
AccessResult CheckStructuredBindingMemberAccess(SourceLocation UseLoc, CXXRecordDecl *DecomposedClass, DeclAccessPair Field)
Checks implicit access to a member in a structured binding.
void EnterTemplatedContext(Scope *S, DeclContext *DC)
Enter a template parameter scope, after it's been associated with a particular DeclContext.
void ActOnBaseSpecifiers(Decl *ClassDecl, MutableArrayRef< CXXBaseSpecifier * > Bases)
ActOnBaseSpecifiers - Attach the given base specifiers to the class, after checking whether there are...
const FunctionProtoType * ResolveExceptionSpec(SourceLocation Loc, const FunctionProtoType *FPT)
void NoteTemplateLocation(const NamedDecl &Decl, std::optional< SourceRange > ParamRange={})
void DefineDefaultedComparison(SourceLocation Loc, FunctionDecl *FD, DefaultedComparisonKind DCK)
bool isEquivalentInternalLinkageDeclaration(const NamedDecl *A, const NamedDecl *B)
Determine if A and B are equivalent internal linkage declarations from different modules,...
bool LookupParsedName(LookupResult &R, Scope *S, CXXScopeSpec *SS, QualType ObjectType, bool AllowBuiltinCreation=false, bool EnteringContext=false)
Performs name lookup for a name that was parsed in the source code, and may contain a C++ scope speci...
Preprocessor & PP
Definition Sema.h:1282
bool CheckConstexprFunctionDefinition(const FunctionDecl *FD, CheckConstexprKind Kind)
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.
AccessResult CheckBaseClassAccess(SourceLocation AccessLoc, QualType Base, QualType Derived, const CXXBasePath &Path, unsigned DiagID, bool ForceCheck=false, bool ForceUnprivileged=false)
Checks access for a hierarchy conversion.
bool DiagnoseUnexpandedParameterPack(SourceLocation Loc, TypeSourceInfo *T, UnexpandedParameterPackContext UPPC)
If the given type contains an unexpanded parameter pack, diagnose the error.
bool RequireNonAbstractType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
NamedDecl * getShadowedDeclaration(const TypedefNameDecl *D, const LookupResult &R)
Return the declaration shadowed by the given typedef D, or null if it doesn't shadow any declaration ...
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
void CheckExtraCXXDefaultArguments(Declarator &D)
CheckExtraCXXDefaultArguments - Check for any extra default arguments in the declarator,...
void CheckCompleteDecompositionDeclaration(DecompositionDecl *DD)
void checkClassLevelDLLAttribute(CXXRecordDecl *Class)
Check class-level dllimport/dllexport attribute.
const LangOptions & LangOpts
Definition Sema.h:1281
std::pair< Expr *, std::string > findFailedBooleanCondition(Expr *Cond)
Find the failed Boolean condition within a given Boolean constant expression, and describe it with a ...
void DiagnoseReturnInConstructorExceptionHandler(CXXTryStmt *TryBlock)
void MarkVirtualMembersReferenced(SourceLocation Loc, const CXXRecordDecl *RD, bool ConstexprOnly=false)
MarkVirtualMembersReferenced - Will mark all members of the given CXXRecordDecl referenced.
ExprResult CheckForImmediateInvocation(ExprResult E, FunctionDecl *Decl)
Wrap the expression in a ConstantExpr if it is a potential immediate invocation.
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition Sema.h:6490
SemaHLSL & HLSL()
Definition Sema.h:1451
void DefineInheritingConstructor(SourceLocation UseLoc, CXXConstructorDecl *Constructor)
Define the specified inheriting constructor.
bool CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD, LookupResult &Previous, bool IsMemberSpecialization, bool DeclIsDefn)
Perform semantic checking of a new function declaration.
CXXRecordDecl * getStdBadAlloc() const
QualType CheckDestructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckDestructorDeclarator - Called by ActOnDeclarator to check the well-formednes of the destructor d...
bool CheckPureMethod(CXXMethodDecl *Method, SourceRange InitRange)
Mark the given method pure.
void SetParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void NoteHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
CXXMethodDecl * DeclareImplicitMoveAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit move assignment operator for the given class.
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
llvm::DenseMap< CXXRecordDecl *, bool > VTablesUsed
The set of classes whose vtables have been used within this translation unit, and a bit that will be ...
Definition Sema.h:5849
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
ComparisonCategoryUsage
Definition Sema.h:5223
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
Definition Sema.h:5230
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition Sema.h:6483
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void ProcessDeclAttributeList(Scope *S, Decl *D, const ParsedAttributesView &AttrList, const ProcessDeclAttributeOptions &Options=ProcessDeclAttributeOptions())
ProcessDeclAttributeList - Apply all the decl attributes in the specified attribute list to the speci...
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
NamedDecl * BuildUsingEnumDeclaration(Scope *S, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceLocation NameLoc, TypeSourceInfo *EnumType, EnumDecl *ED)
TypeLoc getReturnTypeLoc(FunctionDecl *FD) const
SmallVector< std::pair< const CXXMethodDecl *, const CXXMethodDecl * >, 2 > DelayedOverridingExceptionSpecChecks
All the overriding functions seen during a class definition that had their exception spec checks dela...
Definition Sema.h:6588
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition Sema.h:6520
void MarkVirtualMemberExceptionSpecsNeeded(SourceLocation Loc, const CXXRecordDecl *RD)
Mark the exception specifications of all virtual member functions in the given class as needed.
ExprResult BuildConvertedConstantExpression(Expr *From, QualType T, CCEKind CCE, NamedDecl *Dest=nullptr)
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
bool CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
void MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const CXXRecordDecl * > *DirectVirtualBases=nullptr)
Mark destructors of virtual bases of this class referenced.
void ExitDeclaratorContext(Scope *S)
void PushUsingDirective(Scope *S, UsingDirectiveDecl *UDir)
void CheckConstructor(CXXConstructorDecl *Constructor)
CheckConstructor - Checks a fully-formed constructor for well-formedness, issuing any diagnostics req...
void DefineImplicitLambdaToBlockPointerConversion(SourceLocation CurrentLoc, CXXConversionDecl *Conv)
Define the "body" of the conversion from a lambda object to a block pointer.
void DefineImplicitDestructor(SourceLocation CurrentLocation, CXXDestructorDecl *Destructor)
DefineImplicitDestructor - Checks for feasibility of defining this destructor as the default destruct...
void DiagnoseNontrivial(const CXXRecordDecl *Record, CXXSpecialMemberKind CSM)
Diagnose why the specified class does not have a trivial special member of the given kind.
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, const CXXScopeSpec &SS)
CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)
Get the class that is directly named by the current context.
bool EvaluateAsString(Expr *Message, APValue &Result, ASTContext &Ctx, StringEvaluationContext EvalContext, bool ErrorOnInvalidMessage)
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
ExprResult ActOnFinishTrailingRequiresClause(ExprResult ConstraintExpr)
bool checkThisInStaticMemberFunctionAttributes(CXXMethodDecl *Method)
Check whether 'this' shows up in the attributes of the given static member function.
CXXBaseSpecifier * CheckBaseSpecifier(CXXRecordDecl *Class, SourceRange SpecifierRange, bool Virtual, AccessSpecifier Access, TypeSourceInfo *TInfo, SourceLocation EllipsisLoc)
Check the validity of a C++ base class specifier.
DeclResult CheckClassTemplate(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, TemplateParameterList *TemplateParams, AccessSpecifier AS, SourceLocation ModulePrivateLoc, SourceLocation FriendLoc, unsigned NumOuterTemplateParamLists, TemplateParameterList **OuterTemplateParamLists, SkipBodyInfo *SkipBody=nullptr)
UnparsedDefaultArgInstantiationsMap UnparsedDefaultArgInstantiations
A mapping from parameters with unparsed default arguments to the set of instantiations of each parame...
Definition Sema.h:13042
void DefineImplicitDefaultConstructor(SourceLocation CurrentLocation, CXXConstructorDecl *Constructor)
DefineImplicitDefaultConstructor - Checks for feasibility of defining this constructor as the default...
std::pair< CXXRecordDecl *, SourceLocation > VTableUse
The list of classes whose vtables have been used within this translation unit, and the source locatio...
Definition Sema.h:5839
ExprResult DefaultLvalueConversion(Expr *E)
Definition SemaExpr.cpp:639
bool CheckUsingShadowDecl(BaseUsingDecl *BUD, NamedDecl *Target, const LookupResult &PreviousDecls, UsingShadowDecl *&PrevShadow)
Determines whether to create a using shadow decl for a particular decl, given the set of decls existi...
ExprResult BuildDeclarationNameExpr(const CXXScopeSpec &SS, LookupResult &R, bool NeedsADL, bool AcceptInvalidDecl=false)
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
Definition Sema.h:15433
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:9845
bool CheckDeductionGuideDeclarator(Declarator &D, QualType &R, StorageClass &SC)
Check the validity of a declarator that we parsed for a deduction-guide.
void DiagPlaceholderVariableDefinition(SourceLocation Loc)
void CheckForFunctionRedefinition(FunctionDecl *FD, const FunctionDecl *EffectiveDefinition=nullptr, SkipBodyInfo *SkipBody=nullptr)
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
Definition Sema.h:6962
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
Definition Sema.h:6497
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1414
VarDecl * BuildExceptionDeclaration(Scope *S, TypeSourceInfo *TInfo, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id)
Perform semantic analysis for the variable declaration that occurs within a C++ catch clause,...
void ActOnDocumentableDecl(Decl *D)
Should be called on all declarations that might have attached documentation comments.
ClassTemplateDecl * StdTypeIdentity
The C++ "std::type_identity" template, which is defined in <type_traits>.
Definition Sema.h:6516
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Decl * ActOnFriendTypeDecl(Scope *S, const DeclSpec &DS, MultiTemplateParamsArg TemplateParams, SourceLocation EllipsisLoc)
Handle a friend type declaration.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
void DefineImplicitCopyAssignment(SourceLocation CurrentLocation, CXXMethodDecl *MethodDecl)
Defines an implicitly-declared copy assignment operator.
bool SetDelegatingInitializer(CXXConstructorDecl *Constructor, CXXCtorInitializer *Initializer)
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8161
bool CheckLiteralOperatorDeclaration(FunctionDecl *FnDecl)
CheckLiteralOperatorDeclaration - Check whether the declaration of this literal operator function is ...
bool DefineUsedVTables()
Define all of the vtables that have been used in this translation unit and reference any virtual memb...
CXXMethodDecl * DeclareImplicitCopyAssignment(CXXRecordDecl *ClassDecl)
Declare the implicit copy assignment operator for the given class.
void checkIllFormedTrivialABIStruct(CXXRecordDecl &RD)
Check that the C++ class annoated with "trivial_abi" satisfies all the conditions that are needed for...
void MarkDeclRefReferenced(DeclRefExpr *E, const Expr *Base=nullptr)
Perform reference-marking and odr-use handling for a DeclRefExpr.
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
unsigned ActOnReenterTemplateScope(Decl *Template, llvm::function_ref< Scope *()> EnterScope)
ExprResult BuildCXXConstructExpr(SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl, CXXConstructorDecl *Constructor, MultiExprArg Exprs, bool HadMultipleCandidates, bool IsListInitialization, bool IsStdInitListInitialization, bool RequiresZeroInit, CXXConstructionKind ConstructKind, SourceRange ParenRange)
BuildCXXConstructExpr - Creates a complete call to a constructor, including handling of its default a...
bool inTemplateInstantiation() const
Determine whether we are currently performing template instantiation.
Definition Sema.h:13909
SourceManager & getSourceManager() const
Definition Sema.h:923
FunctionDecl * SubstSpaceshipAsEqualEqual(CXXRecordDecl *RD, FunctionDecl *Spaceship)
Substitute the name and return type of a defaulted 'operator<=>' to form an implicit 'operator=='.
NamedDecl * ActOnDecompositionDeclarator(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParamLists)
ExprResult BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec &SS, FieldDecl *Field, DeclAccessPair FoundDecl, const DeclarationNameInfo &MemberNameInfo)
void diagnoseFunctionEffectMergeConflicts(const FunctionEffectSet::Conflicts &Errs, SourceLocation NewLoc, SourceLocation OldLoc)
void EnterDeclaratorContext(Scope *S, DeclContext *DC)
EnterDeclaratorContext - Used when we must lookup names in the context of a declarator's nested name ...
bool CheckExplicitlyDefaultedComparison(Scope *S, FunctionDecl *MD, DefaultedComparisonKind DCK)
bool checkThisInStaticMemberFunctionExceptionSpec(CXXMethodDecl *Method)
Whether this' shows up in the exception specification of a static member function.
void ActOnFinishCXXInClassMemberInitializer(Decl *VarDecl, SourceLocation EqualLoc, ExprResult Init)
This is invoked after parsing an in-class initializer for a non-static C++ class member,...
llvm::FoldingSet< SpecialMemberOverloadResultEntry > SpecialMemberCache
A cache of special member function overload resolution results for C++ records.
Definition Sema.h:9305
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
Decl * ActOnStartLinkageSpecification(Scope *S, SourceLocation ExternLoc, Expr *LangStr, SourceLocation LBraceLoc)
ActOnStartLinkageSpecification - Parsed the beginning of a C++ linkage specification,...
void FilterUsingLookup(Scope *S, LookupResult &lookup)
Remove decls we can't actually see from a lookup being used to declare shadow using decls.
Decl * ActOnExceptionDeclarator(Scope *S, Declarator &D)
ActOnExceptionDeclarator - Parsed the exception-declarator in a C++ catch handler.
StringEvaluationContext
Definition Sema.h:5959
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
void ActOnDefaultCtorInitializers(Decl *CDtorDecl)
void ActOnMemInitializers(Decl *ConstructorDecl, SourceLocation ColonLoc, ArrayRef< CXXCtorInitializer * > MemInits, bool AnyErrors)
ActOnMemInitializers - Handle the member initializers for a constructor.
bool CheckTemplateDeclScope(Scope *S, TemplateParameterList *TemplateParams)
Check whether a template can be declared within this scope.
ExprResult PerformImplicitConversion(Expr *From, QualType ToType, const ImplicitConversionSequence &ICS, AssignmentAction Action, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
PerformImplicitConversion - Perform an implicit conversion of the expression From to the type ToType ...
void ActOnCXXEnterDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXEnterDeclInitializer - Invoked when we are about to parse an initializer for the declaration ...
FunctionDecl * BuildTypeAwareUsualDelete(FunctionTemplateDecl *FnDecl, QualType AllocType, SourceLocation)
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReciever=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:224
void ActOnFinishCXXMemberSpecification(Scope *S, SourceLocation RLoc, Decl *TagDecl, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
void AdjustDestructorExceptionSpec(CXXDestructorDecl *Destructor)
Build an exception spec for destructors that don't have one.
Decl * ActOnStaticAssertDeclaration(SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *AssertMessageExpr, SourceLocation RParenLoc)
void DiagnoseUnknownAttribute(const ParsedAttr &AL)
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15388
bool CheckImmediateEscalatingFunctionDefinition(FunctionDecl *FD, const sema::FunctionScopeInfo *FSI)
void InstantiateDefaultCtorDefaultArgs(CXXConstructorDecl *Ctor)
In the MS ABI, we need to instantiate default arguments of dllexported default constructors along wit...
void CheckCompleteVariableDeclaration(VarDecl *VD)
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
QualType CheckTemplateIdType(ElaboratedTypeKeyword Keyword, TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs, Scope *Scope, bool ForNestedNameSpecifier)
void checkClassLevelCodeSegAttribute(CXXRecordDecl *Class)
bool isStdInitializerList(QualType Ty, QualType *Element)
Tests whether Ty is an instance of std::initializer_list and, if it is and Element is not NULL,...
RedeclarationKind forRedeclarationInCurContext() const
LazyDeclPtr StdNamespace
The C++ "std" namespace, where the standard library resides.
Definition Sema.h:6508
bool CheckUsingDeclRedeclaration(SourceLocation UsingLoc, bool HasTypenameKeyword, const CXXScopeSpec &SS, SourceLocation NameLoc, const LookupResult &Previous)
Checks that the given using declaration is not an invalid redeclaration.
void FinalizeVarWithDestructor(VarDecl *VD, CXXRecordDecl *DeclInit)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
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 ...
IntrusiveRefCntPtr< ExternalSemaSource > ExternalSource
Source of additional semantic information.
Definition Sema.h:1552
ASTConsumer & Consumer
Definition Sema.h:1284
void ActOnFinishCXXMemberDecls()
Perform any semantic analysis which needs to be delayed until all pending class member declarations h...
llvm::SmallPtrSet< const Decl *, 4 > ParsingInitForAutoVars
ParsingInitForAutoVars - a set of declarations with auto types for which we are currently parsing the...
Definition Sema.h:4632
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:123
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
Decl * ActOnFinishLinkageSpecification(Scope *S, Decl *LinkageSpec, SourceLocation RBraceLoc)
ActOnFinishLinkageSpecification - Complete the definition of the C++ linkage specification LinkageSpe...
bool CheckInheritingConstructorUsingDecl(UsingDecl *UD)
Additional checks for a using declaration referring to a constructor name.
@ ConstantEvaluated
The current context is "potentially evaluated" in C++11 terms, but the expression is evaluated at com...
Definition Sema.h:6718
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
Definition Sema.h:6728
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
Definition Sema.h:6697
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
void diagnoseTypo(const TypoCorrection &Correction, const PartialDiagnostic &TypoDiag, bool ErrorRecovery=true)
DeclResult ActOnTag(Scope *S, unsigned TagSpec, TagUseKind TUK, SourceLocation KWLoc, CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc, const ParsedAttributesView &Attr, AccessSpecifier AS, SourceLocation ModulePrivateLoc, MultiTemplateParamsArg TemplateParameterLists, bool &OwnedDecl, bool &IsDependent, SourceLocation ScopedEnumKWLoc, bool ScopedEnumUsesClassTag, TypeResult UnderlyingType, bool IsTypeSpecifier, bool IsTemplateParamOrArg, OffsetOfKind OOK, SkipBodyInfo *SkipBody=nullptr)
This is invoked when we see 'struct foo' or 'struct {'.
void ActOnFinishNamespaceDef(Decl *Dcl, SourceLocation RBrace)
ActOnFinishNamespaceDef - This callback is called after a namespace is exited.
MemInitResult BuildMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, Expr *Init, SourceLocation EllipsisLoc)
Handle a C++ member initializer.
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
void actOnDelayedExceptionSpecification(Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange, ArrayRef< ParsedType > DynamicExceptions, ArrayRef< SourceRange > DynamicExceptionRanges, Expr *NoexceptExpr)
Add an exception-specification to the given member or friend function (or function template).
Scope * TUScope
Translation Unit Scope - useful to Objective-C actions that need to lookup file scope declarations in...
Definition Sema.h:1246
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
void CheckExplicitObjectLambda(Declarator &D)
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
void NoteDeletedInheritingConstructor(CXXConstructorDecl *CD)
void PopPragmaVisibility(bool IsNamespaceEnd, SourceLocation EndLoc)
PopPragmaVisibility - Pop the top element of the visibility stack; used for '#pragma GCC visibility' ...
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void checkInitializerLifetime(const InitializedEntity &Entity, Expr *Init)
Check that the lifetime of the initializer (and its subobjects) is sufficient for initializing the en...
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AvailabilityMergeKind::Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
Definition Sema.h:1286
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
NamedDecl * BuildUsingPackDecl(NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > Expansions)
MemInitResult ActOnMemInitializer(Decl *ConstructorD, Scope *S, CXXScopeSpec &SS, IdentifierInfo *MemberOrBase, ParsedType TemplateTypeTy, const DeclSpec &DS, SourceLocation IdLoc, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, SourceLocation EllipsisLoc)
Handle a C++ member initializer using parentheses syntax.
void SetDeclDeleted(Decl *dcl, SourceLocation DelLoc, StringLiteral *Message=nullptr)
void ActOnStartDelayedCXXMethodDeclaration(Scope *S, Decl *Method)
ActOnStartDelayedCXXMethodDeclaration - We have completed parsing a top-level (non-nested) C++ class,...
DiagnosticsEngine & Diags
Definition Sema.h:1285
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition Sema.h:7773
TypeAwareAllocationMode ShouldUseTypeAwareOperatorNewOrDelete() const
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
NamespaceDecl * getStdNamespace() const
llvm::SmallPtrSet< const CXXRecordDecl *, 8 > RecordDeclSetTy
Definition Sema.h:6492
void DeclareImplicitEqualityComparison(CXXRecordDecl *RD, FunctionDecl *Spaceship)
bool AttachBaseSpecifiers(CXXRecordDecl *Class, MutableArrayRef< CXXBaseSpecifier * > Bases)
Performs the actual work of attaching the given base class specifiers to a C++ class.
void ActOnCXXExitDeclInitializer(Scope *S, Decl *Dcl)
ActOnCXXExitDeclInitializer - Invoked after we are finished parsing an initializer for the declaratio...
static bool adjustContextForLocalExternDecl(DeclContext *&DC)
Adjust the DeclContext for a function or variable that might be a function-local external declaration...
SpecialMemberOverloadResult LookupSpecialMember(CXXRecordDecl *D, CXXSpecialMemberKind SM, bool ConstArg, bool VolatileArg, bool RValueThis, bool ConstThis, bool VolatileThis)
NamedDecl * ActOnTypedefNameDecl(Scope *S, DeclContext *DC, TypedefNameDecl *D, LookupResult &Previous, bool &Redeclaration)
ActOnTypedefNameDecl - Perform semantic checking for a declaration which declares a typedef-name,...
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
friend class InitializationSequence
Definition Sema.h:1556
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())
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
Definition Sema.h:6524
QualType CheckConstructorDeclarator(Declarator &D, QualType R, StorageClass &SC)
CheckConstructorDeclarator - Called by ActOnDeclarator to check the well-formedness of the constructo...
ExprResult ConvertParamDefaultArgument(ParmVarDecl *Param, Expr *DefaultArg, SourceLocation EqualLoc)
void ProcessDeclAttributes(Scope *S, Decl *D, const Declarator &PD)
ProcessDeclAttributes - Given a declarator (PD) with attributes indicated in it, apply them to D.
void FilterLookupForScope(LookupResult &R, DeclContext *Ctx, Scope *S, bool ConsiderLinkage, bool AllowInlineNamespace)
Filters out lookup results that don't fall within the given scope as determined by isDeclInScope.
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
void checkIncorrectVTablePointerAuthenticationAttribute(CXXRecordDecl &RD)
Check that VTable Pointer authentication is only being set on the first first instantiation of the vt...
static Scope * getScopeForDeclContext(Scope *S, DeclContext *DC)
Finds the scope corresponding to the given decl context, if it happens to be an enclosing scope.
bool isUsualDeallocationFunction(const CXXMethodDecl *FD)
void DiagnoseDeletedDefaultedFunction(FunctionDecl *FD)
Produce notes explaining why a defaulted function was defined as deleted.
ExprResult BuildCXXNamedCast(SourceLocation OpLoc, tok::TokenKind Kind, TypeSourceInfo *Ty, Expr *E, SourceRange AngleBrackets, SourceRange Parens)
Definition SemaCast.cpp:337
bool CheckOverridingFunctionExceptionSpec(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionExceptionSpec - Checks whether the exception spec is a subset of base spec.
SmallVector< CXXRecordDecl *, 4 > DelayedDllExportClasses
Definition Sema.h:6268
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,...
bool CheckTemplateParameterList(TemplateParameterList *NewParams, TemplateParameterList *OldParams, TemplateParamListContext TPC, SkipBodyInfo *SkipBody=nullptr)
Checks the validity of a template parameter list, possibly considering the template parameter list fr...
bool CheckOverridingFunctionReturnType(const CXXMethodDecl *New, const CXXMethodDecl *Old)
CheckOverridingFunctionReturnType - Checks whether the return types are covariant,...
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
UnsignedOrNone GetDecompositionElementCount(QualType DecompType, SourceLocation Loc)
Decl * ActOnDeclarator(Scope *S, Declarator &D)
AbstractDiagSelID
Definition Sema.h:6214
@ AbstractVariableType
Definition Sema.h:6218
@ AbstractReturnType
Definition Sema.h:6216
@ AbstractNone
Definition Sema.h:6215
@ AbstractFieldType
Definition Sema.h:6219
@ AbstractArrayType
Definition Sema.h:6222
@ AbstractParamType
Definition Sema.h:6217
MSPropertyDecl * HandleMSProperty(Scope *S, RecordDecl *TagD, SourceLocation DeclStart, Declarator &D, Expr *BitfieldWidth, InClassInitStyle InitStyle, AccessSpecifier AS, const ParsedAttr &MSPropertyAttr)
HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
void UpdateExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI)
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
Definition Sema.h:8350
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
CheckConstexprKind
Definition Sema.h:6403
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
Definition Sema.h:6408
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6405
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
void LoadExternalVTableUses()
Load any externally-stored vtable uses.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
Decl * ActOnUsingDirective(Scope *CurScope, SourceLocation UsingLoc, SourceLocation NamespcLoc, CXXScopeSpec &SS, SourceLocation IdentLoc, IdentifierInfo *NamespcName, const ParsedAttributesView &AttrList)
StmtResult ActOnCompoundStmt(SourceLocation L, SourceLocation R, ArrayRef< Stmt * > Elts, bool isStmtExpr)
Definition SemaStmt.cpp:436
void HandleFunctionTypeMismatch(PartialDiagnostic &PDiag, QualType FromType, QualType ToType)
HandleFunctionTypeMismatch - Gives diagnostic information for differeing function types.
void ActOnStartTrailingRequiresClause(Scope *S, Declarator &D)
void FindHiddenVirtualMethods(CXXMethodDecl *MD, SmallVectorImpl< CXXMethodDecl * > &OverloadedMethods)
Check if a method overloads virtual methods in a base class without overriding any.
IdentifierResolver IdResolver
Definition Sema.h:3460
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
ExprResult ActOnCXXThis(SourceLocation Loc)
CXXConstructorDecl * findInheritingConstructor(SourceLocation Loc, CXXConstructorDecl *BaseCtor, ConstructorUsingShadowDecl *DerivedShadow)
Given a derived-class using shadow declaration for a constructor and the correspnding base class cons...
void warnOnReservedIdentifier(const NamedDecl *D)
bool CheckExplicitlyDefaultedSpecialMember(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, SourceLocation DefaultLoc)
bool isCurrentClassNameTypo(IdentifierInfo *&II, const CXXScopeSpec *SS)
Determine whether the identifier II is a typo for the name of the class type currently being defined.
Decl * ActOnUsingDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation TypenameLoc, CXXScopeSpec &SS, UnqualifiedId &Name, SourceLocation EllipsisLoc, const ParsedAttributesView &AttrList)
void ActOnDelayedCXXMethodParameter(Scope *S, Decl *Param)
ActOnDelayedCXXMethodParameter - We've already started a delayed C++ method declaration.
bool isAbstractType(SourceLocation Loc, QualType T)
bool CheckCXXDefaultArgExpr(SourceLocation CallLoc, FunctionDecl *FD, ParmVarDecl *Param, Expr *Init=nullptr, bool SkipImmediateInvocations=true)
Instantiate or parse a C++ default argument expression as necessary.
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
Definition Sema.cpp:651
bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, ArrayRef< CXXCtorInitializer * > Initializers={})
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition Sema.h:8641
CXXDestructorDecl * DeclareImplicitDestructor(CXXRecordDecl *ClassDecl)
Declare the implicit destructor for the given class.
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 isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
bool isInvalid() const
SourceLocation getEnd() const
SourceLocation getBegin() const
void setEnd(SourceLocation e)
static StaticAssertDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StaticAssertLoc, Expr *AssertExpr, Expr *Message, SourceLocation RParenLoc, bool Failed)
Definition DeclCXX.cpp:3620
Stmt - This represents one statement.
Definition Stmt.h:85
SourceLocation getEndLoc() const LLVM_READONLY
Definition Stmt.cpp:362
child_range children()
Definition Stmt.cpp:299
StmtClass getStmtClass() const
Definition Stmt.h:1483
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:338
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:350
static bool isValidUDSuffix(const LangOptions &LangOpts, StringRef Suffix)
Determine whether a suffix is a valid ud-suffix.
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1799
bool isUnevaluated() const
Definition Expr.h:1921
StringRef getString() const
Definition Expr.h:1867
Represents the declaration of a struct/union/class/enum.
Definition Decl.h:3717
bool isBeingDefined() const
Return true if this decl is currently being defined.
Definition Decl.h:3832
StringRef getKindName() const
Definition Decl.h:3907
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition Decl.h:3812
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:4895
bool isUnion() const
Definition Decl.h:3922
TagKind getTagKind() const
Definition Decl.h:3911
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Definition Decl.h:3857
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition TypeLoc.h:805
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
A convenient class for passing around template argument information.
void addArgument(const TemplateArgumentLoc &Loc)
ArrayRef< TemplateArgumentLoc > arguments() const
Location wrapper for a TemplateArgument.
const TemplateArgument & getArgument() const
TypeSourceInfo * getTypeSourceInfo() const
Represents a template argument.
@ Type
The template argument is a type.
ArgKind getKind() const
Return the kind of stored template argument.
The base class of all kinds of template declarations (e.g., class, function, etc.).
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
QualifiedTemplateName * getAsQualifiedTemplateName() const
Retrieve the underlying qualified template name structure, if any.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
SourceRange getSourceRange() const LLVM_READONLY
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to form a template specialization.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
Expr * getRequiresClause()
The constraint-expression of the associated requires-clause.
SourceLocation getRAngleLoc() const
SourceLocation getLAngleLoc() const
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
SourceLocation getTemplateLoc() const
TemplateArgumentLoc getArgLoc(unsigned i) const
Definition TypeLoc.h:1888
Declaration of a template type parameter.
unsigned getIndex() const
Retrieve the index of the template parameter.
unsigned getDepth() const
Retrieve the depth of the template parameter.
The top declaration context.
Definition Decl.h:105
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition Decl.h:3688
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition Decl.cpp:5746
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Definition Decl.h:3707
Declaration of an alias template.
static TypeAliasTemplateDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName Name, TemplateParameterList *Params, NamedDecl *Decl)
Create a function template node.
TypeAliasDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
Represents a declaration of a type.
Definition Decl.h:3513
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
TypeSpecTypeLoc pushTypeSpec(QualType T)
Pushes space for a typespec TypeLoc.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
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
TypeLoc getNextTypeLoc() const
Get the next TypeLoc pointed by this TypeLoc, e.g for "int*" the TypeLoc is a PointerLoc and next Typ...
Definition TypeLoc.h:171
T getAs() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:89
TypeLoc IgnoreParens() const
Definition TypeLoc.h:1408
T castAs() const
Convert to the specified TypeLoc type, asserting that this TypeLoc is of the desired type.
Definition TypeLoc.h:78
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
SourceRange getLocalSourceRange() const
Get the local source range.
Definition TypeLoc.h:160
TypeLocClass getTypeLocClass() const
Definition TypeLoc.h:116
bool isNull() const
Definition TypeLoc.h:121
SourceLocation getEndLoc() const
Get the end source location.
Definition TypeLoc.cpp:227
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition TypeLoc.h:2706
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
A container of type source information.
Definition TypeBase.h:8264
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:8275
void setNameLoc(SourceLocation Loc)
Definition TypeLoc.h:551
The base class of the type hierarchy.
Definition TypeBase.h:1833
bool isVoidType() const
Definition TypeBase.h:8892
bool isBooleanType() const
Definition TypeBase.h:9022
const TemplateSpecializationType * getAsNonAliasTemplateSpecializationType() const
Look through sugar for an instance of TemplateSpecializationType which is not a type alias,...
Definition Type.cpp:1921
bool isIncompleteArrayType() const
Definition TypeBase.h:8637
bool isUndeducedAutoType() const
Definition TypeBase.h:8722
bool isRValueReferenceType() const
Definition TypeBase.h:8562
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:8629
bool isPointerType() const
Definition TypeBase.h:8530
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:8936
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9179
bool isReferenceType() const
Definition TypeBase.h:8554
bool isEnumeralType() const
Definition TypeBase.h:8661
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:752
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
Definition Type.h:63
bool isLValueReferenceType() const
Definition TypeBase.h:8558
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
Definition TypeBase.h:8861
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2783
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
Definition TypeBase.h:2405
QualType getCanonicalTypeInternal() const
Definition TypeBase.h:3120
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
Definition TypeBase.h:9065
bool isFunctionProtoType() const
Definition TypeBase.h:2601
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
Definition TypeBase.h:9035
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition TypeBase.h:2801
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition TypeBase.h:9028
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
Definition Type.h:53
bool isFunctionType() const
Definition TypeBase.h:8526
bool isStructureOrClassType() const
Definition Type.cpp:706
bool isRealFloatingType() const
Floating point categories.
Definition Type.cpp:2320
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:2922
bool isUnsignedIntegerType() const
Return true if this is an integer type that is unsigned, according to C99 6.2.5p6 [which returns true...
Definition Type.cpp:2253
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9112
bool isRecordType() const
Definition TypeBase.h:8657
bool isUnionType() const
Definition Type.cpp:718
Base class for declarations which introduce a typedef-name.
Definition Decl.h:3562
QualType getUnderlyingType() const
Definition Decl.h:3617
Wrapper for source info for typedefs.
Definition TypeLoc.h:777
Simple class containing the result of Sema::CorrectTypo.
NamedDecl * getCorrectionDecl() const
Gets the pointer to the declaration of the typo correction.
SourceRange getCorrectionRange() const
void WillReplaceSpecifier(bool ForceReplacement)
DeclClass * getCorrectionDeclAs() const
NestedNameSpecifier getCorrectionSpecifier() const
Gets the NestedNameSpecifier needed to use the typo correction.
NamedDecl * getFoundDecl() const
Get the correction declaration found by name lookup (before we looked through using shadow declaratio...
Expr * getSubExpr() const
Definition Expr.h:2285
Opcode getOpcode() const
Definition Expr.h:2280
static bool isIncrementDecrementOp(Opcode Op)
Definition Expr.h:2340
static UnaryOperator * Create(const ASTContext &C, Expr *input, Opcode opc, QualType type, ExprValueKind VK, ExprObjectKind OK, SourceLocation l, bool CanOverflow, FPOptionsOverride FPFeatures)
Definition Expr.cpp:5038
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:998
UnionParsedType ConversionFunctionId
When Kind == IK_ConversionFunctionId, the type that the conversion function names.
Definition DeclSpec.h:1034
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclSpec.h:1210
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
Definition DeclSpec.h:1207
UnionParsedType DestructorName
When Kind == IK_DestructorName, the type referred to by the class-name.
Definition DeclSpec.h:1042
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
Definition DeclSpec.h:1056
UnionParsedTemplateTy TemplateName
When Kind == IK_DeductionGuideName, the parsed template-name.
Definition DeclSpec.h:1045
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
Definition DeclSpec.h:1026
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
Definition DeclSpec.h:1080
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
Definition DeclSpec.h:1050
static UnresolvedLookupExpr * Create(const ASTContext &Context, CXXRecordDecl *NamingClass, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool RequiresADL, UnresolvedSetIterator Begin, UnresolvedSetIterator End, bool KnownDependent, bool KnownInstantiationDependent)
Definition ExprCXX.cpp:432
A set of unresolved declarations.
ArrayRef< DeclAccessPair > pairs() const
The iterator over UnresolvedSets.
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Definition DeclCXX.h:4114
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Definition DeclCXX.cpp:3599
Wrapper for source info for unresolved typename using decls.
Definition TypeLoc.h:782
Represents a dependent using declaration which was marked with typename.
Definition DeclCXX.h:4033
static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)
Definition DeclCXX.cpp:3578
Represents a dependent using declaration which was not marked with typename.
Definition DeclCXX.h:3936
static UnresolvedUsingValueDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc)
Definition DeclCXX.cpp:3550
Represents a C++ using-declaration.
Definition DeclCXX.h:3587
bool hasTypename() const
Return true if the using declaration has 'typename'.
Definition DeclCXX.h:3636
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition DeclCXX.h:3624
DeclarationNameInfo getNameInfo() const
Definition DeclCXX.h:3628
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
Definition DeclCXX.cpp:3487
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Definition DeclCXX.h:3614
Represents C++ using-directive.
Definition DeclCXX.h:3092
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Definition DeclCXX.cpp:3270
Represents a C++ using-enum-declaration.
Definition DeclCXX.h:3788
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
Definition DeclCXX.cpp:3508
static UsingPackDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
Definition DeclCXX.cpp:3530
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition DeclCXX.h:3395
static UsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
Definition DeclCXX.h:3431
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Definition DeclCXX.h:3459
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Definition DeclCXX.cpp:3427
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:712
void setType(QualType newType)
Definition Decl.h:724
QualType getType() const
Definition Decl.h:723
bool isParameterPack() const
Determine whether this value is actually a function parameter pack, init-capture pack,...
Definition Decl.cpp:5527
Represents a variable declaration or definition.
Definition Decl.h:926
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition Decl.cpp:2817
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition Decl.cpp:2158
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition Decl.h:1569
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
Definition Decl.cpp:2267
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2197
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed?
Definition Decl.cpp:2843
void setCXXCondDecl()
Definition Decl.h:1615
bool isInlineSpecified() const
Definition Decl.h:1554
APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
Definition Decl.cpp:2582
bool isStaticDataMember() const
Determines whether this is a static data member.
Definition Decl.h:1283
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition Decl.h:1226
bool evaluateDestruction(SmallVectorImpl< PartialDiagnosticAt > &Notes) const
Evaluate the destruction of this variable to determine if it constitutes constant destruction.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
Definition Decl.h:1208
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition Decl.cpp:2858
ThreadStorageClassSpecifier getTSCSpec() const
Definition Decl.h:1177
const Expr * getInit() const
Definition Decl.h:1368
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition Decl.h:952
void setInit(Expr *I)
Definition Decl.cpp:2484
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition Decl.h:1168
bool isUsableInConstantExpressions(const ASTContext &C) const
Determine whether this variable's value can be used in a constant expression, according to the releva...
Definition Decl.cpp:2535
void setExceptionVariable(bool EV)
Definition Decl.h:1497
Declaration of a variable template.
Represents a GCC generic vector type.
Definition TypeBase.h:4176
unsigned getNumElements() const
Definition TypeBase.h:4191
QualType getElementType() const
Definition TypeBase.h:4190
Represents a C++11 virt-specifier-seq.
Definition DeclSpec.h:2754
SourceLocation getOverrideLoc() const
Definition DeclSpec.h:2774
SourceLocation getLastLocation() const
Definition DeclSpec.h:2786
bool isOverrideSpecified() const
Definition DeclSpec.h:2773
SourceLocation getFinalLoc() const
Definition DeclSpec.h:2778
bool isFinalSpecified() const
Definition DeclSpec.h:2776
bool isFinalSpelledSealed() const
Definition DeclSpec.h:2777
Retains information about a function, method, or block that is currently being parsed.
Definition ScopeInfo.h:104
bool FoundImmediateEscalatingExpression
Whether we found an immediate-escalating expression.
Definition ScopeInfo.h:179
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
#define UINT_MAX
Definition limits.h:64
@ OS
Indicates that the tracking object is a descendant of a referenced-counted OSObject,...
bool Comp(InterpState &S, CodePtr OpPC)
1) Pops the value from the stack.
Definition Interp.h:960
bool Inc(InterpState &S, CodePtr OpPC, bool CanOverflow)
1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by ...
Definition Interp.h:776
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
Stencil access(llvm::StringRef BaseId, Stencil Member)
Constructs a MemberExpr that accesses the named member (Member) of the object bound to BaseId.
The JSON file list parser is used to communicate input to InstallAPI.
bool FTIHasNonVoidParameters(const DeclaratorChunk::FunctionTypeInfo &FTI)
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
@ TST_decltype
Definition Specifiers.h:89
@ TST_typename_pack_indexing
Definition Specifiers.h:97
@ TST_decltype_auto
Definition Specifiers.h:93
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
@ NonFunction
This is not an overload because the lookup results contain a non-function.
Definition Sema.h:820
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:816
@ Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
Definition Sema.h:812
bool isa(CodeGen::Address addr)
Definition Address.h:330
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition Specifiers.h:212
@ CPlusPlus23
@ CPlusPlus20
@ CPlusPlus
@ CPlusPlus11
@ CPlusPlus14
@ CPlusPlus26
@ CPlusPlus17
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
Definition Ownership.h:263
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
@ OR_Ambiguous
Ambiguous candidates found.
Definition Overload.h:58
@ OR_No_Viable_Function
No viable function found.
Definition Overload.h:55
VariadicCallType
Definition Sema.h:511
ConstexprSpecKind
Define the kind of constexpr specifier.
Definition Specifiers.h:35
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
Definition DeclCXX.h:3003
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
Definition Lookup.h:64
@ NotFound
No entity found met the criteria.
Definition Lookup.h:41
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
Definition Lookup.h:54
@ Found
Name lookup found a single declaration that met the criteria.
Definition Lookup.h:50
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
Definition Lookup.h:59
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
Definition Lookup.h:46
LLVM_READONLY auto escapeCStyle(CharT Ch) -> StringRef
Return C-style escaped string for special characters, or an empty string if there is no such mapping.
Definition CharInfo.h:191
@ Comparison
A comparison.
Definition Sema.h:665
InClassInitStyle
In-class initialization styles for non-static data members.
Definition Specifiers.h:271
@ ICIS_ListInit
Direct list-initialization.
Definition Specifiers.h:274
@ ICIS_NoInit
No in-class initializer.
Definition Specifiers.h:272
@ RQ_None
No ref-qualifier was provided.
Definition TypeBase.h:1782
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition TypeBase.h:1788
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
Definition Parser.h:61
@ OCD_AmbiguousCandidates
Requests that only tied-for-best candidates be shown.
Definition Overload.h:73
@ OCD_AllCandidates
Requests that all candidates be shown.
Definition Overload.h:67
CXXConstructionKind
Definition ExprCXX.h:1540
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition Specifiers.h:151
@ Redeclaration
Merge availability attributes for a redeclaration, which requires an exact match.
Definition Sema.h:631
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl *, const TemplateSpecializationType *, const SubstBuiltinTemplatePackType * >, SourceLocation > UnexpandedParameterPack
Definition Sema.h:236
@ If
'if' clause, allowed on all the Compute Constructs, Data Constructs, Executable Constructs,...
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ Seq
'seq' clause, allowed on 'loop' and 'routine' directives.
@ Delete
'delete' clause, allowed on the 'exit data' construct.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
Definition DeclSpec.h:994
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
Definition DeclSpec.h:992
@ IK_TemplateId
A template-id, e.g., f<int>.
Definition DeclSpec.h:990
@ IK_ConstructorTemplateId
A constructor named via a template-id.
Definition DeclSpec.h:986
@ IK_ConstructorName
A constructor name.
Definition DeclSpec.h:984
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
Definition DeclSpec.h:982
@ IK_Identifier
An identifier.
Definition DeclSpec.h:976
@ IK_DestructorName
A destructor name.
Definition DeclSpec.h:988
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
Definition DeclSpec.h:978
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
Definition DeclSpec.h:980
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
Definition Specifiers.h:123
@ AS_public
Definition Specifiers.h:124
@ AS_protected
Definition Specifiers.h:125
@ AS_none
Definition Specifiers.h:127
@ AS_private
Definition Specifiers.h:126
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
ActionResult< Decl * > DeclResult
Definition Ownership.h:255
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
StorageClass
Storage classes.
Definition Specifiers.h:248
@ SC_Static
Definition Specifiers.h:252
@ SC_None
Definition Specifiers.h:250
ComparisonCategoryType commonComparisonType(ComparisonCategoryType A, ComparisonCategoryType B)
Determine the common comparison type, as defined in C++2a [class.spaceship]p4.
Expr * Cond
};
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
Definition Parser.h:142
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
MutableArrayRef< Expr * > MultiExprArg
Definition Ownership.h:259
Language
The language for the input, used to select and validate the language standard and possible actions.
StmtResult StmtError()
Definition Ownership.h:266
@ Result
The result type of a method or function.
Definition TypeBase.h:905
ActionResult< ParsedType > TypeResult
Definition Ownership.h:251
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
ActionResult< CXXCtorInitializer * > MemInitResult
Definition Ownership.h:253
const FunctionProtoType * T
llvm::Expected< QualType > ExpectedType
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
Definition Parser.h:81
ActionResult< CXXBaseSpecifier * > BaseResult
Definition Ownership.h:252
void EscapeStringForDiagnostic(StringRef Str, SmallVectorImpl< char > &OutStr)
EscapeStringForDiagnostic - Append Str to the diagnostic buffer, escaping non-printable characters an...
ReservedLiteralSuffixIdStatus
TagTypeKind
The kind of a tag type.
Definition TypeBase.h:5893
@ Interface
The "__interface" keyword.
Definition TypeBase.h:5898
@ Struct
The "struct" keyword.
Definition TypeBase.h:5895
@ Class
The "class" keyword.
Definition TypeBase.h:5904
ExprResult ExprError()
Definition Ownership.h:265
@ Keyword
The name has been typo-corrected to a keyword.
Definition Sema.h:560
@ Type
The name was classified as a type.
Definition Sema.h:562
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ CanPassInRegs
The argument of this type can be passed directly in registers.
Definition Decl.h:4300
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
Definition Decl.h:4314
@ CannotPassInRegs
The argument of this type cannot be passed directly in registers.
Definition Decl.h:4309
AllowFoldKind
Definition Sema.h:653
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
ComparisonCategoryType
An enumeration representing the different comparison categories types.
CXXSpecialMemberKind
Kinds of C++ special members.
Definition Sema.h:425
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
@ TNK_Concept_template
The name refers to a concept.
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:132
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:135
@ VK_XValue
An x-value expression is a reference to an object with independent storage but which can be "moved",...
Definition Specifiers.h:144
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:139
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:149
TypeAwareAllocationMode
Definition ExprCXX.h:2251
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1288
DynamicRecursiveASTVisitorBase< false > DynamicRecursiveASTVisitor
TrivialABIHandling
Definition Sema.h:643
@ ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
Definition Sema.h:648
@ IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
Definition Sema.h:645
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
Definition Sema.h:377
@ Success
Template argument deduction was successful.
Definition Sema.h:369
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
Definition Sema.h:383
TemplateSpecializationKind
Describes the kind of template specialization that a particular template specialization declaration r...
Definition Specifiers.h:188
@ TSK_ExplicitInstantiationDefinition
This template specialization was instantiated from a template due to an explicit instantiation defini...
Definition Specifiers.h:206
@ TSK_ExplicitInstantiationDeclaration
This template specialization was instantiated from a template due to an explicit instantiation declar...
Definition Specifiers.h:202
@ TSK_ExplicitSpecialization
This template specialization was declared or defined by an explicit specialization (C++ [temp....
Definition Specifiers.h:198
@ TSK_ImplicitInstantiation
This template specialization was implicitly instantiated from a template.
Definition Specifiers.h:194
@ TSK_Undeclared
This template specialization was formed from a template-id but has not yet been declared,...
Definition Specifiers.h:191
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:278
TypeAwareAllocationMode typeAwareAllocationModeFromBool(bool IsTypeAwareAllocation)
Definition ExprCXX.h:2258
U cast(CodeGen::Address addr)
Definition Address.h:327
@ StaticAssertMessageData
Call to data() in a static assert message.
Definition Sema.h:835
@ StaticAssertMessageSize
Call to size() in a static assert message.
Definition Sema.h:833
@ ExplicitBool
Condition in an explicit(bool) specifier.
Definition Sema.h:831
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition TypeBase.h:5868
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:5889
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5879
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:5882
bool isLambdaMethod(const DeclContext *DC)
Definition ASTLambda.h:39
bool isExternallyVisible(Linkage L)
Definition Linkage.h:90
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_Uninstantiated
not instantiated yet
@ EST_Unparsed
not parsed yet
@ EST_NoThrow
Microsoft __declspec(nothrow) extension.
@ EST_None
no exception specification
@ EST_MSAny
Microsoft throw(...) extension.
@ EST_BasicNoexcept
noexcept
@ EST_NoexceptFalse
noexcept(expression), evals to 'false'
@ EST_Unevaluated
not evaluated yet, for special member function
@ EST_NoexceptTrue
noexcept(expression), evals to 'true'
@ EST_Dynamic
throw(T1, T2)
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
Definition Specifiers.h:177
#define false
Definition stdbool.h:26
#define true
Definition stdbool.h:25
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:91
bool hasValidIntValue() const
True iff we've successfully evaluated the variable as a constant expression and extracted its integer...
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
SourceLocation getLoc() const
getLoc - Returns the main location of the declaration name.
DeclarationName getName() const
getName - Returns the embedded declaration name.
void setNamedTypeInfo(TypeSourceInfo *TInfo)
setNamedTypeInfo - Sets the source type info associated to the name.
void setName(DeclarationName N)
setName - Sets the embedded declaration name.
SourceLocation getBeginLoc() const
getBeginLoc - Retrieve the location of the first token.
SourceRange getSourceRange() const LLVM_READONLY
getSourceRange - The range of the declaration name.
SourceLocation getEndLoc() const LLVM_READONLY
bool containsUnexpandedParameterPack() const
Determine whether this name contains an unexpanded parameter pack.
unsigned isVariadic
isVariadic - If this function has a prototype, and if that proto ends with ',...)',...
Definition DeclSpec.h:1338
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
Definition DeclSpec.h:1398
unsigned RefQualifierIsLValueRef
Whether the ref-qualifier (if any) is an lvalue reference.
Definition DeclSpec.h:1347
DeclSpec * MethodQualifiers
DeclSpec for the function with the qualifier related info.
Definition DeclSpec.h:1401
SourceLocation getRefQualifierLoc() const
Retrieve the location of the ref-qualifier, if any.
Definition DeclSpec.h:1499
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
Definition DeclSpec.h:1373
bool hasMutableQualifier() const
Determine whether this lambda-declarator contains a 'mutable' qualifier.
Definition DeclSpec.h:1528
bool hasMethodTypeQualifiers() const
Determine whether this method has qualifiers.
Definition DeclSpec.h:1531
void freeParams()
Reset the parameter list to having zero parameters.
Definition DeclSpec.h:1437
bool hasRefQualifier() const
Determine whether this function declaration contains a ref-qualifier.
Definition DeclSpec.h:1524
std::unique_ptr< CachedTokens > DefaultArgTokens
DefaultArgTokens - When the parameter's default argument cannot be parsed immediately (because it occ...
Definition DeclSpec.h:1313
One instance of this struct is used for each type in a declarator that is parsed.
Definition DeclSpec.h:1221
SourceRange getSourceRange() const
Definition DeclSpec.h:1233
FunctionTypeInfo Fun
Definition DeclSpec.h:1612
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
EvalResult is a struct with detailed info about an evaluated expression.
Definition Expr.h:645
Holds information about the various types of exception specification.
Definition TypeBase.h:5326
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
Definition TypeBase.h:5338
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5328
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5331
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition TypeBase.h:5334
Extra information about a function prototype.
Definition TypeBase.h:5354
static StringRef getTagTypeKindName(TagTypeKind Kind)
Definition TypeBase.h:5932
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
Definition Type.cpp:3258
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Definition Type.cpp:3240
Describes how types, statements, expressions, and declarations should be printed.
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
Definition Sema.h:13078
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition Sema.h:13201
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition Sema.h:13172
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition Sema.h:13169
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition Sema.h:13122
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition Sema.h:13140
Decl * Entity
The entity that is being synthesized.
Definition Sema.h:13204
Abstract class used to diagnose incomplete types.
Definition Sema.h:8242
virtual void diagnose(Sema &S, SourceLocation Loc, QualType T)=0
Information about a template-id annotation token.
TemplateNameKind Kind
The kind of template that Template refers to.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
OpaquePtr< T > get() const
Definition Ownership.h:105