clang 20.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
17#include "clang/AST/CharUnits.h"
19#include "clang/AST/DeclCXX.h"
23#include "clang/AST/Expr.h"
24#include "clang/AST/ExprCXX.h"
27#include "clang/AST/TypeLoc.h"
36#include "clang/Sema/DeclSpec.h"
39#include "clang/Sema/Lookup.h"
42#include "clang/Sema/Scope.h"
44#include "clang/Sema/SemaCUDA.h"
46#include "clang/Sema/SemaObjC.h"
48#include "clang/Sema/Template.h"
49#include "llvm/ADT/ArrayRef.h"
50#include "llvm/ADT/STLExtras.h"
51#include "llvm/ADT/STLForwardCompat.h"
52#include "llvm/ADT/StringExtras.h"
53#include "llvm/Support/ConvertUTF.h"
54#include "llvm/Support/SaveAndRestore.h"
55#include <map>
56#include <optional>
57#include <set>
58
59using namespace clang;
60
61//===----------------------------------------------------------------------===//
62// CheckDefaultArgumentVisitor
63//===----------------------------------------------------------------------===//
64
65namespace {
66/// CheckDefaultArgumentVisitor - C++ [dcl.fct.default] Traverses
67/// the default argument of a parameter to determine whether it
68/// contains any ill-formed subexpressions. For example, this will
69/// diagnose the use of local variables or parameters within the
70/// default argument expression.
71class CheckDefaultArgumentVisitor
72 : public ConstStmtVisitor<CheckDefaultArgumentVisitor, bool> {
73 Sema &S;
74 const Expr *DefaultArg;
75
76public:
77 CheckDefaultArgumentVisitor(Sema &S, const Expr *DefaultArg)
78 : S(S), DefaultArg(DefaultArg) {}
79
80 bool VisitExpr(const Expr *Node);
81 bool VisitDeclRefExpr(const DeclRefExpr *DRE);
82 bool VisitCXXThisExpr(const CXXThisExpr *ThisE);
83 bool VisitLambdaExpr(const LambdaExpr *Lambda);
84 bool VisitPseudoObjectExpr(const PseudoObjectExpr *POE);
85};
86
87/// VisitExpr - Visit all of the children of this expression.
88bool CheckDefaultArgumentVisitor::VisitExpr(const Expr *Node) {
89 bool IsInvalid = false;
90 for (const Stmt *SubStmt : Node->children())
91 if (SubStmt)
92 IsInvalid |= Visit(SubStmt);
93 return IsInvalid;
94}
95
96/// VisitDeclRefExpr - Visit a reference to a declaration, to
97/// determine whether this declaration can be used in the default
98/// argument expression.
99bool CheckDefaultArgumentVisitor::VisitDeclRefExpr(const DeclRefExpr *DRE) {
100 const ValueDecl *Decl = dyn_cast<ValueDecl>(DRE->getDecl());
101
102 if (!isa<VarDecl, BindingDecl>(Decl))
103 return false;
104
105 if (const auto *Param = dyn_cast<ParmVarDecl>(Decl)) {
106 // C++ [dcl.fct.default]p9:
107 // [...] parameters of a function shall not be used in default
108 // argument expressions, even if they are not evaluated. [...]
109 //
110 // C++17 [dcl.fct.default]p9 (by CWG 2082):
111 // [...] A parameter shall not appear as a potentially-evaluated
112 // expression in a default argument. [...]
113 //
114 if (DRE->isNonOdrUse() != NOUR_Unevaluated)
115 return S.Diag(DRE->getBeginLoc(),
116 diag::err_param_default_argument_references_param)
117 << Param->getDeclName() << DefaultArg->getSourceRange();
118 } else if (auto *VD = Decl->getPotentiallyDecomposedVarDecl()) {
119 // C++ [dcl.fct.default]p7:
120 // Local variables shall not be used in default argument
121 // expressions.
122 //
123 // C++17 [dcl.fct.default]p7 (by CWG 2082):
124 // A local variable shall not appear as a potentially-evaluated
125 // expression in a default argument.
126 //
127 // C++20 [dcl.fct.default]p7 (DR as part of P0588R1, see also CWG 2346):
128 // Note: A local variable cannot be odr-used (6.3) in a default
129 // argument.
130 //
131 if (VD->isLocalVarDecl() && !DRE->isNonOdrUse())
132 return S.Diag(DRE->getBeginLoc(),
133 diag::err_param_default_argument_references_local)
134 << Decl << DefaultArg->getSourceRange();
135 }
136 return false;
137}
138
139/// VisitCXXThisExpr - Visit a C++ "this" expression.
140bool CheckDefaultArgumentVisitor::VisitCXXThisExpr(const CXXThisExpr *ThisE) {
141 // C++ [dcl.fct.default]p8:
142 // The keyword this shall not be used in a default argument of a
143 // member function.
144 return S.Diag(ThisE->getBeginLoc(),
145 diag::err_param_default_argument_references_this)
146 << ThisE->getSourceRange();
147}
148
149bool CheckDefaultArgumentVisitor::VisitPseudoObjectExpr(
150 const PseudoObjectExpr *POE) {
151 bool Invalid = false;
152 for (const Expr *E : POE->semantics()) {
153 // Look through bindings.
154 if (const auto *OVE = dyn_cast<OpaqueValueExpr>(E)) {
155 E = OVE->getSourceExpr();
156 assert(E && "pseudo-object binding without source expression?");
157 }
158
159 Invalid |= Visit(E);
160 }
161 return Invalid;
162}
163
164bool CheckDefaultArgumentVisitor::VisitLambdaExpr(const LambdaExpr *Lambda) {
165 // [expr.prim.lambda.capture]p9
166 // a lambda-expression appearing in a default argument cannot implicitly or
167 // explicitly capture any local entity. Such a lambda-expression can still
168 // have an init-capture if any full-expression in its initializer satisfies
169 // the constraints of an expression appearing in a default argument.
170 bool Invalid = false;
171 for (const LambdaCapture &LC : Lambda->captures()) {
172 if (!Lambda->isInitCapture(&LC))
173 return S.Diag(LC.getLocation(), diag::err_lambda_capture_default_arg);
174 // Init captures are always VarDecl.
175 auto *D = cast<VarDecl>(LC.getCapturedVar());
176 Invalid |= Visit(D->getInit());
177 }
178 return Invalid;
179}
180} // namespace
181
182void
184 const CXXMethodDecl *Method) {
185 // If we have an MSAny spec already, don't bother.
186 if (!Method || ComputedEST == EST_MSAny)
187 return;
188
189 const FunctionProtoType *Proto
190 = Method->getType()->getAs<FunctionProtoType>();
191 Proto = Self->ResolveExceptionSpec(CallLoc, Proto);
192 if (!Proto)
193 return;
194
196
197 // If we have a throw-all spec at this point, ignore the function.
198 if (ComputedEST == EST_None)
199 return;
200
201 if (EST == EST_None && Method->hasAttr<NoThrowAttr>())
202 EST = EST_BasicNoexcept;
203
204 switch (EST) {
205 case EST_Unparsed:
207 case EST_Unevaluated:
208 llvm_unreachable("should not see unresolved exception specs here");
209
210 // If this function can throw any exceptions, make a note of that.
211 case EST_MSAny:
212 case EST_None:
213 // FIXME: Whichever we see last of MSAny and None determines our result.
214 // We should make a consistent, order-independent choice here.
215 ClearExceptions();
216 ComputedEST = EST;
217 return;
219 ClearExceptions();
220 ComputedEST = EST_None;
221 return;
222 // FIXME: If the call to this decl is using any of its default arguments, we
223 // need to search them for potentially-throwing calls.
224 // If this function has a basic noexcept, it doesn't affect the outcome.
226 case EST_NoexceptTrue:
227 case EST_NoThrow:
228 return;
229 // If we're still at noexcept(true) and there's a throw() callee,
230 // change to that specification.
231 case EST_DynamicNone:
232 if (ComputedEST == EST_BasicNoexcept)
233 ComputedEST = EST_DynamicNone;
234 return;
236 llvm_unreachable(
237 "should not generate implicit declarations for dependent cases");
238 case EST_Dynamic:
239 break;
240 }
241 assert(EST == EST_Dynamic && "EST case not considered earlier.");
242 assert(ComputedEST != EST_None &&
243 "Shouldn't collect exceptions when throw-all is guaranteed.");
244 ComputedEST = EST_Dynamic;
245 // Record the exceptions in this function's exception specification.
246 for (const auto &E : Proto->exceptions())
247 if (ExceptionsSeen.insert(Self->Context.getCanonicalType(E)).second)
248 Exceptions.push_back(E);
249}
250
252 if (!S || ComputedEST == EST_MSAny)
253 return;
254
255 // FIXME:
256 //
257 // C++0x [except.spec]p14:
258 // [An] implicit exception-specification specifies the type-id T if and
259 // only if T is allowed by the exception-specification of a function directly
260 // invoked by f's implicit definition; f shall allow all exceptions if any
261 // function it directly invokes allows all exceptions, and f shall allow no
262 // exceptions if every function it directly invokes allows no exceptions.
263 //
264 // Note in particular that if an implicit exception-specification is generated
265 // for a function containing a throw-expression, that specification can still
266 // be noexcept(true).
267 //
268 // Note also that 'directly invoked' is not defined in the standard, and there
269 // is no indication that we should only consider potentially-evaluated calls.
270 //
271 // Ultimately we should implement the intent of the standard: the exception
272 // specification should be the set of exceptions which can be thrown by the
273 // implicit definition. For now, we assume that any non-nothrow expression can
274 // throw any exception.
275
276 if (Self->canThrow(S))
277 ComputedEST = EST_None;
278}
279
281 SourceLocation EqualLoc) {
282 if (RequireCompleteType(Param->getLocation(), Param->getType(),
283 diag::err_typecheck_decl_incomplete_type))
284 return true;
285
286 // C++ [dcl.fct.default]p5
287 // A default argument expression is implicitly converted (clause
288 // 4) to the parameter type. The default argument expression has
289 // the same semantic constraints as the initializer expression in
290 // a declaration of a variable of the parameter type, using the
291 // copy-initialization semantics (8.5).
293 Param);
295 EqualLoc);
296 InitializationSequence InitSeq(*this, Entity, Kind, Arg);
297 ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Arg);
298 if (Result.isInvalid())
299 return true;
300 Arg = Result.getAs<Expr>();
301
302 CheckCompletedExpr(Arg, EqualLoc);
304
305 return Arg;
306}
307
309 SourceLocation EqualLoc) {
310 // Add the default argument to the parameter
311 Param->setDefaultArg(Arg);
312
313 // We have already instantiated this parameter; provide each of the
314 // instantiations with the uninstantiated default argument.
315 UnparsedDefaultArgInstantiationsMap::iterator InstPos
317 if (InstPos != UnparsedDefaultArgInstantiations.end()) {
318 for (unsigned I = 0, N = InstPos->second.size(); I != N; ++I)
319 InstPos->second[I]->setUninstantiatedDefaultArg(Arg);
320
321 // We're done tracking this parameter's instantiations.
323 }
324}
325
326void
328 Expr *DefaultArg) {
329 if (!param || !DefaultArg)
330 return;
331
332 ParmVarDecl *Param = cast<ParmVarDecl>(param);
333 UnparsedDefaultArgLocs.erase(Param);
334
335 // Default arguments are only permitted in C++
336 if (!getLangOpts().CPlusPlus) {
337 Diag(EqualLoc, diag::err_param_default_argument)
338 << DefaultArg->getSourceRange();
339 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
340 }
341
342 // Check for unexpanded parameter packs.
344 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
345
346 // C++11 [dcl.fct.default]p3
347 // A default argument expression [...] shall not be specified for a
348 // parameter pack.
349 if (Param->isParameterPack()) {
350 Diag(EqualLoc, diag::err_param_default_argument_on_parameter_pack)
351 << DefaultArg->getSourceRange();
352 // Recover by discarding the default argument.
353 Param->setDefaultArg(nullptr);
354 return;
355 }
356
357 ExprResult Result = ConvertParamDefaultArgument(Param, DefaultArg, EqualLoc);
358 if (Result.isInvalid())
359 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
360
361 DefaultArg = Result.getAs<Expr>();
362
363 // Check that the default argument is well-formed
364 CheckDefaultArgumentVisitor DefaultArgChecker(*this, DefaultArg);
365 if (DefaultArgChecker.Visit(DefaultArg))
366 return ActOnParamDefaultArgumentError(param, EqualLoc, DefaultArg);
367
368 SetParamDefaultArgument(Param, DefaultArg, EqualLoc);
369}
370
372 SourceLocation EqualLoc,
373 SourceLocation ArgLoc) {
374 if (!param)
375 return;
376
377 ParmVarDecl *Param = cast<ParmVarDecl>(param);
378 Param->setUnparsedDefaultArg();
379 UnparsedDefaultArgLocs[Param] = ArgLoc;
380}
381
383 Expr *DefaultArg) {
384 if (!param)
385 return;
386
387 ParmVarDecl *Param = cast<ParmVarDecl>(param);
388 Param->setInvalidDecl();
389 UnparsedDefaultArgLocs.erase(Param);
390 ExprResult RE;
391 if (DefaultArg) {
392 RE = CreateRecoveryExpr(EqualLoc, DefaultArg->getEndLoc(), {DefaultArg},
393 Param->getType().getNonReferenceType());
394 } else {
395 RE = CreateRecoveryExpr(EqualLoc, EqualLoc, {},
396 Param->getType().getNonReferenceType());
397 }
398 Param->setDefaultArg(RE.get());
399}
400
402 // C++ [dcl.fct.default]p3
403 // A default argument expression shall be specified only in the
404 // parameter-declaration-clause of a function declaration or in a
405 // template-parameter (14.1). It shall not be specified for a
406 // parameter pack. If it is specified in a
407 // parameter-declaration-clause, it shall not occur within a
408 // declarator or abstract-declarator of a parameter-declaration.
409 bool MightBeFunction = D.isFunctionDeclarationContext();
410 for (unsigned i = 0, e = D.getNumTypeObjects(); i != e; ++i) {
411 DeclaratorChunk &chunk = D.getTypeObject(i);
412 if (chunk.Kind == DeclaratorChunk::Function) {
413 if (MightBeFunction) {
414 // This is a function declaration. It can have default arguments, but
415 // keep looking in case its return type is a function type with default
416 // arguments.
417 MightBeFunction = false;
418 continue;
419 }
420 for (unsigned argIdx = 0, e = chunk.Fun.NumParams; argIdx != e;
421 ++argIdx) {
422 ParmVarDecl *Param = cast<ParmVarDecl>(chunk.Fun.Params[argIdx].Param);
423 if (Param->hasUnparsedDefaultArg()) {
424 std::unique_ptr<CachedTokens> Toks =
425 std::move(chunk.Fun.Params[argIdx].DefaultArgTokens);
426 SourceRange SR;
427 if (Toks->size() > 1)
428 SR = SourceRange((*Toks)[1].getLocation(),
429 Toks->back().getLocation());
430 else
431 SR = UnparsedDefaultArgLocs[Param];
432 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
433 << SR;
434 } else if (Param->getDefaultArg()) {
435 Diag(Param->getLocation(), diag::err_param_default_argument_nonfunc)
436 << Param->getDefaultArg()->getSourceRange();
437 Param->setDefaultArg(nullptr);
438 }
439 }
440 } else if (chunk.Kind != DeclaratorChunk::Paren) {
441 MightBeFunction = false;
442 }
443 }
444}
445
447 return llvm::any_of(FD->parameters(), [](ParmVarDecl *P) {
448 return P->hasDefaultArg() && !P->hasInheritedDefaultArg();
449 });
450}
451
453 Scope *S) {
454 bool Invalid = false;
455
456 // The declaration context corresponding to the scope is the semantic
457 // parent, unless this is a local function declaration, in which case
458 // it is that surrounding function.
459 DeclContext *ScopeDC = New->isLocalExternDecl()
460 ? New->getLexicalDeclContext()
461 : New->getDeclContext();
462
463 // Find the previous declaration for the purpose of default arguments.
464 FunctionDecl *PrevForDefaultArgs = Old;
465 for (/**/; PrevForDefaultArgs;
466 // Don't bother looking back past the latest decl if this is a local
467 // extern declaration; nothing else could work.
468 PrevForDefaultArgs = New->isLocalExternDecl()
469 ? nullptr
470 : PrevForDefaultArgs->getPreviousDecl()) {
471 // Ignore hidden declarations.
472 if (!LookupResult::isVisible(*this, PrevForDefaultArgs))
473 continue;
474
475 if (S && !isDeclInScope(PrevForDefaultArgs, ScopeDC, S) &&
476 !New->isCXXClassMember()) {
477 // Ignore default arguments of old decl if they are not in
478 // the same scope and this is not an out-of-line definition of
479 // a member function.
480 continue;
481 }
482
483 if (PrevForDefaultArgs->isLocalExternDecl() != New->isLocalExternDecl()) {
484 // If only one of these is a local function declaration, then they are
485 // declared in different scopes, even though isDeclInScope may think
486 // they're in the same scope. (If both are local, the scope check is
487 // sufficient, and if neither is local, then they are in the same scope.)
488 continue;
489 }
490
491 // We found the right previous declaration.
492 break;
493 }
494
495 // C++ [dcl.fct.default]p4:
496 // For non-template functions, default arguments can be added in
497 // later declarations of a function in the same
498 // scope. Declarations in different scopes have completely
499 // distinct sets of default arguments. That is, declarations in
500 // inner scopes do not acquire default arguments from
501 // declarations in outer scopes, and vice versa. In a given
502 // function declaration, all parameters subsequent to a
503 // parameter with a default argument shall have default
504 // arguments supplied in this or previous declarations. A
505 // default argument shall not be redefined by a later
506 // declaration (not even to the same value).
507 //
508 // C++ [dcl.fct.default]p6:
509 // Except for member functions of class templates, the default arguments
510 // in a member function definition that appears outside of the class
511 // definition are added to the set of default arguments provided by the
512 // member function declaration in the class definition.
513 for (unsigned p = 0, NumParams = PrevForDefaultArgs
514 ? PrevForDefaultArgs->getNumParams()
515 : 0;
516 p < NumParams; ++p) {
517 ParmVarDecl *OldParam = PrevForDefaultArgs->getParamDecl(p);
518 ParmVarDecl *NewParam = New->getParamDecl(p);
519
520 bool OldParamHasDfl = OldParam ? OldParam->hasDefaultArg() : false;
521 bool NewParamHasDfl = NewParam->hasDefaultArg();
522
523 if (OldParamHasDfl && NewParamHasDfl) {
524 unsigned DiagDefaultParamID =
525 diag::err_param_default_argument_redefinition;
526
527 // MSVC accepts that default parameters be redefined for member functions
528 // of template class. The new default parameter's value is ignored.
529 Invalid = true;
530 if (getLangOpts().MicrosoftExt) {
531 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(New);
532 if (MD && MD->getParent()->getDescribedClassTemplate()) {
533 // Merge the old default argument into the new parameter.
534 NewParam->setHasInheritedDefaultArg();
535 if (OldParam->hasUninstantiatedDefaultArg())
537 OldParam->getUninstantiatedDefaultArg());
538 else
539 NewParam->setDefaultArg(OldParam->getInit());
540 DiagDefaultParamID = diag::ext_param_default_argument_redefinition;
541 Invalid = false;
542 }
543 }
544
545 // FIXME: If we knew where the '=' was, we could easily provide a fix-it
546 // hint here. Alternatively, we could walk the type-source information
547 // for NewParam to find the last source location in the type... but it
548 // isn't worth the effort right now. This is the kind of test case that
549 // is hard to get right:
550 // int f(int);
551 // void g(int (*fp)(int) = f);
552 // void g(int (*fp)(int) = &f);
553 Diag(NewParam->getLocation(), DiagDefaultParamID)
554 << NewParam->getDefaultArgRange();
555
556 // Look for the function declaration where the default argument was
557 // actually written, which may be a declaration prior to Old.
558 for (auto Older = PrevForDefaultArgs;
559 OldParam->hasInheritedDefaultArg(); /**/) {
560 Older = Older->getPreviousDecl();
561 OldParam = Older->getParamDecl(p);
562 }
563
564 Diag(OldParam->getLocation(), diag::note_previous_definition)
565 << OldParam->getDefaultArgRange();
566 } else if (OldParamHasDfl) {
567 // Merge the old default argument into the new parameter unless the new
568 // function is a friend declaration in a template class. In the latter
569 // case the default arguments will be inherited when the friend
570 // declaration will be instantiated.
571 if (New->getFriendObjectKind() == Decl::FOK_None ||
573 // It's important to use getInit() here; getDefaultArg()
574 // strips off any top-level ExprWithCleanups.
575 NewParam->setHasInheritedDefaultArg();
576 if (OldParam->hasUnparsedDefaultArg())
577 NewParam->setUnparsedDefaultArg();
578 else if (OldParam->hasUninstantiatedDefaultArg())
580 OldParam->getUninstantiatedDefaultArg());
581 else
582 NewParam->setDefaultArg(OldParam->getInit());
583 }
584 } else if (NewParamHasDfl) {
585 if (New->getDescribedFunctionTemplate()) {
586 // Paragraph 4, quoted above, only applies to non-template functions.
587 Diag(NewParam->getLocation(),
588 diag::err_param_default_argument_template_redecl)
589 << NewParam->getDefaultArgRange();
590 Diag(PrevForDefaultArgs->getLocation(),
591 diag::note_template_prev_declaration)
592 << false;
593 } else if (New->getTemplateSpecializationKind()
596 // C++ [temp.expr.spec]p21:
597 // Default function arguments shall not be specified in a declaration
598 // or a definition for one of the following explicit specializations:
599 // - the explicit specialization of a function template;
600 // - the explicit specialization of a member function template;
601 // - the explicit specialization of a member function of a class
602 // template where the class template specialization to which the
603 // member function specialization belongs is implicitly
604 // instantiated.
605 Diag(NewParam->getLocation(), diag::err_template_spec_default_arg)
607 << New->getDeclName()
608 << NewParam->getDefaultArgRange();
609 } else if (New->getDeclContext()->isDependentContext()) {
610 // C++ [dcl.fct.default]p6 (DR217):
611 // Default arguments for a member function of a class template shall
612 // be specified on the initial declaration of the member function
613 // within the class template.
614 //
615 // Reading the tea leaves a bit in DR217 and its reference to DR205
616 // leads me to the conclusion that one cannot add default function
617 // arguments for an out-of-line definition of a member function of a
618 // dependent type.
619 int WhichKind = 2;
621 = dyn_cast<CXXRecordDecl>(New->getDeclContext())) {
622 if (Record->getDescribedClassTemplate())
623 WhichKind = 0;
624 else if (isa<ClassTemplatePartialSpecializationDecl>(Record))
625 WhichKind = 1;
626 else
627 WhichKind = 2;
628 }
629
630 Diag(NewParam->getLocation(),
631 diag::err_param_default_argument_member_template_redecl)
632 << WhichKind
633 << NewParam->getDefaultArgRange();
634 }
635 }
636 }
637
638 // DR1344: If a default argument is added outside a class definition and that
639 // default argument makes the function a special member function, the program
640 // is ill-formed. This can only happen for constructors.
641 if (isa<CXXConstructorDecl>(New) &&
643 CXXSpecialMemberKind NewSM = getSpecialMember(cast<CXXMethodDecl>(New)),
644 OldSM = getSpecialMember(cast<CXXMethodDecl>(Old));
645 if (NewSM != OldSM) {
646 ParmVarDecl *NewParam = New->getParamDecl(New->getMinRequiredArguments());
647 assert(NewParam->hasDefaultArg());
648 Diag(NewParam->getLocation(), diag::err_default_arg_makes_ctor_special)
649 << NewParam->getDefaultArgRange() << llvm::to_underlying(NewSM);
650 Diag(Old->getLocation(), diag::note_previous_declaration);
651 }
652 }
653
654 const FunctionDecl *Def;
655 // C++11 [dcl.constexpr]p1: If any declaration of a function or function
656 // template has a constexpr specifier then all its declarations shall
657 // contain the constexpr specifier.
658 if (New->getConstexprKind() != Old->getConstexprKind()) {
659 Diag(New->getLocation(), diag::err_constexpr_redecl_mismatch)
660 << New << static_cast<int>(New->getConstexprKind())
661 << static_cast<int>(Old->getConstexprKind());
662 Diag(Old->getLocation(), diag::note_previous_declaration);
663 Invalid = true;
664 } else if (!Old->getMostRecentDecl()->isInlined() && New->isInlined() &&
665 Old->isDefined(Def) &&
666 // If a friend function is inlined but does not have 'inline'
667 // specifier, it is a definition. Do not report attribute conflict
668 // in this case, redefinition will be diagnosed later.
669 (New->isInlineSpecified() ||
671 // C++11 [dcl.fcn.spec]p4:
672 // If the definition of a function appears in a translation unit before its
673 // first declaration as inline, the program is ill-formed.
674 Diag(New->getLocation(), diag::err_inline_decl_follows_def) << New;
675 Diag(Def->getLocation(), diag::note_previous_definition);
676 Invalid = true;
677 }
678
679 // C++17 [temp.deduct.guide]p3:
680 // Two deduction guide declarations in the same translation unit
681 // for the same class template shall not have equivalent
682 // parameter-declaration-clauses.
683 if (isa<CXXDeductionGuideDecl>(New) &&
685 Diag(New->getLocation(), diag::err_deduction_guide_redeclared);
686 Diag(Old->getLocation(), diag::note_previous_declaration);
687 }
688
689 // C++11 [dcl.fct.default]p4: If a friend declaration specifies a default
690 // argument expression, that declaration shall be a definition and shall be
691 // the only declaration of the function or function template in the
692 // translation unit.
695 Diag(New->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
696 Diag(Old->getLocation(), diag::note_previous_declaration);
697 Invalid = true;
698 }
699
700 // C++11 [temp.friend]p4 (DR329):
701 // When a function is defined in a friend function declaration in a class
702 // template, the function is instantiated when the function is odr-used.
703 // The same restrictions on multiple declarations and definitions that
704 // apply to non-template function declarations and definitions also apply
705 // to these implicit definitions.
706 const FunctionDecl *OldDefinition = nullptr;
708 Old->isDefined(OldDefinition, true))
709 CheckForFunctionRedefinition(New, OldDefinition);
710
711 return Invalid;
712}
713
716 ? diag::warn_cxx23_placeholder_var_definition
717 : diag::ext_placeholder_var_definition);
718}
719
720NamedDecl *
722 MultiTemplateParamsArg TemplateParamLists) {
723 assert(D.isDecompositionDeclarator());
724 const DecompositionDeclarator &Decomp = D.getDecompositionDeclarator();
725
726 // The syntax only allows a decomposition declarator as a simple-declaration,
727 // a for-range-declaration, or a condition in Clang, but we parse it in more
728 // cases than that.
729 if (!D.mayHaveDecompositionDeclarator()) {
730 Diag(Decomp.getLSquareLoc(), diag::err_decomp_decl_context)
731 << Decomp.getSourceRange();
732 return nullptr;
733 }
734
735 if (!TemplateParamLists.empty()) {
736 // FIXME: There's no rule against this, but there are also no rules that
737 // would actually make it usable, so we reject it for now.
738 Diag(TemplateParamLists.front()->getTemplateLoc(),
739 diag::err_decomp_decl_template);
740 return nullptr;
741 }
742
743 Diag(Decomp.getLSquareLoc(),
745 ? diag::ext_decomp_decl
746 : D.getContext() == DeclaratorContext::Condition
747 ? diag::ext_decomp_decl_cond
748 : diag::warn_cxx14_compat_decomp_decl)
749 << Decomp.getSourceRange();
750
751 // The semantic context is always just the current context.
752 DeclContext *const DC = CurContext;
753
754 // C++17 [dcl.dcl]/8:
755 // The decl-specifier-seq shall contain only the type-specifier auto
756 // and cv-qualifiers.
757 // C++20 [dcl.dcl]/8:
758 // If decl-specifier-seq contains any decl-specifier other than static,
759 // thread_local, auto, or cv-qualifiers, the program is ill-formed.
760 // C++23 [dcl.pre]/6:
761 // Each decl-specifier in the decl-specifier-seq shall be static,
762 // thread_local, auto (9.2.9.6 [dcl.spec.auto]), or a cv-qualifier.
763 auto &DS = D.getDeclSpec();
764 {
765 // Note: While constrained-auto needs to be checked, we do so separately so
766 // we can emit a better diagnostic.
767 SmallVector<StringRef, 8> BadSpecifiers;
768 SmallVector<SourceLocation, 8> BadSpecifierLocs;
769 SmallVector<StringRef, 8> CPlusPlus20Specifiers;
770 SmallVector<SourceLocation, 8> CPlusPlus20SpecifierLocs;
771 if (auto SCS = DS.getStorageClassSpec()) {
772 if (SCS == DeclSpec::SCS_static) {
773 CPlusPlus20Specifiers.push_back(DeclSpec::getSpecifierName(SCS));
774 CPlusPlus20SpecifierLocs.push_back(DS.getStorageClassSpecLoc());
775 } else {
776 BadSpecifiers.push_back(DeclSpec::getSpecifierName(SCS));
777 BadSpecifierLocs.push_back(DS.getStorageClassSpecLoc());
778 }
779 }
780 if (auto TSCS = DS.getThreadStorageClassSpec()) {
781 CPlusPlus20Specifiers.push_back(DeclSpec::getSpecifierName(TSCS));
782 CPlusPlus20SpecifierLocs.push_back(DS.getThreadStorageClassSpecLoc());
783 }
784 if (DS.hasConstexprSpecifier()) {
785 BadSpecifiers.push_back(
786 DeclSpec::getSpecifierName(DS.getConstexprSpecifier()));
787 BadSpecifierLocs.push_back(DS.getConstexprSpecLoc());
788 }
789 if (DS.isInlineSpecified()) {
790 BadSpecifiers.push_back("inline");
791 BadSpecifierLocs.push_back(DS.getInlineSpecLoc());
792 }
793
794 if (!BadSpecifiers.empty()) {
795 auto &&Err = Diag(BadSpecifierLocs.front(), diag::err_decomp_decl_spec);
796 Err << (int)BadSpecifiers.size()
797 << llvm::join(BadSpecifiers.begin(), BadSpecifiers.end(), " ");
798 // Don't add FixItHints to remove the specifiers; we do still respect
799 // them when building the underlying variable.
800 for (auto Loc : BadSpecifierLocs)
801 Err << SourceRange(Loc, Loc);
802 } else if (!CPlusPlus20Specifiers.empty()) {
803 auto &&Warn = Diag(CPlusPlus20SpecifierLocs.front(),
805 ? diag::warn_cxx17_compat_decomp_decl_spec
806 : diag::ext_decomp_decl_spec);
807 Warn << (int)CPlusPlus20Specifiers.size()
808 << llvm::join(CPlusPlus20Specifiers.begin(),
809 CPlusPlus20Specifiers.end(), " ");
810 for (auto Loc : CPlusPlus20SpecifierLocs)
811 Warn << SourceRange(Loc, Loc);
812 }
813 // We can't recover from it being declared as a typedef.
814 if (DS.getStorageClassSpec() == DeclSpec::SCS_typedef)
815 return nullptr;
816 }
817
818 // C++2a [dcl.struct.bind]p1:
819 // A cv that includes volatile is deprecated
820 if ((DS.getTypeQualifiers() & DeclSpec::TQ_volatile) &&
822 Diag(DS.getVolatileSpecLoc(),
823 diag::warn_deprecated_volatile_structured_binding);
824
826 QualType R = TInfo->getType();
827
828 if (DiagnoseUnexpandedParameterPack(D.getIdentifierLoc(), TInfo,
830 D.setInvalidType();
831
832 // The syntax only allows a single ref-qualifier prior to the decomposition
833 // declarator. No other declarator chunks are permitted. Also check the type
834 // specifier here.
835 if (DS.getTypeSpecType() != DeclSpec::TST_auto ||
836 D.hasGroupingParens() || D.getNumTypeObjects() > 1 ||
837 (D.getNumTypeObjects() == 1 &&
838 D.getTypeObject(0).Kind != DeclaratorChunk::Reference)) {
839 Diag(Decomp.getLSquareLoc(),
840 (D.hasGroupingParens() ||
841 (D.getNumTypeObjects() &&
842 D.getTypeObject(0).Kind == DeclaratorChunk::Paren))
843 ? diag::err_decomp_decl_parens
844 : diag::err_decomp_decl_type)
845 << R;
846
847 // In most cases, there's no actual problem with an explicitly-specified
848 // type, but a function type won't work here, and ActOnVariableDeclarator
849 // shouldn't be called for such a type.
850 if (R->isFunctionType())
851 D.setInvalidType();
852 }
853
854 // Constrained auto is prohibited by [decl.pre]p6, so check that here.
855 if (DS.isConstrainedAuto()) {
856 TemplateIdAnnotation *TemplRep = DS.getRepAsTemplateId();
857 assert(TemplRep->Kind == TNK_Concept_template &&
858 "No other template kind should be possible for a constrained auto");
859
860 SourceRange TemplRange{TemplRep->TemplateNameLoc,
861 TemplRep->RAngleLoc.isValid()
862 ? TemplRep->RAngleLoc
863 : TemplRep->TemplateNameLoc};
864 Diag(TemplRep->TemplateNameLoc, diag::err_decomp_decl_constraint)
865 << TemplRange << FixItHint::CreateRemoval(TemplRange);
866 }
867
868 // Build the BindingDecls.
870
871 // Build the BindingDecls.
872 for (auto &B : D.getDecompositionDeclarator().bindings()) {
873 // Check for name conflicts.
874 DeclarationNameInfo NameInfo(B.Name, B.NameLoc);
875 IdentifierInfo *VarName = B.Name;
876 assert(VarName && "Cannot have an unnamed binding declaration");
877
879 RedeclarationKind::ForVisibleRedeclaration);
881 /*CreateBuiltins*/DC->getRedeclContext()->isTranslationUnit());
882
883 // It's not permitted to shadow a template parameter name.
884 if (Previous.isSingleResult() &&
885 Previous.getFoundDecl()->isTemplateParameter()) {
886 DiagnoseTemplateParameterShadow(D.getIdentifierLoc(),
887 Previous.getFoundDecl());
888 Previous.clear();
889 }
890
891 auto *BD = BindingDecl::Create(Context, DC, B.NameLoc, VarName);
892
893 ProcessDeclAttributeList(S, BD, *B.Attrs);
894
895 // Find the shadowed declaration before filtering for scope.
896 NamedDecl *ShadowedDecl = D.getCXXScopeSpec().isEmpty()
898 : nullptr;
899
900 bool ConsiderLinkage = DC->isFunctionOrMethod() &&
901 DS.getStorageClassSpec() == DeclSpec::SCS_extern;
902 FilterLookupForScope(Previous, DC, S, ConsiderLinkage,
903 /*AllowInlineNamespace*/false);
904
905 bool IsPlaceholder = DS.getStorageClassSpec() != DeclSpec::SCS_static &&
906 DC->isFunctionOrMethod() && VarName->isPlaceholder();
907 if (!Previous.empty()) {
908 if (IsPlaceholder) {
909 bool sameDC = (Previous.end() - 1)
910 ->getDeclContext()
911 ->getRedeclContext()
912 ->Equals(DC->getRedeclContext());
913 if (sameDC &&
914 isDeclInScope(*(Previous.end() - 1), CurContext, S, false)) {
915 Previous.clear();
917 }
918 } else {
919 auto *Old = Previous.getRepresentativeDecl();
920 Diag(B.NameLoc, diag::err_redefinition) << B.Name;
921 Diag(Old->getLocation(), diag::note_previous_definition);
922 }
923 } else if (ShadowedDecl && !D.isRedeclaration()) {
924 CheckShadow(BD, ShadowedDecl, Previous);
925 }
926 PushOnScopeChains(BD, S, true);
927 Bindings.push_back(BD);
928 ParsingInitForAutoVars.insert(BD);
929 }
930
931 // There are no prior lookup results for the variable itself, because it
932 // is unnamed.
933 DeclarationNameInfo NameInfo((IdentifierInfo *)nullptr,
934 Decomp.getLSquareLoc());
936 RedeclarationKind::ForVisibleRedeclaration);
937
938 // Build the variable that holds the non-decomposed object.
939 bool AddToScope = true;
940 NamedDecl *New =
941 ActOnVariableDeclarator(S, D, DC, TInfo, Previous,
942 MultiTemplateParamsArg(), AddToScope, Bindings);
943 if (AddToScope) {
944 S->AddDecl(New);
946 }
947
948 if (OpenMP().isInOpenMPDeclareTargetContext())
950
951 return New;
952}
953
956 QualType DecompType, const llvm::APSInt &NumElems, QualType ElemType,
957 llvm::function_ref<ExprResult(SourceLocation, Expr *, unsigned)> GetInit) {
958 if ((int64_t)Bindings.size() != NumElems) {
959 S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings)
960 << DecompType << (unsigned)Bindings.size()
961 << (unsigned)NumElems.getLimitedValue(UINT_MAX)
962 << toString(NumElems, 10) << (NumElems < Bindings.size());
963 return true;
964 }
965
966 unsigned I = 0;
967 for (auto *B : Bindings) {
968 SourceLocation Loc = B->getLocation();
969 ExprResult E = S.BuildDeclRefExpr(Src, DecompType, VK_LValue, Loc);
970 if (E.isInvalid())
971 return true;
972 E = GetInit(Loc, E.get(), I++);
973 if (E.isInvalid())
974 return true;
975 B->setBinding(ElemType, E.get());
976 }
977
978 return false;
979}
980
983 ValueDecl *Src, QualType DecompType,
984 const llvm::APSInt &NumElems,
985 QualType ElemType) {
987 S, Bindings, Src, DecompType, NumElems, ElemType,
988 [&](SourceLocation Loc, Expr *Base, unsigned I) -> ExprResult {
990 if (E.isInvalid())
991 return ExprError();
992 return S.CreateBuiltinArraySubscriptExpr(Base, Loc, E.get(), Loc);
993 });
994}
995
997 ValueDecl *Src, QualType DecompType,
998 const ConstantArrayType *CAT) {
999 return checkArrayLikeDecomposition(S, Bindings, Src, DecompType,
1000 llvm::APSInt(CAT->getSize()),
1001 CAT->getElementType());
1002}
1003
1005 ValueDecl *Src, QualType DecompType,
1006 const VectorType *VT) {
1008 S, Bindings, Src, DecompType, llvm::APSInt::get(VT->getNumElements()),
1010 DecompType.getQualifiers()));
1011}
1012
1015 ValueDecl *Src, QualType DecompType,
1016 const ComplexType *CT) {
1018 S, Bindings, Src, DecompType, llvm::APSInt::get(2),
1020 DecompType.getQualifiers()),
1021 [&](SourceLocation Loc, Expr *Base, unsigned I) -> ExprResult {
1022 return S.CreateBuiltinUnaryOp(Loc, I ? UO_Imag : UO_Real, Base);
1023 });
1024}
1025
1028 const TemplateParameterList *Params) {
1030 llvm::raw_svector_ostream OS(SS);
1031 bool First = true;
1032 unsigned I = 0;
1033 for (auto &Arg : Args.arguments()) {
1034 if (!First)
1035 OS << ", ";
1036 Arg.getArgument().print(PrintingPolicy, OS,
1038 PrintingPolicy, Params, I));
1039 First = false;
1040 I++;
1041 }
1042 return std::string(OS.str());
1043}
1044
1045static bool lookupStdTypeTraitMember(Sema &S, LookupResult &TraitMemberLookup,
1046 SourceLocation Loc, StringRef Trait,
1048 unsigned DiagID) {
1049 auto DiagnoseMissing = [&] {
1050 if (DiagID)
1052 Args, /*Params*/ nullptr);
1053 return true;
1054 };
1055
1056 // FIXME: Factor out duplication with lookupPromiseType in SemaCoroutine.
1058 if (!Std)
1059 return DiagnoseMissing();
1060
1061 // Look up the trait itself, within namespace std. We can diagnose various
1062 // problems with this lookup even if we've been asked to not diagnose a
1063 // missing specialization, because this can only fail if the user has been
1064 // declaring their own names in namespace std or we don't support the
1065 // standard library implementation in use.
1069 return DiagnoseMissing();
1070 if (Result.isAmbiguous())
1071 return true;
1072
1073 ClassTemplateDecl *TraitTD = Result.getAsSingle<ClassTemplateDecl>();
1074 if (!TraitTD) {
1075 Result.suppressDiagnostics();
1076 NamedDecl *Found = *Result.begin();
1077 S.Diag(Loc, diag::err_std_type_trait_not_class_template) << Trait;
1078 S.Diag(Found->getLocation(), diag::note_declared_at);
1079 return true;
1080 }
1081
1082 // Build the template-id.
1083 QualType TraitTy = S.CheckTemplateIdType(TemplateName(TraitTD), Loc, Args);
1084 if (TraitTy.isNull())
1085 return true;
1086 if (!S.isCompleteType(Loc, TraitTy)) {
1087 if (DiagID)
1089 Loc, TraitTy, DiagID,
1091 TraitTD->getTemplateParameters()));
1092 return true;
1093 }
1094
1095 CXXRecordDecl *RD = TraitTy->getAsCXXRecordDecl();
1096 assert(RD && "specialization of class template is not a class?");
1097
1098 // Look up the member of the trait type.
1099 S.LookupQualifiedName(TraitMemberLookup, RD);
1100 return TraitMemberLookup.isAmbiguous();
1101}
1102
1105 uint64_t I) {
1107 return S.getTrivialTemplateArgumentLoc(Arg, T, Loc);
1108}
1109
1113}
1114
1115namespace { enum class IsTupleLike { TupleLike, NotTupleLike, Error }; }
1116
1118 llvm::APSInt &Size) {
1121
1124
1125 // Form template argument list for tuple_size<T>.
1128
1129 // If there's no tuple_size specialization or the lookup of 'value' is empty,
1130 // it's not tuple-like.
1131 if (lookupStdTypeTraitMember(S, R, Loc, "tuple_size", Args, /*DiagID*/ 0) ||
1132 R.empty())
1133 return IsTupleLike::NotTupleLike;
1134
1135 // If we get this far, we've committed to the tuple interpretation, but
1136 // we can still fail if there actually isn't a usable ::value.
1137
1138 struct ICEDiagnoser : Sema::VerifyICEDiagnoser {
1139 LookupResult &R;
1141 ICEDiagnoser(LookupResult &R, TemplateArgumentListInfo &Args)
1142 : R(R), Args(Args) {}
1143 Sema::SemaDiagnosticBuilder diagnoseNotICE(Sema &S,
1144 SourceLocation Loc) override {
1145 return S.Diag(Loc, diag::err_decomp_decl_std_tuple_size_not_constant)
1147 /*Params*/ nullptr);
1148 }
1149 } Diagnoser(R, Args);
1150
1151 ExprResult E =
1152 S.BuildDeclarationNameExpr(CXXScopeSpec(), R, /*NeedsADL*/false);
1153 if (E.isInvalid())
1154 return IsTupleLike::Error;
1155
1156 E = S.VerifyIntegerConstantExpression(E.get(), &Size, Diagnoser);
1157 if (E.isInvalid())
1158 return IsTupleLike::Error;
1159
1160 return IsTupleLike::TupleLike;
1161}
1162
1163/// \return std::tuple_element<I, T>::type.
1165 unsigned I, QualType T) {
1166 // Form template argument list for tuple_element<I, T>.
1168 Args.addArgument(
1171
1172 DeclarationName TypeDN = S.PP.getIdentifierInfo("type");
1175 S, R, Loc, "tuple_element", Args,
1176 diag::err_decomp_decl_std_tuple_element_not_specialized))
1177 return QualType();
1178
1179 auto *TD = R.getAsSingle<TypeDecl>();
1180 if (!TD) {
1182 S.Diag(Loc, diag::err_decomp_decl_std_tuple_element_not_specialized)
1184 /*Params*/ nullptr);
1185 if (!R.empty())
1186 S.Diag(R.getRepresentativeDecl()->getLocation(), diag::note_declared_at);
1187 return QualType();
1188 }
1189
1190 return S.Context.getTypeDeclType(TD);
1191}
1192
1193namespace {
1194struct InitializingBinding {
1195 Sema &S;
1196 InitializingBinding(Sema &S, BindingDecl *BD) : S(S) {
1200 Ctx.Entity = BD;
1202 }
1203 ~InitializingBinding() {
1205 }
1206};
1207}
1208
1211 VarDecl *Src, QualType DecompType,
1212 const llvm::APSInt &TupleSize) {
1213 if ((int64_t)Bindings.size() != TupleSize) {
1214 S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1215 << DecompType << (unsigned)Bindings.size()
1216 << (unsigned)TupleSize.getLimitedValue(UINT_MAX)
1217 << toString(TupleSize, 10) << (TupleSize < Bindings.size());
1218 return true;
1219 }
1220
1221 if (Bindings.empty())
1222 return false;
1223
1224 DeclarationName GetDN = S.PP.getIdentifierInfo("get");
1225
1226 // [dcl.decomp]p3:
1227 // The unqualified-id get is looked up in the scope of E by class member
1228 // access lookup ...
1229 LookupResult MemberGet(S, GetDN, Src->getLocation(), Sema::LookupMemberName);
1230 bool UseMemberGet = false;
1231 if (S.isCompleteType(Src->getLocation(), DecompType)) {
1232 if (auto *RD = DecompType->getAsCXXRecordDecl())
1233 S.LookupQualifiedName(MemberGet, RD);
1234 if (MemberGet.isAmbiguous())
1235 return true;
1236 // ... and if that finds at least one declaration that is a function
1237 // template whose first template parameter is a non-type parameter ...
1238 for (NamedDecl *D : MemberGet) {
1239 if (FunctionTemplateDecl *FTD =
1240 dyn_cast<FunctionTemplateDecl>(D->getUnderlyingDecl())) {
1241 TemplateParameterList *TPL = FTD->getTemplateParameters();
1242 if (TPL->size() != 0 &&
1243 isa<NonTypeTemplateParmDecl>(TPL->getParam(0))) {
1244 // ... the initializer is e.get<i>().
1245 UseMemberGet = true;
1246 break;
1247 }
1248 }
1249 }
1250 }
1251
1252 unsigned I = 0;
1253 for (auto *B : Bindings) {
1254 InitializingBinding InitContext(S, B);
1255 SourceLocation Loc = B->getLocation();
1256
1257 ExprResult E = S.BuildDeclRefExpr(Src, DecompType, VK_LValue, Loc);
1258 if (E.isInvalid())
1259 return true;
1260
1261 // e is an lvalue if the type of the entity is an lvalue reference and
1262 // an xvalue otherwise
1263 if (!Src->getType()->isLValueReferenceType())
1264 E = ImplicitCastExpr::Create(S.Context, E.get()->getType(), CK_NoOp,
1265 E.get(), nullptr, VK_XValue,
1267
1269 Args.addArgument(
1271
1272 if (UseMemberGet) {
1273 // if [lookup of member get] finds at least one declaration, the
1274 // initializer is e.get<i-1>().
1275 E = S.BuildMemberReferenceExpr(E.get(), DecompType, Loc, false,
1276 CXXScopeSpec(), SourceLocation(), nullptr,
1277 MemberGet, &Args, nullptr);
1278 if (E.isInvalid())
1279 return true;
1280
1281 E = S.BuildCallExpr(nullptr, E.get(), Loc, {}, Loc);
1282 } else {
1283 // Otherwise, the initializer is get<i-1>(e), where get is looked up
1284 // in the associated namespaces.
1287 DeclarationNameInfo(GetDN, Loc), /*RequiresADL=*/true, &Args,
1289 /*KnownDependent=*/false, /*KnownInstantiationDependent=*/false);
1290
1291 Expr *Arg = E.get();
1292 E = S.BuildCallExpr(nullptr, Get, Loc, Arg, Loc);
1293 }
1294 if (E.isInvalid())
1295 return true;
1296 Expr *Init = E.get();
1297
1298 // Given the type T designated by std::tuple_element<i - 1, E>::type,
1299 QualType T = getTupleLikeElementType(S, Loc, I, DecompType);
1300 if (T.isNull())
1301 return true;
1302
1303 // each vi is a variable of type "reference to T" initialized with the
1304 // initializer, where the reference is an lvalue reference if the
1305 // initializer is an lvalue and an rvalue reference otherwise
1306 QualType RefType =
1307 S.BuildReferenceType(T, E.get()->isLValue(), Loc, B->getDeclName());
1308 if (RefType.isNull())
1309 return true;
1310 auto *RefVD = VarDecl::Create(
1311 S.Context, Src->getDeclContext(), Loc, Loc,
1312 B->getDeclName().getAsIdentifierInfo(), RefType,
1314 RefVD->setLexicalDeclContext(Src->getLexicalDeclContext());
1315 RefVD->setTSCSpec(Src->getTSCSpec());
1316 RefVD->setImplicit();
1317 if (Src->isInlineSpecified())
1318 RefVD->setInlineSpecified();
1319 RefVD->getLexicalDeclContext()->addHiddenDecl(RefVD);
1320
1323 InitializationSequence Seq(S, Entity, Kind, Init);
1324 E = Seq.Perform(S, Entity, Kind, Init);
1325 if (E.isInvalid())
1326 return true;
1327 E = S.ActOnFinishFullExpr(E.get(), Loc, /*DiscardedValue*/ false);
1328 if (E.isInvalid())
1329 return true;
1330 RefVD->setInit(E.get());
1332
1334 DeclarationNameInfo(B->getDeclName(), Loc),
1335 RefVD);
1336 if (E.isInvalid())
1337 return true;
1338
1339 B->setBinding(T, E.get());
1340 I++;
1341 }
1342
1343 return false;
1344}
1345
1346/// Find the base class to decompose in a built-in decomposition of a class type.
1347/// This base class search is, unfortunately, not quite like any other that we
1348/// perform anywhere else in C++.
1350 const CXXRecordDecl *RD,
1351 CXXCastPath &BasePath) {
1352 auto BaseHasFields = [](const CXXBaseSpecifier *Specifier,
1353 CXXBasePath &Path) {
1354 return Specifier->getType()->getAsCXXRecordDecl()->hasDirectFields();
1355 };
1356
1357 const CXXRecordDecl *ClassWithFields = nullptr;
1359 if (RD->hasDirectFields())
1360 // [dcl.decomp]p4:
1361 // Otherwise, all of E's non-static data members shall be public direct
1362 // members of E ...
1363 ClassWithFields = RD;
1364 else {
1365 // ... or of ...
1366 CXXBasePaths Paths;
1367 Paths.setOrigin(const_cast<CXXRecordDecl*>(RD));
1368 if (!RD->lookupInBases(BaseHasFields, Paths)) {
1369 // If no classes have fields, just decompose RD itself. (This will work
1370 // if and only if zero bindings were provided.)
1371 return DeclAccessPair::make(const_cast<CXXRecordDecl*>(RD), AS_public);
1372 }
1373
1374 CXXBasePath *BestPath = nullptr;
1375 for (auto &P : Paths) {
1376 if (!BestPath)
1377 BestPath = &P;
1378 else if (!S.Context.hasSameType(P.back().Base->getType(),
1379 BestPath->back().Base->getType())) {
1380 // ... the same ...
1381 S.Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1382 << false << RD << BestPath->back().Base->getType()
1383 << P.back().Base->getType();
1384 return DeclAccessPair();
1385 } else if (P.Access < BestPath->Access) {
1386 BestPath = &P;
1387 }
1388 }
1389
1390 // ... unambiguous ...
1391 QualType BaseType = BestPath->back().Base->getType();
1392 if (Paths.isAmbiguous(S.Context.getCanonicalType(BaseType))) {
1393 S.Diag(Loc, diag::err_decomp_decl_ambiguous_base)
1394 << RD << BaseType << S.getAmbiguousPathsDisplayString(Paths);
1395 return DeclAccessPair();
1396 }
1397
1398 // ... [accessible, implied by other rules] base class of E.
1399 S.CheckBaseClassAccess(Loc, BaseType, S.Context.getRecordType(RD),
1400 *BestPath, diag::err_decomp_decl_inaccessible_base);
1401 AS = BestPath->Access;
1402
1403 ClassWithFields = BaseType->getAsCXXRecordDecl();
1404 S.BuildBasePathArray(Paths, BasePath);
1405 }
1406
1407 // The above search did not check whether the selected class itself has base
1408 // classes with fields, so check that now.
1409 CXXBasePaths Paths;
1410 if (ClassWithFields->lookupInBases(BaseHasFields, Paths)) {
1411 S.Diag(Loc, diag::err_decomp_decl_multiple_bases_with_members)
1412 << (ClassWithFields == RD) << RD << ClassWithFields
1413 << Paths.front().back().Base->getType();
1414 return DeclAccessPair();
1415 }
1416
1417 return DeclAccessPair::make(const_cast<CXXRecordDecl*>(ClassWithFields), AS);
1418}
1419
1421 ValueDecl *Src, QualType DecompType,
1422 const CXXRecordDecl *OrigRD) {
1423 if (S.RequireCompleteType(Src->getLocation(), DecompType,
1424 diag::err_incomplete_type))
1425 return true;
1426
1427 CXXCastPath BasePath;
1428 DeclAccessPair BasePair =
1429 findDecomposableBaseClass(S, Src->getLocation(), OrigRD, BasePath);
1430 const CXXRecordDecl *RD = cast_or_null<CXXRecordDecl>(BasePair.getDecl());
1431 if (!RD)
1432 return true;
1434 DecompType.getQualifiers());
1435
1436 auto DiagnoseBadNumberOfBindings = [&]() -> bool {
1437 unsigned NumFields = llvm::count_if(
1438 RD->fields(), [](FieldDecl *FD) { return !FD->isUnnamedBitField(); });
1439 assert(Bindings.size() != NumFields);
1440 S.Diag(Src->getLocation(), diag::err_decomp_decl_wrong_number_bindings)
1441 << DecompType << (unsigned)Bindings.size() << NumFields << NumFields
1442 << (NumFields < Bindings.size());
1443 return true;
1444 };
1445
1446 // all of E's non-static data members shall be [...] well-formed
1447 // when named as e.name in the context of the structured binding,
1448 // E shall not have an anonymous union member, ...
1449 unsigned I = 0;
1450 for (auto *FD : RD->fields()) {
1451 if (FD->isUnnamedBitField())
1452 continue;
1453
1454 // All the non-static data members are required to be nameable, so they
1455 // must all have names.
1456 if (!FD->getDeclName()) {
1457 if (RD->isLambda()) {
1458 S.Diag(Src->getLocation(), diag::err_decomp_decl_lambda);
1459 S.Diag(RD->getLocation(), diag::note_lambda_decl);
1460 return true;
1461 }
1462
1463 if (FD->isAnonymousStructOrUnion()) {
1464 S.Diag(Src->getLocation(), diag::err_decomp_decl_anon_union_member)
1465 << DecompType << FD->getType()->isUnionType();
1466 S.Diag(FD->getLocation(), diag::note_declared_at);
1467 return true;
1468 }
1469
1470 // FIXME: Are there any other ways we could have an anonymous member?
1471 }
1472
1473 // We have a real field to bind.
1474 if (I >= Bindings.size())
1475 return DiagnoseBadNumberOfBindings();
1476 auto *B = Bindings[I++];
1477 SourceLocation Loc = B->getLocation();
1478
1479 // The field must be accessible in the context of the structured binding.
1480 // We already checked that the base class is accessible.
1481 // FIXME: Add 'const' to AccessedEntity's classes so we can remove the
1482 // const_cast here.
1484 Loc, const_cast<CXXRecordDecl *>(OrigRD),
1486 BasePair.getAccess(), FD->getAccess())));
1487
1488 // Initialize the binding to Src.FD.
1489 ExprResult E = S.BuildDeclRefExpr(Src, DecompType, VK_LValue, Loc);
1490 if (E.isInvalid())
1491 return true;
1492 E = S.ImpCastExprToType(E.get(), BaseType, CK_UncheckedDerivedToBase,
1493 VK_LValue, &BasePath);
1494 if (E.isInvalid())
1495 return true;
1496 E = S.BuildFieldReferenceExpr(E.get(), /*IsArrow*/ false, Loc,
1497 CXXScopeSpec(), FD,
1498 DeclAccessPair::make(FD, FD->getAccess()),
1499 DeclarationNameInfo(FD->getDeclName(), Loc));
1500 if (E.isInvalid())
1501 return true;
1502
1503 // If the type of the member is T, the referenced type is cv T, where cv is
1504 // the cv-qualification of the decomposition expression.
1505 //
1506 // FIXME: We resolve a defect here: if the field is mutable, we do not add
1507 // 'const' to the type of the field.
1508 Qualifiers Q = DecompType.getQualifiers();
1509 if (FD->isMutable())
1510 Q.removeConst();
1511 B->setBinding(S.BuildQualifiedType(FD->getType(), Loc, Q), E.get());
1512 }
1513
1514 if (I != Bindings.size())
1515 return DiagnoseBadNumberOfBindings();
1516
1517 return false;
1518}
1519
1521 QualType DecompType = DD->getType();
1522
1523 // If the type of the decomposition is dependent, then so is the type of
1524 // each binding.
1525 if (DecompType->isDependentType()) {
1526 for (auto *B : DD->bindings())
1527 B->setType(Context.DependentTy);
1528 return;
1529 }
1530
1531 DecompType = DecompType.getNonReferenceType();
1533
1534 // C++1z [dcl.decomp]/2:
1535 // If E is an array type [...]
1536 // As an extension, we also support decomposition of built-in complex and
1537 // vector types.
1538 if (auto *CAT = Context.getAsConstantArrayType(DecompType)) {
1539 if (checkArrayDecomposition(*this, Bindings, DD, DecompType, CAT))
1540 DD->setInvalidDecl();
1541 return;
1542 }
1543 if (auto *VT = DecompType->getAs<VectorType>()) {
1544 if (checkVectorDecomposition(*this, Bindings, DD, DecompType, VT))
1545 DD->setInvalidDecl();
1546 return;
1547 }
1548 if (auto *CT = DecompType->getAs<ComplexType>()) {
1549 if (checkComplexDecomposition(*this, Bindings, DD, DecompType, CT))
1550 DD->setInvalidDecl();
1551 return;
1552 }
1553
1554 // C++1z [dcl.decomp]/3:
1555 // if the expression std::tuple_size<E>::value is a well-formed integral
1556 // constant expression, [...]
1557 llvm::APSInt TupleSize(32);
1558 switch (isTupleLike(*this, DD->getLocation(), DecompType, TupleSize)) {
1559 case IsTupleLike::Error:
1560 DD->setInvalidDecl();
1561 return;
1562
1563 case IsTupleLike::TupleLike:
1564 if (checkTupleLikeDecomposition(*this, Bindings, DD, DecompType, TupleSize))
1565 DD->setInvalidDecl();
1566 return;
1567
1568 case IsTupleLike::NotTupleLike:
1569 break;
1570 }
1571
1572 // C++1z [dcl.dcl]/8:
1573 // [E shall be of array or non-union class type]
1574 CXXRecordDecl *RD = DecompType->getAsCXXRecordDecl();
1575 if (!RD || RD->isUnion()) {
1576 Diag(DD->getLocation(), diag::err_decomp_decl_unbindable_type)
1577 << DD << !RD << DecompType;
1578 DD->setInvalidDecl();
1579 return;
1580 }
1581
1582 // C++1z [dcl.decomp]/4:
1583 // all of E's non-static data members shall be [...] direct members of
1584 // E or of the same unambiguous public base class of E, ...
1585 if (checkMemberDecomposition(*this, Bindings, DD, DecompType, RD))
1586 DD->setInvalidDecl();
1587}
1588
1590 // Shortcut if exceptions are disabled.
1591 if (!getLangOpts().CXXExceptions)
1592 return;
1593
1594 assert(Context.hasSameType(New->getType(), Old->getType()) &&
1595 "Should only be called if types are otherwise the same.");
1596
1597 QualType NewType = New->getType();
1598 QualType OldType = Old->getType();
1599
1600 // We're only interested in pointers and references to functions, as well
1601 // as pointers to member functions.
1602 if (const ReferenceType *R = NewType->getAs<ReferenceType>()) {
1603 NewType = R->getPointeeType();
1604 OldType = OldType->castAs<ReferenceType>()->getPointeeType();
1605 } else if (const PointerType *P = NewType->getAs<PointerType>()) {
1606 NewType = P->getPointeeType();
1607 OldType = OldType->castAs<PointerType>()->getPointeeType();
1608 } else if (const MemberPointerType *M = NewType->getAs<MemberPointerType>()) {
1609 NewType = M->getPointeeType();
1610 OldType = OldType->castAs<MemberPointerType>()->getPointeeType();
1611 }
1612
1613 if (!NewType->isFunctionProtoType())
1614 return;
1615
1616 // There's lots of special cases for functions. For function pointers, system
1617 // libraries are hopefully not as broken so that we don't need these
1618 // workarounds.
1620 OldType->getAs<FunctionProtoType>(), Old->getLocation(),
1621 NewType->getAs<FunctionProtoType>(), New->getLocation())) {
1622 New->setInvalidDecl();
1623 }
1624}
1625
1626/// CheckCXXDefaultArguments - Verify that the default arguments for a
1627/// function declaration are well-formed according to C++
1628/// [dcl.fct.default].
1630 // This checking doesn't make sense for explicit specializations; their
1631 // default arguments are determined by the declaration we're specializing,
1632 // not by FD.
1634 return;
1635 if (auto *FTD = FD->getDescribedFunctionTemplate())
1636 if (FTD->isMemberSpecialization())
1637 return;
1638
1639 unsigned NumParams = FD->getNumParams();
1640 unsigned ParamIdx = 0;
1641
1642 // Find first parameter with a default argument
1643 for (; ParamIdx < NumParams; ++ParamIdx) {
1644 ParmVarDecl *Param = FD->getParamDecl(ParamIdx);
1645 if (Param->hasDefaultArg())
1646 break;
1647 }
1648
1649 // C++20 [dcl.fct.default]p4:
1650 // In a given function declaration, each parameter subsequent to a parameter
1651 // with a default argument shall have a default argument supplied in this or
1652 // a previous declaration, unless the parameter was expanded from a
1653 // parameter pack, or shall be a function parameter pack.
1654 for (++ParamIdx; ParamIdx < NumParams; ++ParamIdx) {
1655 ParmVarDecl *Param = FD->getParamDecl(ParamIdx);
1656 if (Param->hasDefaultArg() || Param->isParameterPack() ||
1659 continue;
1660 if (Param->isInvalidDecl())
1661 /* We already complained about this parameter. */;
1662 else if (Param->getIdentifier())
1663 Diag(Param->getLocation(), diag::err_param_default_argument_missing_name)
1664 << Param->getIdentifier();
1665 else
1666 Diag(Param->getLocation(), diag::err_param_default_argument_missing);
1667 }
1668}
1669
1670/// Check that the given type is a literal type. Issue a diagnostic if not,
1671/// if Kind is Diagnose.
1672/// \return \c true if a problem has been found (and optionally diagnosed).
1673template <typename... Ts>
1675 SourceLocation Loc, QualType T, unsigned DiagID,
1676 Ts &&...DiagArgs) {
1677 if (T->isDependentType())
1678 return false;
1679
1680 switch (Kind) {
1682 return SemaRef.RequireLiteralType(Loc, T, DiagID,
1683 std::forward<Ts>(DiagArgs)...);
1684
1686 return !T->isLiteralType(SemaRef.Context);
1687 }
1688
1689 llvm_unreachable("unknown CheckConstexprKind");
1690}
1691
1692/// Determine whether a destructor cannot be constexpr due to
1694 const CXXDestructorDecl *DD,
1696 assert(!SemaRef.getLangOpts().CPlusPlus23 &&
1697 "this check is obsolete for C++23");
1698 auto Check = [&](SourceLocation Loc, QualType T, const FieldDecl *FD) {
1699 const CXXRecordDecl *RD =
1701 if (!RD || RD->hasConstexprDestructor())
1702 return true;
1703
1705 SemaRef.Diag(DD->getLocation(), diag::err_constexpr_dtor_subobject)
1706 << static_cast<int>(DD->getConstexprKind()) << !FD
1707 << (FD ? FD->getDeclName() : DeclarationName()) << T;
1708 SemaRef.Diag(Loc, diag::note_constexpr_dtor_subobject)
1709 << !FD << (FD ? FD->getDeclName() : DeclarationName()) << T;
1710 }
1711 return false;
1712 };
1713
1714 const CXXRecordDecl *RD = DD->getParent();
1715 for (const CXXBaseSpecifier &B : RD->bases())
1716 if (!Check(B.getBaseTypeLoc(), B.getType(), nullptr))
1717 return false;
1718 for (const FieldDecl *FD : RD->fields())
1719 if (!Check(FD->getLocation(), FD->getType(), FD))
1720 return false;
1721 return true;
1722}
1723
1724/// Check whether a function's parameter types are all literal types. If so,
1725/// return true. If not, produce a suitable diagnostic and return false.
1727 const FunctionDecl *FD,
1729 assert(!SemaRef.getLangOpts().CPlusPlus23 &&
1730 "this check is obsolete for C++23");
1731 unsigned ArgIndex = 0;
1732 const auto *FT = FD->getType()->castAs<FunctionProtoType>();
1733 for (FunctionProtoType::param_type_iterator i = FT->param_type_begin(),
1734 e = FT->param_type_end();
1735 i != e; ++i, ++ArgIndex) {
1736 const ParmVarDecl *PD = FD->getParamDecl(ArgIndex);
1737 assert(PD && "null in a parameter list");
1738 SourceLocation ParamLoc = PD->getLocation();
1739 if (CheckLiteralType(SemaRef, Kind, ParamLoc, *i,
1740 diag::err_constexpr_non_literal_param, ArgIndex + 1,
1741 PD->getSourceRange(), isa<CXXConstructorDecl>(FD),
1742 FD->isConsteval()))
1743 return false;
1744 }
1745 return true;
1746}
1747
1748/// Check whether a function's return type is a literal type. If so, return
1749/// true. If not, produce a suitable diagnostic and return false.
1752 assert(!SemaRef.getLangOpts().CPlusPlus23 &&
1753 "this check is obsolete for C++23");
1754 if (CheckLiteralType(SemaRef, Kind, FD->getLocation(), FD->getReturnType(),
1755 diag::err_constexpr_non_literal_return,
1756 FD->isConsteval()))
1757 return false;
1758 return true;
1759}
1760
1761/// Get diagnostic %select index for tag kind for
1762/// record diagnostic message.
1763/// WARNING: Indexes apply to particular diagnostics only!
1764///
1765/// \returns diagnostic %select index.
1767 switch (Tag) {
1769 return 0;
1771 return 1;
1772 case TagTypeKind::Class:
1773 return 2;
1774 default: llvm_unreachable("Invalid tag kind for record diagnostic!");
1775 }
1776}
1777
1778static bool CheckConstexprFunctionBody(Sema &SemaRef, const FunctionDecl *Dcl,
1779 Stmt *Body,
1781static bool CheckConstexprMissingReturn(Sema &SemaRef, const FunctionDecl *Dcl);
1782
1784 CheckConstexprKind Kind) {
1785 const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(NewFD);
1786 if (MD && MD->isInstance()) {
1787 // C++11 [dcl.constexpr]p4:
1788 // The definition of a constexpr constructor shall satisfy the following
1789 // constraints:
1790 // - the class shall not have any virtual base classes;
1791 //
1792 // FIXME: This only applies to constructors and destructors, not arbitrary
1793 // member functions.
1794 const CXXRecordDecl *RD = MD->getParent();
1795 if (RD->getNumVBases()) {
1797 return false;
1798
1799 Diag(NewFD->getLocation(), diag::err_constexpr_virtual_base)
1800 << isa<CXXConstructorDecl>(NewFD)
1802 for (const auto &I : RD->vbases())
1803 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here)
1804 << I.getSourceRange();
1805 return false;
1806 }
1807 }
1808
1809 if (!isa<CXXConstructorDecl>(NewFD)) {
1810 // C++11 [dcl.constexpr]p3:
1811 // The definition of a constexpr function shall satisfy the following
1812 // constraints:
1813 // - it shall not be virtual; (removed in C++20)
1814 const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(NewFD);
1815 if (Method && Method->isVirtual()) {
1816 if (getLangOpts().CPlusPlus20) {
1817 if (Kind == CheckConstexprKind::Diagnose)
1818 Diag(Method->getLocation(), diag::warn_cxx17_compat_constexpr_virtual);
1819 } else {
1821 return false;
1822
1823 Method = Method->getCanonicalDecl();
1824 Diag(Method->getLocation(), diag::err_constexpr_virtual);
1825
1826 // If it's not obvious why this function is virtual, find an overridden
1827 // function which uses the 'virtual' keyword.
1828 const CXXMethodDecl *WrittenVirtual = Method;
1829 while (!WrittenVirtual->isVirtualAsWritten())
1830 WrittenVirtual = *WrittenVirtual->begin_overridden_methods();
1831 if (WrittenVirtual != Method)
1832 Diag(WrittenVirtual->getLocation(),
1833 diag::note_overridden_virtual_function);
1834 return false;
1835 }
1836 }
1837
1838 // - its return type shall be a literal type; (removed in C++23)
1839 if (!getLangOpts().CPlusPlus23 &&
1840 !CheckConstexprReturnType(*this, NewFD, Kind))
1841 return false;
1842 }
1843
1844 if (auto *Dtor = dyn_cast<CXXDestructorDecl>(NewFD)) {
1845 // A destructor can be constexpr only if the defaulted destructor could be;
1846 // we don't need to check the members and bases if we already know they all
1847 // have constexpr destructors. (removed in C++23)
1848 if (!getLangOpts().CPlusPlus23 &&
1849 !Dtor->getParent()->defaultedDestructorIsConstexpr()) {
1851 return false;
1852 if (!CheckConstexprDestructorSubobjects(*this, Dtor, Kind))
1853 return false;
1854 }
1855 }
1856
1857 // - each of its parameter types shall be a literal type; (removed in C++23)
1858 if (!getLangOpts().CPlusPlus23 &&
1859 !CheckConstexprParameterTypes(*this, NewFD, Kind))
1860 return false;
1861
1862 Stmt *Body = NewFD->getBody();
1863 assert(Body &&
1864 "CheckConstexprFunctionDefinition called on function with no body");
1865 return CheckConstexprFunctionBody(*this, NewFD, Body, Kind);
1866}
1867
1868/// Check the given declaration statement is legal within a constexpr function
1869/// body. C++11 [dcl.constexpr]p3,p4, and C++1y [dcl.constexpr]p3.
1870///
1871/// \return true if the body is OK (maybe only as an extension), false if we
1872/// have diagnosed a problem.
1874 DeclStmt *DS, SourceLocation &Cxx1yLoc,
1876 // C++11 [dcl.constexpr]p3 and p4:
1877 // The definition of a constexpr function(p3) or constructor(p4) [...] shall
1878 // contain only
1879 for (const auto *DclIt : DS->decls()) {
1880 switch (DclIt->getKind()) {
1881 case Decl::StaticAssert:
1882 case Decl::Using:
1883 case Decl::UsingShadow:
1884 case Decl::UsingDirective:
1885 case Decl::UnresolvedUsingTypename:
1886 case Decl::UnresolvedUsingValue:
1887 case Decl::UsingEnum:
1888 // - static_assert-declarations
1889 // - using-declarations,
1890 // - using-directives,
1891 // - using-enum-declaration
1892 continue;
1893
1894 case Decl::Typedef:
1895 case Decl::TypeAlias: {
1896 // - typedef declarations and alias-declarations that do not define
1897 // classes or enumerations,
1898 const auto *TN = cast<TypedefNameDecl>(DclIt);
1899 if (TN->getUnderlyingType()->isVariablyModifiedType()) {
1900 // Don't allow variably-modified types in constexpr functions.
1902 TypeLoc TL = TN->getTypeSourceInfo()->getTypeLoc();
1903 SemaRef.Diag(TL.getBeginLoc(), diag::err_constexpr_vla)
1904 << TL.getSourceRange() << TL.getType()
1905 << isa<CXXConstructorDecl>(Dcl);
1906 }
1907 return false;
1908 }
1909 continue;
1910 }
1911
1912 case Decl::Enum:
1913 case Decl::CXXRecord:
1914 // C++1y allows types to be defined, not just declared.
1915 if (cast<TagDecl>(DclIt)->isThisDeclarationADefinition()) {
1917 SemaRef.Diag(DS->getBeginLoc(),
1918 SemaRef.getLangOpts().CPlusPlus14
1919 ? diag::warn_cxx11_compat_constexpr_type_definition
1920 : diag::ext_constexpr_type_definition)
1921 << isa<CXXConstructorDecl>(Dcl);
1922 } else if (!SemaRef.getLangOpts().CPlusPlus14) {
1923 return false;
1924 }
1925 }
1926 continue;
1927
1928 case Decl::EnumConstant:
1929 case Decl::IndirectField:
1930 case Decl::ParmVar:
1931 // These can only appear with other declarations which are banned in
1932 // C++11 and permitted in C++1y, so ignore them.
1933 continue;
1934
1935 case Decl::Var:
1936 case Decl::Decomposition: {
1937 // C++1y [dcl.constexpr]p3 allows anything except:
1938 // a definition of a variable of non-literal type or of static or
1939 // thread storage duration or [before C++2a] for which no
1940 // initialization is performed.
1941 const auto *VD = cast<VarDecl>(DclIt);
1942 if (VD->isThisDeclarationADefinition()) {
1943 if (VD->isStaticLocal()) {
1945 SemaRef.Diag(VD->getLocation(),
1946 SemaRef.getLangOpts().CPlusPlus23
1947 ? diag::warn_cxx20_compat_constexpr_var
1948 : diag::ext_constexpr_static_var)
1949 << isa<CXXConstructorDecl>(Dcl)
1950 << (VD->getTLSKind() == VarDecl::TLS_Dynamic);
1951 } else if (!SemaRef.getLangOpts().CPlusPlus23) {
1952 return false;
1953 }
1954 }
1955 if (SemaRef.LangOpts.CPlusPlus23) {
1956 CheckLiteralType(SemaRef, Kind, VD->getLocation(), VD->getType(),
1957 diag::warn_cxx20_compat_constexpr_var,
1958 isa<CXXConstructorDecl>(Dcl),
1959 /*variable of non-literal type*/ 2);
1960 } else if (CheckLiteralType(
1961 SemaRef, Kind, VD->getLocation(), VD->getType(),
1962 diag::err_constexpr_local_var_non_literal_type,
1963 isa<CXXConstructorDecl>(Dcl))) {
1964 return false;
1965 }
1966 if (!VD->getType()->isDependentType() &&
1967 !VD->hasInit() && !VD->isCXXForRangeDecl()) {
1969 SemaRef.Diag(
1970 VD->getLocation(),
1971 SemaRef.getLangOpts().CPlusPlus20
1972 ? diag::warn_cxx17_compat_constexpr_local_var_no_init
1973 : diag::ext_constexpr_local_var_no_init)
1974 << isa<CXXConstructorDecl>(Dcl);
1975 } else if (!SemaRef.getLangOpts().CPlusPlus20) {
1976 return false;
1977 }
1978 continue;
1979 }
1980 }
1982 SemaRef.Diag(VD->getLocation(),
1983 SemaRef.getLangOpts().CPlusPlus14
1984 ? diag::warn_cxx11_compat_constexpr_local_var
1985 : diag::ext_constexpr_local_var)
1986 << isa<CXXConstructorDecl>(Dcl);
1987 } else if (!SemaRef.getLangOpts().CPlusPlus14) {
1988 return false;
1989 }
1990 continue;
1991 }
1992
1993 case Decl::NamespaceAlias:
1994 case Decl::Function:
1995 // These are disallowed in C++11 and permitted in C++1y. Allow them
1996 // everywhere as an extension.
1997 if (!Cxx1yLoc.isValid())
1998 Cxx1yLoc = DS->getBeginLoc();
1999 continue;
2000
2001 default:
2003 SemaRef.Diag(DS->getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2004 << isa<CXXConstructorDecl>(Dcl) << Dcl->isConsteval();
2005 }
2006 return false;
2007 }
2008 }
2009
2010 return true;
2011}
2012
2013/// Check that the given field is initialized within a constexpr constructor.
2014///
2015/// \param Dcl The constexpr constructor being checked.
2016/// \param Field The field being checked. This may be a member of an anonymous
2017/// struct or union nested within the class being checked.
2018/// \param Inits All declarations, including anonymous struct/union members and
2019/// indirect members, for which any initialization was provided.
2020/// \param Diagnosed Whether we've emitted the error message yet. Used to attach
2021/// multiple notes for different members to the same error.
2022/// \param Kind Whether we're diagnosing a constructor as written or determining
2023/// whether the formal requirements are satisfied.
2024/// \return \c false if we're checking for validity and the constructor does
2025/// not satisfy the requirements on a constexpr constructor.
2027 const FunctionDecl *Dcl,
2028 FieldDecl *Field,
2029 llvm::SmallSet<Decl*, 16> &Inits,
2030 bool &Diagnosed,
2032 // In C++20 onwards, there's nothing to check for validity.
2034 SemaRef.getLangOpts().CPlusPlus20)
2035 return true;
2036
2037 if (Field->isInvalidDecl())
2038 return true;
2039
2040 if (Field->isUnnamedBitField())
2041 return true;
2042
2043 // Anonymous unions with no variant members and empty anonymous structs do not
2044 // need to be explicitly initialized. FIXME: Anonymous structs that contain no
2045 // indirect fields don't need initializing.
2046 if (Field->isAnonymousStructOrUnion() &&
2047 (Field->getType()->isUnionType()
2048 ? !Field->getType()->getAsCXXRecordDecl()->hasVariantMembers()
2049 : Field->getType()->getAsCXXRecordDecl()->isEmpty()))
2050 return true;
2051
2052 if (!Inits.count(Field)) {
2054 if (!Diagnosed) {
2055 SemaRef.Diag(Dcl->getLocation(),
2056 SemaRef.getLangOpts().CPlusPlus20
2057 ? diag::warn_cxx17_compat_constexpr_ctor_missing_init
2058 : diag::ext_constexpr_ctor_missing_init);
2059 Diagnosed = true;
2060 }
2061 SemaRef.Diag(Field->getLocation(),
2062 diag::note_constexpr_ctor_missing_init);
2063 } else if (!SemaRef.getLangOpts().CPlusPlus20) {
2064 return false;
2065 }
2066 } else if (Field->isAnonymousStructOrUnion()) {
2067 const RecordDecl *RD = Field->getType()->castAs<RecordType>()->getDecl();
2068 for (auto *I : RD->fields())
2069 // If an anonymous union contains an anonymous struct of which any member
2070 // is initialized, all members must be initialized.
2071 if (!RD->isUnion() || Inits.count(I))
2072 if (!CheckConstexprCtorInitializer(SemaRef, Dcl, I, Inits, Diagnosed,
2073 Kind))
2074 return false;
2075 }
2076 return true;
2077}
2078
2079/// Check the provided statement is allowed in a constexpr function
2080/// definition.
2081static bool
2084 SourceLocation &Cxx1yLoc, SourceLocation &Cxx2aLoc,
2085 SourceLocation &Cxx2bLoc,
2087 // - its function-body shall be [...] a compound-statement that contains only
2088 switch (S->getStmtClass()) {
2089 case Stmt::NullStmtClass:
2090 // - null statements,
2091 return true;
2092
2093 case Stmt::DeclStmtClass:
2094 // - static_assert-declarations
2095 // - using-declarations,
2096 // - using-directives,
2097 // - typedef declarations and alias-declarations that do not define
2098 // classes or enumerations,
2099 if (!CheckConstexprDeclStmt(SemaRef, Dcl, cast<DeclStmt>(S), Cxx1yLoc, Kind))
2100 return false;
2101 return true;
2102
2103 case Stmt::ReturnStmtClass:
2104 // - and exactly one return statement;
2105 if (isa<CXXConstructorDecl>(Dcl)) {
2106 // C++1y allows return statements in constexpr constructors.
2107 if (!Cxx1yLoc.isValid())
2108 Cxx1yLoc = S->getBeginLoc();
2109 return true;
2110 }
2111
2112 ReturnStmts.push_back(S->getBeginLoc());
2113 return true;
2114
2115 case Stmt::AttributedStmtClass:
2116 // Attributes on a statement don't affect its formal kind and hence don't
2117 // affect its validity in a constexpr function.
2119 SemaRef, Dcl, cast<AttributedStmt>(S)->getSubStmt(), ReturnStmts,
2120 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind);
2121
2122 case Stmt::CompoundStmtClass: {
2123 // C++1y allows compound-statements.
2124 if (!Cxx1yLoc.isValid())
2125 Cxx1yLoc = S->getBeginLoc();
2126
2127 CompoundStmt *CompStmt = cast<CompoundStmt>(S);
2128 for (auto *BodyIt : CompStmt->body()) {
2129 if (!CheckConstexprFunctionStmt(SemaRef, Dcl, BodyIt, ReturnStmts,
2130 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2131 return false;
2132 }
2133 return true;
2134 }
2135
2136 case Stmt::IfStmtClass: {
2137 // C++1y allows if-statements.
2138 if (!Cxx1yLoc.isValid())
2139 Cxx1yLoc = S->getBeginLoc();
2140
2141 IfStmt *If = cast<IfStmt>(S);
2142 if (!CheckConstexprFunctionStmt(SemaRef, Dcl, If->getThen(), ReturnStmts,
2143 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2144 return false;
2145 if (If->getElse() &&
2146 !CheckConstexprFunctionStmt(SemaRef, Dcl, If->getElse(), ReturnStmts,
2147 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2148 return false;
2149 return true;
2150 }
2151
2152 case Stmt::WhileStmtClass:
2153 case Stmt::DoStmtClass:
2154 case Stmt::ForStmtClass:
2155 case Stmt::CXXForRangeStmtClass:
2156 case Stmt::ContinueStmtClass:
2157 // C++1y allows all of these. We don't allow them as extensions in C++11,
2158 // because they don't make sense without variable mutation.
2159 if (!SemaRef.getLangOpts().CPlusPlus14)
2160 break;
2161 if (!Cxx1yLoc.isValid())
2162 Cxx1yLoc = S->getBeginLoc();
2163 for (Stmt *SubStmt : S->children()) {
2164 if (SubStmt &&
2165 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2166 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2167 return false;
2168 }
2169 return true;
2170
2171 case Stmt::SwitchStmtClass:
2172 case Stmt::CaseStmtClass:
2173 case Stmt::DefaultStmtClass:
2174 case Stmt::BreakStmtClass:
2175 // C++1y allows switch-statements, and since they don't need variable
2176 // mutation, we can reasonably allow them in C++11 as an extension.
2177 if (!Cxx1yLoc.isValid())
2178 Cxx1yLoc = S->getBeginLoc();
2179 for (Stmt *SubStmt : S->children()) {
2180 if (SubStmt &&
2181 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2182 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2183 return false;
2184 }
2185 return true;
2186
2187 case Stmt::LabelStmtClass:
2188 case Stmt::GotoStmtClass:
2189 if (Cxx2bLoc.isInvalid())
2190 Cxx2bLoc = S->getBeginLoc();
2191 for (Stmt *SubStmt : S->children()) {
2192 if (SubStmt &&
2193 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2194 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2195 return false;
2196 }
2197 return true;
2198
2199 case Stmt::GCCAsmStmtClass:
2200 case Stmt::MSAsmStmtClass:
2201 // C++2a allows inline assembly statements.
2202 case Stmt::CXXTryStmtClass:
2203 if (Cxx2aLoc.isInvalid())
2204 Cxx2aLoc = S->getBeginLoc();
2205 for (Stmt *SubStmt : S->children()) {
2206 if (SubStmt &&
2207 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2208 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2209 return false;
2210 }
2211 return true;
2212
2213 case Stmt::CXXCatchStmtClass:
2214 // Do not bother checking the language mode (already covered by the
2215 // try block check).
2217 SemaRef, Dcl, cast<CXXCatchStmt>(S)->getHandlerBlock(), ReturnStmts,
2218 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2219 return false;
2220 return true;
2221
2222 default:
2223 if (!isa<Expr>(S))
2224 break;
2225
2226 // C++1y allows expression-statements.
2227 if (!Cxx1yLoc.isValid())
2228 Cxx1yLoc = S->getBeginLoc();
2229 return true;
2230 }
2231
2233 SemaRef.Diag(S->getBeginLoc(), diag::err_constexpr_body_invalid_stmt)
2234 << isa<CXXConstructorDecl>(Dcl) << Dcl->isConsteval();
2235 }
2236 return false;
2237}
2238
2239/// Check the body for the given constexpr function declaration only contains
2240/// the permitted types of statement. C++11 [dcl.constexpr]p3,p4.
2241///
2242/// \return true if the body is OK, false if we have found or diagnosed a
2243/// problem.
2245 Stmt *Body,
2248
2249 if (isa<CXXTryStmt>(Body)) {
2250 // C++11 [dcl.constexpr]p3:
2251 // The definition of a constexpr function shall satisfy the following
2252 // constraints: [...]
2253 // - its function-body shall be = delete, = default, or a
2254 // compound-statement
2255 //
2256 // C++11 [dcl.constexpr]p4:
2257 // In the definition of a constexpr constructor, [...]
2258 // - its function-body shall not be a function-try-block;
2259 //
2260 // This restriction is lifted in C++2a, as long as inner statements also
2261 // apply the general constexpr rules.
2262 switch (Kind) {
2264 if (!SemaRef.getLangOpts().CPlusPlus20)
2265 return false;
2266 break;
2267
2269 SemaRef.Diag(Body->getBeginLoc(),
2270 !SemaRef.getLangOpts().CPlusPlus20
2271 ? diag::ext_constexpr_function_try_block_cxx20
2272 : diag::warn_cxx17_compat_constexpr_function_try_block)
2273 << isa<CXXConstructorDecl>(Dcl);
2274 break;
2275 }
2276 }
2277
2278 // - its function-body shall be [...] a compound-statement that contains only
2279 // [... list of cases ...]
2280 //
2281 // Note that walking the children here is enough to properly check for
2282 // CompoundStmt and CXXTryStmt body.
2283 SourceLocation Cxx1yLoc, Cxx2aLoc, Cxx2bLoc;
2284 for (Stmt *SubStmt : Body->children()) {
2285 if (SubStmt &&
2286 !CheckConstexprFunctionStmt(SemaRef, Dcl, SubStmt, ReturnStmts,
2287 Cxx1yLoc, Cxx2aLoc, Cxx2bLoc, Kind))
2288 return false;
2289 }
2290
2292 // If this is only valid as an extension, report that we don't satisfy the
2293 // constraints of the current language.
2294 if ((Cxx2bLoc.isValid() && !SemaRef.getLangOpts().CPlusPlus23) ||
2295 (Cxx2aLoc.isValid() && !SemaRef.getLangOpts().CPlusPlus20) ||
2296 (Cxx1yLoc.isValid() && !SemaRef.getLangOpts().CPlusPlus17))
2297 return false;
2298 } else if (Cxx2bLoc.isValid()) {
2299 SemaRef.Diag(Cxx2bLoc,
2300 SemaRef.getLangOpts().CPlusPlus23
2301 ? diag::warn_cxx20_compat_constexpr_body_invalid_stmt
2302 : diag::ext_constexpr_body_invalid_stmt_cxx23)
2303 << isa<CXXConstructorDecl>(Dcl);
2304 } else if (Cxx2aLoc.isValid()) {
2305 SemaRef.Diag(Cxx2aLoc,
2306 SemaRef.getLangOpts().CPlusPlus20
2307 ? diag::warn_cxx17_compat_constexpr_body_invalid_stmt
2308 : diag::ext_constexpr_body_invalid_stmt_cxx20)
2309 << isa<CXXConstructorDecl>(Dcl);
2310 } else if (Cxx1yLoc.isValid()) {
2311 SemaRef.Diag(Cxx1yLoc,
2312 SemaRef.getLangOpts().CPlusPlus14
2313 ? diag::warn_cxx11_compat_constexpr_body_invalid_stmt
2314 : diag::ext_constexpr_body_invalid_stmt)
2315 << isa<CXXConstructorDecl>(Dcl);
2316 }
2317
2318 if (const CXXConstructorDecl *Constructor
2319 = dyn_cast<CXXConstructorDecl>(Dcl)) {
2320 const CXXRecordDecl *RD = Constructor->getParent();
2321 // DR1359:
2322 // - every non-variant non-static data member and base class sub-object
2323 // shall be initialized;
2324 // DR1460:
2325 // - if the class is a union having variant members, exactly one of them
2326 // shall be initialized;
2327 if (RD->isUnion()) {
2328 if (Constructor->getNumCtorInitializers() == 0 &&
2329 RD->hasVariantMembers()) {
2331 SemaRef.Diag(
2332 Dcl->getLocation(),
2333 SemaRef.getLangOpts().CPlusPlus20
2334 ? diag::warn_cxx17_compat_constexpr_union_ctor_no_init
2335 : diag::ext_constexpr_union_ctor_no_init);
2336 } else if (!SemaRef.getLangOpts().CPlusPlus20) {
2337 return false;
2338 }
2339 }
2340 } else if (!Constructor->isDependentContext() &&
2341 !Constructor->isDelegatingConstructor()) {
2342 assert(RD->getNumVBases() == 0 && "constexpr ctor with virtual bases");
2343
2344 // Skip detailed checking if we have enough initializers, and we would
2345 // allow at most one initializer per member.
2346 bool AnyAnonStructUnionMembers = false;
2347 unsigned Fields = 0;
2349 E = RD->field_end(); I != E; ++I, ++Fields) {
2350 if (I->isAnonymousStructOrUnion()) {
2351 AnyAnonStructUnionMembers = true;
2352 break;
2353 }
2354 }
2355 // DR1460:
2356 // - if the class is a union-like class, but is not a union, for each of
2357 // its anonymous union members having variant members, exactly one of
2358 // them shall be initialized;
2359 if (AnyAnonStructUnionMembers ||
2360 Constructor->getNumCtorInitializers() != RD->getNumBases() + Fields) {
2361 // Check initialization of non-static data members. Base classes are
2362 // always initialized so do not need to be checked. Dependent bases
2363 // might not have initializers in the member initializer list.
2364 llvm::SmallSet<Decl*, 16> Inits;
2365 for (const auto *I: Constructor->inits()) {
2366 if (FieldDecl *FD = I->getMember())
2367 Inits.insert(FD);
2368 else if (IndirectFieldDecl *ID = I->getIndirectMember())
2369 Inits.insert(ID->chain_begin(), ID->chain_end());
2370 }
2371
2372 bool Diagnosed = false;
2373 for (auto *I : RD->fields())
2374 if (!CheckConstexprCtorInitializer(SemaRef, Dcl, I, Inits, Diagnosed,
2375 Kind))
2376 return false;
2377 }
2378 }
2379 } else {
2380 if (ReturnStmts.empty()) {
2381 switch (Kind) {
2384 return false;
2385 break;
2386
2388 // The formal requirements don't include this rule in C++14, even
2389 // though the "must be able to produce a constant expression" rules
2390 // still imply it in some cases.
2391 if (!SemaRef.getLangOpts().CPlusPlus14)
2392 return false;
2393 break;
2394 }
2395 } else if (ReturnStmts.size() > 1) {
2396 switch (Kind) {
2398 SemaRef.Diag(
2399 ReturnStmts.back(),
2400 SemaRef.getLangOpts().CPlusPlus14
2401 ? diag::warn_cxx11_compat_constexpr_body_multiple_return
2402 : diag::ext_constexpr_body_multiple_return);
2403 for (unsigned I = 0; I < ReturnStmts.size() - 1; ++I)
2404 SemaRef.Diag(ReturnStmts[I],
2405 diag::note_constexpr_body_previous_return);
2406 break;
2407
2409 if (!SemaRef.getLangOpts().CPlusPlus14)
2410 return false;
2411 break;
2412 }
2413 }
2414 }
2415
2416 // C++11 [dcl.constexpr]p5:
2417 // if no function argument values exist such that the function invocation
2418 // substitution would produce a constant expression, the program is
2419 // ill-formed; no diagnostic required.
2420 // C++11 [dcl.constexpr]p3:
2421 // - every constructor call and implicit conversion used in initializing the
2422 // return value shall be one of those allowed in a constant expression.
2423 // C++11 [dcl.constexpr]p4:
2424 // - every constructor involved in initializing non-static data members and
2425 // base class sub-objects shall be a constexpr constructor.
2426 //
2427 // Note that this rule is distinct from the "requirements for a constexpr
2428 // function", so is not checked in CheckValid mode. Because the check for
2429 // constexpr potential is expensive, skip the check if the diagnostic is
2430 // disabled, the function is declared in a system header, or we're in C++23
2431 // or later mode (see https://wg21.link/P2448).
2432 bool SkipCheck =
2433 !SemaRef.getLangOpts().CheckConstexprFunctionBodies ||
2436 diag::ext_constexpr_function_never_constant_expr, Dcl->getLocation());
2438 if (Kind == Sema::CheckConstexprKind::Diagnose && !SkipCheck &&
2440 SemaRef.Diag(Dcl->getLocation(),
2441 diag::ext_constexpr_function_never_constant_expr)
2442 << isa<CXXConstructorDecl>(Dcl) << Dcl->isConsteval()
2443 << Dcl->getNameInfo().getSourceRange();
2444 for (size_t I = 0, N = Diags.size(); I != N; ++I)
2445 SemaRef.Diag(Diags[I].first, Diags[I].second);
2446 // Don't return false here: we allow this for compatibility in
2447 // system headers.
2448 }
2449
2450 return true;
2451}
2452
2454 const FunctionDecl *Dcl) {
2455 bool IsVoidOrDependentType = Dcl->getReturnType()->isVoidType() ||
2457 // Skip emitting a missing return error diagnostic for non-void functions
2458 // since C++23 no longer mandates constexpr functions to yield constant
2459 // expressions.
2460 if (SemaRef.getLangOpts().CPlusPlus23 && !IsVoidOrDependentType)
2461 return true;
2462
2463 // C++14 doesn't require constexpr functions to contain a 'return'
2464 // statement. We still do, unless the return type might be void, because
2465 // otherwise if there's no return statement, the function cannot
2466 // be used in a core constant expression.
2467 bool OK = SemaRef.getLangOpts().CPlusPlus14 && IsVoidOrDependentType;
2468 SemaRef.Diag(Dcl->getLocation(),
2469 OK ? diag::warn_cxx11_compat_constexpr_body_no_return
2470 : diag::err_constexpr_body_no_return)
2471 << Dcl->isConsteval();
2472 return OK;
2473}
2474
2476 FunctionDecl *FD, const sema::FunctionScopeInfo *FSI) {
2478 return true;
2482 auto it = UndefinedButUsed.find(FD->getCanonicalDecl());
2483 if (it != UndefinedButUsed.end()) {
2484 Diag(it->second, diag::err_immediate_function_used_before_definition)
2485 << it->first;
2486 Diag(FD->getLocation(), diag::note_defined_here) << FD;
2487 if (FD->isImmediateFunction() && !FD->isConsteval())
2489 return false;
2490 }
2491 }
2492 return true;
2493}
2494
2496 assert(FD->isImmediateEscalating() && !FD->isConsteval() &&
2497 "expected an immediate function");
2498 assert(FD->hasBody() && "expected the function to have a body");
2499 struct ImmediateEscalatingExpressionsVisitor : DynamicRecursiveASTVisitor {
2500 Sema &SemaRef;
2501
2502 const FunctionDecl *ImmediateFn;
2503 bool ImmediateFnIsConstructor;
2504 CXXConstructorDecl *CurrentConstructor = nullptr;
2505 CXXCtorInitializer *CurrentInit = nullptr;
2506
2507 ImmediateEscalatingExpressionsVisitor(Sema &SemaRef, FunctionDecl *FD)
2508 : SemaRef(SemaRef), ImmediateFn(FD),
2509 ImmediateFnIsConstructor(isa<CXXConstructorDecl>(FD)) {
2510 ShouldVisitImplicitCode = true;
2511 ShouldVisitLambdaBody = false;
2512 }
2513
2514 void Diag(const Expr *E, const FunctionDecl *Fn, bool IsCall) {
2517 if (CurrentConstructor && CurrentInit) {
2518 Loc = CurrentConstructor->getLocation();
2519 Range = CurrentInit->isWritten() ? CurrentInit->getSourceRange()
2520 : SourceRange();
2521 }
2522
2523 FieldDecl* InitializedField = CurrentInit ? CurrentInit->getAnyMember() : nullptr;
2524
2525 SemaRef.Diag(Loc, diag::note_immediate_function_reason)
2526 << ImmediateFn << Fn << Fn->isConsteval() << IsCall
2527 << isa<CXXConstructorDecl>(Fn) << ImmediateFnIsConstructor
2528 << (InitializedField != nullptr)
2529 << (CurrentInit && !CurrentInit->isWritten())
2530 << InitializedField << Range;
2531 }
2532 bool TraverseCallExpr(CallExpr *E) override {
2533 if (const auto *DR =
2534 dyn_cast<DeclRefExpr>(E->getCallee()->IgnoreImplicit());
2535 DR && DR->isImmediateEscalating()) {
2536 Diag(E, E->getDirectCallee(), /*IsCall=*/true);
2537 return false;
2538 }
2539
2540 for (Expr *A : E->arguments())
2541 if (!TraverseStmt(A))
2542 return false;
2543
2544 return true;
2545 }
2546
2547 bool VisitDeclRefExpr(DeclRefExpr *E) override {
2548 if (const auto *ReferencedFn = dyn_cast<FunctionDecl>(E->getDecl());
2549 ReferencedFn && E->isImmediateEscalating()) {
2550 Diag(E, ReferencedFn, /*IsCall=*/false);
2551 return false;
2552 }
2553
2554 return true;
2555 }
2556
2557 bool VisitCXXConstructExpr(CXXConstructExpr *E) override {
2558 CXXConstructorDecl *D = E->getConstructor();
2559 if (E->isImmediateEscalating()) {
2560 Diag(E, D, /*IsCall=*/true);
2561 return false;
2562 }
2563 return true;
2564 }
2565
2566 bool TraverseConstructorInitializer(CXXCtorInitializer *Init) override {
2567 llvm::SaveAndRestore RAII(CurrentInit, Init);
2569 }
2570
2571 bool TraverseCXXConstructorDecl(CXXConstructorDecl *Ctr) override {
2572 llvm::SaveAndRestore RAII(CurrentConstructor, Ctr);
2573 return DynamicRecursiveASTVisitor::TraverseCXXConstructorDecl(Ctr);
2574 }
2575
2576 bool TraverseType(QualType T) override { return true; }
2577 bool VisitBlockExpr(BlockExpr *T) override { return true; }
2578
2579 } Visitor(*this, FD);
2580 Visitor.TraverseDecl(FD);
2581}
2582
2584 assert(getLangOpts().CPlusPlus && "No class names in C!");
2585
2586 if (SS && SS->isInvalid())
2587 return nullptr;
2588
2589 if (SS && SS->isNotEmpty()) {
2590 DeclContext *DC = computeDeclContext(*SS, true);
2591 return dyn_cast_or_null<CXXRecordDecl>(DC);
2592 }
2593
2594 return dyn_cast_or_null<CXXRecordDecl>(CurContext);
2595}
2596
2598 const CXXScopeSpec *SS) {
2599 CXXRecordDecl *CurDecl = getCurrentClass(S, SS);
2600 return CurDecl && &II == CurDecl->getIdentifier();
2601}
2602
2604 assert(getLangOpts().CPlusPlus && "No class names in C!");
2605
2606 if (!getLangOpts().SpellChecking)
2607 return false;
2608
2609 CXXRecordDecl *CurDecl;
2610 if (SS && SS->isSet() && !SS->isInvalid()) {
2611 DeclContext *DC = computeDeclContext(*SS, true);
2612 CurDecl = dyn_cast_or_null<CXXRecordDecl>(DC);
2613 } else
2614 CurDecl = dyn_cast_or_null<CXXRecordDecl>(CurContext);
2615
2616 if (CurDecl && CurDecl->getIdentifier() && II != CurDecl->getIdentifier() &&
2617 3 * II->getName().edit_distance(CurDecl->getIdentifier()->getName())
2618 < II->getLength()) {
2619 II = CurDecl->getIdentifier();
2620 return true;
2621 }
2622
2623 return false;
2624}
2625
2627 SourceRange SpecifierRange,
2628 bool Virtual, AccessSpecifier Access,
2629 TypeSourceInfo *TInfo,
2630 SourceLocation EllipsisLoc) {
2631 QualType BaseType = TInfo->getType();
2632 SourceLocation BaseLoc = TInfo->getTypeLoc().getBeginLoc();
2633 if (BaseType->containsErrors()) {
2634 // Already emitted a diagnostic when parsing the error type.
2635 return nullptr;
2636 }
2637
2638 if (EllipsisLoc.isValid() && !BaseType->containsUnexpandedParameterPack()) {
2639 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
2640 << TInfo->getTypeLoc().getSourceRange();
2641 EllipsisLoc = SourceLocation();
2642 }
2643
2644 auto *BaseDecl =
2645 dyn_cast_if_present<CXXRecordDecl>(computeDeclContext(BaseType));
2646 // C++ [class.derived.general]p2:
2647 // A class-or-decltype shall denote a (possibly cv-qualified) class type
2648 // that is not an incompletely defined class; any cv-qualifiers are
2649 // ignored.
2650 if (BaseDecl) {
2651 // C++ [class.union.general]p4:
2652 // [...] A union shall not be used as a base class.
2653 if (BaseDecl->isUnion()) {
2654 Diag(BaseLoc, diag::err_union_as_base_class) << SpecifierRange;
2655 return nullptr;
2656 }
2657
2658 // For the MS ABI, propagate DLL attributes to base class templates.
2660 Context.getTargetInfo().getTriple().isPS()) {
2661 if (Attr *ClassAttr = getDLLAttr(Class)) {
2662 if (auto *BaseSpec =
2663 dyn_cast<ClassTemplateSpecializationDecl>(BaseDecl)) {
2664 propagateDLLAttrToBaseClassTemplate(Class, ClassAttr, BaseSpec,
2665 BaseLoc);
2666 }
2667 }
2668 }
2669
2670 if (RequireCompleteType(BaseLoc, BaseType, diag::err_incomplete_base_class,
2671 SpecifierRange)) {
2672 Class->setInvalidDecl();
2673 return nullptr;
2674 }
2675
2676 BaseDecl = BaseDecl->getDefinition();
2677 assert(BaseDecl && "Base type is not incomplete, but has no definition");
2678
2679 // Microsoft docs say:
2680 // "If a base-class has a code_seg attribute, derived classes must have the
2681 // same attribute."
2682 const auto *BaseCSA = BaseDecl->getAttr<CodeSegAttr>();
2683 const auto *DerivedCSA = Class->getAttr<CodeSegAttr>();
2684 if ((DerivedCSA || BaseCSA) &&
2685 (!BaseCSA || !DerivedCSA ||
2686 BaseCSA->getName() != DerivedCSA->getName())) {
2687 Diag(Class->getLocation(), diag::err_mismatched_code_seg_base);
2688 Diag(BaseDecl->getLocation(), diag::note_base_class_specified_here)
2689 << BaseDecl;
2690 return nullptr;
2691 }
2692
2693 // A class which contains a flexible array member is not suitable for use as
2694 // a base class:
2695 // - If the layout determines that a base comes before another base,
2696 // the flexible array member would index into the subsequent base.
2697 // - If the layout determines that base comes before the derived class,
2698 // the flexible array member would index into the derived class.
2699 if (BaseDecl->hasFlexibleArrayMember()) {
2700 Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
2701 << BaseDecl->getDeclName();
2702 return nullptr;
2703 }
2704
2705 // C++ [class]p3:
2706 // If a class is marked final and it appears as a base-type-specifier in
2707 // base-clause, the program is ill-formed.
2708 if (FinalAttr *FA = BaseDecl->getAttr<FinalAttr>()) {
2709 Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
2710 << BaseDecl->getDeclName() << FA->isSpelledAsSealed();
2711 Diag(BaseDecl->getLocation(), diag::note_entity_declared_at)
2712 << BaseDecl->getDeclName() << FA->getRange();
2713 return nullptr;
2714 }
2715
2716 // If the base class is invalid the derived class is as well.
2717 if (BaseDecl->isInvalidDecl())
2718 Class->setInvalidDecl();
2719 } else if (BaseType->isDependentType()) {
2720 // Make sure that we don't make an ill-formed AST where the type of the
2721 // Class is non-dependent and its attached base class specifier is an
2722 // dependent type, which violates invariants in many clang code paths (e.g.
2723 // constexpr evaluator). If this case happens (in errory-recovery mode), we
2724 // explicitly mark the Class decl invalid. The diagnostic was already
2725 // emitted.
2726 if (!Class->isDependentContext())
2727 Class->setInvalidDecl();
2728 } else {
2729 // The base class is some non-dependent non-class type.
2730 Diag(BaseLoc, diag::err_base_must_be_class) << SpecifierRange;
2731 return nullptr;
2732 }
2733
2734 // In HLSL, unspecified class access is public rather than private.
2735 if (getLangOpts().HLSL && Class->getTagKind() == TagTypeKind::Class &&
2736 Access == AS_none)
2737 Access = AS_public;
2738
2739 // Create the base specifier.
2740 return new (Context) CXXBaseSpecifier(
2741 SpecifierRange, Virtual, Class->getTagKind() == TagTypeKind::Class,
2742 Access, TInfo, EllipsisLoc);
2743}
2744
2746 const ParsedAttributesView &Attributes,
2747 bool Virtual, AccessSpecifier Access,
2748 ParsedType basetype, SourceLocation BaseLoc,
2749 SourceLocation EllipsisLoc) {
2750 if (!classdecl)
2751 return true;
2752
2753 AdjustDeclIfTemplate(classdecl);
2754 CXXRecordDecl *Class = dyn_cast<CXXRecordDecl>(classdecl);
2755 if (!Class)
2756 return true;
2757
2758 // We haven't yet attached the base specifiers.
2759 Class->setIsParsingBaseSpecifiers();
2760
2761 // We do not support any C++11 attributes on base-specifiers yet.
2762 // Diagnose any attributes we see.
2763 for (const ParsedAttr &AL : Attributes) {
2764 if (AL.isInvalid() || AL.getKind() == ParsedAttr::IgnoredAttribute)
2765 continue;
2766 if (AL.getKind() == ParsedAttr::UnknownAttribute)
2767 Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored)
2768 << AL << AL.getRange();
2769 else
2770 Diag(AL.getLoc(), diag::err_base_specifier_attribute)
2771 << AL << AL.isRegularKeywordAttribute() << AL.getRange();
2772 }
2773
2774 TypeSourceInfo *TInfo = nullptr;
2775 GetTypeFromParser(basetype, &TInfo);
2776
2777 if (EllipsisLoc.isInvalid() &&
2778 DiagnoseUnexpandedParameterPack(SpecifierRange.getBegin(), TInfo,
2780 return true;
2781
2782 // C++ [class.union.general]p4:
2783 // [...] A union shall not have base classes.
2784 if (Class->isUnion()) {
2785 Diag(Class->getLocation(), diag::err_base_clause_on_union)
2786 << SpecifierRange;
2787 return true;
2788 }
2789
2790 if (CXXBaseSpecifier *BaseSpec = CheckBaseSpecifier(Class, SpecifierRange,
2791 Virtual, Access, TInfo,
2792 EllipsisLoc))
2793 return BaseSpec;
2794
2795 Class->setInvalidDecl();
2796 return true;
2797}
2798
2799/// Use small set to collect indirect bases. As this is only used
2800/// locally, there's no need to abstract the small size parameter.
2802
2803/// Recursively add the bases of Type. Don't add Type itself.
2804static void
2806 const QualType &Type)
2807{
2808 // Even though the incoming type is a base, it might not be
2809 // a class -- it could be a template parm, for instance.
2810 if (auto Rec = Type->getAs<RecordType>()) {
2811 auto Decl = Rec->getAsCXXRecordDecl();
2812
2813 // Iterate over its bases.
2814 for (const auto &BaseSpec : Decl->bases()) {
2815 QualType Base = Context.getCanonicalType(BaseSpec.getType())
2817 if (Set.insert(Base).second)
2818 // If we've not already seen it, recurse.
2820 }
2821 }
2822}
2823
2826 if (Bases.empty())
2827 return false;
2828
2829 // Used to keep track of which base types we have already seen, so
2830 // that we can properly diagnose redundant direct base types. Note
2831 // that the key is always the unqualified canonical type of the base
2832 // class.
2833 std::map<QualType, CXXBaseSpecifier*, QualTypeOrdering> KnownBaseTypes;
2834
2835 // Used to track indirect bases so we can see if a direct base is
2836 // ambiguous.
2837 IndirectBaseSet IndirectBaseTypes;
2838
2839 // Copy non-redundant base specifiers into permanent storage.
2840 unsigned NumGoodBases = 0;
2841 bool Invalid = false;
2842 for (unsigned idx = 0; idx < Bases.size(); ++idx) {
2843 QualType NewBaseType
2844 = Context.getCanonicalType(Bases[idx]->getType());
2845 NewBaseType = NewBaseType.getLocalUnqualifiedType();
2846
2847 CXXBaseSpecifier *&KnownBase = KnownBaseTypes[NewBaseType];
2848 if (KnownBase) {
2849 // C++ [class.mi]p3:
2850 // A class shall not be specified as a direct base class of a
2851 // derived class more than once.
2852 Diag(Bases[idx]->getBeginLoc(), diag::err_duplicate_base_class)
2853 << KnownBase->getType() << Bases[idx]->getSourceRange();
2854
2855 // Delete the duplicate base class specifier; we're going to
2856 // overwrite its pointer later.
2857 Context.Deallocate(Bases[idx]);
2858
2859 Invalid = true;
2860 } else {
2861 // Okay, add this new base class.
2862 KnownBase = Bases[idx];
2863 Bases[NumGoodBases++] = Bases[idx];
2864
2865 if (NewBaseType->isDependentType())
2866 continue;
2867 // Note this base's direct & indirect bases, if there could be ambiguity.
2868 if (Bases.size() > 1)
2869 NoteIndirectBases(Context, IndirectBaseTypes, NewBaseType);
2870
2871 if (const RecordType *Record = NewBaseType->getAs<RecordType>()) {
2872 const CXXRecordDecl *RD = cast<CXXRecordDecl>(Record->getDecl());
2873 if (Class->isInterface() &&
2874 (!RD->isInterfaceLike() ||
2875 KnownBase->getAccessSpecifier() != AS_public)) {
2876 // The Microsoft extension __interface does not permit bases that
2877 // are not themselves public interfaces.
2878 Diag(KnownBase->getBeginLoc(), diag::err_invalid_base_in_interface)
2879 << getRecordDiagFromTagKind(RD->getTagKind()) << RD
2880 << RD->getSourceRange();
2881 Invalid = true;
2882 }
2883 if (RD->hasAttr<WeakAttr>())
2884 Class->addAttr(WeakAttr::CreateImplicit(Context));
2885 }
2886 }
2887 }
2888
2889 // Attach the remaining base class specifiers to the derived class.
2890 Class->setBases(Bases.data(), NumGoodBases);
2891
2892 // Check that the only base classes that are duplicate are virtual.
2893 for (unsigned idx = 0; idx < NumGoodBases; ++idx) {
2894 // Check whether this direct base is inaccessible due to ambiguity.
2895 QualType BaseType = Bases[idx]->getType();
2896
2897 // Skip all dependent types in templates being used as base specifiers.
2898 // Checks below assume that the base specifier is a CXXRecord.
2899 if (BaseType->isDependentType())
2900 continue;
2901
2902 CanQualType CanonicalBase = Context.getCanonicalType(BaseType)
2904
2905 if (IndirectBaseTypes.count(CanonicalBase)) {
2906 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
2907 /*DetectVirtual=*/true);
2908 bool found
2909 = Class->isDerivedFrom(CanonicalBase->getAsCXXRecordDecl(), Paths);
2910 assert(found);
2911 (void)found;
2912
2913 if (Paths.isAmbiguous(CanonicalBase))
2914 Diag(Bases[idx]->getBeginLoc(), diag::warn_inaccessible_base_class)
2915 << BaseType << getAmbiguousPathsDisplayString(Paths)
2916 << Bases[idx]->getSourceRange();
2917 else
2918 assert(Bases[idx]->isVirtual());
2919 }
2920
2921 // Delete the base class specifier, since its data has been copied
2922 // into the CXXRecordDecl.
2923 Context.Deallocate(Bases[idx]);
2924 }
2925
2926 return Invalid;
2927}
2928
2931 if (!ClassDecl || Bases.empty())
2932 return;
2933
2934 AdjustDeclIfTemplate(ClassDecl);
2935 AttachBaseSpecifiers(cast<CXXRecordDecl>(ClassDecl), Bases);
2936}
2937
2939 if (!getLangOpts().CPlusPlus)
2940 return false;
2941
2942 CXXRecordDecl *DerivedRD = Derived->getAsCXXRecordDecl();
2943 if (!DerivedRD)
2944 return false;
2945
2946 CXXRecordDecl *BaseRD = Base->getAsCXXRecordDecl();
2947 if (!BaseRD)
2948 return false;
2949
2950 // If either the base or the derived type is invalid, don't try to
2951 // check whether one is derived from the other.
2952 if (BaseRD->isInvalidDecl() || DerivedRD->isInvalidDecl())
2953 return false;
2954
2955 // FIXME: In a modules build, do we need the entire path to be visible for us
2956 // to be able to use the inheritance relationship?
2957 if (!isCompleteType(Loc, Derived) && !DerivedRD->isBeingDefined())
2958 return false;
2959
2960 return DerivedRD->isDerivedFrom(BaseRD);
2961}
2962
2964 CXXBasePaths &Paths) {
2965 if (!getLangOpts().CPlusPlus)
2966 return false;
2967
2968 CXXRecordDecl *DerivedRD = Derived->getAsCXXRecordDecl();
2969 if (!DerivedRD)
2970 return false;
2971
2972 CXXRecordDecl *BaseRD = Base->getAsCXXRecordDecl();
2973 if (!BaseRD)
2974 return false;
2975
2976 if (!isCompleteType(Loc, Derived) && !DerivedRD->isBeingDefined())
2977 return false;
2978
2979 return DerivedRD->isDerivedFrom(BaseRD, Paths);
2980}
2981
2983 CXXCastPath &BasePathArray) {
2984 // We first go backward and check if we have a virtual base.
2985 // FIXME: It would be better if CXXBasePath had the base specifier for
2986 // the nearest virtual base.
2987 unsigned Start = 0;
2988 for (unsigned I = Path.size(); I != 0; --I) {
2989 if (Path[I - 1].Base->isVirtual()) {
2990 Start = I - 1;
2991 break;
2992 }
2993 }
2994
2995 // Now add all bases.
2996 for (unsigned I = Start, E = Path.size(); I != E; ++I)
2997 BasePathArray.push_back(const_cast<CXXBaseSpecifier*>(Path[I].Base));
2998}
2999
3000
3002 CXXCastPath &BasePathArray) {
3003 assert(BasePathArray.empty() && "Base path array must be empty!");
3004 assert(Paths.isRecordingPaths() && "Must record paths!");
3005 return ::BuildBasePathArray(Paths.front(), BasePathArray);
3006}
3007
3008bool
3010 unsigned InaccessibleBaseID,
3011 unsigned AmbiguousBaseConvID,
3013 DeclarationName Name,
3014 CXXCastPath *BasePath,
3015 bool IgnoreAccess) {
3016 // First, determine whether the path from Derived to Base is
3017 // ambiguous. This is slightly more expensive than checking whether
3018 // the Derived to Base conversion exists, because here we need to
3019 // explore multiple paths to determine if there is an ambiguity.
3020 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
3021 /*DetectVirtual=*/false);
3022 bool DerivationOkay = IsDerivedFrom(Loc, Derived, Base, Paths);
3023 if (!DerivationOkay)
3024 return true;
3025
3026 const CXXBasePath *Path = nullptr;
3027 if (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType()))
3028 Path = &Paths.front();
3029
3030 // For MSVC compatibility, check if Derived directly inherits from Base. Clang
3031 // warns about this hierarchy under -Winaccessible-base, but MSVC allows the
3032 // user to access such bases.
3033 if (!Path && getLangOpts().MSVCCompat) {
3034 for (const CXXBasePath &PossiblePath : Paths) {
3035 if (PossiblePath.size() == 1) {
3036 Path = &PossiblePath;
3037 if (AmbiguousBaseConvID)
3038 Diag(Loc, diag::ext_ms_ambiguous_direct_base)
3039 << Base << Derived << Range;
3040 break;
3041 }
3042 }
3043 }
3044
3045 if (Path) {
3046 if (!IgnoreAccess) {
3047 // Check that the base class can be accessed.
3048 switch (
3049 CheckBaseClassAccess(Loc, Base, Derived, *Path, InaccessibleBaseID)) {
3050 case AR_inaccessible:
3051 return true;
3052 case AR_accessible:
3053 case AR_dependent:
3054 case AR_delayed:
3055 break;
3056 }
3057 }
3058
3059 // Build a base path if necessary.
3060 if (BasePath)
3061 ::BuildBasePathArray(*Path, *BasePath);
3062 return false;
3063 }
3064
3065 if (AmbiguousBaseConvID) {
3066 // We know that the derived-to-base conversion is ambiguous, and
3067 // we're going to produce a diagnostic. Perform the derived-to-base
3068 // search just one more time to compute all of the possible paths so
3069 // that we can print them out. This is more expensive than any of
3070 // the previous derived-to-base checks we've done, but at this point
3071 // performance isn't as much of an issue.
3072 Paths.clear();
3073 Paths.setRecordingPaths(true);
3074 bool StillOkay = IsDerivedFrom(Loc, Derived, Base, Paths);
3075 assert(StillOkay && "Can only be used with a derived-to-base conversion");
3076 (void)StillOkay;
3077
3078 // Build up a textual representation of the ambiguous paths, e.g.,
3079 // D -> B -> A, that will be used to illustrate the ambiguous
3080 // conversions in the diagnostic. We only print one of the paths
3081 // to each base class subobject.
3082 std::string PathDisplayStr = getAmbiguousPathsDisplayString(Paths);
3083
3084 Diag(Loc, AmbiguousBaseConvID)
3085 << Derived << Base << PathDisplayStr << Range << Name;
3086 }
3087 return true;
3088}
3089
3090bool
3093 CXXCastPath *BasePath,
3094 bool IgnoreAccess) {
3096 Derived, Base, diag::err_upcast_to_inaccessible_base,
3097 diag::err_ambiguous_derived_to_base_conv, Loc, Range, DeclarationName(),
3098 BasePath, IgnoreAccess);
3099}
3100
3102 std::string PathDisplayStr;
3103 std::set<unsigned> DisplayedPaths;
3104 for (CXXBasePaths::paths_iterator Path = Paths.begin();
3105 Path != Paths.end(); ++Path) {
3106 if (DisplayedPaths.insert(Path->back().SubobjectNumber).second) {
3107 // We haven't displayed a path to this particular base
3108 // class subobject yet.
3109 PathDisplayStr += "\n ";
3110 PathDisplayStr += Context.getTypeDeclType(Paths.getOrigin()).getAsString();
3111 for (CXXBasePath::const_iterator Element = Path->begin();
3112 Element != Path->end(); ++Element)
3113 PathDisplayStr += " -> " + Element->Base->getType().getAsString();
3114 }
3115 }
3116
3117 return PathDisplayStr;
3118}
3119
3120//===----------------------------------------------------------------------===//
3121// C++ class member Handling
3122//===----------------------------------------------------------------------===//
3123
3125 SourceLocation ColonLoc,
3126 const ParsedAttributesView &Attrs) {
3127 assert(Access != AS_none && "Invalid kind for syntactic access specifier!");
3129 ASLoc, ColonLoc);
3130 CurContext->addHiddenDecl(ASDecl);
3131 return ProcessAccessDeclAttributeList(ASDecl, Attrs);
3132}
3133
3135 if (D->isInvalidDecl())
3136 return;
3137
3138 // We only care about "override" and "final" declarations.
3139 if (!D->hasAttr<OverrideAttr>() && !D->hasAttr<FinalAttr>())
3140 return;
3141
3142 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D);
3143
3144 // We can't check dependent instance methods.
3145 if (MD && MD->isInstance() &&
3146 (MD->getParent()->hasAnyDependentBases() ||
3147 MD->getType()->isDependentType()))
3148 return;
3149
3150 if (MD && !MD->isVirtual()) {
3151 // If we have a non-virtual method, check if it hides a virtual method.
3152 // (In that case, it's most likely the method has the wrong type.)
3153 SmallVector<CXXMethodDecl *, 8> OverloadedMethods;
3154 FindHiddenVirtualMethods(MD, OverloadedMethods);
3155
3156 if (!OverloadedMethods.empty()) {
3157 if (OverrideAttr *OA = D->getAttr<OverrideAttr>()) {
3158 Diag(OA->getLocation(),
3159 diag::override_keyword_hides_virtual_member_function)
3160 << "override" << (OverloadedMethods.size() > 1);
3161 } else if (FinalAttr *FA = D->getAttr<FinalAttr>()) {
3162 Diag(FA->getLocation(),
3163 diag::override_keyword_hides_virtual_member_function)
3164 << (FA->isSpelledAsSealed() ? "sealed" : "final")
3165 << (OverloadedMethods.size() > 1);
3166 }
3167 NoteHiddenVirtualMethods(MD, OverloadedMethods);
3168 MD->setInvalidDecl();
3169 return;
3170 }
3171 // Fall through into the general case diagnostic.
3172 // FIXME: We might want to attempt typo correction here.
3173 }
3174
3175 if (!MD || !MD->isVirtual()) {
3176 if (OverrideAttr *OA = D->getAttr<OverrideAttr>()) {
3177 Diag(OA->getLocation(),
3178 diag::override_keyword_only_allowed_on_virtual_member_functions)
3179 << "override" << FixItHint::CreateRemoval(OA->getLocation());
3180 D->dropAttr<OverrideAttr>();
3181 }
3182 if (FinalAttr *FA = D->getAttr<FinalAttr>()) {
3183 Diag(FA->getLocation(),
3184 diag::override_keyword_only_allowed_on_virtual_member_functions)
3185 << (FA->isSpelledAsSealed() ? "sealed" : "final")
3186 << FixItHint::CreateRemoval(FA->getLocation());
3187 D->dropAttr<FinalAttr>();
3188 }
3189 return;
3190 }
3191
3192 // C++11 [class.virtual]p5:
3193 // If a function is marked with the virt-specifier override and
3194 // does not override a member function of a base class, the program is
3195 // ill-formed.
3196 bool HasOverriddenMethods = MD->size_overridden_methods() != 0;
3197 if (MD->hasAttr<OverrideAttr>() && !HasOverriddenMethods)
3198 Diag(MD->getLocation(), diag::err_function_marked_override_not_overriding)
3199 << MD->getDeclName();
3200}
3201
3203 if (D->isInvalidDecl() || D->hasAttr<OverrideAttr>())
3204 return;
3205 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D);
3206 if (!MD || MD->isImplicit() || MD->hasAttr<FinalAttr>())
3207 return;
3208
3210 SourceLocation SpellingLoc = Loc;
3211 if (getSourceManager().isMacroArgExpansion(Loc))
3213 SpellingLoc = getSourceManager().getSpellingLoc(SpellingLoc);
3214 if (SpellingLoc.isValid() && getSourceManager().isInSystemHeader(SpellingLoc))
3215 return;
3216
3217 if (MD->size_overridden_methods() > 0) {
3218 auto EmitDiag = [&](unsigned DiagInconsistent, unsigned DiagSuggest) {
3219 unsigned DiagID =
3220 Inconsistent && !Diags.isIgnored(DiagInconsistent, MD->getLocation())
3221 ? DiagInconsistent
3222 : DiagSuggest;
3223 Diag(MD->getLocation(), DiagID) << MD->getDeclName();
3224 const CXXMethodDecl *OMD = *MD->begin_overridden_methods();
3225 Diag(OMD->getLocation(), diag::note_overridden_virtual_function);
3226 };
3227 if (isa<CXXDestructorDecl>(MD))
3228 EmitDiag(
3229 diag::warn_inconsistent_destructor_marked_not_override_overriding,
3230 diag::warn_suggest_destructor_marked_not_override_overriding);
3231 else
3232 EmitDiag(diag::warn_inconsistent_function_marked_not_override_overriding,
3233 diag::warn_suggest_function_marked_not_override_overriding);
3234 }
3235}
3236
3238 const CXXMethodDecl *Old) {
3239 FinalAttr *FA = Old->getAttr<FinalAttr>();
3240 if (!FA)
3241 return false;
3242
3243 Diag(New->getLocation(), diag::err_final_function_overridden)
3244 << New->getDeclName()
3245 << FA->isSpelledAsSealed();
3246 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
3247 return true;
3248}
3249
3251 const Type *T = FD.getType()->getBaseElementTypeUnsafe();
3252 // FIXME: Destruction of ObjC lifetime types has side-effects.
3253 if (const CXXRecordDecl *RD = T->getAsCXXRecordDecl())
3254 return !RD->isCompleteDefinition() ||
3255 !RD->hasTrivialDefaultConstructor() ||
3256 !RD->hasTrivialDestructor();
3257 return false;
3258}
3259
3260void Sema::CheckShadowInheritedFields(const SourceLocation &Loc,
3261 DeclarationName FieldName,
3262 const CXXRecordDecl *RD,
3263 bool DeclIsField) {
3264 if (Diags.isIgnored(diag::warn_shadow_field, Loc))
3265 return;
3266
3267 // To record a shadowed field in a base
3268 std::map<CXXRecordDecl*, NamedDecl*> Bases;
3269 auto FieldShadowed = [&](const CXXBaseSpecifier *Specifier,
3270 CXXBasePath &Path) {
3271 const auto Base = Specifier->getType()->getAsCXXRecordDecl();
3272 // Record an ambiguous path directly
3273 if (Bases.find(Base) != Bases.end())
3274 return true;
3275 for (const auto Field : Base->lookup(FieldName)) {
3276 if ((isa<FieldDecl>(Field) || isa<IndirectFieldDecl>(Field)) &&
3277 Field->getAccess() != AS_private) {
3278 assert(Field->getAccess() != AS_none);
3279 assert(Bases.find(Base) == Bases.end());
3280 Bases[Base] = Field;
3281 return true;
3282 }
3283 }
3284 return false;
3285 };
3286
3287 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
3288 /*DetectVirtual=*/true);
3289 if (!RD->lookupInBases(FieldShadowed, Paths))
3290 return;
3291
3292 for (const auto &P : Paths) {
3293 auto Base = P.back().Base->getType()->getAsCXXRecordDecl();
3294 auto It = Bases.find(Base);
3295 // Skip duplicated bases
3296 if (It == Bases.end())
3297 continue;
3298 auto BaseField = It->second;
3299 assert(BaseField->getAccess() != AS_private);
3300 if (AS_none !=
3301 CXXRecordDecl::MergeAccess(P.Access, BaseField->getAccess())) {
3302 Diag(Loc, diag::warn_shadow_field)
3303 << FieldName << RD << Base << DeclIsField;
3304 Diag(BaseField->getLocation(), diag::note_shadow_field);
3305 Bases.erase(It);
3306 }
3307 }
3308}
3309
3310NamedDecl *
3312 MultiTemplateParamsArg TemplateParameterLists,
3313 Expr *BW, const VirtSpecifiers &VS,
3314 InClassInitStyle InitStyle) {
3315 const DeclSpec &DS = D.getDeclSpec();
3317 DeclarationName Name = NameInfo.getName();
3318 SourceLocation Loc = NameInfo.getLoc();
3319
3320 // For anonymous bitfields, the location should point to the type.
3321 if (Loc.isInvalid())
3322 Loc = D.getBeginLoc();
3323
3324 Expr *BitWidth = static_cast<Expr*>(BW);
3325
3326 assert(isa<CXXRecordDecl>(CurContext));
3327 assert(!DS.isFriendSpecified());
3328
3329 bool isFunc = D.isDeclarationOfFunction();
3330 const ParsedAttr *MSPropertyAttr =
3331 D.getDeclSpec().getAttributes().getMSPropertyAttr();
3332
3333 if (cast<CXXRecordDecl>(CurContext)->isInterface()) {
3334 // The Microsoft extension __interface only permits public member functions
3335 // and prohibits constructors, destructors, operators, non-public member
3336 // functions, static methods and data members.
3337 unsigned InvalidDecl;
3338 bool ShowDeclName = true;
3339 if (!isFunc &&
3340 (DS.getStorageClassSpec() == DeclSpec::SCS_typedef || MSPropertyAttr))
3341 InvalidDecl = 0;
3342 else if (!isFunc)
3343 InvalidDecl = 1;
3344 else if (AS != AS_public)
3345 InvalidDecl = 2;
3347 InvalidDecl = 3;
3348 else switch (Name.getNameKind()) {
3350 InvalidDecl = 4;
3351 ShowDeclName = false;
3352 break;
3353
3355 InvalidDecl = 5;
3356 ShowDeclName = false;
3357 break;
3358
3361 InvalidDecl = 6;
3362 break;
3363
3364 default:
3365 InvalidDecl = 0;
3366 break;
3367 }
3368
3369 if (InvalidDecl) {
3370 if (ShowDeclName)
3371 Diag(Loc, diag::err_invalid_member_in_interface)
3372 << (InvalidDecl-1) << Name;
3373 else
3374 Diag(Loc, diag::err_invalid_member_in_interface)
3375 << (InvalidDecl-1) << "";
3376 return nullptr;
3377 }
3378 }
3379
3380 // C++ 9.2p6: A member shall not be declared to have automatic storage
3381 // duration (auto, register) or with the extern storage-class-specifier.
3382 // C++ 7.1.1p8: The mutable specifier can be applied only to names of class
3383 // data members and cannot be applied to names declared const or static,
3384 // and cannot be applied to reference members.
3385 switch (DS.getStorageClassSpec()) {
3389 break;
3391 if (isFunc) {
3392 Diag(DS.getStorageClassSpecLoc(), diag::err_mutable_function);
3393
3394 // FIXME: It would be nicer if the keyword was ignored only for this
3395 // declarator. Otherwise we could get follow-up errors.
3396 D.getMutableDeclSpec().ClearStorageClassSpecs();
3397 }
3398 break;
3399 default:
3401 diag::err_storageclass_invalid_for_member);
3402 D.getMutableDeclSpec().ClearStorageClassSpecs();
3403 break;
3404 }
3405
3406 bool isInstField = (DS.getStorageClassSpec() == DeclSpec::SCS_unspecified ||
3408 !isFunc && TemplateParameterLists.empty();
3409
3410 if (DS.hasConstexprSpecifier() && isInstField) {
3412 Diag(DS.getConstexprSpecLoc(), diag::err_invalid_constexpr_member);
3413 SourceLocation ConstexprLoc = DS.getConstexprSpecLoc();
3414 if (InitStyle == ICIS_NoInit) {
3415 B << 0 << 0;
3416 if (D.getDeclSpec().getTypeQualifiers() & DeclSpec::TQ_const)
3417 B << FixItHint::CreateRemoval(ConstexprLoc);
3418 else {
3419 B << FixItHint::CreateReplacement(ConstexprLoc, "const");
3420 D.getMutableDeclSpec().ClearConstexprSpec();
3421 const char *PrevSpec;
3422 unsigned DiagID;
3423 bool Failed = D.getMutableDeclSpec().SetTypeQual(
3424 DeclSpec::TQ_const, ConstexprLoc, PrevSpec, DiagID, getLangOpts());
3425 (void)Failed;
3426 assert(!Failed && "Making a constexpr member const shouldn't fail");
3427 }
3428 } else {
3429 B << 1;
3430 const char *PrevSpec;
3431 unsigned DiagID;
3432 if (D.getMutableDeclSpec().SetStorageClassSpec(
3433 *this, DeclSpec::SCS_static, ConstexprLoc, PrevSpec, DiagID,
3436 "This is the only DeclSpec that should fail to be applied");
3437 B << 1;
3438 } else {
3439 B << 0 << FixItHint::CreateInsertion(ConstexprLoc, "static ");
3440 isInstField = false;
3441 }
3442 }
3443 }
3444
3446 if (isInstField) {
3447 CXXScopeSpec &SS = D.getCXXScopeSpec();
3448
3449 // Data members must have identifiers for names.
3450 if (!Name.isIdentifier()) {
3451 Diag(Loc, diag::err_bad_variable_name)
3452 << Name;
3453 return nullptr;
3454 }
3455
3456 IdentifierInfo *II = Name.getAsIdentifierInfo();
3457 if (D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId) {
3458 Diag(D.getIdentifierLoc(), diag::err_member_with_template_arguments)
3459 << II
3460 << SourceRange(D.getName().TemplateId->LAngleLoc,
3461 D.getName().TemplateId->RAngleLoc)
3462 << D.getName().TemplateId->LAngleLoc;
3463 D.SetIdentifier(II, Loc);
3464 }
3465
3466 if (SS.isSet() && !SS.isInvalid()) {
3467 // The user provided a superfluous scope specifier inside a class
3468 // definition:
3469 //
3470 // class X {
3471 // int X::member;
3472 // };
3473 if (DeclContext *DC = computeDeclContext(SS, false)) {
3474 TemplateIdAnnotation *TemplateId =
3476 ? D.getName().TemplateId
3477 : nullptr;
3478 diagnoseQualifiedDeclaration(SS, DC, Name, D.getIdentifierLoc(),
3479 TemplateId,
3480 /*IsMemberSpecialization=*/false);
3481 } else {
3482 Diag(D.getIdentifierLoc(), diag::err_member_qualification)
3483 << Name << SS.getRange();
3484 }
3485 SS.clear();
3486 }
3487
3488 if (MSPropertyAttr) {
3489 Member = HandleMSProperty(S, cast<CXXRecordDecl>(CurContext), Loc, D,
3490 BitWidth, InitStyle, AS, *MSPropertyAttr);
3491 if (!Member)
3492 return nullptr;
3493 isInstField = false;
3494 } else {
3495 Member = HandleField(S, cast<CXXRecordDecl>(CurContext), Loc, D,
3496 BitWidth, InitStyle, AS);
3497 if (!Member)
3498 return nullptr;
3499 }
3500
3501 CheckShadowInheritedFields(Loc, Name, cast<CXXRecordDecl>(CurContext));
3502 } else {
3503 Member = HandleDeclarator(S, D, TemplateParameterLists);
3504 if (!Member)
3505 return nullptr;
3506
3507 // Non-instance-fields can't have a bitfield.
3508 if (BitWidth) {
3509 if (Member->isInvalidDecl()) {
3510 // don't emit another diagnostic.
3511 } else if (isa<VarDecl>(Member) || isa<VarTemplateDecl>(Member)) {
3512 // C++ 9.6p3: A bit-field shall not be a static member.
3513 // "static member 'A' cannot be a bit-field"
3514 Diag(Loc, diag::err_static_not_bitfield)
3515 << Name << BitWidth->getSourceRange();
3516 } else if (isa<TypedefDecl>(Member)) {
3517 // "typedef member 'x' cannot be a bit-field"
3518 Diag(Loc, diag::err_typedef_not_bitfield)
3519 << Name << BitWidth->getSourceRange();
3520 } else {
3521 // A function typedef ("typedef int f(); f a;").
3522 // C++ 9.6p3: A bit-field shall have integral or enumeration type.
3523 Diag(Loc, diag::err_not_integral_type_bitfield)
3524 << Name << cast<ValueDecl>(Member)->getType()
3525 << BitWidth->getSourceRange();
3526 }
3527
3528 BitWidth = nullptr;
3529 Member->setInvalidDecl();
3530 }
3531
3532 NamedDecl *NonTemplateMember = Member;
3533 if (FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(Member))
3534 NonTemplateMember = FunTmpl->getTemplatedDecl();
3535 else if (VarTemplateDecl *VarTmpl = dyn_cast<VarTemplateDecl>(Member))
3536 NonTemplateMember = VarTmpl->getTemplatedDecl();
3537
3538 Member->setAccess(AS);
3539
3540 // If we have declared a member function template or static data member
3541 // template, set the access of the templated declaration as well.
3542 if (NonTemplateMember != Member)
3543 NonTemplateMember->setAccess(AS);
3544
3545 // C++ [temp.deduct.guide]p3:
3546 // A deduction guide [...] for a member class template [shall be
3547 // declared] with the same access [as the template].
3548 if (auto *DG = dyn_cast<CXXDeductionGuideDecl>(NonTemplateMember)) {
3549 auto *TD = DG->getDeducedTemplate();
3550 // Access specifiers are only meaningful if both the template and the
3551 // deduction guide are from the same scope.
3552 if (AS != TD->getAccess() &&
3553 TD->getDeclContext()->getRedeclContext()->Equals(
3554 DG->getDeclContext()->getRedeclContext())) {
3555 Diag(DG->getBeginLoc(), diag::err_deduction_guide_wrong_access);
3556 Diag(TD->getBeginLoc(), diag::note_deduction_guide_template_access)
3557 << TD->getAccess();
3558 const AccessSpecDecl *LastAccessSpec = nullptr;
3559 for (const auto *D : cast<CXXRecordDecl>(CurContext)->decls()) {
3560 if (const auto *AccessSpec = dyn_cast<AccessSpecDecl>(D))
3561 LastAccessSpec = AccessSpec;
3562 }
3563 assert(LastAccessSpec && "differing access with no access specifier");
3564 Diag(LastAccessSpec->getBeginLoc(), diag::note_deduction_guide_access)
3565 << AS;
3566 }
3567 }
3568 }
3569
3570 if (VS.isOverrideSpecified())
3571 Member->addAttr(OverrideAttr::Create(Context, VS.getOverrideLoc()));
3572 if (VS.isFinalSpecified())
3573 Member->addAttr(FinalAttr::Create(Context, VS.getFinalLoc(),
3575 ? FinalAttr::Keyword_sealed
3576 : FinalAttr::Keyword_final));
3577
3578 if (VS.getLastLocation().isValid()) {
3579 // Update the end location of a method that has a virt-specifiers.
3580 if (CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(Member))
3581 MD->setRangeEnd(VS.getLastLocation());
3582 }
3583
3585
3586 assert((Name || isInstField) && "No identifier for non-field ?");
3587
3588 if (isInstField) {
3589 FieldDecl *FD = cast<FieldDecl>(Member);
3590 FieldCollector->Add(FD);
3591
3592 if (!Diags.isIgnored(diag::warn_unused_private_field, FD->getLocation())) {
3593 // Remember all explicit private FieldDecls that have a name, no side
3594 // effects and are not part of a dependent type declaration.
3595
3596 auto DeclHasUnusedAttr = [](const QualType &T) {
3597 if (const TagDecl *TD = T->getAsTagDecl())
3598 return TD->hasAttr<UnusedAttr>();
3599 if (const TypedefType *TDT = T->getAs<TypedefType>())
3600 return TDT->getDecl()->hasAttr<UnusedAttr>();
3601 return false;
3602 };
3603
3604 if (!FD->isImplicit() && FD->getDeclName() &&
3605 FD->getAccess() == AS_private &&
3606 !FD->hasAttr<UnusedAttr>() &&
3607 !FD->getParent()->isDependentContext() &&
3608 !DeclHasUnusedAttr(FD->getType()) &&
3610 UnusedPrivateFields.insert(FD);
3611 }
3612 }
3613
3614 return Member;
3615}
3616
3617namespace {
3618 class UninitializedFieldVisitor
3619 : public EvaluatedExprVisitor<UninitializedFieldVisitor> {
3620 Sema &S;
3621 // List of Decls to generate a warning on. Also remove Decls that become
3622 // initialized.
3623 llvm::SmallPtrSetImpl<ValueDecl*> &Decls;
3624 // List of base classes of the record. Classes are removed after their
3625 // initializers.
3626 llvm::SmallPtrSetImpl<QualType> &BaseClasses;
3627 // Vector of decls to be removed from the Decl set prior to visiting the
3628 // nodes. These Decls may have been initialized in the prior initializer.
3630 // If non-null, add a note to the warning pointing back to the constructor.
3631 const CXXConstructorDecl *Constructor;
3632 // Variables to hold state when processing an initializer list. When
3633 // InitList is true, special case initialization of FieldDecls matching
3634 // InitListFieldDecl.
3635 bool InitList;
3636 FieldDecl *InitListFieldDecl;
3637 llvm::SmallVector<unsigned, 4> InitFieldIndex;
3638
3639 public:
3641 UninitializedFieldVisitor(Sema &S,
3642 llvm::SmallPtrSetImpl<ValueDecl*> &Decls,
3643 llvm::SmallPtrSetImpl<QualType> &BaseClasses)
3644 : Inherited(S.Context), S(S), Decls(Decls), BaseClasses(BaseClasses),
3645 Constructor(nullptr), InitList(false), InitListFieldDecl(nullptr) {}
3646
3647 // Returns true if the use of ME is not an uninitialized use.
3648 bool IsInitListMemberExprInitialized(MemberExpr *ME,
3649 bool CheckReferenceOnly) {
3651 bool ReferenceField = false;
3652 while (ME) {
3653 FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl());
3654 if (!FD)
3655 return false;
3656 Fields.push_back(FD);
3657 if (FD->getType()->isReferenceType())
3658 ReferenceField = true;
3659 ME = dyn_cast<MemberExpr>(ME->getBase()->IgnoreParenImpCasts());
3660 }
3661
3662 // Binding a reference to an uninitialized field is not an
3663 // uninitialized use.
3664 if (CheckReferenceOnly && !ReferenceField)
3665 return true;
3666
3667 llvm::SmallVector<unsigned, 4> UsedFieldIndex;
3668 // Discard the first field since it is the field decl that is being
3669 // initialized.
3670 for (const FieldDecl *FD : llvm::drop_begin(llvm::reverse(Fields)))
3671 UsedFieldIndex.push_back(FD->getFieldIndex());
3672
3673 for (auto UsedIter = UsedFieldIndex.begin(),
3674 UsedEnd = UsedFieldIndex.end(),
3675 OrigIter = InitFieldIndex.begin(),
3676 OrigEnd = InitFieldIndex.end();
3677 UsedIter != UsedEnd && OrigIter != OrigEnd; ++UsedIter, ++OrigIter) {
3678 if (*UsedIter < *OrigIter)
3679 return true;
3680 if (*UsedIter > *OrigIter)
3681 break;
3682 }
3683
3684 return false;
3685 }
3686
3687 void HandleMemberExpr(MemberExpr *ME, bool CheckReferenceOnly,
3688 bool AddressOf) {
3689 if (isa<EnumConstantDecl>(ME->getMemberDecl()))
3690 return;
3691
3692 // FieldME is the inner-most MemberExpr that is not an anonymous struct
3693 // or union.
3694 MemberExpr *FieldME = ME;
3695
3696 bool AllPODFields = FieldME->getType().isPODType(S.Context);
3697
3698 Expr *Base = ME;
3699 while (MemberExpr *SubME =
3700 dyn_cast<MemberExpr>(Base->IgnoreParenImpCasts())) {
3701
3702 if (isa<VarDecl>(SubME->getMemberDecl()))
3703 return;
3704
3705 if (FieldDecl *FD = dyn_cast<FieldDecl>(SubME->getMemberDecl()))
3706 if (!FD->isAnonymousStructOrUnion())
3707 FieldME = SubME;
3708
3709 if (!FieldME->getType().isPODType(S.Context))
3710 AllPODFields = false;
3711
3712 Base = SubME->getBase();
3713 }
3714
3715 if (!isa<CXXThisExpr>(Base->IgnoreParenImpCasts())) {
3716 Visit(Base);
3717 return;
3718 }
3719
3720 if (AddressOf && AllPODFields)
3721 return;
3722
3723 ValueDecl* FoundVD = FieldME->getMemberDecl();
3724
3725 if (ImplicitCastExpr *BaseCast = dyn_cast<ImplicitCastExpr>(Base)) {
3726 while (isa<ImplicitCastExpr>(BaseCast->getSubExpr())) {
3727 BaseCast = cast<ImplicitCastExpr>(BaseCast->getSubExpr());
3728 }
3729
3730 if (BaseCast->getCastKind() == CK_UncheckedDerivedToBase) {
3731 QualType T = BaseCast->getType();
3732 if (T->isPointerType() &&
3733 BaseClasses.count(T->getPointeeType())) {
3734 S.Diag(FieldME->getExprLoc(), diag::warn_base_class_is_uninit)
3735 << T->getPointeeType() << FoundVD;
3736 }
3737 }
3738 }
3739
3740 if (!Decls.count(FoundVD))
3741 return;
3742
3743 const bool IsReference = FoundVD->getType()->isReferenceType();
3744
3745 if (InitList && !AddressOf && FoundVD == InitListFieldDecl) {
3746 // Special checking for initializer lists.
3747 if (IsInitListMemberExprInitialized(ME, CheckReferenceOnly)) {
3748 return;
3749 }
3750 } else {
3751 // Prevent double warnings on use of unbounded references.
3752 if (CheckReferenceOnly && !IsReference)
3753 return;
3754 }
3755
3756 unsigned diag = IsReference
3757 ? diag::warn_reference_field_is_uninit
3758 : diag::warn_field_is_uninit;
3759 S.Diag(FieldME->getExprLoc(), diag) << FoundVD;
3760 if (Constructor)
3761 S.Diag(Constructor->getLocation(),
3762 diag::note_uninit_in_this_constructor)
3763 << (Constructor->isDefaultConstructor() && Constructor->isImplicit());
3764
3765 }
3766
3767 void HandleValue(Expr *E, bool AddressOf) {
3768 E = E->IgnoreParens();
3769
3770 if (MemberExpr *ME = dyn_cast<MemberExpr>(E)) {
3771 HandleMemberExpr(ME, false /*CheckReferenceOnly*/,
3772 AddressOf /*AddressOf*/);
3773 return;
3774 }
3775
3776 if (ConditionalOperator *CO = dyn_cast<ConditionalOperator>(E)) {
3777 Visit(CO->getCond());
3778 HandleValue(CO->getTrueExpr(), AddressOf);
3779 HandleValue(CO->getFalseExpr(), AddressOf);
3780 return;
3781 }
3782
3783 if (BinaryConditionalOperator *BCO =
3784 dyn_cast<BinaryConditionalOperator>(E)) {
3785 Visit(BCO->getCond());
3786 HandleValue(BCO->getFalseExpr(), AddressOf);
3787 return;
3788 }
3789
3790 if (OpaqueValueExpr *OVE = dyn_cast<OpaqueValueExpr>(E)) {
3791 HandleValue(OVE->getSourceExpr(), AddressOf);
3792 return;
3793 }
3794
3795 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
3796 switch (BO->getOpcode()) {
3797 default:
3798 break;
3799 case(BO_PtrMemD):
3800 case(BO_PtrMemI):
3801 HandleValue(BO->getLHS(), AddressOf);
3802 Visit(BO->getRHS());
3803 return;
3804 case(BO_Comma):
3805 Visit(BO->getLHS());
3806 HandleValue(BO->getRHS(), AddressOf);
3807 return;
3808 }
3809 }
3810
3811 Visit(E);
3812 }
3813
3814 void CheckInitListExpr(InitListExpr *ILE) {
3815 InitFieldIndex.push_back(0);
3816 for (auto *Child : ILE->children()) {
3817 if (InitListExpr *SubList = dyn_cast<InitListExpr>(Child)) {
3818 CheckInitListExpr(SubList);
3819 } else {
3820 Visit(Child);
3821 }
3822 ++InitFieldIndex.back();
3823 }
3824 InitFieldIndex.pop_back();
3825 }
3826
3827 void CheckInitializer(Expr *E, const CXXConstructorDecl *FieldConstructor,
3828 FieldDecl *Field, const Type *BaseClass) {
3829 // Remove Decls that may have been initialized in the previous
3830 // initializer.
3831 for (ValueDecl* VD : DeclsToRemove)
3832 Decls.erase(VD);
3833 DeclsToRemove.clear();
3834
3835 Constructor = FieldConstructor;
3836 InitListExpr *ILE = dyn_cast<InitListExpr>(E);
3837
3838 if (ILE && Field) {
3839 InitList = true;
3840 InitListFieldDecl = Field;
3841 InitFieldIndex.clear();
3842 CheckInitListExpr(ILE);
3843 } else {
3844 InitList = false;
3845 Visit(E);
3846 }
3847
3848 if (Field)
3849 Decls.erase(Field);
3850 if (BaseClass)
3851 BaseClasses.erase(BaseClass->getCanonicalTypeInternal());
3852 }
3853
3854 void VisitMemberExpr(MemberExpr *ME) {
3855 // All uses of unbounded reference fields will warn.
3856 HandleMemberExpr(ME, true /*CheckReferenceOnly*/, false /*AddressOf*/);
3857 }
3858
3859 void VisitImplicitCastExpr(ImplicitCastExpr *E) {
3860 if (E->getCastKind() == CK_LValueToRValue) {
3861 HandleValue(E->getSubExpr(), false /*AddressOf*/);
3862 return;
3863 }
3864
3865 Inherited::VisitImplicitCastExpr(E);
3866 }
3867
3868 void VisitCXXConstructExpr(CXXConstructExpr *E) {
3869 if (E->getConstructor()->isCopyConstructor()) {
3870 Expr *ArgExpr = E->getArg(0);
3871 if (InitListExpr *ILE = dyn_cast<InitListExpr>(ArgExpr))
3872 if (ILE->getNumInits() == 1)
3873 ArgExpr = ILE->getInit(0);
3874 if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(ArgExpr))
3875 if (ICE->getCastKind() == CK_NoOp)
3876 ArgExpr = ICE->getSubExpr();
3877 HandleValue(ArgExpr, false /*AddressOf*/);
3878 return;
3879 }
3880 Inherited::VisitCXXConstructExpr(E);
3881 }
3882
3883 void VisitCXXMemberCallExpr(CXXMemberCallExpr *E) {
3884 Expr *Callee = E->getCallee();
3885 if (isa<MemberExpr>(Callee)) {
3886 HandleValue(Callee, false /*AddressOf*/);
3887 for (auto *Arg : E->arguments())
3888 Visit(Arg);
3889 return;
3890 }
3891
3892 Inherited::VisitCXXMemberCallExpr(E);
3893 }
3894
3895 void VisitCallExpr(CallExpr *E) {
3896 // Treat std::move as a use.
3897 if (E->isCallToStdMove()) {
3898 HandleValue(E->getArg(0), /*AddressOf=*/false);
3899 return;
3900 }
3901
3902 Inherited::VisitCallExpr(E);
3903 }
3904
3905 void VisitCXXOperatorCallExpr(CXXOperatorCallExpr *E) {
3906 Expr *Callee = E->getCallee();
3907
3908 if (isa<UnresolvedLookupExpr>(Callee))
3909 return Inherited::VisitCXXOperatorCallExpr(E);
3910
3911 Visit(Callee);
3912 for (auto *Arg : E->arguments())
3913 HandleValue(Arg->IgnoreParenImpCasts(), false /*AddressOf*/);
3914 }
3915
3916 void VisitBinaryOperator(BinaryOperator *E) {
3917 // If a field assignment is detected, remove the field from the
3918 // uninitiailized field set.
3919 if (E->getOpcode() == BO_Assign)
3920 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->getLHS()))
3921 if (FieldDecl *FD = dyn_cast<FieldDecl>(ME->getMemberDecl()))
3922 if (!FD->getType()->isReferenceType())
3923 DeclsToRemove.push_back(FD);
3924
3925 if (E->isCompoundAssignmentOp()) {
3926 HandleValue(E->getLHS(), false /*AddressOf*/);
3927 Visit(E->getRHS());
3928 return;
3929 }
3930
3931 Inherited::VisitBinaryOperator(E);
3932 }
3933
3934 void VisitUnaryOperator(UnaryOperator *E) {
3935 if (E->isIncrementDecrementOp()) {
3936 HandleValue(E->getSubExpr(), false /*AddressOf*/);
3937 return;
3938 }
3939 if (E->getOpcode() == UO_AddrOf) {
3940 if (MemberExpr *ME = dyn_cast<MemberExpr>(E->getSubExpr())) {
3941 HandleValue(ME->getBase(), true /*AddressOf*/);
3942 return;
3943 }
3944 }
3945
3946 Inherited::VisitUnaryOperator(E);
3947 }
3948 };
3949
3950 // Diagnose value-uses of fields to initialize themselves, e.g.
3951 // foo(foo)
3952 // where foo is not also a parameter to the constructor.
3953 // Also diagnose across field uninitialized use such as
3954 // x(y), y(x)
3955 // TODO: implement -Wuninitialized and fold this into that framework.
3956 static void DiagnoseUninitializedFields(
3957 Sema &SemaRef, const CXXConstructorDecl *Constructor) {
3958
3959 if (SemaRef.getDiagnostics().isIgnored(diag::warn_field_is_uninit,
3960 Constructor->getLocation())) {
3961 return;
3962 }
3963
3964 if (Constructor->isInvalidDecl())
3965 return;
3966
3967 const CXXRecordDecl *RD = Constructor->getParent();
3968
3969 if (RD->isDependentContext())
3970 return;
3971
3972 // Holds fields that are uninitialized.
3973 llvm::SmallPtrSet<ValueDecl*, 4> UninitializedFields;
3974
3975 // At the beginning, all fields are uninitialized.
3976 for (auto *I : RD->decls()) {
3977 if (auto *FD = dyn_cast<FieldDecl>(I)) {
3978 UninitializedFields.insert(FD);
3979 } else if (auto *IFD = dyn_cast<IndirectFieldDecl>(I)) {
3980 UninitializedFields.insert(IFD->getAnonField());
3981 }
3982 }
3983
3984 llvm::SmallPtrSet<QualType, 4> UninitializedBaseClasses;
3985 for (const auto &I : RD->bases())
3986 UninitializedBaseClasses.insert(I.getType().getCanonicalType());
3987
3988 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
3989 return;
3990
3991 UninitializedFieldVisitor UninitializedChecker(SemaRef,
3992 UninitializedFields,
3993 UninitializedBaseClasses);
3994
3995 for (const auto *FieldInit : Constructor->inits()) {
3996 if (UninitializedFields.empty() && UninitializedBaseClasses.empty())
3997 break;
3998
3999 Expr *InitExpr = FieldInit->getInit();
4000 if (!InitExpr)
4001 continue;
4002
4004 dyn_cast<CXXDefaultInitExpr>(InitExpr)) {
4005 InitExpr = Default->getExpr();
4006 if (!InitExpr)
4007 continue;
4008 // In class initializers will point to the constructor.
4009 UninitializedChecker.CheckInitializer(InitExpr, Constructor,
4010 FieldInit->getAnyMember(),
4011 FieldInit->getBaseClass());
4012 } else {
4013 UninitializedChecker.CheckInitializer(InitExpr, nullptr,
4014 FieldInit->getAnyMember(),
4015 FieldInit->getBaseClass());
4016 }
4017 }
4018 }
4019} // namespace
4020
4022 // Create a synthetic function scope to represent the call to the constructor
4023 // that notionally surrounds a use of this initializer.
4025}
4026
4028 if (!D.isFunctionDeclarator())
4029 return;
4030 auto &FTI = D.getFunctionTypeInfo();
4031 if (!FTI.Params)
4032 return;
4033 for (auto &Param : ArrayRef<DeclaratorChunk::ParamInfo>(FTI.Params,
4034 FTI.NumParams)) {
4035 auto *ParamDecl = cast<NamedDecl>(Param.Param);
4036 if (ParamDecl->getDeclName())
4037 PushOnScopeChains(ParamDecl, S, /*AddToContext=*/false);
4038 }
4039}
4040
4042 return ActOnRequiresClause(ConstraintExpr);
4043}
4044
4046 if (ConstraintExpr.isInvalid())
4047 return ExprError();
4048
4049 ConstraintExpr = CorrectDelayedTyposInExpr(ConstraintExpr);
4050 if (ConstraintExpr.isInvalid())
4051 return ExprError();
4052
4053 if (DiagnoseUnexpandedParameterPack(ConstraintExpr.get(),
4055 return ExprError();
4056
4057 return ConstraintExpr;
4058}
4059
4061 Expr *InitExpr,
4062 SourceLocation InitLoc) {
4063 InitializedEntity Entity =
4065 InitializationKind Kind =
4068 InitExpr->getBeginLoc(),
4069 InitExpr->getEndLoc())
4070 : InitializationKind::CreateCopy(InitExpr->getBeginLoc(), InitLoc);
4071 InitializationSequence Seq(*this, Entity, Kind, InitExpr);
4072 return Seq.Perform(*this, Entity, Kind, InitExpr);
4073}
4074
4076 SourceLocation InitLoc,
4077 ExprResult InitExpr) {
4078 // Pop the notional constructor scope we created earlier.
4079 PopFunctionScopeInfo(nullptr, D);
4080
4081 // Microsoft C++'s property declaration cannot have a default member
4082 // initializer.
4083 if (isa<MSPropertyDecl>(D)) {
4084 D->setInvalidDecl();
4085 return;
4086 }
4087
4088 FieldDecl *FD = dyn_cast<FieldDecl>(D);
4089 assert((FD && FD->getInClassInitStyle() != ICIS_NoInit) &&
4090 "must set init style when field is created");
4091
4092 if (!InitExpr.isUsable() ||
4094 FD->setInvalidDecl();
4095 ExprResult RecoveryInit =
4096 CreateRecoveryExpr(InitLoc, InitLoc, {}, FD->getType());
4097 if (RecoveryInit.isUsable())
4098 FD->setInClassInitializer(RecoveryInit.get());
4099 return;
4100 }
4101
4102 ExprResult Init = CorrectDelayedTyposInExpr(InitExpr, /*InitDecl=*/nullptr,
4103 /*RecoverUncorrectedTypos=*/true);
4104 assert(Init.isUsable() && "Init should at least have a RecoveryExpr");
4105 if (!FD->getType()->isDependentType() && !Init.get()->isTypeDependent()) {
4106 Init = ConvertMemberDefaultInitExpression(FD, Init.get(), InitLoc);
4107 // C++11 [class.base.init]p7:
4108 // The initialization of each base and member constitutes a
4109 // full-expression.
4110 if (!Init.isInvalid())
4111 Init = ActOnFinishFullExpr(Init.get(), /*DiscarededValue=*/false);
4112 if (Init.isInvalid()) {
4113 FD->setInvalidDecl();
4114 return;
4115 }
4116 }
4117
4118 FD->setInClassInitializer(Init.get());
4119}
4120
4121/// Find the direct and/or virtual base specifiers that
4122/// correspond to the given base type, for use in base initialization
4123/// within a constructor.
4125 CXXRecordDecl *ClassDecl,
4126 QualType BaseType,
4127 const CXXBaseSpecifier *&DirectBaseSpec,
4128 const CXXBaseSpecifier *&VirtualBaseSpec) {
4129 // First, check for a direct base class.
4130 DirectBaseSpec = nullptr;
4131 for (const auto &Base : ClassDecl->bases()) {
4132 if (SemaRef.Context.hasSameUnqualifiedType(BaseType, Base.getType())) {
4133 // We found a direct base of this type. That's what we're
4134 // initializing.
4135 DirectBaseSpec = &Base;
4136 break;
4137 }
4138 }
4139
4140 // Check for a virtual base class.
4141 // FIXME: We might be able to short-circuit this if we know in advance that
4142 // there are no virtual bases.
4143 VirtualBaseSpec = nullptr;
4144 if (!DirectBaseSpec || !DirectBaseSpec->isVirtual()) {
4145 // We haven't found a base yet; search the class hierarchy for a
4146 // virtual base class.
4147 CXXBasePaths Paths(/*FindAmbiguities=*/true, /*RecordPaths=*/true,
4148 /*DetectVirtual=*/false);
4149 if (SemaRef.IsDerivedFrom(ClassDecl->getLocation(),
4150 SemaRef.Context.getTypeDeclType(ClassDecl),
4151 BaseType, Paths)) {
4152 for (CXXBasePaths::paths_iterator Path = Paths.begin();
4153 Path != Paths.end(); ++Path) {
4154 if (Path->back().Base->isVirtual()) {
4155 VirtualBaseSpec = Path->back().Base;
4156 break;
4157 }
4158 }
4159 }
4160 }
4161
4162 return DirectBaseSpec || VirtualBaseSpec;
4163}
4164
4167 Scope *S,
4168 CXXScopeSpec &SS,
4169 IdentifierInfo *MemberOrBase,
4170 ParsedType TemplateTypeTy,
4171 const DeclSpec &DS,
4172 SourceLocation IdLoc,
4173 Expr *InitList,
4174 SourceLocation EllipsisLoc) {
4175 return BuildMemInitializer(ConstructorD, S, SS, MemberOrBase, TemplateTypeTy,
4176 DS, IdLoc, InitList,
4177 EllipsisLoc);
4178}
4179
4182 Scope *S,
4183 CXXScopeSpec &SS,
4184 IdentifierInfo *MemberOrBase,
4185 ParsedType TemplateTypeTy,
4186 const DeclSpec &DS,
4187 SourceLocation IdLoc,
4188 SourceLocation LParenLoc,
4189 ArrayRef<Expr *> Args,
4190 SourceLocation RParenLoc,
4191 SourceLocation EllipsisLoc) {
4192 Expr *List = ParenListExpr::Create(Context, LParenLoc, Args, RParenLoc);
4193 return BuildMemInitializer(ConstructorD, S, SS, MemberOrBase, TemplateTypeTy,
4194 DS, IdLoc, List, EllipsisLoc);
4195}
4196
4197namespace {
4198
4199// Callback to only accept typo corrections that can be a valid C++ member
4200// initializer: either a non-static field member or a base class.
4201class MemInitializerValidatorCCC final : public CorrectionCandidateCallback {
4202public:
4203 explicit MemInitializerValidatorCCC(CXXRecordDecl *ClassDecl)
4204 : ClassDecl(ClassDecl) {}
4205
4206 bool ValidateCandidate(const TypoCorrection &candidate) override {
4207 if (NamedDecl *ND = candidate.getCorrectionDecl()) {
4208 if (FieldDecl *Member = dyn_cast<FieldDecl>(ND))
4209 return Member->getDeclContext()->getRedeclContext()->Equals(ClassDecl);
4210 return isa<TypeDecl>(ND);
4211 }
4212 return false;
4213 }
4214
4215 std::unique_ptr<CorrectionCandidateCallback> clone() override {
4216 return std::make_unique<MemInitializerValidatorCCC>(*this);
4217 }
4218
4219private:
4220 CXXRecordDecl *ClassDecl;
4221};
4222
4223}
4224
4226 RecordDecl *ClassDecl,
4227 const IdentifierInfo *Name) {
4228 DeclContextLookupResult Result = ClassDecl->lookup(Name);
4230 llvm::find_if(Result, [this](const NamedDecl *Elem) {
4231 return isa<FieldDecl, IndirectFieldDecl>(Elem) &&
4233 });
4234 // We did not find a placeholder variable
4235 if (Found == Result.end())
4236 return false;
4237 Diag(Loc, diag::err_using_placeholder_variable) << Name;
4238 for (DeclContextLookupResult::iterator It = Found; It != Result.end(); It++) {
4239 const NamedDecl *ND = *It;
4240 if (ND->getDeclContext() != ND->getDeclContext())
4241 break;
4242 if (isa<FieldDecl, IndirectFieldDecl>(ND) &&
4244 Diag(ND->getLocation(), diag::note_reference_placeholder) << ND;
4245 }
4246 return true;
4247}
4248
4249ValueDecl *
4251 const IdentifierInfo *MemberOrBase) {
4252 ValueDecl *ND = nullptr;
4253 for (auto *D : ClassDecl->lookup(MemberOrBase)) {
4254 if (isa<FieldDecl, IndirectFieldDecl>(D)) {
4255 bool IsPlaceholder = D->isPlaceholderVar(getLangOpts());
4256 if (ND) {
4257 if (IsPlaceholder && D->getDeclContext() == ND->getDeclContext())
4258 return nullptr;
4259 break;
4260 }
4261 if (!IsPlaceholder)
4262 return cast<ValueDecl>(D);
4263 ND = cast<ValueDecl>(D);
4264 }
4265 }
4266 return ND;
4267}
4268
4270 CXXScopeSpec &SS,
4271 ParsedType TemplateTypeTy,
4272 IdentifierInfo *MemberOrBase) {
4273 if (SS.getScopeRep() || TemplateTypeTy)
4274 return nullptr;
4275 return tryLookupUnambiguousFieldDecl(ClassDecl, MemberOrBase);
4276}
4277
4280 Scope *S,
4281 CXXScopeSpec &SS,
4282 IdentifierInfo *MemberOrBase,
4283 ParsedType TemplateTypeTy,
4284 const DeclSpec &DS,
4285 SourceLocation IdLoc,
4286 Expr *Init,
4287 SourceLocation EllipsisLoc) {
4288 ExprResult Res = CorrectDelayedTyposInExpr(Init, /*InitDecl=*/nullptr,
4289 /*RecoverUncorrectedTypos=*/true);
4290 if (!Res.isUsable())
4291 return true;
4292 Init = Res.get();
4293
4294 if (!ConstructorD)
4295 return true;
4296
4297 AdjustDeclIfTemplate(ConstructorD);
4298
4299 CXXConstructorDecl *Constructor
4300 = dyn_cast<CXXConstructorDecl>(ConstructorD);
4301 if (!Constructor) {
4302 // The user wrote a constructor initializer on a function that is
4303 // not a C++ constructor. Ignore the error for now, because we may
4304 // have more member initializers coming; we'll diagnose it just
4305 // once in ActOnMemInitializers.
4306 return true;
4307 }
4308
4309 CXXRecordDecl *ClassDecl = Constructor->getParent();
4310
4311 // C++ [class.base.init]p2:
4312 // Names in a mem-initializer-id are looked up in the scope of the
4313 // constructor's class and, if not found in that scope, are looked
4314 // up in the scope containing the constructor's definition.
4315 // [Note: if the constructor's class contains a member with the
4316 // same name as a direct or virtual base class of the class, a
4317 // mem-initializer-id naming the member or base class and composed
4318 // of a single identifier refers to the class member. A
4319 // mem-initializer-id for the hidden base class may be specified
4320 // using a qualified name. ]
4321
4322 // Look for a member, first.
4324 ClassDecl, SS, TemplateTypeTy, MemberOrBase)) {
4325 if (EllipsisLoc.isValid())
4326 Diag(EllipsisLoc, diag::err_pack_expansion_member_init)
4327 << MemberOrBase
4328 << SourceRange(IdLoc, Init->getSourceRange().getEnd());
4329
4330 return BuildMemberInitializer(Member, Init, IdLoc);
4331 }
4332 // It didn't name a member, so see if it names a class.
4333 QualType BaseType;
4334 TypeSourceInfo *TInfo = nullptr;
4335
4336 if (TemplateTypeTy) {
4337 BaseType = GetTypeFromParser(TemplateTypeTy, &TInfo);
4338 if (BaseType.isNull())
4339 return true;
4340 } else if (DS.getTypeSpecType() == TST_decltype) {
4341 BaseType = BuildDecltypeType(DS.getRepAsExpr());
4342 } else if (DS.getTypeSpecType() == TST_decltype_auto) {
4343 Diag(DS.getTypeSpecTypeLoc(), diag::err_decltype_auto_invalid);
4344 return true;
4345 } else if (DS.getTypeSpecType() == TST_typename_pack_indexing) {
4346 BaseType =
4348 DS.getBeginLoc(), DS.getEllipsisLoc());
4349 } else {
4350 LookupResult R(*this, MemberOrBase, IdLoc, LookupOrdinaryName);
4351 LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
4352
4353 TypeDecl *TyD = R.getAsSingle<TypeDecl>();
4354 if (!TyD) {
4355 if (R.isAmbiguous()) return true;
4356
4357 // We don't want access-control diagnostics here.
4359
4360 if (SS.isSet() && isDependentScopeSpecifier(SS)) {
4361 bool NotUnknownSpecialization = false;
4362 DeclContext *DC = computeDeclContext(SS, false);
4363 if (CXXRecordDecl *Record = dyn_cast_or_null<CXXRecordDecl>(DC))
4364 NotUnknownSpecialization = !Record->hasAnyDependentBases();
4365
4366 if (!NotUnknownSpecialization) {
4367 // When the scope specifier can refer to a member of an unknown
4368 // specialization, we take it as a type name.
4369 BaseType = CheckTypenameType(
4371 SS.getWithLocInContext(Context), *MemberOrBase, IdLoc);
4372 if (BaseType.isNull())
4373 return true;
4374
4375 TInfo = Context.CreateTypeSourceInfo(BaseType);
4378 if (!TL.isNull()) {
4379 TL.setNameLoc(IdLoc);
4382 }
4383
4384 R.clear();
4385 R.setLookupName(MemberOrBase);
4386 }
4387 }
4388
4389 if (getLangOpts().MSVCCompat && !getLangOpts().CPlusPlus20) {
4390 if (auto UnqualifiedBase = R.getAsSingle<ClassTemplateDecl>()) {
4391 auto *TempSpec = cast<TemplateSpecializationType>(
4392 UnqualifiedBase->getInjectedClassNameSpecialization());
4393 TemplateName TN = TempSpec->getTemplateName();
4394 for (auto const &Base : ClassDecl->bases()) {
4395 auto BaseTemplate =
4396 Base.getType()->getAs<TemplateSpecializationType>();
4397 if (BaseTemplate &&
4398 Context.hasSameTemplateName(BaseTemplate->getTemplateName(), TN,
4399 /*IgnoreDeduced=*/true)) {
4400 Diag(IdLoc, diag::ext_unqualified_base_class)
4401 << SourceRange(IdLoc, Init->getSourceRange().getEnd());
4402 BaseType = Base.getType();
4403 break;
4404 }
4405 }
4406 }
4407 }
4408
4409 // If no results were found, try to correct typos.
4410 TypoCorrection Corr;
4411 MemInitializerValidatorCCC CCC(ClassDecl);
4412 if (R.empty() && BaseType.isNull() &&
4413 (Corr = CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS,
4414 CCC, CTK_ErrorRecovery, ClassDecl))) {
4416 // We have found a non-static data member with a similar
4417 // name to what was typed; complain and initialize that
4418 // member.
4419 diagnoseTypo(Corr,
4420 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4421 << MemberOrBase << true);
4422 return BuildMemberInitializer(Member, Init, IdLoc);
4423 } else if (TypeDecl *Type = Corr.getCorrectionDeclAs<TypeDecl>()) {
4424 const CXXBaseSpecifier *DirectBaseSpec;
4425 const CXXBaseSpecifier *VirtualBaseSpec;
4426 if (FindBaseInitializer(*this, ClassDecl,
4428 DirectBaseSpec, VirtualBaseSpec)) {
4429 // We have found a direct or virtual base class with a
4430 // similar name to what was typed; complain and initialize
4431 // that base class.
4432 diagnoseTypo(Corr,
4433 PDiag(diag::err_mem_init_not_member_or_class_suggest)
4434 << MemberOrBase << false,
4435 PDiag() /*Suppress note, we provide our own.*/);
4436
4437 const CXXBaseSpecifier *BaseSpec = DirectBaseSpec ? DirectBaseSpec
4438 : VirtualBaseSpec;
4439 Diag(BaseSpec->getBeginLoc(), diag::note_base_class_specified_here)
4440 << BaseSpec->getType() << BaseSpec->getSourceRange();
4441
4442 TyD = Type;
4443 }
4444 }
4445 }
4446
4447 if (!TyD && BaseType.isNull()) {
4448 Diag(IdLoc, diag::err_mem_init_not_member_or_class)
4449 << MemberOrBase << SourceRange(IdLoc,Init->getSourceRange().getEnd());
4450 return true;
4451 }
4452 }
4453
4454 if (BaseType.isNull()) {
4457 MarkAnyDeclReferenced(TyD->getLocation(), TyD, /*OdrUse=*/false);
4458 TInfo = Context.CreateTypeSourceInfo(BaseType);
4460 TL.getNamedTypeLoc().castAs<TypeSpecTypeLoc>().setNameLoc(IdLoc);
4463 }
4464 }
4465
4466 if (!TInfo)
4467 TInfo = Context.getTrivialTypeSourceInfo(BaseType, IdLoc);
4468
4469 return BuildBaseInitializer(BaseType, TInfo, Init, ClassDecl, EllipsisLoc);
4470}
4471
4474 SourceLocation IdLoc) {
4475 FieldDecl *DirectMember = dyn_cast<FieldDecl>(Member);
4476 IndirectFieldDecl *IndirectMember = dyn_cast<IndirectFieldDecl>(Member);
4477 assert((DirectMember || IndirectMember) &&
4478 "Member must be a FieldDecl or IndirectFieldDecl");
4479
4481 return true;
4482
4483 if (Member->isInvalidDecl())
4484 return true;
4485
4486 MultiExprArg Args;
4487 if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
4488 Args = MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4489 } else if (InitListExpr *InitList = dyn_cast<InitListExpr>(Init)) {
4490 Args = MultiExprArg(InitList->getInits(), InitList->getNumInits());
4491 } else {
4492 // Template instantiation doesn't reconstruct ParenListExprs for us.
4493 Args = Init;
4494 }
4495
4496 SourceRange InitRange = Init->getSourceRange();
4497
4498 if (Member->getType()->isDependentType() || Init->isTypeDependent()) {
4499 // Can't check initialization for a member of dependent type or when
4500 // any of the arguments are type-dependent expressions.
4502 } else {
4503 bool InitList = false;
4504 if (isa<InitListExpr>(Init)) {
4505 InitList = true;
4506 Args = Init;
4507 }
4508
4509 // Initialize the member.
4510 InitializedEntity MemberEntity =
4511 DirectMember ? InitializedEntity::InitializeMember(DirectMember, nullptr)
4512 : InitializedEntity::InitializeMember(IndirectMember,
4513 nullptr);
4514 InitializationKind Kind =
4516 IdLoc, Init->getBeginLoc(), Init->getEndLoc())
4517 : InitializationKind::CreateDirect(IdLoc, InitRange.getBegin(),
4518 InitRange.getEnd());
4519
4520 InitializationSequence InitSeq(*this, MemberEntity, Kind, Args);
4521 ExprResult MemberInit = InitSeq.Perform(*this, MemberEntity, Kind, Args,
4522 nullptr);
4523 if (!MemberInit.isInvalid()) {
4524 // C++11 [class.base.init]p7:
4525 // The initialization of each base and member constitutes a
4526 // full-expression.
4527 MemberInit = ActOnFinishFullExpr(MemberInit.get(), InitRange.getBegin(),
4528 /*DiscardedValue*/ false);
4529 }
4530
4531 if (MemberInit.isInvalid()) {
4532 // Args were sensible expressions but we couldn't initialize the member
4533 // from them. Preserve them in a RecoveryExpr instead.
4534 Init = CreateRecoveryExpr(InitRange.getBegin(), InitRange.getEnd(), Args,
4535 Member->getType())
4536 .get();
4537 if (!Init)
4538 return true;
4539 } else {
4540 Init = MemberInit.get();
4541 }
4542 }
4543
4544 if (DirectMember) {
4545 return new (Context) CXXCtorInitializer(Context, DirectMember, IdLoc,
4546 InitRange.getBegin(), Init,
4547 InitRange.getEnd());
4548 } else {
4549 return new (Context) CXXCtorInitializer(Context, IndirectMember, IdLoc,
4550 InitRange.getBegin(), Init,
4551 InitRange.getEnd());
4552 }
4553}
4554
4557 CXXRecordDecl *ClassDecl) {
4558 SourceLocation NameLoc = TInfo->getTypeLoc().getSourceRange().getBegin();
4559 if (!LangOpts.CPlusPlus11)
4560 return Diag(NameLoc, diag::err_delegating_ctor)
4561 << TInfo->getTypeLoc().getSourceRange();
4562 Diag(NameLoc, diag::warn_cxx98_compat_delegating_ctor);
4563
4564 bool InitList = true;
4565 MultiExprArg Args = Init;
4566 if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
4567 InitList = false;
4568 Args = MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4569 }
4570
4571 SourceRange InitRange = Init->getSourceRange();
4572 // Initialize the object.
4574 QualType(ClassDecl->getTypeForDecl(), 0));
4575 InitializationKind Kind =
4577 NameLoc, Init->getBeginLoc(), Init->getEndLoc())
4578 : InitializationKind::CreateDirect(NameLoc, InitRange.getBegin(),
4579 InitRange.getEnd());
4580 InitializationSequence InitSeq(*this, DelegationEntity, Kind, Args);
4581 ExprResult DelegationInit = InitSeq.Perform(*this, DelegationEntity, Kind,
4582 Args, nullptr);
4583 if (!DelegationInit.isInvalid()) {
4584 assert((DelegationInit.get()->containsErrors() ||
4585 cast<CXXConstructExpr>(DelegationInit.get())->getConstructor()) &&
4586 "Delegating constructor with no target?");
4587
4588 // C++11 [class.base.init]p7:
4589 // The initialization of each base and member constitutes a
4590 // full-expression.
4591 DelegationInit = ActOnFinishFullExpr(
4592 DelegationInit.get(), InitRange.getBegin(), /*DiscardedValue*/ false);
4593 }
4594
4595 if (DelegationInit.isInvalid()) {
4596 DelegationInit =
4597 CreateRecoveryExpr(InitRange.getBegin(), InitRange.getEnd(), Args,
4598 QualType(ClassDecl->getTypeForDecl(), 0));
4599 if (DelegationInit.isInvalid())
4600 return true;
4601 } else {
4602 // If we are in a dependent context, template instantiation will
4603 // perform this type-checking again. Just save the arguments that we
4604 // received in a ParenListExpr.
4605 // FIXME: This isn't quite ideal, since our ASTs don't capture all
4606 // of the information that we have about the base
4607 // initializer. However, deconstructing the ASTs is a dicey process,
4608 // and this approach is far more likely to get the corner cases right.
4610 DelegationInit = Init;
4611 }
4612
4613 return new (Context) CXXCtorInitializer(Context, TInfo, InitRange.getBegin(),
4614 DelegationInit.getAs<Expr>(),
4615 InitRange.getEnd());
4616}
4617
4620 Expr *Init, CXXRecordDecl *ClassDecl,
4621 SourceLocation EllipsisLoc) {
4622 SourceLocation BaseLoc = BaseTInfo->getTypeLoc().getBeginLoc();
4623
4624 if (!BaseType->isDependentType() && !BaseType->isRecordType())
4625 return Diag(BaseLoc, diag::err_base_init_does_not_name_class)
4626 << BaseType << BaseTInfo->getTypeLoc().getSourceRange();
4627
4628 // C++ [class.base.init]p2:
4629 // [...] Unless the mem-initializer-id names a nonstatic data
4630 // member of the constructor's class or a direct or virtual base
4631 // of that class, the mem-initializer is ill-formed. A
4632 // mem-initializer-list can initialize a base class using any
4633 // name that denotes that base class type.
4634
4635 // We can store the initializers in "as-written" form and delay analysis until
4636 // instantiation if the constructor is dependent. But not for dependent
4637 // (broken) code in a non-template! SetCtorInitializers does not expect this.
4639 (BaseType->isDependentType() || Init->isTypeDependent());
4640
4641 SourceRange InitRange = Init->getSourceRange();
4642 if (EllipsisLoc.isValid()) {
4643 // This is a pack expansion.
4644 if (!BaseType->containsUnexpandedParameterPack()) {
4645 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
4646 << SourceRange(BaseLoc, InitRange.getEnd());
4647
4648 EllipsisLoc = SourceLocation();
4649 }
4650 } else {
4651 // Check for any unexpanded parameter packs.
4652 if (DiagnoseUnexpandedParameterPack(BaseLoc, BaseTInfo, UPPC_Initializer))
4653 return true;
4654
4656 return true;
4657 }
4658
4659 // Check for direct and virtual base classes.
4660 const CXXBaseSpecifier *DirectBaseSpec = nullptr;
4661 const CXXBaseSpecifier *VirtualBaseSpec = nullptr;
4662 if (!Dependent) {
4664 BaseType))
4665 return BuildDelegatingInitializer(BaseTInfo, Init, ClassDecl);
4666
4667 FindBaseInitializer(*this, ClassDecl, BaseType, DirectBaseSpec,
4668 VirtualBaseSpec);
4669
4670 // C++ [base.class.init]p2:
4671 // Unless the mem-initializer-id names a nonstatic data member of the
4672 // constructor's class or a direct or virtual base of that class, the
4673 // mem-initializer is ill-formed.
4674 if (!DirectBaseSpec && !VirtualBaseSpec) {
4675 // If the class has any dependent bases, then it's possible that
4676 // one of those types will resolve to the same type as
4677 // BaseType. Therefore, just treat this as a dependent base
4678 // class initialization. FIXME: Should we try to check the
4679 // initialization anyway? It seems odd.
4680 if (ClassDecl->hasAnyDependentBases())
4681 Dependent = true;
4682 else
4683 return Diag(BaseLoc, diag::err_not_direct_base_or_virtual)
4684 << BaseType << Context.getTypeDeclType(ClassDecl)
4685 << BaseTInfo->getTypeLoc().getSourceRange();
4686 }
4687 }
4688
4689 if (Dependent) {
4691
4692 return new (Context) CXXCtorInitializer(Context, BaseTInfo,
4693 /*IsVirtual=*/false,
4694 InitRange.getBegin(), Init,
4695 InitRange.getEnd(), EllipsisLoc);
4696 }
4697
4698 // C++ [base.class.init]p2:
4699 // If a mem-initializer-id is ambiguous because it designates both
4700 // a direct non-virtual base class and an inherited virtual base
4701 // class, the mem-initializer is ill-formed.
4702 if (DirectBaseSpec && VirtualBaseSpec)
4703 return Diag(BaseLoc, diag::err_base_init_direct_and_virtual)
4704 << BaseType << BaseTInfo->getTypeLoc().getLocalSourceRange();
4705
4706 const CXXBaseSpecifier *BaseSpec = DirectBaseSpec;
4707 if (!BaseSpec)
4708 BaseSpec = VirtualBaseSpec;
4709
4710 // Initialize the base.
4711 bool InitList = true;
4712 MultiExprArg Args = Init;
4713 if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) {
4714 InitList = false;
4715 Args = MultiExprArg(ParenList->getExprs(), ParenList->getNumExprs());
4716 }
4717
4718 InitializedEntity BaseEntity =
4719 InitializedEntity::InitializeBase(Context, BaseSpec, VirtualBaseSpec);
4720 InitializationKind Kind =
4721 InitList ? InitializationKind::CreateDirectList(BaseLoc)
4722 : InitializationKind::CreateDirect(BaseLoc, InitRange.getBegin(),
4723 InitRange.getEnd());
4724 InitializationSequence InitSeq(*this, BaseEntity, Kind, Args);
4725 ExprResult BaseInit = InitSeq.Perform(*this, BaseEntity, Kind, Args, nullptr);
4726 if (!BaseInit.isInvalid()) {
4727 // C++11 [class.base.init]p7:
4728 // The initialization of each base and member constitutes a
4729 // full-expression.
4730 BaseInit = ActOnFinishFullExpr(BaseInit.get(), InitRange.getBegin(),
4731 /*DiscardedValue*/ false);
4732 }
4733
4734 if (BaseInit.isInvalid()) {
4735 BaseInit = CreateRecoveryExpr(InitRange.getBegin(), InitRange.getEnd(),
4736 Args, BaseType);
4737 if (BaseInit.isInvalid())
4738 return true;
4739 } else {
4740 // If we are in a dependent context, template instantiation will
4741 // perform this type-checking again. Just save the arguments that we
4742 // received in a ParenListExpr.
4743 // FIXME: This isn't quite ideal, since our ASTs don't capture all
4744 // of the information that we have about the base
4745 // initializer. However, deconstructing the ASTs is a dicey process,
4746 // and this approach is far more likely to get the corner cases right.
4748 BaseInit = Init;
4749 }
4750
4751 return new (Context) CXXCtorInitializer(Context, BaseTInfo,
4752 BaseSpec->isVirtual(),
4753 InitRange.getBegin(),
4754 BaseInit.getAs<Expr>(),
4755 InitRange.getEnd(), EllipsisLoc);
4756}
4757
4758// Create a static_cast<T&&>(expr).
4760 QualType TargetType =
4761 SemaRef.BuildReferenceType(E->getType(), /*SpelledAsLValue*/ false,
4763 SourceLocation ExprLoc = E->getBeginLoc();
4765 TargetType, ExprLoc);
4766
4767 return SemaRef.BuildCXXNamedCast(ExprLoc, tok::kw_static_cast, TargetLoc, E,
4768 SourceRange(ExprLoc, ExprLoc),
4769 E->getSourceRange()).get();
4770}
4771
4772/// ImplicitInitializerKind - How an implicit base or member initializer should
4773/// initialize its base or member.
4780
4781static bool
4783 ImplicitInitializerKind ImplicitInitKind,
4784 CXXBaseSpecifier *BaseSpec,
4785 bool IsInheritedVirtualBase,
4786 CXXCtorInitializer *&CXXBaseInit) {
4787 InitializedEntity InitEntity
4789 IsInheritedVirtualBase);
4790
4791 ExprResult BaseInit;
4792
4793 switch (ImplicitInitKind) {
4794 case IIK_Inherit:
4795 case IIK_Default: {
4796 InitializationKind InitKind
4797 = InitializationKind::CreateDefault(Constructor->getLocation());
4798 InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, {});
4799 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
4800 break;
4801 }
4802
4803 case IIK_Move:
4804 case IIK_Copy: {
4805 bool Moving = ImplicitInitKind == IIK_Move;
4806 ParmVarDecl *Param = Constructor->getParamDecl(0);
4807 QualType ParamType = Param->getType().getNonReferenceType();
4808
4809 Expr *CopyCtorArg =
4811 SourceLocation(), Param, false,
4812 Constructor->getLocation(), ParamType,
4813 VK_LValue, nullptr);
4814
4815 SemaRef.MarkDeclRefReferenced(cast<DeclRefExpr>(CopyCtorArg));
4816
4817 // Cast to the base class to avoid ambiguities.
4818 QualType ArgTy =
4820 ParamType.getQualifiers());
4821
4822 if (Moving) {
4823 CopyCtorArg = CastForMoving(SemaRef, CopyCtorArg);
4824 }
4825
4826 CXXCastPath BasePath;
4827 BasePath.push_back(BaseSpec);
4828 CopyCtorArg = SemaRef.ImpCastExprToType(CopyCtorArg, ArgTy,
4829 CK_UncheckedDerivedToBase,
4830 Moving ? VK_XValue : VK_LValue,
4831 &BasePath).get();
4832
4833 InitializationKind InitKind
4834 = InitializationKind::CreateDirect(Constructor->getLocation(),
4836 InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, CopyCtorArg);
4837 BaseInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, CopyCtorArg);
4838 break;
4839 }
4840 }
4841
4842 BaseInit = SemaRef.MaybeCreateExprWithCleanups(BaseInit);
4843 if (BaseInit.isInvalid())
4844 return true;
4845
4846 CXXBaseInit =
4849 SourceLocation()),
4850 BaseSpec->isVirtual(),
4852 BaseInit.getAs<Expr>(),
4854 SourceLocation());
4855
4856 return false;
4857}
4858
4859static bool RefersToRValueRef(Expr *MemRef) {
4860 ValueDecl *Referenced = cast<MemberExpr>(MemRef)->getMemberDecl();
4861 return Referenced->getType()->isRValueReferenceType();
4862}
4863
4864static bool
4866 ImplicitInitializerKind ImplicitInitKind,
4868 CXXCtorInitializer *&CXXMemberInit) {
4869 if (Field->isInvalidDecl())
4870 return true;
4871
4872 SourceLocation Loc = Constructor->getLocation();
4873
4874 if (ImplicitInitKind == IIK_Copy || ImplicitInitKind == IIK_Move) {
4875 bool Moving = ImplicitInitKind == IIK_Move;
4876 ParmVarDecl *Param = Constructor->getParamDecl(0);
4877 QualType ParamType = Param->getType().getNonReferenceType();
4878
4879 // Suppress copying zero-width bitfields.
4880 if (Field->isZeroLengthBitField())
4881 return false;
4882
4883 Expr *MemberExprBase =
4885 SourceLocation(), Param, false,
4886 Loc, ParamType, VK_LValue, nullptr);
4887
4888 SemaRef.MarkDeclRefReferenced(cast<DeclRefExpr>(MemberExprBase));
4889
4890 if (Moving) {
4891 MemberExprBase = CastForMoving(SemaRef, MemberExprBase);
4892 }
4893
4894 // Build a reference to this field within the parameter.
4895 CXXScopeSpec SS;
4896 LookupResult MemberLookup(SemaRef, Field->getDeclName(), Loc,
4898 MemberLookup.addDecl(Indirect ? cast<ValueDecl>(Indirect)
4899 : cast<ValueDecl>(Field), AS_public);
4900 MemberLookup.resolveKind();
4901 ExprResult CtorArg
4902 = SemaRef.BuildMemberReferenceExpr(MemberExprBase,
4903 ParamType, Loc,
4904 /*IsArrow=*/false,
4905 SS,
4906 /*TemplateKWLoc=*/SourceLocation(),
4907 /*FirstQualifierInScope=*/nullptr,
4908 MemberLookup,
4909 /*TemplateArgs=*/nullptr,
4910 /*S*/nullptr);
4911 if (CtorArg.isInvalid())
4912 return true;
4913
4914 // C++11 [class.copy]p15:
4915 // - if a member m has rvalue reference type T&&, it is direct-initialized
4916 // with static_cast<T&&>(x.m);
4917 if (RefersToRValueRef(CtorArg.get())) {
4918 CtorArg = CastForMoving(SemaRef, CtorArg.get());
4919 }
4920
4921 InitializedEntity Entity =
4923 /*Implicit*/ true)
4924 : InitializedEntity::InitializeMember(Field, nullptr,
4925 /*Implicit*/ true);
4926
4927 // Direct-initialize to use the copy constructor.
4928 InitializationKind InitKind =
4930
4931 Expr *CtorArgE = CtorArg.getAs<Expr>();
4932 InitializationSequence InitSeq(SemaRef, Entity, InitKind, CtorArgE);
4933 ExprResult MemberInit =
4934 InitSeq.Perform(SemaRef, Entity, InitKind, MultiExprArg(&CtorArgE, 1));
4935 MemberInit = SemaRef.MaybeCreateExprWithCleanups(MemberInit);
4936 if (MemberInit.isInvalid())
4937 return true;
4938
4939 if (Indirect)
4940 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(
4941 SemaRef.Context, Indirect, Loc, Loc, MemberInit.getAs<Expr>(), Loc);
4942 else
4943 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(
4944 SemaRef.Context, Field, Loc, Loc, MemberInit.getAs<Expr>(), Loc);
4945 return false;
4946 }
4947
4948 assert((ImplicitInitKind == IIK_Default || ImplicitInitKind == IIK_Inherit) &&
4949 "Unhandled implicit init kind!");
4950
4951 QualType FieldBaseElementType =
4952 SemaRef.Context.getBaseElementType(Field->getType());
4953
4954 if (FieldBaseElementType->isRecordType()) {
4955 InitializedEntity InitEntity =
4957 /*Implicit*/ true)
4958 : InitializedEntity::InitializeMember(Field, nullptr,
4959 /*Implicit*/ true);
4960 InitializationKind InitKind =
4962
4963 InitializationSequence InitSeq(SemaRef, InitEntity, InitKind, {});
4964 ExprResult MemberInit = InitSeq.Perform(SemaRef, InitEntity, InitKind, {});
4965
4966 MemberInit = SemaRef.MaybeCreateExprWithCleanups(MemberInit);
4967 if (MemberInit.isInvalid())
4968 return true;
4969
4970 if (Indirect)
4971 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context,
4972 Indirect, Loc,
4973 Loc,
4974 MemberInit.get(),
4975 Loc);
4976 else
4977 CXXMemberInit = new (SemaRef.Context) CXXCtorInitializer(SemaRef.Context,
4978 Field, Loc, Loc,
4979 MemberInit.get(),
4980 Loc);
4981 return false;
4982 }
4983
4984 if (!Field->getParent()->isUnion()) {
4985 if (FieldBaseElementType->isReferenceType()) {
4986 SemaRef.Diag(Constructor->getLocation(),
4987 diag::err_uninitialized_member_in_ctor)
4988 << (int)Constructor->isImplicit()
4989 << SemaRef.Context.getTagDeclType(Constructor->getParent())
4990 << 0 << Field->getDeclName();
4991 SemaRef.Diag(Field->getLocation(), diag::note_declared_at);
4992 return true;
4993 }
4994
4995 if (FieldBaseElementType.isConstQualified()) {
4996 SemaRef.Diag(Constructor->getLocation(),
4997 diag::err_uninitialized_member_in_ctor)
4998 << (int)Constructor->isImplicit()
4999 << SemaRef.Context.getTagDeclType(Constructor->getParent())
5000 << 1 << Field->getDeclName();
5001 SemaRef.Diag(Field->getLocation(), diag::note_declared_at);
5002 return true;
5003 }
5004 }
5005
5006 if (FieldBaseElementType.hasNonTrivialObjCLifetime()) {
5007 // ARC and Weak:
5008 // Default-initialize Objective-C pointers to NULL.
5009 CXXMemberInit
5011 Loc, Loc,
5012 new (SemaRef.Context) ImplicitValueInitExpr(Field->getType()),
5013 Loc);
5014 return false;
5015 }
5016
5017 // Nothing to initialize.
5018 CXXMemberInit = nullptr;
5019 return false;
5020}
5021
5022namespace {
5023struct BaseAndFieldInfo {
5024 Sema &S;
5025 CXXConstructorDecl *Ctor;
5026 bool AnyErrorsInInits;
5028 llvm::DenseMap<const void *, CXXCtorInitializer*> AllBaseFields;
5030 llvm::DenseMap<TagDecl*, FieldDecl*> ActiveUnionMember;
5031
5032 BaseAndFieldInfo(Sema &S, CXXConstructorDecl *Ctor, bool ErrorsInInits)
5033 : S(S), Ctor(Ctor), AnyErrorsInInits(ErrorsInInits) {
5034 bool Generated = Ctor->isImplicit() || Ctor->isDefaulted();
5035 if (Ctor->getInheritedConstructor())
5036 IIK = IIK_Inherit;
5037 else if (Generated && Ctor->isCopyConstructor())
5038 IIK = IIK_Copy;
5039 else if (Generated && Ctor->isMoveConstructor())
5040 IIK = IIK_Move;
5041 else
5042 IIK = IIK_Default;
5043 }
5044
5045 bool isImplicitCopyOrMove() const {
5046 switch (IIK) {
5047 case IIK_Copy:
5048 case IIK_Move:
5049 return true;
5050
5051 case IIK_Default:
5052 case IIK_Inherit:
5053 return false;
5054 }
5055
5056 llvm_unreachable("Invalid ImplicitInitializerKind!");
5057 }
5058
5059 bool addFieldInitializer(CXXCtorInitializer *Init) {
5060 AllToInit.push_back(Init);
5061
5062 // Check whether this initializer makes the field "used".
5063 if (Init->getInit()->HasSideEffects(S.Context))
5064 S.UnusedPrivateFields.remove(Init->getAnyMember());
5065
5066 return false;
5067 }
5068
5069 bool isInactiveUnionMember(FieldDecl *Field) {
5070 RecordDecl *Record = Field->getParent();
5071 if (!Record->isUnion())
5072 return false;
5073
5074 if (FieldDecl *Active =
5075 ActiveUnionMember.lookup(Record->getCanonicalDecl()))
5076 return Active != Field->getCanonicalDecl();
5077
5078 // In an implicit copy or move constructor, ignore any in-class initializer.
5079 if (isImplicitCopyOrMove())
5080 return true;
5081
5082 // If there's no explicit initialization, the field is active only if it
5083 // has an in-class initializer...
5084 if (Field->hasInClassInitializer())
5085 return false;
5086 // ... or it's an anonymous struct or union whose class has an in-class
5087 // initializer.
5088 if (!Field->isAnonymousStructOrUnion())
5089 return true;
5090 CXXRecordDecl *FieldRD = Field->getType()->getAsCXXRecordDecl();
5091 return !FieldRD->hasInClassInitializer();
5092 }
5093
5094 /// Determine whether the given field is, or is within, a union member
5095 /// that is inactive (because there was an initializer given for a different
5096 /// member of the union, or because the union was not initialized at all).
5097 bool isWithinInactiveUnionMember(FieldDecl *Field,
5099 if (!Indirect)
5100 return isInactiveUnionMember(Field);
5101
5102 for (auto *C : Indirect->chain()) {
5103 FieldDecl *Field = dyn_cast<FieldDecl>(C);
5104 if (Field && isInactiveUnionMember(Field))
5105 return true;
5106 }
5107 return false;
5108 }
5109};
5110}
5111
5112/// Determine whether the given type is an incomplete or zero-lenfgth
5113/// array type.
5115 if (T->isIncompleteArrayType())
5116 return true;
5117
5118 while (const ConstantArrayType *ArrayT = Context.getAsConstantArrayType(T)) {
5119 if (ArrayT->isZeroSize())
5120 return true;
5121
5122 T = ArrayT->getElementType();
5123 }
5124
5125 return false;
5126}
5127
5128static bool CollectFieldInitializer(Sema &SemaRef, BaseAndFieldInfo &Info,
5129 FieldDecl *Field,
5130 IndirectFieldDecl *Indirect = nullptr) {
5131 if (Field->isInvalidDecl())
5132 return false;
5133
5134 // Overwhelmingly common case: we have a direct initializer for this field.
5136 Info.AllBaseFields.lookup(Field->getCanonicalDecl()))
5137 return Info.addFieldInitializer(Init);
5138
5139 // C++11 [class.base.init]p8:
5140 // if the entity is a non-static data member that has a
5141 // brace-or-equal-initializer and either
5142 // -- the constructor's class is a union and no other variant member of that
5143 // union is designated by a mem-initializer-id or
5144 // -- the constructor's class is not a union, and, if the entity is a member
5145 // of an anonymous union, no other member of that union is designated by
5146 // a mem-initializer-id,
5147 // the entity is initialized as specified in [dcl.init].
5148 //
5149 // We also apply the same rules to handle anonymous structs within anonymous
5150 // unions.
5151 if (Info.isWithinInactiveUnionMember(Field, Indirect))
5152 return false;
5153
5154 if (Field->hasInClassInitializer() && !Info.isImplicitCopyOrMove()) {
5155 ExprResult DIE =
5156 SemaRef.BuildCXXDefaultInitExpr(Info.Ctor->getLocation(), Field);
5157 if (DIE.isInvalid())
5158 return true;
5159
5160 auto Entity = InitializedEntity::InitializeMember(Field, nullptr, true);
5161 SemaRef.checkInitializerLifetime(Entity, DIE.get());
5162
5164 if (Indirect)
5165 Init = new (SemaRef.Context)
5167 SourceLocation(), DIE.get(), SourceLocation());
5168 else
5169 Init = new (SemaRef.Context)
5171 SourceLocation(), DIE.get(), SourceLocation());
5172 return Info.addFieldInitializer(Init);
5173 }
5174
5175 // Don't initialize incomplete or zero-length arrays.
5176 if (isIncompleteOrZeroLengthArrayType(SemaRef.Context, Field->getType()))
5177 return false;
5178
5179 // Don't try to build an implicit initializer if there were semantic
5180 // errors in any of the initializers (and therefore we might be
5181 // missing some that the user actually wrote).
5182 if (Info.AnyErrorsInInits)
5183 return false;
5184
5185 CXXCtorInitializer *Init = nullptr;
5186 if (BuildImplicitMemberInitializer(Info.S, Info.Ctor, Info.IIK, Field,
5187 Indirect, Init))
5188 return true;
5189
5190 if (!Init)
5191 return false;
5192
5193 return Info.addFieldInitializer(Init);
5194}
5195
5196bool
5199 assert(Initializer->isDelegatingInitializer());
5200 Constructor->setNumCtorInitializers(1);
5201 CXXCtorInitializer **initializer =
5202 new (Context) CXXCtorInitializer*[1];
5203 memcpy(initializer, &Initializer, sizeof (CXXCtorInitializer*));
5204 Constructor->setCtorInitializers(initializer);
5205
5206 if (CXXDestructorDecl *Dtor = LookupDestructor(Constructor->getParent())) {
5207 MarkFunctionReferenced(Initializer->getSourceLocation(), Dtor);
5208 DiagnoseUseOfDecl(Dtor, Initializer->getSourceLocation());
5209 }
5210
5211 DelegatingCtorDecls.push_back(Constructor);
5212
5213 DiagnoseUninitializedFields(*this, Constructor);
5214
5215 return false;
5216}
5217
5218bool Sema::SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors,
5219 ArrayRef<CXXCtorInitializer *> Initializers) {
5220 if (Constructor->isDependentContext()) {
5221 // Just store the initializers as written, they will be checked during
5222 // instantiation.
5223 if (!Initializers.empty()) {
5224 Constructor->setNumCtorInitializers(Initializers.size());
5225 CXXCtorInitializer **baseOrMemberInitializers =
5226 new (Context) CXXCtorInitializer*[Initializers.size()];
5227 memcpy(baseOrMemberInitializers, Initializers.data(),
5228 Initializers.size() * sizeof(CXXCtorInitializer*));
5229 Constructor->setCtorInitializers(baseOrMemberInitializers);
5230 }
5231
5232 // Let template instantiation know whether we had errors.
5233 if (AnyErrors)
5234 Constructor->setInvalidDecl();
5235
5236 return false;
5237 }
5238
5239 BaseAndFieldInfo Info(*this, Constructor, AnyErrors);
5240
5241 // We need to build the initializer AST according to order of construction
5242 // and not what user specified in the Initializers list.
5243 CXXRecordDecl *ClassDecl = Constructor->getParent()->getDefinition();
5244 if (!ClassDecl)
5245 return true;
5246
5247 bool HadError = false;
5248
5249 for (unsigned i = 0; i < Initializers.size(); i++) {
5250 CXXCtorInitializer *Member = Initializers[i];
5251
5252 if (Member->isBaseInitializer())
5253 Info.AllBaseFields[Member->getBaseClass()->getAs<RecordType>()] = Member;
5254 else {
5255 Info.AllBaseFields[Member->getAnyMember()->getCanonicalDecl()] = Member;
5256
5257 if (IndirectFieldDecl *F = Member->getIndirectMember()) {
5258 for (auto *C : F->chain()) {
5259 FieldDecl *FD = dyn_cast<FieldDecl>(C);
5260 if (FD && FD->getParent()->isUnion())
5261 Info.ActiveUnionMember.insert(std::make_pair(
5263 }
5264 } else if (FieldDecl *FD = Member->getMember()) {
5265 if (FD->getParent()->isUnion())
5266 Info.ActiveUnionMember.insert(std::make_pair(
5268 }
5269 }
5270 }
5271
5272 // Keep track of the direct virtual bases.
5274 for (auto &I : ClassDecl->bases()) {
5275 if (I.isVirtual())
5276 DirectVBases.insert(&I);
5277 }
5278
5279 // Push virtual bases before others.
5280 for (auto &VBase : ClassDecl->vbases()) {
5282 = Info.AllBaseFields.lookup(VBase.getType()->getAs<RecordType>())) {
5283 // [class.base.init]p7, per DR257:
5284 // A mem-initializer where the mem-initializer-id names a virtual base
5285 // class is ignored during execution of a constructor of any class that
5286 // is not the most derived class.
5287 if (ClassDecl->isAbstract()) {
5288 // FIXME: Provide a fixit to remove the base specifier. This requires
5289 // tracking the location of the associated comma for a base specifier.
5290 Diag(Value->getSourceLocation(), diag::warn_abstract_vbase_init_ignored)
5291 << VBase.getType() << ClassDecl;
5292 DiagnoseAbstractType(ClassDecl);
5293 }
5294
5295 Info.AllToInit.push_back(Value);
5296 } else if (!AnyErrors && !ClassDecl->isAbstract()) {
5297 // [class.base.init]p8, per DR257:
5298 // If a given [...] base class is not named by a mem-initializer-id
5299 // [...] and the entity is not a virtual base class of an abstract
5300 // class, then [...] the entity is default-initialized.
5301 bool IsInheritedVirtualBase = !DirectVBases.count(&VBase);
5302 CXXCtorInitializer *CXXBaseInit;
5303 if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
5304 &VBase, IsInheritedVirtualBase,
5305 CXXBaseInit)) {
5306 HadError = true;
5307 continue;
5308 }
5309
5310 Info.AllToInit.push_back(CXXBaseInit);
5311 }
5312 }
5313
5314 // Non-virtual bases.
5315 for (auto &Base : ClassDecl->bases()) {
5316 // Virtuals are in the virtual base list and already constructed.
5317 if (Base.isVirtual())
5318 continue;
5319
5321 = Info.AllBaseFields.lookup(Base.getType()->getAs<RecordType>())) {
5322 Info.AllToInit.push_back(Value);
5323 } else if (!AnyErrors) {
5324 CXXCtorInitializer *CXXBaseInit;
5325 if (BuildImplicitBaseInitializer(*this, Constructor, Info.IIK,
5326 &Base, /*IsInheritedVirtualBase=*/false,
5327 CXXBaseInit)) {
5328 HadError = true;
5329 continue;
5330 }
5331
5332 Info.AllToInit.push_back(CXXBaseInit);
5333 }
5334 }
5335
5336 // Fields.
5337 for (auto *Mem : ClassDecl->decls()) {
5338 if (auto *F = dyn_cast<FieldDecl>(Mem)) {
5339 // C++ [class.bit]p2:
5340 // A declaration for a bit-field that omits the identifier declares an
5341 // unnamed bit-field. Unnamed bit-fields are not members and cannot be
5342 // initialized.
5343 if (F->isUnnamedBitField())
5344 continue;
5345
5346 // If we're not generating the implicit copy/move constructor, then we'll
5347 // handle anonymous struct/union fields based on their individual
5348 // indirect fields.
5349 if (F->isAnonymousStructOrUnion() && !Info.isImplicitCopyOrMove())
5350 continue;
5351
5352 if (CollectFieldInitializer(*this, Info, F))
5353 HadError = true;
5354 continue;
5355 }
5356
5357 // Beyond this point, we only consider default initialization.
5358 if (Info.isImplicitCopyOrMove())
5359 continue;
5360
5361 if (auto *F = dyn_cast<IndirectFieldDecl>(Mem)) {
5362 if (F->getType()->isIncompleteArrayType()) {
5363 assert(ClassDecl->hasFlexibleArrayMember() &&
5364 "Incomplete array type is not valid");
5365 continue;
5366 }
5367
5368 // Initialize each field of an anonymous struct individually.
5369 if (CollectFieldInitializer(*this, Info, F->getAnonField(), F))
5370 HadError = true;
5371
5372 continue;
5373 }
5374 }
5375
5376 unsigned NumInitializers = Info.AllToInit.size();
5377 if (NumInitializers > 0) {
5378 Constructor->setNumCtorInitializers(NumInitializers);
5379 CXXCtorInitializer **baseOrMemberInitializers =
5380 new (Context) CXXCtorInitializer*[NumInitializers];
5381 memcpy(baseOrMemberInitializers, Info.AllToInit.data(),
5382 NumInitializers * sizeof(CXXCtorInitializer*));
5383 Constructor->setCtorInitializers(baseOrMemberInitializers);
5384
5385 // Constructors implicitly reference the base and member
5386 // destructors.
5387 MarkBaseAndMemberDestructorsReferenced(Constructor->getLocation(),
5388 Constructor->getParent());
5389 }
5390
5391 return HadError;
5392}
5393
5395 if (const RecordType *RT = Field->getType()->getAs<RecordType>()) {
5396 const RecordDecl *RD = RT->getDecl();
5397 if (RD->isAnonymousStructOrUnion()) {
5398 for (auto *Field : RD->fields())
5399 PopulateKeysForFields(Field, IdealInits);
5400 return;
5401 }
5402 }
5403 IdealInits.push_back(Field->getCanonicalDecl());
5404}
5405
5406static const void *GetKeyForBase(ASTContext &Context, QualType BaseType) {
5407 return Context.getCanonicalType(BaseType).getTypePtr();
5408}
5409
5412 if (!Member->isAnyMemberInitializer())
5413 return GetKeyForBase(Context, QualType(Member->getBaseClass(), 0));
5414
5415 return Member->getAnyMember()->getCanonicalDecl();
5416}
5417
5420 const CXXCtorInitializer *Current) {
5421 if (Previous->isAnyMemberInitializer())
5422 Diag << 0 << Previous->getAnyMember();
5423 else
5424 Diag << 1 << Previous->getTypeSourceInfo()->getType();
5425
5426 if (Current->isAnyMemberInitializer())
5427 Diag << 0 << Current->getAnyMember();
5428 else
5429 Diag << 1 << Current->getTypeSourceInfo()->getType();
5430}
5431
5433 Sema &SemaRef, const CXXConstructorDecl *Constructor,
5435 if (Constructor->getDeclContext()->isDependentContext())
5436 return;
5437
5438 // Don't check initializers order unless the warning is enabled at the
5439 // location of at least one initializer.
5440 bool ShouldCheckOrder = false;
5441 for (unsigned InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) {
5442 CXXCtorInitializer *Init = Inits[InitIndex];
5443 if (!SemaRef.Diags.isIgnored(diag::warn_initializer_out_of_order,
5444 Init->getSourceLocation())) {
5445 ShouldCheckOrder = true;
5446 break;
5447 }
5448 }
5449 if (!ShouldCheckOrder)
5450 return;
5451
5452 // Build the list of bases and members in the order that they'll
5453 // actually be initialized. The explicit initializers should be in
5454 // this same order but may be missing things.
5455 SmallVector<const void*, 32> IdealInitKeys;
5456
5457 const CXXRecordDecl *ClassDecl = Constructor->getParent();
5458
5459 // 1. Virtual bases.
5460 for (const auto &VBase : ClassDecl->vbases())
5461 IdealInitKeys.push_back(GetKeyForBase(SemaRef.Context, VBase.getType()));
5462
5463 // 2. Non-virtual bases.
5464 for (const auto &Base : ClassDecl->bases()) {
5465 if (Base.isVirtual())
5466 continue;
5467 IdealInitKeys.push_back(GetKeyForBase(SemaRef.Context, Base.getType()));
5468 }
5469
5470 // 3. Direct fields.
5471 for (auto *Field : ClassDecl->fields()) {
5472 if (Field->isUnnamedBitField())
5473 continue;
5474
5475 PopulateKeysForFields(Field, IdealInitKeys);
5476 }
5477
5478 unsigned NumIdealInits = IdealInitKeys.size();
5479 unsigned IdealIndex = 0;
5480
5481 // Track initializers that are in an incorrect order for either a warning or
5482 // note if multiple ones occur.
5483 SmallVector<unsigned> WarnIndexes;
5484 // Correlates the index of an initializer in the init-list to the index of
5485 // the field/base in the class.
5486 SmallVector<std::pair<unsigned, unsigned>, 32> CorrelatedInitOrder;
5487
5488 for (unsigned InitIndex = 0; InitIndex != Inits.size(); ++InitIndex) {
5489 const void *InitKey = GetKeyForMember(SemaRef.Context, Inits[InitIndex]);
5490
5491 // Scan forward to try to find this initializer in the idealized
5492 // initializers list.
5493 for (; IdealIndex != NumIdealInits; ++IdealIndex)
5494 if (InitKey == IdealInitKeys[IdealIndex])
5495 break;
5496
5497 // If we didn't find this initializer, it must be because we
5498 // scanned past it on a previous iteration. That can only
5499 // happen if we're out of order; emit a warning.
5500 if (IdealIndex == NumIdealInits && InitIndex) {
5501 WarnIndexes.push_back(InitIndex);
5502
5503 // Move back to the initializer's location in the ideal list.
5504 for (IdealIndex = 0; IdealIndex != NumIdealInits; ++IdealIndex)
5505 if (InitKey == IdealInitKeys[IdealIndex])
5506 break;
5507
5508 assert(IdealIndex < NumIdealInits &&
5509 "initializer not found in initializer list");
5510 }
5511 CorrelatedInitOrder.emplace_back(IdealIndex, InitIndex);
5512 }
5513
5514 if (WarnIndexes.empty())
5515 return;
5516
5517 // Sort based on the ideal order, first in the pair.
5518 llvm::sort(CorrelatedInitOrder, llvm::less_first());
5519
5520 // Introduce a new scope as SemaDiagnosticBuilder needs to be destroyed to
5521 // emit the diagnostic before we can try adding notes.
5522 {
5524 Inits[WarnIndexes.front() - 1]->getSourceLocation(),
5525 WarnIndexes.size() == 1 ? diag::warn_initializer_out_of_order
5526 : diag::warn_some_initializers_out_of_order);
5527
5528 for (unsigned I = 0; I < CorrelatedInitOrder.size(); ++I) {
5529 if (CorrelatedInitOrder[I].second == I)
5530 continue;
5531 // Ideally we would be using InsertFromRange here, but clang doesn't
5532 // appear to handle InsertFromRange correctly when the source range is
5533 // modified by another fix-it.
5535 Inits[I]->getSourceRange(),
5538 Inits[CorrelatedInitOrder[I].second]->getSourceRange()),
5540 }
5541
5542 // If there is only 1 item out of order, the warning expects the name and
5543 // type of each being added to it.
5544 if (WarnIndexes.size() == 1) {
5545 AddInitializerToDiag(D, Inits[WarnIndexes.front() - 1],
5546 Inits[WarnIndexes.front()]);
5547 return;
5548 }
5549 }
5550 // More than 1 item to warn, create notes letting the user know which ones
5551 // are bad.
5552 for (unsigned WarnIndex : WarnIndexes) {
5553 const clang::CXXCtorInitializer *PrevInit = Inits[WarnIndex - 1];
5554 auto D = SemaRef.Diag(PrevInit->getSourceLocation(),
5555 diag::note_initializer_out_of_order);
5556 AddInitializerToDiag(D, PrevInit, Inits[WarnIndex]);
5557 D << PrevInit->getSourceRange();
5558 }
5559}
5560
5561namespace {
5562bool CheckRedundantInit(Sema &S,
5564 CXXCtorInitializer *&PrevInit) {
5565 if (!PrevInit) {
5566 PrevInit = Init;
5567 return false;
5568 }
5569
5570 if (FieldDecl *Field = Init->getAnyMember())
5571 S.Diag(Init->getSourceLocation(),
5572 diag::err_multiple_mem_initialization)
5573 << Field->getDeclName()
5574 << Init->getSourceRange();
5575 else {
5576 const Type *BaseClass = Init->getBaseClass();
5577 assert(BaseClass && "neither field nor base");
5578 S.Diag(Init->getSourceLocation(),
5579 diag::err_multiple_base_initialization)
5580 << QualType(BaseClass, 0)
5581 << Init->getSourceRange();
5582 }
5583 S.Diag(PrevInit->getSourceLocation(), diag::note_previous_initializer)
5584 << 0 << PrevInit->getSourceRange();
5585
5586 return true;
5587}
5588
5589typedef std::pair<NamedDecl *, CXXCtorInitializer *> UnionEntry;
5590typedef llvm::DenseMap<RecordDecl*, UnionEntry> RedundantUnionMap;
5591
5592bool CheckRedundantUnionInit(Sema &S,
5594 RedundantUnionMap &Unions) {
5595 FieldDecl *Field = Init->getAnyMember();
5596 RecordDecl *Parent = Field->getParent();
5597 NamedDecl *Child = Field;
5598
5599 while (Parent->isAnonymousStructOrUnion() || Parent->isUnion()) {
5600 if (Parent->isUnion()) {
5601 UnionEntry &En = Unions[Parent];
5602 if (En.first && En.first != Child) {
5603 S.Diag(Init->getSourceLocation(),
5604 diag::err_multiple_mem_union_initialization)
5605 << Field->getDeclName()
5606 << Init->getSourceRange();
5607 S.Diag(En.second->getSourceLocation(), diag::note_previous_initializer)
5608 << 0 << En.second->getSourceRange();
5609 return true;
5610 }
5611 if (!En.first) {
5612 En.first = Child;
5613 En.second = Init;
5614 }
5615 if (!Parent->isAnonymousStructOrUnion())
5616 return false;
5617 }
5618
5619 Child = Parent;
5620 Parent = cast<RecordDecl>(Parent->getDeclContext());
5621 }
5622
5623 return false;
5624}
5625} // namespace
5626
5627void Sema::ActOnMemInitializers(Decl *ConstructorDecl,
5628 SourceLocation ColonLoc,
5630 bool AnyErrors) {
5631 if (!ConstructorDecl)
5632 return;
5633
5634 AdjustDeclIfTemplate(ConstructorDecl);
5635
5636 CXXConstructorDecl *Constructor
5637 = dyn_cast<CXXConstructorDecl>(ConstructorDecl);
5638
5639 if (!Constructor) {
5640 Diag(ColonLoc, diag::err_only_constructors_take_base_inits);
5641 return;
5642 }
5643
5644 // Mapping for the duplicate initializers check.
5645 // For member initializers, this is keyed with a FieldDecl*.
5646 // For base initializers, this is keyed with a Type*.
5647 llvm::DenseMap<const void *, CXXCtorInitializer *> Members;
5648
5649 // Mapping for the inconsistent anonymous-union initializers check.
5650 RedundantUnionMap MemberUnions;
5651
5652 bool HadError = false;
5653 for (unsigned i = 0; i < MemInits.size(); i++) {
5654 CXXCtorInitializer *Init = MemInits[i];
5655
5656 // Set the source order index.
5657 Init->setSourceOrder(i);
5658
5659 if (Init->isAnyMemberInitializer()) {
5660 const void *Key = GetKeyForMember(Context, Init);
5661 if (CheckRedundantInit(*this, Init, Members[Key]) ||
5662 CheckRedundantUnionInit(*this, Init, MemberUnions))
5663 HadError = true;
5664 } else if (Init->isBaseInitializer()) {
5665 const void *Key = GetKeyForMember(Context, Init);
5666 if (CheckRedundantInit(*this, Init, Members[Key]))
5667 HadError = true;
5668 } else {
5669 assert(Init->isDelegatingInitializer());
5670 // This must be the only initializer
5671 if (MemInits.size() != 1) {
5672 Diag(Init->getSourceLocation(),
5673 diag::err_delegating_initializer_alone)
5674 << Init->getSourceRange() << MemInits[i ? 0 : 1]->getSourceRange();
5675 // We will treat this as being the only initializer.
5676 }
5677 SetDelegatingInitializer(Constructor, MemInits[i]);
5678 // Return immediately as the initializer is set.
5679 return;
5680 }
5681 }
5682
5683 if (HadError)
5684 return;
5685
5686 DiagnoseBaseOrMemInitializerOrder(*this, Constructor, MemInits);
5687
5688 SetCtorInitializers(Constructor, AnyErrors, MemInits);
5689
5690 DiagnoseUninitializedFields(*this, Constructor);
5691}
5692
5693void
5695 CXXRecordDecl *ClassDecl) {
5696 // Ignore dependent contexts. Also ignore unions, since their members never
5697 // have destructors implicitly called.
5698 if (ClassDecl->isDependentContext() || ClassDecl->isUnion())
5699 return;
5700
5701 // FIXME: all the access-control diagnostics are positioned on the
5702 // field/base declaration. That's probably good; that said, the
5703 // user might reasonably want to know why the destructor is being
5704 // emitted, and we currently don't say.
5705
5706 // Non-static data members.
5707 for (auto *Field : ClassDecl->fields()) {
5708 if (Field->isInvalidDecl())
5709 continue;
5710
5711 // Don't destroy incomplete or zero-length arrays.
5712 if (isIncompleteOrZeroLengthArrayType(Context, Field->getType()))
5713 continue;
5714
5715 QualType FieldType = Context.getBaseElementType(Field->getType());
5716
5717 const RecordType* RT = FieldType->getAs<RecordType>();
5718 if (!RT)
5719 continue;
5720
5721 CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5722 if (FieldClassDecl->isInvalidDecl())
5723 continue;
5724 if (FieldClassDecl->hasIrrelevantDestructor())
5725 continue;
5726 // The destructor for an implicit anonymous union member is never invoked.
5727 if (FieldClassDecl->isUnion() && FieldClassDecl->isAnonymousStructOrUnion())
5728 continue;
5729
5730 CXXDestructorDecl *Dtor = LookupDestructor(FieldClassDecl);
5731 // Dtor might still be missing, e.g because it's invalid.
5732 if (!Dtor)
5733 continue;
5734 CheckDestructorAccess(Field->getLocation(), Dtor,
5735 PDiag(diag::err_access_dtor_field)
5736 << Field->getDeclName()
5737 << FieldType);
5738
5739 MarkFunctionReferenced(Location, Dtor);
5740 DiagnoseUseOfDecl(Dtor, Location);
5741 }
5742
5743 // We only potentially invoke the destructors of potentially constructed
5744 // subobjects.
5745 bool VisitVirtualBases = !ClassDecl->isAbstract();
5746
5747 // If the destructor exists and has already been marked used in the MS ABI,
5748 // then virtual base destructors have already been checked and marked used.
5749 // Skip checking them again to avoid duplicate diagnostics.
5751 CXXDestructorDecl *Dtor = ClassDecl->getDestructor();
5752 if (Dtor && Dtor->isUsed())
5753 VisitVirtualBases = false;
5754 }
5755
5757
5758 // Bases.
5759 for (const auto &Base : ClassDecl->bases()) {
5760 const RecordType *RT = Base.getType()->getAs<RecordType>();
5761 if (!RT)
5762 continue;
5763
5764 // Remember direct virtual bases.
5765 if (Base.isVirtual()) {
5766 if (!VisitVirtualBases)
5767 continue;
5768 DirectVirtualBases.insert(RT);
5769 }
5770
5771 CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5772 // If our base class is invalid, we probably can't get its dtor anyway.
5773 if (BaseClassDecl->isInvalidDecl())
5774 continue;
5775 if (BaseClassDecl->hasIrrelevantDestructor())
5776 continue;
5777
5778 CXXDestructorDecl *Dtor = LookupDestructor(BaseClassDecl);
5779 // Dtor might still be missing, e.g because it's invalid.
5780 if (!Dtor)
5781 continue;
5782
5783 // FIXME: caret should be on the start of the class name
5784 CheckDestructorAccess(Base.getBeginLoc(), Dtor,
5785 PDiag(diag::err_access_dtor_base)
5786 << Base.getType() << Base.getSourceRange(),
5787 Context.getTypeDeclType(ClassDecl));
5788
5789 MarkFunctionReferenced(Location, Dtor);
5790 DiagnoseUseOfDecl(Dtor, Location);
5791 }
5792
5793 if (VisitVirtualBases)
5794 MarkVirtualBaseDestructorsReferenced(Location, ClassDecl,
5795 &DirectVirtualBases);
5796}
5797
5799 SourceLocation Location, CXXRecordDecl *ClassDecl,
5800 llvm::SmallPtrSetImpl<const RecordType *> *DirectVirtualBases) {
5801 // Virtual bases.
5802 for (const auto &VBase : ClassDecl->vbases()) {
5803 // Bases are always records in a well-formed non-dependent class.
5804 const RecordType *RT = VBase.getType()->castAs<RecordType>();
5805
5806 // Ignore already visited direct virtual bases.
5807 if (DirectVirtualBases && DirectVirtualBases->count(RT))
5808 continue;
5809
5810 CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(RT->getDecl());
5811 // If our base class is invalid, we probably can't get its dtor anyway.
5812 if (BaseClassDecl->isInvalidDecl())
5813 continue;
5814 if (BaseClassDecl->hasIrrelevantDestructor())
5815 continue;
5816
5817 CXXDestructorDecl *Dtor = LookupDestructor(BaseClassDecl);
5818 // Dtor might still be missing, e.g because it's invalid.
5819 if (!Dtor)
5820 continue;
5822 ClassDecl->getLocation(), Dtor,
5823 PDiag(diag::err_access_dtor_vbase)
5824 << Context.getTypeDeclType(ClassDecl) << VBase.getType(),
5825 Context.getTypeDeclType(ClassDecl)) ==
5826 AR_accessible) {
5828 Context.getTypeDeclType(ClassDecl), VBase.getType(),
5829 diag::err_access_dtor_vbase, 0, ClassDecl->getLocation(),
5830 SourceRange(), DeclarationName(), nullptr);
5831 }
5832
5833 MarkFunctionReferenced(Location, Dtor);
5834 DiagnoseUseOfDecl(Dtor, Location);
5835 }
5836}
5837
5839 if (!CDtorDecl)
5840 return;
5841
5842 if (CXXConstructorDecl *Constructor
5843 = dyn_cast<CXXConstructorDecl>(CDtorDecl)) {
5844 if (CXXRecordDecl *ClassDecl = Constructor->getParent();
5845 !ClassDecl || ClassDecl->isInvalidDecl()) {
5846 return;
5847 }
5848 SetCtorInitializers(Constructor, /*AnyErrors=*/false);
5849 DiagnoseUninitializedFields(*this, Constructor);
5850 }
5851}
5852
5854 if (!getLangOpts().CPlusPlus)
5855 return false;
5856
5857 const auto *RD = Context.getBaseElementType(T)->getAsCXXRecordDecl();
5858 if (!RD)
5859 return false;
5860
5861 // FIXME: Per [temp.inst]p1, we are supposed to trigger instantiation of a
5862 // class template specialization here, but doing so breaks a lot of code.
5863
5864 // We can't answer whether something is abstract until it has a
5865 // definition. If it's currently being defined, we'll walk back
5866 // over all the declarations when we have a full definition.
5867 const CXXRecordDecl *Def = RD->getDefinition();
5868 if (!Def || Def->isBeingDefined())
5869 return false;
5870
5871 return RD->isAbstract();
5872}
5873
5875 TypeDiagnoser &Diagnoser) {
5876 if (!isAbstractType(Loc, T))
5877 return false;
5878
5880 Diagnoser.diagnose(*this, Loc, T);
5882 return true;
5883}
5884
5886 // Check if we've already emitted the list of pure virtual functions
5887 // for this class.
5889 return;
5890
5891 // If the diagnostic is suppressed, don't emit the notes. We're only
5892 // going to emit them once, so try to attach them to a diagnostic we're
5893 // actually going to show.
5895 return;
5896
5897 CXXFinalOverriderMap FinalOverriders;
5898 RD->getFinalOverriders(FinalOverriders);
5899
5900 // Keep a set of seen pure methods so we won't diagnose the same method
5901 // more than once.
5903
5904 for (CXXFinalOverriderMap::iterator M = FinalOverriders.begin(),
5905 MEnd = FinalOverriders.end();
5906 M != MEnd;
5907 ++M) {
5908 for (OverridingMethods::iterator SO = M->second.begin(),
5909 SOEnd = M->second.end();
5910 SO != SOEnd; ++SO) {
5911 // C++ [class.abstract]p4:
5912 // A class is abstract if it contains or inherits at least one
5913 // pure virtual function for which the final overrider is pure
5914 // virtual.
5915
5916 //
5917 if (SO->second.size() != 1)
5918 continue;
5919
5920 if (!SO->second.front().Method->isPureVirtual())
5921 continue;
5922
5923 if (!SeenPureMethods.insert(SO->second.front().Method).second)
5924 continue;
5925
5926 Diag(SO->second.front().Method->getLocation(),
5927 diag::note_pure_virtual_function)
5928 << SO->second.front().Method->getDeclName() << RD->getDeclName();
5929 }
5930 }
5931
5934 PureVirtualClassDiagSet->insert(RD);
5935}
5936
5937namespace {
5938struct AbstractUsageInfo {
5939 Sema &S;
5941 CanQualType AbstractType;
5942 bool Invalid;
5943
5944 AbstractUsageInfo(Sema &S, CXXRecordDecl *Record)
5945 : S(S), Record(Record),
5946 AbstractType(S.Context.getCanonicalType(
5947 S.Context.getTypeDeclType(Record))),
5948 Invalid(false) {}
5949
5950 void DiagnoseAbstractType() {
5951 if (Invalid) return;
5953 Invalid = true;
5954 }
5955
5956 void CheckType(const NamedDecl *D, TypeLoc TL, Sema::AbstractDiagSelID Sel);
5957};
5958
5959struct CheckAbstractUsage {
5960 AbstractUsageInfo &Info;
5961 const NamedDecl *Ctx;
5962
5963 CheckAbstractUsage(AbstractUsageInfo &Info, const NamedDecl *Ctx)
5964 : Info(Info), Ctx(Ctx) {}
5965
5966 void Visit(TypeLoc TL, Sema::AbstractDiagSelID Sel) {
5967 switch (TL.getTypeLocClass()) {
5968#define ABSTRACT_TYPELOC(CLASS, PARENT)
5969#define TYPELOC(CLASS, PARENT) \
5970 case TypeLoc::CLASS: Check(TL.castAs<CLASS##TypeLoc>(), Sel); break;
5971#include "clang/AST/TypeLocNodes.def"
5972 }
5973 }
5974
5975 void Check(FunctionProtoTypeLoc TL, Sema::AbstractDiagSelID Sel) {
5977 for (unsigned I = 0, E = TL.getNumParams(); I != E; ++I) {
5978 if (!TL.getParam(I))
5979 continue;
5980
5982 if (TSI) Visit(TSI->getTypeLoc(), Sema::AbstractParamType);
5983 }
5984 }
5985
5986 void Check(ArrayTypeLoc TL, Sema::AbstractDiagSelID Sel) {
5988 }
5989
5991 // Visit the type parameters from a permissive context.
5992 for (unsigned I = 0, E = TL.getNumArgs(); I != E; ++I) {
5993 TemplateArgumentLoc TAL = TL.getArgLoc(I);
5995 if (TypeSourceInfo *TSI = TAL.getTypeSourceInfo())
5996 Visit(TSI->getTypeLoc(), Sema::AbstractNone);
5997 // TODO: other template argument types?
5998 }
5999 }
6000
6001 // Visit pointee types from a permissive context.
6002#define CheckPolymorphic(Type) \
6003 void Check(Type TL, Sema::AbstractDiagSelID Sel) { \
6004 Visit(TL.getNextTypeLoc(), Sema::AbstractNone); \
6005 }
6011
6012 /// Handle all the types we haven't given a more specific
6013 /// implementation for above.
6014 void Check(TypeLoc TL, Sema::AbstractDiagSelID Sel) {
6015 // Every other kind of type that we haven't called out already
6016 // that has an inner type is either (1) sugar or (2) contains that
6017 // inner type in some way as a subobject.
6018 if (TypeLoc Next = TL.getNextTypeLoc())
6019 return Visit(Next, Sel);
6020
6021 // If there's no inner type and we're in a permissive context,
6022 // don't diagnose.
6023 if (Sel == Sema::AbstractNone) return;
6024
6025 // Check whether the type matches the abstract type.
6026 QualType T = TL.getType();
6027 if (T->isArrayType()) {
6029 T = Info.S.Context.getBaseElementType(T);
6030 }
6032 if (CT != Info.AbstractType) return;
6033
6034 // It matched; do some magic.
6035 // FIXME: These should be at most warnings. See P0929R2, CWG1640, CWG1646.
6036 if (Sel == Sema::AbstractArrayType) {
6037 Info.S.Diag(Ctx->getLocation(), diag::err_array_of_abstract_type)
6038 << T << TL.getSourceRange();
6039 } else {
6040 Info.S.Diag(Ctx->getLocation(), diag::err_abstract_type_in_decl)
6041 << Sel << T << TL.getSourceRange();
6042 }
6043 Info.DiagnoseAbstractType();
6044 }
6045};
6046
6047void AbstractUsageInfo::CheckType(const NamedDecl *D, TypeLoc TL,
6049 CheckAbstractUsage(*this, D).Visit(TL, Sel);
6050}
6051
6052}
6053
6054/// Check for invalid uses of an abstract type in a function declaration.
6055static void CheckAbstractClassUsage(AbstractUsageInfo &Info,
6056 FunctionDecl *FD) {
6057 // Only definitions are required to refer to complete and
6058 // non-abstract types.
6060 return;
6061
6062 // For safety's sake, just ignore it if we don't have type source
6063 // information. This should never happen for non-implicit methods,
6064 // but...
6065 if (TypeSourceInfo *TSI = FD->getTypeSourceInfo())
6066 Info.CheckType(FD, TSI->getTypeLoc(), Sema::AbstractNone);
6067}
6068
6069/// Check for invalid uses of an abstract type in a variable0 declaration.
6070static void CheckAbstractClassUsage(AbstractUsageInfo &Info,
6071 VarDecl *VD) {
6072 // No need to do the check on definitions, which require that
6073 // the type is complete.
6075 return;
6076
6077 Info.CheckType(VD, VD->getTypeSourceInfo()->getTypeLoc(),
6079}
6080
6081/// Check for invalid uses of an abstract type within a class definition.
6082static void CheckAbstractClassUsage(AbstractUsageInfo &Info,
6083 CXXRecordDecl *RD) {
6084 for (auto *D : RD->decls()) {
6085 if (D->isImplicit()) continue;
6086
6087 // Step through friends to the befriended declaration.
6088 if (auto *FD = dyn_cast<FriendDecl>(D)) {
6089 D = FD->getFriendDecl();
6090 if (!D) continue;
6091 }
6092
6093 // Functions and function templates.
6094 if (auto *FD = dyn_cast<FunctionDecl>(D)) {
6095 CheckAbstractClassUsage(Info, FD);
6096 } else if (auto *FTD = dyn_cast<FunctionTemplateDecl>(D)) {
6097 CheckAbstractClassUsage(Info, FTD->getTemplatedDecl());
6098
6099 // Fields and static variables.
6100 } else if (auto *FD = dyn_cast<FieldDecl>(D)) {
6101 if (TypeSourceInfo *TSI = FD->getTypeSourceInfo())
6102 Info.CheckType(FD, TSI->getTypeLoc(), Sema::AbstractFieldType);
6103 } else if (auto *VD = dyn_cast<VarDecl>(D)) {
6104 CheckAbstractClassUsage(Info, VD);
6105 } else if (auto *VTD = dyn_cast<VarTemplateDecl>(D)) {
6106 CheckAbstractClassUsage(Info, VTD->getTemplatedDecl());
6107
6108 // Nested classes and class templates.
6109 } else if (auto *RD = dyn_cast<CXXRecordDecl>(D)) {
6110 CheckAbstractClassUsage(Info, RD);
6111 } else if (auto *CTD = dyn_cast<ClassTemplateDecl>(D)) {
6112 CheckAbstractClassUsage(Info, CTD->getTemplatedDecl());
6113 }
6114 }
6115}
6116
6118 Attr *ClassAttr = getDLLAttr(Class);
6119 if (!ClassAttr)
6120 return;
6121
6122 assert(ClassAttr->getKind() == attr::DLLExport);
6123
6124 TemplateSpecializationKind TSK = Class->getTemplateSpecializationKind();
6125
6127 // Don't go any further if this is just an explicit instantiation
6128 // declaration.
6129 return;
6130
6131 // Add a context note to explain how we got to any diagnostics produced below.
6132 struct MarkingClassDllexported {
6133 Sema &S;
6134 MarkingClassDllexported(Sema &S, CXXRecordDecl *Class,
6135 SourceLocation AttrLoc)
6136 : S(S) {
6139 Ctx.PointOfInstantiation = AttrLoc;
6140 Ctx.Entity = Class;
6142 }
6143 ~MarkingClassDllexported() {
6145 }
6146 } MarkingDllexportedContext(S, Class, ClassAttr->getLocation());
6147
6148 if (S.Context.getTargetInfo().getTriple().isWindowsGNUEnvironment())
6149 S.MarkVTableUsed(Class->getLocation(), Class, true);
6150
6151 for (Decl *Member : Class->decls()) {
6152 // Skip members that were not marked exported.
6153 if (!Member->hasAttr<DLLExportAttr>())
6154 continue;
6155
6156 // Defined static variables that are members of an exported base
6157 // class must be marked export too.
6158 auto *VD = dyn_cast<VarDecl>(Member);
6159 if (VD && VD->getStorageClass() == SC_Static &&
6161 S.MarkVariableReferenced(VD->getLocation(), VD);
6162
6163 auto *MD = dyn_cast<CXXMethodDecl>(Member);
6164 if (!MD)
6165 continue;
6166
6167 if (MD->isUserProvided()) {
6168 // Instantiate non-default class member functions ...
6169
6170 // .. except for certain kinds of template specializations.
6171 if (TSK == TSK_ImplicitInstantiation && !ClassAttr->isInherited())
6172 continue;
6173
6174 // If this is an MS ABI dllexport default constructor, instantiate any
6175 // default arguments.
6177 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6178 if (CD && CD->isDefaultConstructor() && TSK == TSK_Undeclared) {
6180 }
6181 }
6182
6183 S.MarkFunctionReferenced(Class->getLocation(), MD);
6184
6185 // The function will be passed to the consumer when its definition is
6186 // encountered.
6187 } else if (MD->isExplicitlyDefaulted()) {
6188 // Synthesize and instantiate explicitly defaulted methods.
6189 S.MarkFunctionReferenced(Class->getLocation(), MD);
6190
6192 // Except for explicit instantiation defs, we will not see the
6193 // definition again later, so pass it to the consumer now.
6195 }
6196 } else if (!MD->isTrivial() ||
6197 MD->isCopyAssignmentOperator() ||
6198 MD->isMoveAssignmentOperator()) {
6199 // Synthesize and instantiate non-trivial implicit methods, and the copy
6200 // and move assignment operators. The latter are exported even if they
6201 // are trivial, because the address of an operator can be taken and
6202 // should compare equal across libraries.
6203 S.MarkFunctionReferenced(Class->getLocation(), MD);
6204
6205 // There is no later point when we will see the definition of this
6206 // function, so pass it to the consumer now.
6208 }
6209 }
6210}
6211
6214 // Only the MS ABI has default constructor closures, so we don't need to do
6215 // this semantic checking anywhere else.
6217 return;
6218
6219 CXXConstructorDecl *LastExportedDefaultCtor = nullptr;
6220 for (Decl *Member : Class->decls()) {
6221 // Look for exported default constructors.
6222 auto *CD = dyn_cast<CXXConstructorDecl>(Member);
6223 if (!CD || !CD->isDefaultConstructor())
6224 continue;
6225 auto *Attr = CD->getAttr<DLLExportAttr>();
6226 if (!Attr)
6227 continue;
6228
6229 // If the class is non-dependent, mark the default arguments as ODR-used so
6230 // that we can properly codegen the constructor closure.
6231 if (!Class->isDependentContext()) {
6232 for (ParmVarDecl *PD : CD->parameters()) {
6233 (void)S.CheckCXXDefaultArgExpr(Attr->getLocation(), CD, PD);
6235 }
6236 }
6237
6238 if (LastExportedDefaultCtor) {
6239 S.Diag(LastExportedDefaultCtor->getLocation(),
6240 diag::err_attribute_dll_ambiguous_default_ctor)
6241 << Class;
6242 S.Diag(CD->getLocation(), diag::note_entity_declared_at)
6243 << CD->getDeclName();
6244 return;
6245 }
6246 LastExportedDefaultCtor = CD;
6247 }
6248}
6249
6252 bool ErrorReported = false;
6253 auto reportIllegalClassTemplate = [&ErrorReported](Sema &S,
6254 ClassTemplateDecl *TD) {
6255 if (ErrorReported)
6256 return;
6257 S.Diag(TD->getLocation(),
6258 diag::err_cuda_device_builtin_surftex_cls_template)
6259 << /*surface*/ 0 << TD;
6260 ErrorReported = true;
6261 };
6262
6263 ClassTemplateDecl *TD = Class->getDescribedClassTemplate();
6264 if (!TD) {
6265 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6266 if (!SD) {
6267 S.Diag(Class->getLocation(),
6268 diag::err_cuda_device_builtin_surftex_ref_decl)
6269 << /*surface*/ 0 << Class;
6270 S.Diag(Class->getLocation(),
6271 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6272 << Class;
6273 return;
6274 }
6275 TD = SD->getSpecializedTemplate();
6276 }
6277
6279 unsigned N = Params->size();
6280
6281 if (N != 2) {
6282 reportIllegalClassTemplate(S, TD);
6283 S.Diag(TD->getLocation(),
6284 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6285 << TD << 2;
6286 }
6287 if (N > 0 && !isa<TemplateTypeParmDecl>(Params->getParam(0))) {
6288 reportIllegalClassTemplate(S, TD);
6289 S.Diag(TD->getLocation(),
6290 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6291 << TD << /*1st*/ 0 << /*type*/ 0;
6292 }
6293 if (N > 1) {
6294 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->getParam(1));
6295 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6296 reportIllegalClassTemplate(S, TD);
6297 S.Diag(TD->getLocation(),
6298 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6299 << TD << /*2nd*/ 1 << /*integer*/ 1;
6300 }
6301 }
6302}
6303
6306 bool ErrorReported = false;
6307 auto reportIllegalClassTemplate = [&ErrorReported](Sema &S,
6308 ClassTemplateDecl *TD) {
6309 if (ErrorReported)
6310 return;
6311 S.Diag(TD->getLocation(),
6312 diag::err_cuda_device_builtin_surftex_cls_template)
6313 << /*texture*/ 1 << TD;
6314 ErrorReported = true;
6315 };
6316
6317 ClassTemplateDecl *TD = Class->getDescribedClassTemplate();
6318 if (!TD) {
6319 auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(Class);
6320 if (!SD) {
6321 S.Diag(Class->getLocation(),
6322 diag::err_cuda_device_builtin_surftex_ref_decl)
6323 << /*texture*/ 1 << Class;
6324 S.Diag(Class->getLocation(),
6325 diag::note_cuda_device_builtin_surftex_should_be_template_class)
6326 << Class;
6327 return;
6328 }
6329 TD = SD->getSpecializedTemplate();
6330 }
6331
6333 unsigned N = Params->size();
6334
6335 if (N != 3) {
6336 reportIllegalClassTemplate(S, TD);
6337 S.Diag(TD->getLocation(),
6338 diag::note_cuda_device_builtin_surftex_cls_should_have_n_args)
6339 << TD << 3;
6340 }
6341 if (N > 0 && !isa<TemplateTypeParmDecl>(Params->getParam(0))) {
6342 reportIllegalClassTemplate(S, TD);
6343 S.Diag(TD->getLocation(),
6344 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6345 << TD << /*1st*/ 0 << /*type*/ 0;
6346 }
6347 if (N > 1) {
6348 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->getParam(1));
6349 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6350 reportIllegalClassTemplate(S, TD);
6351 S.Diag(TD->getLocation(),
6352 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6353 << TD << /*2nd*/ 1 << /*integer*/ 1;
6354 }
6355 }
6356 if (N > 2) {
6357 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Params->getParam(2));
6358 if (!NTTP || !NTTP->getType()->isIntegralOrEnumerationType()) {
6359 reportIllegalClassTemplate(S, TD);
6360 S.Diag(TD->getLocation(),
6361 diag::note_cuda_device_builtin_surftex_cls_should_have_match_arg)
6362 << TD << /*3rd*/ 2 << /*integer*/ 1;
6363 }
6364 }
6365}
6366
6368 // Mark any compiler-generated routines with the implicit code_seg attribute.
6369 for (auto *Method : Class->methods()) {
6370 if (Method->isUserProvided())
6371 continue;
6372 if (Attr *A = getImplicitCodeSegOrSectionAttrForFunction(Method, /*IsDefinition=*/true))
6373 Method->addAttr(A);
6374 }
6375}
6376
6378 Attr *ClassAttr = getDLLAttr(Class);
6379
6380 // MSVC inherits DLL attributes to partial class template specializations.
6381 if (Context.getTargetInfo().shouldDLLImportComdatSymbols() && !ClassAttr) {
6382 if (auto *Spec = dyn_cast<ClassTemplatePartialSpecializationDecl>(Class)) {
6383 if (Attr *TemplateAttr =
6384 getDLLAttr(Spec->getSpecializedTemplate()->getTemplatedDecl())) {
6385 auto *A = cast<InheritableAttr>(TemplateAttr->clone(getASTContext()));
6386 A->setInherited(true);
6387 ClassAttr = A;
6388 }
6389 }
6390 }
6391
6392 if (!ClassAttr)
6393 return;
6394
6395 // MSVC allows imported or exported template classes that have UniqueExternal
6396 // linkage. This occurs when the template class has been instantiated with
6397 // a template parameter which itself has internal linkage.
6398 // We drop the attribute to avoid exporting or importing any members.
6400 Context.getTargetInfo().getTriple().isPS()) &&
6401 (!Class->isExternallyVisible() && Class->hasExternalFormalLinkage())) {
6402 Class->dropAttrs<DLLExportAttr, DLLImportAttr>();
6403 return;
6404 }
6405
6406 if (!Class->isExternallyVisible()) {
6407 Diag(Class->getLocation(), diag::err_attribute_dll_not_extern)
6408 << Class << ClassAttr;
6409 return;
6410 }
6411
6413 !ClassAttr->isInherited()) {
6414 // Diagnose dll attributes on members of class with dll attribute.
6415 for (Decl *Member : Class->decls()) {
6416 if (!isa<VarDecl>(Member) && !isa<CXXMethodDecl>(Member))
6417 continue;
6418 InheritableAttr *MemberAttr = getDLLAttr(Member);
6419 if (!MemberAttr || MemberAttr->isInherited() || Member->isInvalidDecl())
6420 continue;
6421
6422 Diag(MemberAttr->getLocation(),
6423 diag::err_attribute_dll_member_of_dll_class)
6424 << MemberAttr << ClassAttr;
6425 Diag(ClassAttr->getLocation(), diag::note_previous_attribute);
6426 Member->setInvalidDecl();
6427 }
6428 }
6429
6430 if (Class->getDescribedClassTemplate())
6431 // Don't inherit dll attribute until the template is instantiated.
6432 return;
6433
6434 // The class is either imported or exported.
6435 const bool ClassExported = ClassAttr->getKind() == attr::DLLExport;
6436
6437 // Check if this was a dllimport attribute propagated from a derived class to
6438 // a base class template specialization. We don't apply these attributes to
6439 // static data members.
6440 const bool PropagatedImport =
6441 !ClassExported &&
6442 cast<DLLImportAttr>(ClassAttr)->wasPropagatedToBaseTemplate();
6443
6444 TemplateSpecializationKind TSK = Class->getTemplateSpecializationKind();
6445
6446 // Ignore explicit dllexport on explicit class template instantiation
6447 // declarations, except in MinGW mode.
6448 if (ClassExported && !ClassAttr->isInherited() &&
6450 !Context.getTargetInfo().getTriple().isWindowsGNUEnvironment()) {
6451 Class->dropAttr<DLLExportAttr>();
6452 return;
6453 }
6454
6455 // Force declaration of implicit members so they can inherit the attribute.
6457
6458 // FIXME: MSVC's docs say all bases must be exportable, but this doesn't
6459 // seem to be true in practice?
6460
6461 for (Decl *Member : Class->decls()) {
6462 VarDecl *VD = dyn_cast<VarDecl>(Member);
6463 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(Member);
6464
6465 // Only methods and static fields inherit the attributes.
6466 if (!VD && !MD)
6467 continue;
6468
6469 if (MD) {
6470 // Don't process deleted methods.
6471 if (MD->isDeleted())
6472 continue;
6473
6474 if (MD->isInlined()) {
6475 // MinGW does not import or export inline methods. But do it for
6476 // template instantiations.
6480 continue;
6481
6482 // MSVC versions before 2015 don't export the move assignment operators
6483 // and move constructor, so don't attempt to import/export them if
6484 // we have a definition.
6485 auto *Ctor = dyn_cast<CXXConstructorDecl>(MD);
6486 if ((MD->isMoveAssignmentOperator() ||
6487 (Ctor && Ctor->isMoveConstructor())) &&
6488 !getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015))
6489 continue;
6490
6491 // MSVC2015 doesn't export trivial defaulted x-tor but copy assign
6492 // operator is exported anyway.
6493 if (getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015) &&
6494 (Ctor || isa<CXXDestructorDecl>(MD)) && MD->isTrivial())
6495 continue;
6496 }
6497 }
6498
6499 // Don't apply dllimport attributes to static data members of class template
6500 // instantiations when the attribute is propagated from a derived class.
6501 if (VD && PropagatedImport)
6502 continue;
6503
6504 if (!cast<NamedDecl>(Member)->isExternallyVisible())
6505 continue;
6506
6507 if (!getDLLAttr(Member)) {
6508 InheritableAttr *NewAttr = nullptr;
6509
6510 // Do not export/import inline function when -fno-dllexport-inlines is
6511 // passed. But add attribute for later local static var check.
6512 if (!getLangOpts().DllExportInlines && MD && MD->isInlined() &&
6515 if (ClassExported) {
6516 NewAttr = ::new (getASTContext())
6517 DLLExportStaticLocalAttr(getASTContext(), *ClassAttr);
6518 } else {
6519 NewAttr = ::new (getASTContext())
6520 DLLImportStaticLocalAttr(getASTContext(), *ClassAttr);
6521 }
6522 } else {
6523 NewAttr = cast<InheritableAttr>(ClassAttr->clone(getASTContext()));
6524 }
6525
6526 NewAttr->setInherited(true);
6527 Member->addAttr(NewAttr);
6528
6529 if (MD) {
6530 // Propagate DLLAttr to friend re-declarations of MD that have already
6531 // been constructed.
6532 for (FunctionDecl *FD = MD->getMostRecentDecl(); FD;
6533 FD = FD->getPreviousDecl()) {
6535 continue;
6536 assert(!getDLLAttr(FD) &&
6537 "friend re-decl should not already have a DLLAttr");
6538 NewAttr = cast<InheritableAttr>(ClassAttr->clone(getASTContext()));
6539 NewAttr->setInherited(true);
6540 FD->addAttr(NewAttr);
6541 }
6542 }
6543 }
6544 }
6545
6546 if (ClassExported)
6547 DelayedDllExportClasses.push_back(Class);
6548}
6549
6551 CXXRecordDecl *Class, Attr *ClassAttr,
6552 ClassTemplateSpecializationDecl *BaseTemplateSpec, SourceLocation BaseLoc) {
6553 if (getDLLAttr(
6554 BaseTemplateSpec->getSpecializedTemplate()->getTemplatedDecl())) {
6555 // If the base class template has a DLL attribute, don't try to change it.
6556 return;
6557 }
6558
6559 auto TSK = BaseTemplateSpec->getSpecializationKind();
6560 if (!getDLLAttr(BaseTemplateSpec) &&
6562 TSK == TSK_ImplicitInstantiation)) {
6563 // The template hasn't been instantiated yet (or it has, but only as an
6564 // explicit instantiation declaration or implicit instantiation, which means
6565 // we haven't codegenned any members yet), so propagate the attribute.
6566 auto *NewAttr = cast<InheritableAttr>(ClassAttr->clone(getASTContext()));
6567 NewAttr->setInherited(true);
6568 BaseTemplateSpec->addAttr(NewAttr);
6569
6570 // If this was an import, mark that we propagated it from a derived class to
6571 // a base class template specialization.
6572 if (auto *ImportAttr = dyn_cast<DLLImportAttr>(NewAttr))
6573 ImportAttr->setPropagatedToBaseTemplate();
6574
6575 // If the template is already instantiated, checkDLLAttributeRedeclaration()
6576 // needs to be run again to work see the new attribute. Otherwise this will
6577 // get run whenever the template is instantiated.
6578 if (TSK != TSK_Undeclared)
6579 checkClassLevelDLLAttribute(BaseTemplateSpec);
6580
6581 return;
6582 }
6583
6584 if (getDLLAttr(BaseTemplateSpec)) {
6585 // The template has already been specialized or instantiated with an
6586 // attribute, explicitly or through propagation. We should not try to change
6587 // it.
6588 return;
6589 }
6590
6591 // The template was previously instantiated or explicitly specialized without
6592 // a dll attribute, It's too late for us to add an attribute, so warn that
6593 // this is unsupported.
6594 Diag(BaseLoc, diag::warn_attribute_dll_instantiated_base_class)
6595 << BaseTemplateSpec->isExplicitSpecialization();
6596 Diag(ClassAttr->getLocation(), diag::note_attribute);
6597 if (BaseTemplateSpec->isExplicitSpecialization()) {
6598 Diag(BaseTemplateSpec->getLocation(),
6599 diag::note_template_class_explicit_specialization_was_here)
6600 << BaseTemplateSpec;
6601 } else {
6602 Diag(BaseTemplateSpec->getPointOfInstantiation(),
6603 diag::note_template_class_instantiation_was_here)
6604 << BaseTemplateSpec;
6605 }
6606}
6607
6610 if (auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
6611 if (const CXXConstructorDecl *Ctor = dyn_cast<CXXConstructorDecl>(FD)) {
6612 if (Ctor->isDefaultConstructor())
6614
6615 if (Ctor->isCopyConstructor())
6617
6618 if (Ctor->isMoveConstructor())
6620 }
6621
6622 if (MD->isCopyAssignmentOperator())
6624
6625 if (MD->isMoveAssignmentOperator())
6627
6628 if (isa<CXXDestructorDecl>(FD))
6630 }
6631
6632 switch (FD->getDeclName().getCXXOverloadedOperator()) {
6633 case OO_EqualEqual:
6635
6636 case OO_ExclaimEqual:
6638
6639 case OO_Spaceship:
6640 // No point allowing this if <=> doesn't exist in the current language mode.
6641 if (!getLangOpts().CPlusPlus20)
6642 break;
6644
6645 case OO_Less:
6646 case OO_LessEqual:
6647 case OO_Greater:
6648 case OO_GreaterEqual:
6649 // No point allowing this if <=> doesn't exist in the current language mode.
6650 if (!getLangOpts().CPlusPlus20)
6651 break;
6653
6654 default:
6655 break;
6656 }
6657
6658 // Not defaultable.
6659 return DefaultedFunctionKind();
6660}
6661
6663 SourceLocation DefaultLoc) {
6665 if (DFK.isComparison())
6666 return S.DefineDefaultedComparison(DefaultLoc, FD, DFK.asComparison());
6667
6668 switch (DFK.asSpecialMember()) {
6671 cast<CXXConstructorDecl>(FD));
6672 break;
6674 S.DefineImplicitCopyConstructor(DefaultLoc, cast<CXXConstructorDecl>(FD));
6675 break;
6677 S.DefineImplicitCopyAssignment(DefaultLoc, cast<CXXMethodDecl>(FD));
6678 break;
6680 S.DefineImplicitDestructor(DefaultLoc, cast<CXXDestructorDecl>(FD));
6681 break;
6683 S.DefineImplicitMoveConstructor(DefaultLoc, cast<CXXConstructorDecl>(FD));
6684 break;
6686 S.DefineImplicitMoveAssignment(DefaultLoc, cast<CXXMethodDecl>(FD));
6687 break;
6689 llvm_unreachable("Invalid special member.");
6690 }
6691}
6692
6693/// Determine whether a type is permitted to be passed or returned in
6694/// registers, per C++ [class.temporary]p3.
6697 if (D->isDependentType() || D->isInvalidDecl())
6698 return false;
6699
6700 // Clang <= 4 used the pre-C++11 rule, which ignores move operations.
6701 // The PS4 platform ABI follows the behavior of Clang 3.2.
6703 return !D->hasNonTrivialDestructorForCall() &&
6704 !D->hasNonTrivialCopyConstructorForCall();
6705
6706 if (CCK == TargetInfo::CCK_MicrosoftWin64) {
6707 bool CopyCtorIsTrivial = false, CopyCtorIsTrivialForCall = false;
6708 bool DtorIsTrivialForCall = false;
6709
6710 // If a class has at least one eligible, trivial copy constructor, it
6711 // is passed according to the C ABI. Otherwise, it is passed indirectly.
6712 //
6713 // Note: This permits classes with non-trivial copy or move ctors to be
6714 // passed in registers, so long as they *also* have a trivial copy ctor,
6715 // which is non-conforming.
6716 if (D->needsImplicitCopyConstructor()) {
6717 if (!D->defaultedCopyConstructorIsDeleted()) {
6718 if (D->hasTrivialCopyConstructor())
6719 CopyCtorIsTrivial = true;
6720 if (D->hasTrivialCopyConstructorForCall())
6721 CopyCtorIsTrivialForCall = true;
6722 }
6723 } else {
6724 for (const CXXConstructorDecl *CD : D->ctors()) {
6725 if (CD->isCopyConstructor() && !CD->isDeleted() &&
6726 !CD->isIneligibleOrNotSelected()) {
6727 if (CD->isTrivial())
6728 CopyCtorIsTrivial = true;
6729 if (CD->isTrivialForCall())
6730 CopyCtorIsTrivialForCall = true;
6731 }
6732 }
6733 }
6734
6735 if (D->needsImplicitDestructor()) {
6736 if (!D->defaultedDestructorIsDeleted() &&
6737 D->hasTrivialDestructorForCall())
6738 DtorIsTrivialForCall = true;
6739 } else if (const auto *DD = D->getDestructor()) {
6740 if (!DD->isDeleted() && DD->isTrivialForCall())
6741 DtorIsTrivialForCall = true;
6742 }
6743
6744 // If the copy ctor and dtor are both trivial-for-calls, pass direct.
6745 if (CopyCtorIsTrivialForCall && DtorIsTrivialForCall)
6746 return true;
6747
6748 // If a class has a destructor, we'd really like to pass it indirectly
6749 // because it allows us to elide copies. Unfortunately, MSVC makes that
6750 // impossible for small types, which it will pass in a single register or
6751 // stack slot. Most objects with dtors are large-ish, so handle that early.
6752 // We can't call out all large objects as being indirect because there are
6753 // multiple x64 calling conventions and the C++ ABI code shouldn't dictate
6754 // how we pass large POD types.
6755
6756 // Note: This permits small classes with nontrivial destructors to be
6757 // passed in registers, which is non-conforming.
6758 bool isAArch64 = S.Context.getTargetInfo().getTriple().isAArch64();
6759 uint64_t TypeSize = isAArch64 ? 128 : 64;
6760
6761 if (CopyCtorIsTrivial &&
6762 S.getASTContext().getTypeSize(D->getTypeForDecl()) <= TypeSize)
6763 return true;
6764 return false;
6765 }
6766
6767 // Per C++ [class.temporary]p3, the relevant condition is:
6768 // each copy constructor, move constructor, and destructor of X is
6769 // either trivial or deleted, and X has at least one non-deleted copy
6770 // or move constructor
6771 bool HasNonDeletedCopyOrMove = false;
6772
6773 if (D->needsImplicitCopyConstructor() &&
6774 !D->defaultedCopyConstructorIsDeleted()) {
6775 if (!D->hasTrivialCopyConstructorForCall())
6776 return false;
6777 HasNonDeletedCopyOrMove = true;
6778 }
6779
6780 if (S.getLangOpts().CPlusPlus11 && D->needsImplicitMoveConstructor() &&
6781 !D->defaultedMoveConstructorIsDeleted()) {
6782 if (!D->hasTrivialMoveConstructorForCall())
6783 return false;
6784 HasNonDeletedCopyOrMove = true;
6785 }
6786
6787 if (D->needsImplicitDestructor() && !D->defaultedDestructorIsDeleted() &&
6788 !D->hasTrivialDestructorForCall())
6789 return false;
6790
6791 for (const CXXMethodDecl *MD : D->methods()) {
6792 if (MD->isDeleted() || MD->isIneligibleOrNotSelected())
6793 continue;
6794
6795 auto *CD = dyn_cast<CXXConstructorDecl>(MD);
6796 if (CD && CD->isCopyOrMoveConstructor())
6797 HasNonDeletedCopyOrMove = true;
6798 else if (!isa<CXXDestructorDecl>(MD))
6799 continue;
6800
6801 if (!MD->isTrivialForCall())
6802 return false;
6803 }
6804
6805 return HasNonDeletedCopyOrMove;
6806}
6807
6808/// Report an error regarding overriding, along with any relevant
6809/// overridden methods.
6810///
6811/// \param DiagID the primary error to report.
6812/// \param MD the overriding method.
6813static bool
6814ReportOverrides(Sema &S, unsigned DiagID, const CXXMethodDecl *MD,
6815 llvm::function_ref<bool(const CXXMethodDecl *)> Report) {
6816 bool IssuedDiagnostic = false;
6817 for (const CXXMethodDecl *O : MD->overridden_methods()) {
6818 if (Report(O)) {
6819 if (!IssuedDiagnostic) {
6820 S.Diag(MD->getLocation(), DiagID) << MD->getDeclName();
6821 IssuedDiagnostic = true;
6822 }
6823 S.Diag(O->getLocation(), diag::note_overridden_virtual_function);
6824 }
6825 }
6826 return IssuedDiagnostic;
6827}
6828
6830 if (!Record)
6831 return;
6832
6833 if (Record->isAbstract() && !Record->isInvalidDecl()) {
6834 AbstractUsageInfo Info(*this, Record);
6836 }
6837
6838 // If this is not an aggregate type and has no user-declared constructor,
6839 // complain about any non-static data members of reference or const scalar
6840 // type, since they will never get initializers.
6841 if (!Record->isInvalidDecl() && !Record->isDependentType() &&
6842 !Record->isAggregate() && !Record->hasUserDeclaredConstructor() &&
6843 !Record->isLambda()) {
6844 bool Complained = false;
6845 for (const auto *F : Record->fields()) {
6846 if (F->hasInClassInitializer() || F->isUnnamedBitField())
6847 continue;
6848
6849 if (F->getType()->isReferenceType() ||
6850 (F->getType().isConstQualified() && F->getType()->isScalarType())) {
6851 if (!Complained) {
6852 Diag(Record->getLocation(), diag::warn_no_constructor_for_refconst)
6853 << llvm::to_underlying(Record->getTagKind()) << Record;
6854 Complained = true;
6855 }
6856
6857 Diag(F->getLocation(), diag::note_refconst_member_not_initialized)
6858 << F->getType()->isReferenceType()
6859 << F->getDeclName();
6860 }
6861 }
6862 }
6863
6864 if (Record->getIdentifier()) {
6865 // C++ [class.mem]p13:
6866 // If T is the name of a class, then each of the following shall have a
6867 // name different from T:
6868 // - every member of every anonymous union that is a member of class T.
6869 //
6870 // C++ [class.mem]p14:
6871 // In addition, if class T has a user-declared constructor (12.1), every
6872 // non-static data member of class T shall have a name different from T.
6873 DeclContext::lookup_result R = Record->lookup(Record->getDeclName());
6874 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E;
6875 ++I) {
6876 NamedDecl *D = (*I)->getUnderlyingDecl();
6877 if (((isa<FieldDecl>(D) || isa<UnresolvedUsingValueDecl>(D)) &&
6878 Record->hasUserDeclaredConstructor()) ||
6879 isa<IndirectFieldDecl>(D)) {
6880 Diag((*I)->getLocation(), diag::err_member_name_of_class)
6881 << D->getDeclName();
6882 break;
6883 }
6884 }
6885 }
6886
6887 // Warn if the class has virtual methods but non-virtual public destructor.
6888 if (Record->isPolymorphic() && !Record->isDependentType()) {
6889 CXXDestructorDecl *dtor = Record->getDestructor();
6890 if ((!dtor || (!dtor->isVirtual() && dtor->getAccess() == AS_public)) &&
6891 !Record->hasAttr<FinalAttr>())
6892 Diag(dtor ? dtor->getLocation() : Record->getLocation(),
6893 diag::warn_non_virtual_dtor) << Context.getRecordType(Record);
6894 }
6895
6896 if (Record->isAbstract()) {
6897 if (FinalAttr *FA = Record->getAttr<FinalAttr>()) {
6898 Diag(Record->getLocation(), diag::warn_abstract_final_class)
6899 << FA->isSpelledAsSealed();
6901 }
6902 }
6903
6904 // Warn if the class has a final destructor but is not itself marked final.
6905 if (!Record->hasAttr<FinalAttr>()) {
6906 if (const CXXDestructorDecl *dtor = Record->getDestructor()) {
6907 if (const FinalAttr *FA = dtor->getAttr<FinalAttr>()) {
6908 Diag(FA->getLocation(), diag::warn_final_dtor_non_final_class)
6909 << FA->isSpelledAsSealed()
6911 getLocForEndOfToken(Record->getLocation()),
6912 (FA->isSpelledAsSealed() ? " sealed" : " final"));
6913 Diag(Record->getLocation(),
6914 diag::note_final_dtor_non_final_class_silence)
6915 << Context.getRecordType(Record) << FA->isSpelledAsSealed();
6916 }
6917 }
6918 }
6919
6920 // See if trivial_abi has to be dropped.
6921 if (Record->hasAttr<TrivialABIAttr>())
6923
6924 // Set HasTrivialSpecialMemberForCall if the record has attribute
6925 // "trivial_abi".
6926 bool HasTrivialABI = Record->hasAttr<TrivialABIAttr>();
6927
6928 if (HasTrivialABI)
6929 Record->setHasTrivialSpecialMemberForCall();
6930
6931 // Explicitly-defaulted secondary comparison functions (!=, <, <=, >, >=).
6932 // We check these last because they can depend on the properties of the
6933 // primary comparison functions (==, <=>).
6934 llvm::SmallVector<FunctionDecl*, 5> DefaultedSecondaryComparisons;
6935
6936 // Perform checks that can't be done until we know all the properties of a
6937 // member function (whether it's defaulted, deleted, virtual, overriding,
6938 // ...).
6939 auto CheckCompletedMemberFunction = [&](CXXMethodDecl *MD) {
6940 // A static function cannot override anything.
6941 if (MD->getStorageClass() == SC_Static) {
6942 if (ReportOverrides(*this, diag::err_static_overrides_virtual, MD,
6943 [](const CXXMethodDecl *) { return true; }))
6944 return;
6945 }
6946
6947 // A deleted function cannot override a non-deleted function and vice
6948 // versa.
6949 if (ReportOverrides(*this,
6950 MD->isDeleted() ? diag::err_deleted_override
6951 : diag::err_non_deleted_override,
6952 MD, [&](const CXXMethodDecl *V) {
6953 return MD->isDeleted() != V->isDeleted();
6954 })) {
6955 if (MD->isDefaulted() && MD->isDeleted())
6956 // Explain why this defaulted function was deleted.
6958 return;
6959 }
6960
6961 // A consteval function cannot override a non-consteval function and vice
6962 // versa.
6963 if (ReportOverrides(*this,
6964 MD->isConsteval() ? diag::err_consteval_override
6965 : diag::err_non_consteval_override,
6966 MD, [&](const CXXMethodDecl *V) {
6967 return MD->isConsteval() != V->isConsteval();
6968 })) {
6969 if (MD->isDefaulted() && MD->isDeleted())
6970 // Explain why this defaulted function was deleted.
6972 return;
6973 }
6974 };
6975
6976 auto CheckForDefaultedFunction = [&](FunctionDecl *FD) -> bool {
6977 if (!FD || FD->isInvalidDecl() || !FD->isExplicitlyDefaulted())
6978 return false;
6979
6983 DefaultedSecondaryComparisons.push_back(FD);
6984 return true;
6985 }
6986
6988 return false;
6989 };
6990
6991 if (!Record->isInvalidDecl() &&
6992 Record->hasAttr<VTablePointerAuthenticationAttr>())
6994
6995 auto CompleteMemberFunction = [&](CXXMethodDecl *M) {
6996 // Check whether the explicitly-defaulted members are valid.
6997 bool Incomplete = CheckForDefaultedFunction(M);
6998
6999 // Skip the rest of the checks for a member of a dependent class.
7000 if (Record->isDependentType())
7001 return;
7002
7003 // For an explicitly defaulted or deleted special member, we defer
7004 // determining triviality until the class is complete. That time is now!
7006 if (!M->isImplicit() && !M->isUserProvided()) {
7007 if (CSM != CXXSpecialMemberKind::Invalid) {
7008 M->setTrivial(SpecialMemberIsTrivial(M, CSM));
7009 // Inform the class that we've finished declaring this member.
7010 Record->finishedDefaultedOrDeletedMember(M);
7011 M->setTrivialForCall(
7012 HasTrivialABI ||
7014 Record->setTrivialForCallFlags(M);
7015 }
7016 }
7017
7018 // Set triviality for the purpose of calls if this is a user-provided
7019 // copy/move constructor or destructor.
7023 M->isUserProvided()) {
7024 M->setTrivialForCall(HasTrivialABI);
7025 Record->setTrivialForCallFlags(M);
7026 }
7027
7028 if (!M->isInvalidDecl() && M->isExplicitlyDefaulted() &&
7029 M->hasAttr<DLLExportAttr>()) {
7030 if (getLangOpts().isCompatibleWithMSVC(LangOptions::MSVC2015) &&
7031 M->isTrivial() &&
7035 M->dropAttr<DLLExportAttr>();
7036
7037 if (M->hasAttr<DLLExportAttr>()) {
7038 // Define after any fields with in-class initializers have been parsed.
7040 }
7041 }
7042
7043 bool EffectivelyConstexprDestructor = true;
7044 // Avoid triggering vtable instantiation due to a dtor that is not
7045 // "effectively constexpr" for better compatibility.
7046 // See https://github.com/llvm/llvm-project/issues/102293 for more info.
7047 if (isa<CXXDestructorDecl>(M)) {
7048 auto Check = [](QualType T, auto &&Check) -> bool {
7049 const CXXRecordDecl *RD =
7051 if (!RD || !RD->isCompleteDefinition())
7052 return true;
7053
7054 if (!RD->hasConstexprDestructor())
7055 return false;
7056
7057 QualType CanUnqualT = T.getCanonicalType().getUnqualifiedType();
7058 for (const CXXBaseSpecifier &B : RD->bases())
7059 if (B.getType().getCanonicalType().getUnqualifiedType() !=
7060 CanUnqualT &&
7061 !Check(B.getType(), Check))
7062 return false;
7063 for (const FieldDecl *FD : RD->fields())
7065 CanUnqualT &&
7066 !Check(FD->getType(), Check))
7067 return false;
7068 return true;
7069 };
7070 EffectivelyConstexprDestructor =
7071 Check(QualType(Record->getTypeForDecl(), 0), Check);
7072 }
7073
7074 // Define defaulted constexpr virtual functions that override a base class
7075 // function right away.
7076 // FIXME: We can defer doing this until the vtable is marked as used.
7077 if (CSM != CXXSpecialMemberKind::Invalid && !M->isDeleted() &&
7078 M->isDefaulted() && M->isConstexpr() && M->size_overridden_methods() &&
7079 EffectivelyConstexprDestructor)
7080 DefineDefaultedFunction(*this, M, M->getLocation());
7081
7082 if (!Incomplete)
7083 CheckCompletedMemberFunction(M);
7084 };
7085
7086 // Check the destructor before any other member function. We need to
7087 // determine whether it's trivial in order to determine whether the claas
7088 // type is a literal type, which is a prerequisite for determining whether
7089 // other special member functions are valid and whether they're implicitly
7090 // 'constexpr'.
7091 if (CXXDestructorDecl *Dtor = Record->getDestructor())
7092 CompleteMemberFunction(Dtor);
7093
7094 bool HasMethodWithOverrideControl = false,
7095 HasOverridingMethodWithoutOverrideControl = false;
7096 for (auto *D : Record->decls()) {
7097 if (auto *M = dyn_cast<CXXMethodDecl>(D)) {
7098 // FIXME: We could do this check for dependent types with non-dependent
7099 // bases.
7100 if (!Record->isDependentType()) {
7101 // See if a method overloads virtual methods in a base
7102 // class without overriding any.
7103 if (!M->isStatic())
7105 if (M->hasAttr<OverrideAttr>())
7106 HasMethodWithOverrideControl = true;
7107 else if (M->size_overridden_methods() > 0)
7108 HasOverridingMethodWithoutOverrideControl = true;
7109 }
7110
7111 if (!isa<CXXDestructorDecl>(M))
7112 CompleteMemberFunction(M);
7113 } else if (auto *F = dyn_cast<FriendDecl>(D)) {
7114 CheckForDefaultedFunction(
7115 dyn_cast_or_null<FunctionDecl>(F->getFriendDecl()));
7116 }
7117 }
7118
7119 if (HasOverridingMethodWithoutOverrideControl) {
7120 bool HasInconsistentOverrideControl = HasMethodWithOverrideControl;
7121 for (auto *M : Record->methods())
7122 DiagnoseAbsenceOfOverrideControl(M, HasInconsistentOverrideControl);
7123 }
7124
7125 // Check the defaulted secondary comparisons after any other member functions.
7126 for (FunctionDecl *FD : DefaultedSecondaryComparisons) {
7128
7129 // If this is a member function, we deferred checking it until now.
7130 if (auto *MD = dyn_cast<CXXMethodDecl>(FD))
7131 CheckCompletedMemberFunction(MD);
7132 }
7133
7134 // ms_struct is a request to use the same ABI rules as MSVC. Check
7135 // whether this class uses any C++ features that are implemented
7136 // completely differently in MSVC, and if so, emit a diagnostic.
7137 // That diagnostic defaults to an error, but we allow projects to
7138 // map it down to a warning (or ignore it). It's a fairly common
7139 // practice among users of the ms_struct pragma to mass-annotate
7140 // headers, sweeping up a bunch of types that the project doesn't
7141 // really rely on MSVC-compatible layout for. We must therefore
7142 // support "ms_struct except for C++ stuff" as a secondary ABI.
7143 // Don't emit this diagnostic if the feature was enabled as a
7144 // language option (as opposed to via a pragma or attribute), as
7145 // the option -mms-bitfields otherwise essentially makes it impossible
7146 // to build C++ code, unless this diagnostic is turned off.
7147 if (Record->isMsStruct(Context) && !Context.getLangOpts().MSBitfields &&
7148 (Record->isPolymorphic() || Record->getNumBases())) {
7149 Diag(Record->getLocation(), diag::warn_cxx_ms_struct);
7150 }
7151
7154
7155 bool ClangABICompat4 =
7156 Context.getLangOpts().getClangABICompat() <= LangOptions::ClangABI::Ver4;
7158 Context.getTargetInfo().getCallingConvKind(ClangABICompat4);
7159 bool CanPass = canPassInRegisters(*this, Record, CCK);
7160
7161 // Do not change ArgPassingRestrictions if it has already been set to
7162 // RecordArgPassingKind::CanNeverPassInRegs.
7163 if (Record->getArgPassingRestrictions() !=
7165 Record->setArgPassingRestrictions(
7168
7169 // If canPassInRegisters returns true despite the record having a non-trivial
7170 // destructor, the record is destructed in the callee. This happens only when
7171 // the record or one of its subobjects has a field annotated with trivial_abi
7172 // or a field qualified with ObjC __strong/__weak.
7174 Record->setParamDestroyedInCallee(true);
7175 else if (Record->hasNonTrivialDestructor())
7176 Record->setParamDestroyedInCallee(CanPass);
7177
7178 if (getLangOpts().ForceEmitVTables) {
7179 // If we want to emit all the vtables, we need to mark it as used. This
7180 // is especially required for cases like vtable assumption loads.
7181 MarkVTableUsed(Record->getInnerLocStart(), Record);
7182 }
7183
7184 if (getLangOpts().CUDA) {
7185 if (Record->hasAttr<CUDADeviceBuiltinSurfaceTypeAttr>())
7187 else if (Record->hasAttr<CUDADeviceBuiltinTextureTypeAttr>())
7189 }
7190}
7191
7192/// Look up the special member function that would be called by a special
7193/// member function for a subobject of class type.
7194///
7195/// \param Class The class type of the subobject.
7196/// \param CSM The kind of special member function.
7197/// \param FieldQuals If the subobject is a field, its cv-qualifiers.
7198/// \param ConstRHS True if this is a copy operation with a const object
7199/// on its RHS, that is, if the argument to the outer special member
7200/// function is 'const' and this is not a field marked 'mutable'.
7203 CXXSpecialMemberKind CSM, unsigned FieldQuals,
7204 bool ConstRHS) {
7205 unsigned LHSQuals = 0;
7208 LHSQuals = FieldQuals;
7209
7210 unsigned RHSQuals = FieldQuals;
7213 RHSQuals = 0;
7214 else if (ConstRHS)
7215 RHSQuals |= Qualifiers::Const;
7216
7217 return S.LookupSpecialMember(Class, CSM,
7218 RHSQuals & Qualifiers::Const,
7219 RHSQuals & Qualifiers::Volatile,
7220 false,
7221 LHSQuals & Qualifiers::Const,
7222 LHSQuals & Qualifiers::Volatile);
7223}
7224
7226 Sema &S;
7227 SourceLocation UseLoc;
7228
7229 /// A mapping from the base classes through which the constructor was
7230 /// inherited to the using shadow declaration in that base class (or a null
7231 /// pointer if the constructor was declared in that base class).
7232 llvm::DenseMap<CXXRecordDecl *, ConstructorUsingShadowDecl *>
7233 InheritedFromBases;
7234
7235public:
7238 : S(S), UseLoc(UseLoc) {
7239 bool DiagnosedMultipleConstructedBases = false;
7240 CXXRecordDecl *ConstructedBase = nullptr;
7241 BaseUsingDecl *ConstructedBaseIntroducer = nullptr;
7242
7243 // Find the set of such base class subobjects and check that there's a
7244 // unique constructed subobject.
7245 for (auto *D : Shadow->redecls()) {
7246 auto *DShadow = cast<ConstructorUsingShadowDecl>(D);
7247 auto *DNominatedBase = DShadow->getNominatedBaseClass();
7248 auto *DConstructedBase = DShadow->getConstructedBaseClass();
7249
7250 InheritedFromBases.insert(
7251 std::make_pair(DNominatedBase->getCanonicalDecl(),
7252 DShadow->getNominatedBaseClassShadowDecl()));
7253 if (DShadow->constructsVirtualBase())
7254 InheritedFromBases.insert(
7255 std::make_pair(DConstructedBase->getCanonicalDecl(),
7256 DShadow->getConstructedBaseClassShadowDecl()));
7257 else
7258 assert(DNominatedBase == DConstructedBase);
7259
7260 // [class.inhctor.init]p2:
7261 // If the constructor was inherited from multiple base class subobjects
7262 // of type B, the program is ill-formed.
7263 if (!ConstructedBase) {
7264 ConstructedBase = DConstructedBase;
7265 ConstructedBaseIntroducer = D->getIntroducer();
7266 } else if (ConstructedBase != DConstructedBase &&
7267 !Shadow->isInvalidDecl()) {
7268 if (!DiagnosedMultipleConstructedBases) {
7269 S.Diag(UseLoc, diag::err_ambiguous_inherited_constructor)
7270 << Shadow->getTargetDecl();
7271 S.Diag(ConstructedBaseIntroducer->getLocation(),
7272 diag::note_ambiguous_inherited_constructor_using)
7273 << ConstructedBase;
7274 DiagnosedMultipleConstructedBases = true;
7275 }
7276 S.Diag(D->getIntroducer()->getLocation(),
7277 diag::note_ambiguous_inherited_constructor_using)
7278 << DConstructedBase;
7279 }
7280 }
7281
7282 if (DiagnosedMultipleConstructedBases)
7283 Shadow->setInvalidDecl();
7284 }
7285
7286 /// Find the constructor to use for inherited construction of a base class,
7287 /// and whether that base class constructor inherits the constructor from a
7288 /// virtual base class (in which case it won't actually invoke it).
7289 std::pair<CXXConstructorDecl *, bool>
7291 auto It = InheritedFromBases.find(Base->getCanonicalDecl());
7292 if (It == InheritedFromBases.end())
7293 return std::make_pair(nullptr, false);
7294
7295 // This is an intermediary class.
7296 if (It->second)
7297 return std::make_pair(
7298 S.findInheritingConstructor(UseLoc, Ctor, It->second),
7299 It->second->constructsVirtualBase());
7300
7301 // This is the base class from which the constructor was inherited.
7302 return std::make_pair(Ctor, false);
7303 }
7304};
7305
7306/// Is the special member function which would be selected to perform the
7307/// specified operation on the specified class type a constexpr constructor?
7309 Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, unsigned Quals,
7310 bool ConstRHS, CXXConstructorDecl *InheritedCtor = nullptr,
7311 Sema::InheritedConstructorInfo *Inherited = nullptr) {
7312 // Suppress duplicate constraint checking here, in case a constraint check
7313 // caused us to decide to do this. Any truely recursive checks will get
7314 // caught during these checks anyway.
7316
7317 // If we're inheriting a constructor, see if we need to call it for this base
7318 // class.
7319 if (InheritedCtor) {
7321 auto BaseCtor =
7322 Inherited->findConstructorForBase(ClassDecl, InheritedCtor).first;
7323 if (BaseCtor)
7324 return BaseCtor->isConstexpr();
7325 }
7326
7328 return ClassDecl->hasConstexprDefaultConstructor();
7330 return ClassDecl->hasConstexprDestructor();
7331
7333 lookupCallFromSpecialMember(S, ClassDecl, CSM, Quals, ConstRHS);
7334 if (!SMOR.getMethod())
7335 // A constructor we wouldn't select can't be "involved in initializing"
7336 // anything.
7337 return true;
7338 return SMOR.getMethod()->isConstexpr();
7339}
7340
7341/// Determine whether the specified special member function would be constexpr
7342/// if it were implicitly defined.
7344 Sema &S, CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, bool ConstArg,
7345 CXXConstructorDecl *InheritedCtor = nullptr,
7346 Sema::InheritedConstructorInfo *Inherited = nullptr) {
7347 if (!S.getLangOpts().CPlusPlus11)
7348 return false;
7349
7350 // C++11 [dcl.constexpr]p4:
7351 // In the definition of a constexpr constructor [...]
7352 bool Ctor = true;
7353 switch (CSM) {
7355 if (Inherited)
7356 break;
7357 // Since default constructor lookup is essentially trivial (and cannot
7358 // involve, for instance, template instantiation), we compute whether a
7359 // defaulted default constructor is constexpr directly within CXXRecordDecl.
7360 //
7361 // This is important for performance; we need to know whether the default
7362 // constructor is constexpr to determine whether the type is a literal type.
7363 return ClassDecl->defaultedDefaultConstructorIsConstexpr();
7364
7367 // For copy or move constructors, we need to perform overload resolution.
7368 break;
7369
7372 if (!S.getLangOpts().CPlusPlus14)
7373 return false;
7374 // In C++1y, we need to perform overload resolution.
7375 Ctor = false;
7376 break;
7377
7379 return ClassDecl->defaultedDestructorIsConstexpr();
7380
7382 return false;
7383 }
7384
7385 // -- if the class is a non-empty union, or for each non-empty anonymous
7386 // union member of a non-union class, exactly one non-static data member
7387 // shall be initialized; [DR1359]
7388 //
7389 // If we squint, this is guaranteed, since exactly one non-static data member
7390 // will be initialized (if the constructor isn't deleted), we just don't know
7391 // which one.
7392 if (Ctor && ClassDecl->isUnion())
7394 ? ClassDecl->hasInClassInitializer() ||
7395 !ClassDecl->hasVariantMembers()
7396 : true;
7397
7398 // -- the class shall not have any virtual base classes;
7399 if (Ctor && ClassDecl->getNumVBases())
7400 return false;
7401
7402 // C++1y [class.copy]p26:
7403 // -- [the class] is a literal type, and
7404 if (!Ctor && !ClassDecl->isLiteral() && !S.getLangOpts().CPlusPlus23)
7405 return false;
7406
7407 // -- every constructor involved in initializing [...] base class
7408 // sub-objects shall be a constexpr constructor;
7409 // -- the assignment operator selected to copy/move each direct base
7410 // class is a constexpr function, and
7411 if (!S.getLangOpts().CPlusPlus23) {
7412 for (const auto &B : ClassDecl->bases()) {
7413 const RecordType *BaseType = B.getType()->getAs<RecordType>();
7414 if (!BaseType)
7415 continue;
7416 CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(BaseType->getDecl());
7417 if (!specialMemberIsConstexpr(S, BaseClassDecl, CSM, 0, ConstArg,
7418 InheritedCtor, Inherited))
7419 return false;
7420 }
7421 }
7422
7423 // -- every constructor involved in initializing non-static data members
7424 // [...] shall be a constexpr constructor;
7425 // -- every non-static data member and base class sub-object shall be
7426 // initialized
7427 // -- for each non-static data member of X that is of class type (or array
7428 // thereof), the assignment operator selected to copy/move that member is
7429 // a constexpr function
7430 if (!S.getLangOpts().CPlusPlus23) {
7431 for (const auto *F : ClassDecl->fields()) {
7432 if (F->isInvalidDecl())
7433 continue;
7435 F->hasInClassInitializer())
7436 continue;
7437 QualType BaseType = S.Context.getBaseElementType(F->getType());
7438 if (const RecordType *RecordTy = BaseType->getAs<RecordType>()) {
7439 CXXRecordDecl *FieldRecDecl = cast<CXXRecordDecl>(RecordTy->getDecl());
7440 if (!specialMemberIsConstexpr(S, FieldRecDecl, CSM,
7441 BaseType.getCVRQualifiers(),
7442 ConstArg && !F->isMutable()))
7443 return false;
7444 } else if (CSM == CXXSpecialMemberKind::DefaultConstructor) {
7445 return false;
7446 }
7447 }
7448 }
7449
7450 // All OK, it's constexpr!
7451 return true;
7452}
7453
7454namespace {
7455/// RAII object to register a defaulted function as having its exception
7456/// specification computed.
7457struct ComputingExceptionSpec {
7458 Sema &S;
7459
7460 ComputingExceptionSpec(Sema &S, FunctionDecl *FD, SourceLocation Loc)
7461 : S(S) {
7465 Ctx.Entity = FD;
7467 }
7468 ~ComputingExceptionSpec() {
7470 }
7471};
7472}
7473
7476 CXXMethodDecl *MD,
7479
7482 FunctionDecl *FD,
7484
7487 auto DFK = S.getDefaultedFunctionKind(FD);
7488 if (DFK.isSpecialMember())
7490 S, Loc, cast<CXXMethodDecl>(FD), DFK.asSpecialMember(), nullptr);
7491 if (DFK.isComparison())
7493 DFK.asComparison());
7494
7495 auto *CD = cast<CXXConstructorDecl>(FD);
7496 assert(CD->getInheritedConstructor() &&
7497 "only defaulted functions and inherited constructors have implicit "
7498 "exception specs");
7500 S, Loc, CD->getInheritedConstructor().getShadowDecl());
7503}
7504
7506 CXXMethodDecl *MD) {
7508
7509 // Build an exception specification pointing back at this member.
7511 EPI.ExceptionSpec.SourceDecl = MD;
7512
7513 // Set the calling convention to the default for C++ instance methods.
7515 S.Context.getDefaultCallingConvention(/*IsVariadic=*/false,
7516 /*IsCXXMethod=*/true));
7517 return EPI;
7518}
7519
7521 const FunctionProtoType *FPT = FD->getType()->castAs<FunctionProtoType>();
7523 return;
7524
7525 // Evaluate the exception specification.
7526 auto IES = computeImplicitExceptionSpec(*this, Loc, FD);
7527 auto ESI = IES.getExceptionSpec();
7528
7529 // Update the type of the special member to use it.
7530 UpdateExceptionSpec(FD, ESI);
7531}
7532
7534 assert(FD->isExplicitlyDefaulted() && "not explicitly-defaulted");
7535
7537 if (!DefKind) {
7538 assert(FD->getDeclContext()->isDependentContext());
7539 return;
7540 }
7541
7542 if (DefKind.isComparison()) {
7543 auto PT = FD->getParamDecl(0)->getType();
7544 if (const CXXRecordDecl *RD =
7545 PT.getNonReferenceType()->getAsCXXRecordDecl()) {
7546 for (FieldDecl *Field : RD->fields()) {
7547 UnusedPrivateFields.remove(Field);
7548 }
7549 }
7550 }
7551
7552 if (DefKind.isSpecialMember()
7553 ? CheckExplicitlyDefaultedSpecialMember(cast<CXXMethodDecl>(FD),
7554 DefKind.asSpecialMember(),
7555 FD->getDefaultLoc())
7557 FD->setInvalidDecl();
7558}
7559
7562 SourceLocation DefaultLoc) {
7563 CXXRecordDecl *RD = MD->getParent();
7564
7566 "not an explicitly-defaulted special member");
7567
7568 // Defer all checking for special members of a dependent type.
7569 if (RD->isDependentType())
7570 return false;
7571
7572 // Whether this was the first-declared instance of the constructor.
7573 // This affects whether we implicitly add an exception spec and constexpr.
7574 bool First = MD == MD->getCanonicalDecl();
7575
7576 bool HadError = false;
7577
7578 // C++11 [dcl.fct.def.default]p1:
7579 // A function that is explicitly defaulted shall
7580 // -- be a special member function [...] (checked elsewhere),
7581 // -- have the same type (except for ref-qualifiers, and except that a
7582 // copy operation can take a non-const reference) as an implicit
7583 // declaration, and
7584 // -- not have default arguments.
7585 // C++2a changes the second bullet to instead delete the function if it's
7586 // defaulted on its first declaration, unless it's "an assignment operator,
7587 // and its return type differs or its parameter type is not a reference".
7588 bool DeleteOnTypeMismatch = getLangOpts().CPlusPlus20 && First;
7589 bool ShouldDeleteForTypeMismatch = false;
7590 unsigned ExpectedParams = 1;
7593 ExpectedParams = 0;
7594 if (MD->getNumExplicitParams() != ExpectedParams) {
7595 // This checks for default arguments: a copy or move constructor with a
7596 // default argument is classified as a default constructor, and assignment
7597 // operations and destructors can't have default arguments.
7598 Diag(MD->getLocation(), diag::err_defaulted_special_member_params)
7599 << llvm::to_underlying(CSM) << MD->getSourceRange();
7600 HadError = true;
7601 } else if (MD->isVariadic()) {
7602 if (DeleteOnTypeMismatch)
7603 ShouldDeleteForTypeMismatch = true;
7604 else {
7605 Diag(MD->getLocation(), diag::err_defaulted_special_member_variadic)
7606 << llvm::to_underlying(CSM) << MD->getSourceRange();
7607 HadError = true;
7608 }
7609 }
7610
7612
7613 bool CanHaveConstParam = false;
7615 CanHaveConstParam = RD->implicitCopyConstructorHasConstParam();
7617 CanHaveConstParam = RD->implicitCopyAssignmentHasConstParam();
7618
7619 QualType ReturnType = Context.VoidTy;
7622 // Check for return type matching.
7623 ReturnType = Type->getReturnType();
7625
7626 QualType DeclType = Context.getTypeDeclType(RD);
7628 DeclType, nullptr);
7629 DeclType = Context.getAddrSpaceQualType(
7630 DeclType, ThisType.getQualifiers().getAddressSpace());
7631 QualType ExpectedReturnType = Context.getLValueReferenceType(DeclType);
7632
7633 if (!Context.hasSameType(ReturnType, ExpectedReturnType)) {
7634 Diag(MD->getLocation(), diag::err_defaulted_special_member_return_type)
7636 << ExpectedReturnType;
7637 HadError = true;
7638 }
7639
7640 // A defaulted special member cannot have cv-qualifiers.
7641 if (ThisType.isConstQualified() || ThisType.isVolatileQualified()) {
7642 if (DeleteOnTypeMismatch)
7643 ShouldDeleteForTypeMismatch = true;
7644 else {
7645 Diag(MD->getLocation(), diag::err_defaulted_special_member_quals)
7647 << getLangOpts().CPlusPlus14;
7648 HadError = true;
7649 }
7650 }
7651 // [C++23][dcl.fct.def.default]/p2.2
7652 // if F2 has an implicit object parameter of type “reference to C”,
7653 // F1 may be an explicit object member function whose explicit object
7654 // parameter is of (possibly different) type “reference to C”,
7655 // in which case the type of F1 would differ from the type of F2
7656 // in that the type of F1 has an additional parameter;
7657 QualType ExplicitObjectParameter = MD->isExplicitObjectMemberFunction()
7658 ? MD->getParamDecl(0)->getType()
7659 : QualType();
7660 if (!ExplicitObjectParameter.isNull() &&
7661 (!ExplicitObjectParameter->isReferenceType() ||
7662 !Context.hasSameType(ExplicitObjectParameter.getNonReferenceType(),
7663 Context.getRecordType(RD)))) {
7664 if (DeleteOnTypeMismatch)
7665 ShouldDeleteForTypeMismatch = true;
7666 else {
7667 Diag(MD->getLocation(),
7668 diag::err_defaulted_special_member_explicit_object_mismatch)
7669 << (CSM == CXXSpecialMemberKind::MoveAssignment) << RD
7670 << MD->getSourceRange();
7671 HadError = true;
7672 }
7673 }
7674 }
7675
7676 // Check for parameter type matching.
7677 QualType ArgType =
7678 ExpectedParams
7679 ? Type->getParamType(MD->isExplicitObjectMemberFunction() ? 1 : 0)
7680 : QualType();
7681 bool HasConstParam = false;
7682 if (ExpectedParams && ArgType->isReferenceType()) {
7683 // Argument must be reference to possibly-const T.
7684 QualType ReferentType = ArgType->getPointeeType();
7685 HasConstParam = ReferentType.isConstQualified();
7686
7687 if (ReferentType.isVolatileQualified()) {
7688 if (DeleteOnTypeMismatch)
7689 ShouldDeleteForTypeMismatch = true;
7690 else {
7691 Diag(MD->getLocation(),
7692 diag::err_defaulted_special_member_volatile_param)
7693 << llvm::to_underlying(CSM);
7694 HadError = true;
7695 }
7696 }
7697
7698 if (HasConstParam && !CanHaveConstParam) {
7699 if (DeleteOnTypeMismatch)
7700 ShouldDeleteForTypeMismatch = true;
7701 else if (CSM == CXXSpecialMemberKind::CopyConstructor ||
7703 Diag(MD->getLocation(),
7704 diag::err_defaulted_special_member_copy_const_param)
7706 // FIXME: Explain why this special member can't be const.
7707 HadError = true;
7708 } else {
7709 Diag(MD->getLocation(),
7710 diag::err_defaulted_special_member_move_const_param)
7712 HadError = true;
7713 }
7714 }
7715 } else if (ExpectedParams) {
7716 // A copy assignment operator can take its argument by value, but a
7717 // defaulted one cannot.
7719 "unexpected non-ref argument");
7720 Diag(MD->getLocation(), diag::err_defaulted_copy_assign_not_ref);
7721 HadError = true;
7722 }
7723
7724 // C++11 [dcl.fct.def.default]p2:
7725 // An explicitly-defaulted function may be declared constexpr only if it
7726 // would have been implicitly declared as constexpr,
7727 // Do not apply this rule to members of class templates, since core issue 1358
7728 // makes such functions always instantiate to constexpr functions. For
7729 // functions which cannot be constexpr (for non-constructors in C++11 and for
7730 // destructors in C++14 and C++17), this is checked elsewhere.
7731 //
7732 // FIXME: This should not apply if the member is deleted.
7733 bool Constexpr = defaultedSpecialMemberIsConstexpr(*this, RD, CSM,
7734 HasConstParam);
7735
7736 // C++14 [dcl.constexpr]p6 (CWG DR647/CWG DR1358):
7737 // If the instantiated template specialization of a constexpr function
7738 // template or member function of a class template would fail to satisfy
7739 // the requirements for a constexpr function or constexpr constructor, that
7740 // specialization is still a constexpr function or constexpr constructor,
7741 // even though a call to such a function cannot appear in a constant
7742 // expression.
7743 if (MD->isTemplateInstantiation() && MD->isConstexpr())
7744 Constexpr = true;
7745
7746 if ((getLangOpts().CPlusPlus20 ||
7747 (getLangOpts().CPlusPlus14 ? !isa<CXXDestructorDecl>(MD)
7748 : isa<CXXConstructorDecl>(MD))) &&
7749 MD->isConstexpr() && !Constexpr &&
7751 if (!MD->isConsteval() && RD->getNumVBases()) {
7752 Diag(MD->getBeginLoc(),
7753 diag::err_incorrect_defaulted_constexpr_with_vb)
7754 << llvm::to_underlying(CSM);
7755 for (const auto &I : RD->vbases())
7756 Diag(I.getBeginLoc(), diag::note_constexpr_virtual_base_here);
7757 } else {
7758 Diag(MD->getBeginLoc(), diag::err_incorrect_defaulted_constexpr)
7759 << llvm::to_underlying(CSM) << MD->isConsteval();
7760 }
7761 HadError = true;
7762 // FIXME: Explain why the special member can't be constexpr.
7763 }
7764
7765 if (First) {
7766 // C++2a [dcl.fct.def.default]p3:
7767 // If a function is explicitly defaulted on its first declaration, it is
7768 // implicitly considered to be constexpr if the implicit declaration
7769 // would be.
7774
7775 if (!Type->hasExceptionSpec()) {
7776 // C++2a [except.spec]p3:
7777 // If a declaration of a function does not have a noexcept-specifier
7778 // [and] is defaulted on its first declaration, [...] the exception
7779 // specification is as specified below
7780 FunctionProtoType::ExtProtoInfo EPI = Type->getExtProtoInfo();
7782 EPI.ExceptionSpec.SourceDecl = MD;
7783 MD->setType(
7784 Context.getFunctionType(ReturnType, Type->getParamTypes(), EPI));
7785 }
7786 }
7787
7788 if (ShouldDeleteForTypeMismatch || ShouldDeleteSpecialMember(MD, CSM)) {
7789 if (First) {
7790 SetDeclDeleted(MD, MD->getLocation());
7791 if (!inTemplateInstantiation() && !HadError) {
7792 Diag(MD->getLocation(), diag::warn_defaulted_method_deleted)
7793 << llvm::to_underlying(CSM);
7794 if (ShouldDeleteForTypeMismatch) {
7795 Diag(MD->getLocation(), diag::note_deleted_type_mismatch)
7796 << llvm::to_underlying(CSM);
7797 } else if (ShouldDeleteSpecialMember(MD, CSM, nullptr,
7798 /*Diagnose*/ true) &&
7799 DefaultLoc.isValid()) {
7800 Diag(DefaultLoc, diag::note_replace_equals_default_to_delete)
7801 << FixItHint::CreateReplacement(DefaultLoc, "delete");
7802 }
7803 }
7804 if (ShouldDeleteForTypeMismatch && !HadError) {
7805 Diag(MD->getLocation(),
7806 diag::warn_cxx17_compat_defaulted_method_type_mismatch)
7807 << llvm::to_underlying(CSM);
7808 }
7809 } else {
7810 // C++11 [dcl.fct.def.default]p4:
7811 // [For a] user-provided explicitly-defaulted function [...] if such a
7812 // function is implicitly defined as deleted, the program is ill-formed.
7813 Diag(MD->getLocation(), diag::err_out_of_line_default_deletes)
7814 << llvm::to_underlying(CSM);
7815 assert(!ShouldDeleteForTypeMismatch && "deleted non-first decl");
7816 ShouldDeleteSpecialMember(MD, CSM, nullptr, /*Diagnose*/true);
7817 HadError = true;
7818 }
7819 }
7820
7821 return HadError;
7822}
7823
7824namespace {
7825/// Helper class for building and checking a defaulted comparison.
7826///
7827/// Defaulted functions are built in two phases:
7828///
7829/// * First, the set of operations that the function will perform are
7830/// identified, and some of them are checked. If any of the checked
7831/// operations is invalid in certain ways, the comparison function is
7832/// defined as deleted and no body is built.
7833/// * Then, if the function is not defined as deleted, the body is built.
7834///
7835/// This is accomplished by performing two visitation steps over the eventual
7836/// body of the function.
7837template<typename Derived, typename ResultList, typename Result,
7838 typename Subobject>
7839class DefaultedComparisonVisitor {
7840public:
7841 using DefaultedComparisonKind = Sema::DefaultedComparisonKind;
7842
7843 DefaultedComparisonVisitor(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
7844 DefaultedComparisonKind DCK)
7845 : S(S), RD(RD), FD(FD), DCK(DCK) {
7846 if (auto *Info = FD->getDefalutedOrDeletedInfo()) {
7847 // FIXME: Change CreateOverloadedBinOp to take an ArrayRef instead of an
7848 // UnresolvedSet to avoid this copy.
7849 Fns.assign(Info->getUnqualifiedLookups().begin(),
7850 Info->getUnqualifiedLookups().end());
7851 }
7852 }
7853
7854 ResultList visit() {
7855 // The type of an lvalue naming a parameter of this function.
7856 QualType ParamLvalType =
7858
7859 ResultList Results;
7860
7861 switch (DCK) {
7862 case DefaultedComparisonKind::None:
7863 llvm_unreachable("not a defaulted comparison");
7864
7865 case DefaultedComparisonKind::Equal:
7866 case DefaultedComparisonKind::ThreeWay:
7867 getDerived().visitSubobjects(Results, RD, ParamLvalType.getQualifiers());
7868 return Results;
7869
7870 case DefaultedComparisonKind::NotEqual:
7871 case DefaultedComparisonKind::Relational:
7872 Results.add(getDerived().visitExpandedSubobject(
7873 ParamLvalType, getDerived().getCompleteObject()));
7874 return Results;
7875 }
7876 llvm_unreachable("");
7877 }
7878
7879protected:
7880 Derived &getDerived() { return static_cast<Derived&>(*this); }
7881
7882 /// Visit the expanded list of subobjects of the given type, as specified in
7883 /// C++2a [class.compare.default].
7884 ///
7885 /// \return \c true if the ResultList object said we're done, \c false if not.
7886 bool visitSubobjects(ResultList &Results, CXXRecordDecl *Record,
7887 Qualifiers Quals) {
7888 // C++2a [class.compare.default]p4:
7889 // The direct base class subobjects of C
7890 for (CXXBaseSpecifier &Base : Record->bases())
7891 if (Results.add(getDerived().visitSubobject(
7892 S.Context.getQualifiedType(Base.getType(), Quals),
7893 getDerived().getBase(&Base))))
7894 return true;
7895
7896 // followed by the non-static data members of C
7897 for (FieldDecl *Field : Record->fields()) {
7898 // C++23 [class.bit]p2:
7899 // Unnamed bit-fields are not members ...
7900 if (Field->isUnnamedBitField())
7901 continue;
7902 // Recursively expand anonymous structs.
7903 if (Field->isAnonymousStructOrUnion()) {
7904 if (visitSubobjects(Results, Field->getType()->getAsCXXRecordDecl(),
7905 Quals))
7906 return true;
7907 continue;
7908 }
7909
7910 // Figure out the type of an lvalue denoting this field.
7911 Qualifiers FieldQuals = Quals;
7912 if (Field->isMutable())
7913 FieldQuals.removeConst();
7914 QualType FieldType =
7915 S.Context.getQualifiedType(Field->getType(), FieldQuals);
7916
7917 if (Results.add(getDerived().visitSubobject(
7918 FieldType, getDerived().getField(Field))))
7919 return true;
7920 }
7921
7922 // form a list of subobjects.
7923 return false;
7924 }
7925
7926 Result visitSubobject(QualType Type, Subobject Subobj) {
7927 // In that list, any subobject of array type is recursively expanded
7928 const ArrayType *AT = S.Context.getAsArrayType(Type);
7929 if (auto *CAT = dyn_cast_or_null<ConstantArrayType>(AT))
7930 return getDerived().visitSubobjectArray(CAT->getElementType(),
7931 CAT->getSize(), Subobj);
7932 return getDerived().visitExpandedSubobject(Type, Subobj);
7933 }
7934
7935 Result visitSubobjectArray(QualType Type, const llvm::APInt &Size,
7936 Subobject Subobj) {
7937 return getDerived().visitSubobject(Type, Subobj);
7938 }
7939
7940protected:
7941 Sema &S;
7942 CXXRecordDecl *RD;
7943 FunctionDecl *FD;
7944 DefaultedComparisonKind DCK;
7946};
7947
7948/// Information about a defaulted comparison, as determined by
7949/// DefaultedComparisonAnalyzer.
7950struct DefaultedComparisonInfo {
7951 bool Deleted = false;
7952 bool Constexpr = true;
7953 ComparisonCategoryType Category = ComparisonCategoryType::StrongOrdering;
7954
7955 static DefaultedComparisonInfo deleted() {
7956 DefaultedComparisonInfo Deleted;
7957 Deleted.Deleted = true;
7958 return Deleted;
7959 }
7960
7961 bool add(const DefaultedComparisonInfo &R) {
7962 Deleted |= R.Deleted;
7963 Constexpr &= R.Constexpr;
7964 Category = commonComparisonType(Category, R.Category);
7965 return Deleted;
7966 }
7967};
7968
7969/// An element in the expanded list of subobjects of a defaulted comparison, as
7970/// specified in C++2a [class.compare.default]p4.
7971struct DefaultedComparisonSubobject {
7972 enum { CompleteObject, Member, Base } Kind;
7973 NamedDecl *Decl;
7975};
7976
7977/// A visitor over the notional body of a defaulted comparison that determines
7978/// whether that body would be deleted or constexpr.
7979class DefaultedComparisonAnalyzer
7980 : public DefaultedComparisonVisitor<DefaultedComparisonAnalyzer,
7981 DefaultedComparisonInfo,
7982 DefaultedComparisonInfo,
7983 DefaultedComparisonSubobject> {
7984public:
7985 enum DiagnosticKind { NoDiagnostics, ExplainDeleted, ExplainConstexpr };
7986
7987private:
7988 DiagnosticKind Diagnose;
7989
7990public:
7991 using Base = DefaultedComparisonVisitor;
7992 using Result = DefaultedComparisonInfo;
7993 using Subobject = DefaultedComparisonSubobject;
7994
7995 friend Base;
7996
7997 DefaultedComparisonAnalyzer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
7998 DefaultedComparisonKind DCK,
7999 DiagnosticKind Diagnose = NoDiagnostics)
8000 : Base(S, RD, FD, DCK), Diagnose(Diagnose) {}
8001
8002 Result visit() {
8003 if ((DCK == DefaultedComparisonKind::Equal ||
8004 DCK == DefaultedComparisonKind::ThreeWay) &&
8005 RD->hasVariantMembers()) {
8006 // C++2a [class.compare.default]p2 [P2002R0]:
8007 // A defaulted comparison operator function for class C is defined as
8008 // deleted if [...] C has variant members.
8009 if (Diagnose == ExplainDeleted) {
8010 S.Diag(FD->getLocation(), diag::note_defaulted_comparison_union)
8011 << FD << RD->isUnion() << RD;
8012 }
8013 return Result::deleted();
8014 }
8015
8016 return Base::visit();
8017 }
8018
8019private:
8020 Subobject getCompleteObject() {
8021 return Subobject{Subobject::CompleteObject, RD, FD->getLocation()};
8022 }
8023
8024 Subobject getBase(CXXBaseSpecifier *Base) {
8025 return Subobject{Subobject::Base, Base->getType()->getAsCXXRecordDecl(),
8026 Base->getBaseTypeLoc()};
8027 }
8028
8029 Subobject getField(FieldDecl *Field) {
8030 return Subobject{Subobject::Member, Field, Field->getLocation()};
8031 }
8032
8033 Result visitExpandedSubobject(QualType Type, Subobject Subobj) {
8034 // C++2a [class.compare.default]p2 [P2002R0]:
8035 // A defaulted <=> or == operator function for class C is defined as
8036 // deleted if any non-static data member of C is of reference type
8037 if (Type->isReferenceType()) {
8038 if (Diagnose == ExplainDeleted) {
8039 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_reference_member)
8040 << FD << RD;
8041 }
8042 return Result::deleted();
8043 }
8044
8045 // [...] Let xi be an lvalue denoting the ith element [...]
8047 Expr *Args[] = {&Xi, &Xi};
8048
8049 // All operators start by trying to apply that same operator recursively.
8051 assert(OO != OO_None && "not an overloaded operator!");
8052 return visitBinaryOperator(OO, Args, Subobj);
8053 }
8054
8055 Result
8056 visitBinaryOperator(OverloadedOperatorKind OO, ArrayRef<Expr *> Args,
8057 Subobject Subobj,
8058 OverloadCandidateSet *SpaceshipCandidates = nullptr) {
8059 // Note that there is no need to consider rewritten candidates here if
8060 // we've already found there is no viable 'operator<=>' candidate (and are
8061 // considering synthesizing a '<=>' from '==' and '<').
8062 OverloadCandidateSet CandidateSet(
8065 OO, FD->getLocation(),
8066 /*AllowRewrittenCandidates=*/!SpaceshipCandidates));
8067
8068 /// C++2a [class.compare.default]p1 [P2002R0]:
8069 /// [...] the defaulted function itself is never a candidate for overload
8070 /// resolution [...]
8071 CandidateSet.exclude(FD);
8072
8073 if (Args[0]->getType()->isOverloadableType())
8074 S.LookupOverloadedBinOp(CandidateSet, OO, Fns, Args);
8075 else
8076 // FIXME: We determine whether this is a valid expression by checking to
8077 // see if there's a viable builtin operator candidate for it. That isn't
8078 // really what the rules ask us to do, but should give the right results.
8079 S.AddBuiltinOperatorCandidates(OO, FD->getLocation(), Args, CandidateSet);
8080
8081 Result R;
8082
8084 switch (CandidateSet.BestViableFunction(S, FD->getLocation(), Best)) {
8085 case OR_Success: {
8086 // C++2a [class.compare.secondary]p2 [P2002R0]:
8087 // The operator function [...] is defined as deleted if [...] the
8088 // candidate selected by overload resolution is not a rewritten
8089 // candidate.
8090 if ((DCK == DefaultedComparisonKind::NotEqual ||
8091 DCK == DefaultedComparisonKind::Relational) &&
8092 !Best->RewriteKind) {
8093 if (Diagnose == ExplainDeleted) {
8094 if (Best->Function) {
8095 S.Diag(Best->Function->getLocation(),
8096 diag::note_defaulted_comparison_not_rewritten_callee)
8097 << FD;
8098 } else {
8099 assert(Best->Conversions.size() == 2 &&
8100 Best->Conversions[0].isUserDefined() &&
8101 "non-user-defined conversion from class to built-in "
8102 "comparison");
8103 S.Diag(Best->Conversions[0]
8104 .UserDefined.FoundConversionFunction.getDecl()
8105 ->getLocation(),
8106 diag::note_defaulted_comparison_not_rewritten_conversion)
8107 << FD;
8108 }
8109 }
8110 return Result::deleted();
8111 }
8112
8113 // Throughout C++2a [class.compare]: if overload resolution does not
8114 // result in a usable function, the candidate function is defined as
8115 // deleted. This requires that we selected an accessible function.
8116 //
8117 // Note that this only considers the access of the function when named
8118 // within the type of the subobject, and not the access path for any
8119 // derived-to-base conversion.
8120 CXXRecordDecl *ArgClass = Args[0]->getType()->getAsCXXRecordDecl();
8121 if (ArgClass && Best->FoundDecl.getDecl() &&
8122 Best->FoundDecl.getDecl()->isCXXClassMember()) {
8123 QualType ObjectType = Subobj.Kind == Subobject::Member
8124 ? Args[0]->getType()
8125 : S.Context.getRecordType(RD);
8127 ArgClass, Best->FoundDecl, ObjectType, Subobj.Loc,
8128 Diagnose == ExplainDeleted
8129 ? S.PDiag(diag::note_defaulted_comparison_inaccessible)
8130 << FD << Subobj.Kind << Subobj.Decl
8131 : S.PDiag()))
8132 return Result::deleted();
8133 }
8134
8135 bool NeedsDeducing =
8136 OO == OO_Spaceship && FD->getReturnType()->isUndeducedAutoType();
8137
8138 if (FunctionDecl *BestFD = Best->Function) {
8139 // C++2a [class.compare.default]p3 [P2002R0]:
8140 // A defaulted comparison function is constexpr-compatible if
8141 // [...] no overlod resolution performed [...] results in a
8142 // non-constexpr function.
8143 assert(!BestFD->isDeleted() && "wrong overload resolution result");
8144 // If it's not constexpr, explain why not.
8145 if (Diagnose == ExplainConstexpr && !BestFD->isConstexpr()) {
8146 if (Subobj.Kind != Subobject::CompleteObject)
8147 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_not_constexpr)
8148 << Subobj.Kind << Subobj.Decl;
8149 S.Diag(BestFD->getLocation(),
8150 diag::note_defaulted_comparison_not_constexpr_here);
8151 // Bail out after explaining; we don't want any more notes.
8152 return Result::deleted();
8153 }
8154 R.Constexpr &= BestFD->isConstexpr();
8155
8156 if (NeedsDeducing) {
8157 // If any callee has an undeduced return type, deduce it now.
8158 // FIXME: It's not clear how a failure here should be handled. For
8159 // now, we produce an eager diagnostic, because that is forward
8160 // compatible with most (all?) other reasonable options.
8161 if (BestFD->getReturnType()->isUndeducedType() &&
8162 S.DeduceReturnType(BestFD, FD->getLocation(),
8163 /*Diagnose=*/false)) {
8164 // Don't produce a duplicate error when asked to explain why the
8165 // comparison is deleted: we diagnosed that when initially checking
8166 // the defaulted operator.
8167 if (Diagnose == NoDiagnostics) {
8168 S.Diag(
8169 FD->getLocation(),
8170 diag::err_defaulted_comparison_cannot_deduce_undeduced_auto)
8171 << Subobj.Kind << Subobj.Decl;
8172 S.Diag(
8173 Subobj.Loc,
8174 diag::note_defaulted_comparison_cannot_deduce_undeduced_auto)
8175 << Subobj.Kind << Subobj.Decl;
8176 S.Diag(BestFD->getLocation(),
8177 diag::note_defaulted_comparison_cannot_deduce_callee)
8178 << Subobj.Kind << Subobj.Decl;
8179 }
8180 return Result::deleted();
8181 }
8183 BestFD->getCallResultType());
8184 if (!Info) {
8185 if (Diagnose == ExplainDeleted) {
8186 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_cannot_deduce)
8187 << Subobj.Kind << Subobj.Decl
8188 << BestFD->getCallResultType().withoutLocalFastQualifiers();
8189 S.Diag(BestFD->getLocation(),
8190 diag::note_defaulted_comparison_cannot_deduce_callee)
8191 << Subobj.Kind << Subobj.Decl;
8192 }
8193 return Result::deleted();
8194 }
8195 R.Category = Info->Kind;
8196 }
8197 } else {
8198 QualType T = Best->BuiltinParamTypes[0];
8199 assert(T == Best->BuiltinParamTypes[1] &&
8200 "builtin comparison for different types?");
8201 assert(Best->BuiltinParamTypes[2].isNull() &&
8202 "invalid builtin comparison");
8203
8204 if (NeedsDeducing) {
8205 std::optional<ComparisonCategoryType> Cat =
8207 assert(Cat && "no category for builtin comparison?");
8208 R.Category = *Cat;
8209 }
8210 }
8211
8212 // Note that we might be rewriting to a different operator. That call is
8213 // not considered until we come to actually build the comparison function.
8214 break;
8215 }
8216
8217 case OR_Ambiguous:
8218 if (Diagnose == ExplainDeleted) {
8219 unsigned Kind = 0;
8220 if (FD->getOverloadedOperator() == OO_Spaceship && OO != OO_Spaceship)
8221 Kind = OO == OO_EqualEqual ? 1 : 2;
8222 CandidateSet.NoteCandidates(
8224 Subobj.Loc, S.PDiag(diag::note_defaulted_comparison_ambiguous)
8225 << FD << Kind << Subobj.Kind << Subobj.Decl),
8226 S, OCD_AmbiguousCandidates, Args);
8227 }
8228 R = Result::deleted();
8229 break;
8230
8231 case OR_Deleted:
8232 if (Diagnose == ExplainDeleted) {
8233 if ((DCK == DefaultedComparisonKind::NotEqual ||
8234 DCK == DefaultedComparisonKind::Relational) &&
8235 !Best->RewriteKind) {
8236 S.Diag(Best->Function->getLocation(),
8237 diag::note_defaulted_comparison_not_rewritten_callee)
8238 << FD;
8239 } else {
8240 S.Diag(Subobj.Loc,
8241 diag::note_defaulted_comparison_calls_deleted)
8242 << FD << Subobj.Kind << Subobj.Decl;
8243 S.NoteDeletedFunction(Best->Function);
8244 }
8245 }
8246 R = Result::deleted();
8247 break;
8248
8250 // If there's no usable candidate, we're done unless we can rewrite a
8251 // '<=>' in terms of '==' and '<'.
8252 if (OO == OO_Spaceship &&
8254 // For any kind of comparison category return type, we need a usable
8255 // '==' and a usable '<'.
8256 if (!R.add(visitBinaryOperator(OO_EqualEqual, Args, Subobj,
8257 &CandidateSet)))
8258 R.add(visitBinaryOperator(OO_Less, Args, Subobj, &CandidateSet));
8259 break;
8260 }
8261
8262 if (Diagnose == ExplainDeleted) {
8263 S.Diag(Subobj.Loc, diag::note_defaulted_comparison_no_viable_function)
8264 << FD << (OO == OO_EqualEqual || OO == OO_ExclaimEqual)
8265 << Subobj.Kind << Subobj.Decl;
8266
8267 // For a three-way comparison, list both the candidates for the
8268 // original operator and the candidates for the synthesized operator.
8269 if (SpaceshipCandidates) {
8270 SpaceshipCandidates->NoteCandidates(
8271 S, Args,
8272 SpaceshipCandidates->CompleteCandidates(S, OCD_AllCandidates,
8273 Args, FD->getLocation()));
8274 S.Diag(Subobj.Loc,
8275 diag::note_defaulted_comparison_no_viable_function_synthesized)
8276 << (OO == OO_EqualEqual ? 0 : 1);
8277 }
8278
8279 CandidateSet.NoteCandidates(
8280 S, Args,
8281 CandidateSet.CompleteCandidates(S, OCD_AllCandidates, Args,
8282 FD->getLocation()));
8283 }
8284 R = Result::deleted();
8285 break;
8286 }
8287
8288 return R;
8289 }
8290};
8291
8292/// A list of statements.
8293struct StmtListResult {
8294 bool IsInvalid = false;
8296
8297 bool add(const StmtResult &S) {
8298 IsInvalid |= S.isInvalid();
8299 if (IsInvalid)
8300 return true;
8301 Stmts.push_back(S.get());
8302 return false;
8303 }
8304};
8305
8306/// A visitor over the notional body of a defaulted comparison that synthesizes
8307/// the actual body.
8308class DefaultedComparisonSynthesizer
8309 : public DefaultedComparisonVisitor<DefaultedComparisonSynthesizer,
8310 StmtListResult, StmtResult,
8311 std::pair<ExprResult, ExprResult>> {
8313 unsigned ArrayDepth = 0;
8314
8315public:
8316 using Base = DefaultedComparisonVisitor;
8317 using ExprPair = std::pair<ExprResult, ExprResult>;
8318
8319 friend Base;
8320
8321 DefaultedComparisonSynthesizer(Sema &S, CXXRecordDecl *RD, FunctionDecl *FD,
8322 DefaultedComparisonKind DCK,
8323 SourceLocation BodyLoc)
8324 : Base(S, RD, FD, DCK), Loc(BodyLoc) {}
8325
8326 /// Build a suitable function body for this defaulted comparison operator.
8327 StmtResult build() {
8328 Sema::CompoundScopeRAII CompoundScope(S);
8329
8330 StmtListResult Stmts = visit();
8331 if (Stmts.IsInvalid)
8332 return StmtError();
8333
8334 ExprResult RetVal;
8335 switch (DCK) {
8336 case DefaultedComparisonKind::None:
8337 llvm_unreachable("not a defaulted comparison");
8338
8339 case DefaultedComparisonKind::Equal: {
8340 // C++2a [class.eq]p3:
8341 // [...] compar[e] the corresponding elements [...] until the first
8342 // index i where xi == yi yields [...] false. If no such index exists,
8343 // V is true. Otherwise, V is false.
8344 //
8345 // Join the comparisons with '&&'s and return the result. Use a right
8346 // fold (traversing the conditions right-to-left), because that
8347 // short-circuits more naturally.
8348 auto OldStmts = std::move(Stmts.Stmts);
8349 Stmts.Stmts.clear();
8350 ExprResult CmpSoFar;
8351 // Finish a particular comparison chain.
8352 auto FinishCmp = [&] {
8353 if (Expr *Prior = CmpSoFar.get()) {
8354 // Convert the last expression to 'return ...;'
8355 if (RetVal.isUnset() && Stmts.Stmts.empty())
8356 RetVal = CmpSoFar;
8357 // Convert any prior comparison to 'if (!(...)) return false;'
8358 else if (Stmts.add(buildIfNotCondReturnFalse(Prior)))
8359 return true;
8360 CmpSoFar = ExprResult();
8361 }
8362 return false;
8363 };
8364 for (Stmt *EAsStmt : llvm::reverse(OldStmts)) {
8365 Expr *E = dyn_cast<Expr>(EAsStmt);
8366 if (!E) {
8367 // Found an array comparison.
8368 if (FinishCmp() || Stmts.add(EAsStmt))
8369 return StmtError();
8370 continue;
8371 }
8372
8373 if (CmpSoFar.isUnset()) {
8374 CmpSoFar = E;
8375 continue;
8376 }
8377 CmpSoFar = S.CreateBuiltinBinOp(Loc, BO_LAnd, E, CmpSoFar.get());
8378 if (CmpSoFar.isInvalid())
8379 return StmtError();
8380 }
8381 if (FinishCmp())
8382 return StmtError();
8383 std::reverse(Stmts.Stmts.begin(), Stmts.Stmts.end());
8384 // If no such index exists, V is true.
8385 if (RetVal.isUnset())
8386 RetVal = S.ActOnCXXBoolLiteral(Loc, tok::kw_true);
8387 break;
8388 }
8389
8390 case DefaultedComparisonKind::ThreeWay: {
8391 // Per C++2a [class.spaceship]p3, as a fallback add:
8392 // return static_cast<R>(std::strong_ordering::equal);
8394 ComparisonCategoryType::StrongOrdering, Loc,
8395 Sema::ComparisonCategoryUsage::DefaultedOperator);
8396 if (StrongOrdering.isNull())
8397 return StmtError();
8399 .getValueInfo(ComparisonCategoryResult::Equal)
8400 ->VD;
8401 RetVal = getDecl(EqualVD);
8402 if (RetVal.isInvalid())
8403 return StmtError();
8404 RetVal = buildStaticCastToR(RetVal.get());
8405 break;
8406 }
8407
8408 case DefaultedComparisonKind::NotEqual:
8409 case DefaultedComparisonKind::Relational:
8410 RetVal = cast<Expr>(Stmts.Stmts.pop_back_val());
8411 break;
8412 }
8413
8414 // Build the final return statement.
8415 if (RetVal.isInvalid())
8416 return StmtError();
8418 if (ReturnStmt.isInvalid())
8419 return StmtError();
8420 Stmts.Stmts.push_back(ReturnStmt.get());
8421
8422 return S.ActOnCompoundStmt(Loc, Loc, Stmts.Stmts, /*IsStmtExpr=*/false);
8423 }
8424
8425private:
8426 ExprResult getDecl(ValueDecl *VD) {
8427 return S.BuildDeclarationNameExpr(
8429 }
8430
8431 ExprResult getParam(unsigned I) {
8432 ParmVarDecl *PD = FD->getParamDecl(I);
8433 return getDecl(PD);
8434 }
8435
8436 ExprPair getCompleteObject() {
8437 unsigned Param = 0;
8438 ExprResult LHS;
8439 if (const auto *MD = dyn_cast<CXXMethodDecl>(FD);
8440 MD && MD->isImplicitObjectMemberFunction()) {
8441 // LHS is '*this'.
8442 LHS = S.ActOnCXXThis(Loc);
8443 if (!LHS.isInvalid())
8444 LHS = S.CreateBuiltinUnaryOp(Loc, UO_Deref, LHS.get());
8445 } else {
8446 LHS = getParam(Param++);
8447 }
8448 ExprResult RHS = getParam(Param++);
8449 assert(Param == FD->getNumParams());
8450 return {LHS, RHS};
8451 }
8452
8453 ExprPair getBase(CXXBaseSpecifier *Base) {
8454 ExprPair Obj = getCompleteObject();
8455 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8456 return {ExprError(), ExprError()};
8457 CXXCastPath Path = {Base};
8458 const auto CastToBase = [&](Expr *E) {
8460 Base->getType(), E->getType().getQualifiers());
8461 return S.ImpCastExprToType(E, ToType, CK_DerivedToBase, VK_LValue, &Path);
8462 };
8463 return {CastToBase(Obj.first.get()), CastToBase(Obj.second.get())};
8464 }
8465
8466 ExprPair getField(FieldDecl *Field) {
8467 ExprPair Obj = getCompleteObject();
8468 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8469 return {ExprError(), ExprError()};
8470
8471 DeclAccessPair Found = DeclAccessPair::make(Field, Field->getAccess());
8472 DeclarationNameInfo NameInfo(Field->getDeclName(), Loc);
8473 return {S.BuildFieldReferenceExpr(Obj.first.get(), /*IsArrow=*/false, Loc,
8474 CXXScopeSpec(), Field, Found, NameInfo),
8475 S.BuildFieldReferenceExpr(Obj.second.get(), /*IsArrow=*/false, Loc,
8476 CXXScopeSpec(), Field, Found, NameInfo)};
8477 }
8478
8479 // FIXME: When expanding a subobject, register a note in the code synthesis
8480 // stack to say which subobject we're comparing.
8481
8482 StmtResult buildIfNotCondReturnFalse(ExprResult Cond) {
8483 if (Cond.isInvalid())
8484 return StmtError();
8485
8486 ExprResult NotCond = S.CreateBuiltinUnaryOp(Loc, UO_LNot, Cond.get());
8487 if (NotCond.isInvalid())
8488 return StmtError();
8489
8490 ExprResult False = S.ActOnCXXBoolLiteral(Loc, tok::kw_false);
8491 assert(!False.isInvalid() && "should never fail");
8492 StmtResult ReturnFalse = S.BuildReturnStmt(Loc, False.get());
8493 if (ReturnFalse.isInvalid())
8494 return StmtError();
8495
8496 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, nullptr,
8497 S.ActOnCondition(nullptr, Loc, NotCond.get(),
8498 Sema::ConditionKind::Boolean),
8499 Loc, ReturnFalse.get(), SourceLocation(), nullptr);
8500 }
8501
8502 StmtResult visitSubobjectArray(QualType Type, llvm::APInt Size,
8503 ExprPair Subobj) {
8504 QualType SizeType = S.Context.getSizeType();
8505 Size = Size.zextOrTrunc(S.Context.getTypeSize(SizeType));
8506
8507 // Build 'size_t i$n = 0'.
8508 IdentifierInfo *IterationVarName = nullptr;
8509 {
8510 SmallString<8> Str;
8511 llvm::raw_svector_ostream OS(Str);
8512 OS << "i" << ArrayDepth;
8513 IterationVarName = &S.Context.Idents.get(OS.str());
8514 }
8515 VarDecl *IterationVar = VarDecl::Create(
8516 S.Context, S.CurContext, Loc, Loc, IterationVarName, SizeType,
8518 llvm::APInt Zero(S.Context.getTypeSize(SizeType), 0);
8519 IterationVar->setInit(
8520 IntegerLiteral::Create(S.Context, Zero, SizeType, Loc));
8521 Stmt *Init = new (S.Context) DeclStmt(DeclGroupRef(IterationVar), Loc, Loc);
8522
8523 auto IterRef = [&] {
8525 CXXScopeSpec(), DeclarationNameInfo(IterationVarName, Loc),
8526 IterationVar);
8527 assert(!Ref.isInvalid() && "can't reference our own variable?");
8528 return Ref.get();
8529 };
8530
8531 // Build 'i$n != Size'.
8533 Loc, BO_NE, IterRef(),
8534 IntegerLiteral::Create(S.Context, Size, SizeType, Loc));
8535 assert(!Cond.isInvalid() && "should never fail");
8536
8537 // Build '++i$n'.
8538 ExprResult Inc = S.CreateBuiltinUnaryOp(Loc, UO_PreInc, IterRef());
8539 assert(!Inc.isInvalid() && "should never fail");
8540
8541 // Build 'a[i$n]' and 'b[i$n]'.
8542 auto Index = [&](ExprResult E) {
8543 if (E.isInvalid())
8544 return ExprError();
8545 return S.CreateBuiltinArraySubscriptExpr(E.get(), Loc, IterRef(), Loc);
8546 };
8547 Subobj.first = Index(Subobj.first);
8548 Subobj.second = Index(Subobj.second);
8549
8550 // Compare the array elements.
8551 ++ArrayDepth;
8552 StmtResult Substmt = visitSubobject(Type, Subobj);
8553 --ArrayDepth;
8554
8555 if (Substmt.isInvalid())
8556 return StmtError();
8557
8558 // For the inner level of an 'operator==', build 'if (!cmp) return false;'.
8559 // For outer levels or for an 'operator<=>' we already have a suitable
8560 // statement that returns as necessary.
8561 if (Expr *ElemCmp = dyn_cast<Expr>(Substmt.get())) {
8562 assert(DCK == DefaultedComparisonKind::Equal &&
8563 "should have non-expression statement");
8564 Substmt = buildIfNotCondReturnFalse(ElemCmp);
8565 if (Substmt.isInvalid())
8566 return StmtError();
8567 }
8568
8569 // Build 'for (...) ...'
8570 return S.ActOnForStmt(Loc, Loc, Init,
8571 S.ActOnCondition(nullptr, Loc, Cond.get(),
8572 Sema::ConditionKind::Boolean),
8574 Substmt.get());
8575 }
8576
8577 StmtResult visitExpandedSubobject(QualType Type, ExprPair Obj) {
8578 if (Obj.first.isInvalid() || Obj.second.isInvalid())
8579 return StmtError();
8580
8583 ExprResult Op;
8584 if (Type->isOverloadableType())
8585 Op = S.CreateOverloadedBinOp(Loc, Opc, Fns, Obj.first.get(),
8586 Obj.second.get(), /*PerformADL=*/true,
8587 /*AllowRewrittenCandidates=*/true, FD);
8588 else
8589 Op = S.CreateBuiltinBinOp(Loc, Opc, Obj.first.get(), Obj.second.get());
8590 if (Op.isInvalid())
8591 return StmtError();
8592
8593 switch (DCK) {
8594 case DefaultedComparisonKind::None:
8595 llvm_unreachable("not a defaulted comparison");
8596
8597 case DefaultedComparisonKind::Equal:
8598 // Per C++2a [class.eq]p2, each comparison is individually contextually
8599 // converted to bool.
8601 if (Op.isInvalid())
8602 return StmtError();
8603 return Op.get();
8604
8605 case DefaultedComparisonKind::ThreeWay: {
8606 // Per C++2a [class.spaceship]p3, form:
8607 // if (R cmp = static_cast<R>(op); cmp != 0)
8608 // return cmp;
8609 QualType R = FD->getReturnType();
8610 Op = buildStaticCastToR(Op.get());
8611 if (Op.isInvalid())
8612 return StmtError();
8613
8614 // R cmp = ...;
8615 IdentifierInfo *Name = &S.Context.Idents.get("cmp");
8616 VarDecl *VD =
8617 VarDecl::Create(S.Context, S.CurContext, Loc, Loc, Name, R,
8619 S.AddInitializerToDecl(VD, Op.get(), /*DirectInit=*/false);
8620 Stmt *InitStmt = new (S.Context) DeclStmt(DeclGroupRef(VD), Loc, Loc);
8621
8622 // cmp != 0
8623 ExprResult VDRef = getDecl(VD);
8624 if (VDRef.isInvalid())
8625 return StmtError();
8626 llvm::APInt ZeroVal(S.Context.getIntWidth(S.Context.IntTy), 0);
8627 Expr *Zero =
8630 if (VDRef.get()->getType()->isOverloadableType())
8631 Comp = S.CreateOverloadedBinOp(Loc, BO_NE, Fns, VDRef.get(), Zero, true,
8632 true, FD);
8633 else
8634 Comp = S.CreateBuiltinBinOp(Loc, BO_NE, VDRef.get(), Zero);
8635 if (Comp.isInvalid())
8636 return StmtError();
8638 nullptr, Loc, Comp.get(), Sema::ConditionKind::Boolean);
8639 if (Cond.isInvalid())
8640 return StmtError();
8641
8642 // return cmp;
8643 VDRef = getDecl(VD);
8644 if (VDRef.isInvalid())
8645 return StmtError();
8647 if (ReturnStmt.isInvalid())
8648 return StmtError();
8649
8650 // if (...)
8651 return S.ActOnIfStmt(Loc, IfStatementKind::Ordinary, Loc, InitStmt, Cond,
8652 Loc, ReturnStmt.get(),
8653 /*ElseLoc=*/SourceLocation(), /*Else=*/nullptr);
8654 }
8655
8656 case DefaultedComparisonKind::NotEqual:
8657 case DefaultedComparisonKind::Relational:
8658 // C++2a [class.compare.secondary]p2:
8659 // Otherwise, the operator function yields x @ y.
8660 return Op.get();
8661 }
8662 llvm_unreachable("");
8663 }
8664
8665 /// Build "static_cast<R>(E)".
8666 ExprResult buildStaticCastToR(Expr *E) {
8667 QualType R = FD->getReturnType();
8668 assert(!R->isUndeducedType() && "type should have been deduced already");
8669
8670 // Don't bother forming a no-op cast in the common case.
8671 if (E->isPRValue() && S.Context.hasSameType(E->getType(), R))
8672 return E;
8673 return S.BuildCXXNamedCast(Loc, tok::kw_static_cast,
8676 }
8677};
8678}
8679
8680/// Perform the unqualified lookups that might be needed to form a defaulted
8681/// comparison function for the given operator.
8683 UnresolvedSetImpl &Operators,
8685 auto Lookup = [&](OverloadedOperatorKind OO) {
8686 Self.LookupOverloadedOperatorName(OO, S, Operators);
8687 };
8688
8689 // Every defaulted operator looks up itself.
8690 Lookup(Op);
8691 // ... and the rewritten form of itself, if any.
8693 Lookup(ExtraOp);
8694
8695 // For 'operator<=>', we also form a 'cmp != 0' expression, and might
8696 // synthesize a three-way comparison from '<' and '=='. In a dependent
8697 // context, we also need to look up '==' in case we implicitly declare a
8698 // defaulted 'operator=='.
8699 if (Op == OO_Spaceship) {
8700 Lookup(OO_ExclaimEqual);
8701 Lookup(OO_Less);
8702 Lookup(OO_EqualEqual);
8703 }
8704}
8705
8708 assert(DCK != DefaultedComparisonKind::None && "not a defaulted comparison");
8709
8710 // Perform any unqualified lookups we're going to need to default this
8711 // function.
8712 if (S) {
8713 UnresolvedSet<32> Operators;
8714 lookupOperatorsForDefaultedComparison(*this, S, Operators,
8715 FD->getOverloadedOperator());
8718 Context, Operators.pairs()));
8719 }
8720
8721 // C++2a [class.compare.default]p1:
8722 // A defaulted comparison operator function for some class C shall be a
8723 // non-template function declared in the member-specification of C that is
8724 // -- a non-static const non-volatile member of C having one parameter of
8725 // type const C& and either no ref-qualifier or the ref-qualifier &, or
8726 // -- a friend of C having two parameters of type const C& or two
8727 // parameters of type C.
8728
8729 CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalDeclContext());
8730 bool IsMethod = isa<CXXMethodDecl>(FD);
8731 if (IsMethod) {
8732 auto *MD = cast<CXXMethodDecl>(FD);
8733 assert(!MD->isStatic() && "comparison function cannot be a static member");
8734
8735 if (MD->getRefQualifier() == RQ_RValue) {
8736 Diag(MD->getLocation(), diag::err_ref_qualifier_comparison_operator);
8737
8738 // Remove the ref qualifier to recover.
8739 const auto *FPT = MD->getType()->castAs<FunctionProtoType>();
8740 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
8741 EPI.RefQualifier = RQ_None;
8742 MD->setType(Context.getFunctionType(FPT->getReturnType(),
8743 FPT->getParamTypes(), EPI));
8744 }
8745
8746 // If we're out-of-class, this is the class we're comparing.
8747 if (!RD)
8748 RD = MD->getParent();
8750 if (!T.getNonReferenceType().isConstQualified() &&
8752 SourceLocation Loc, InsertLoc;
8754 Loc = MD->getParamDecl(0)->getBeginLoc();
8755 InsertLoc = getLocForEndOfToken(
8757 } else {
8758 Loc = MD->getLocation();
8760 InsertLoc = Loc.getRParenLoc();
8761 }
8762 // Don't diagnose an implicit 'operator=='; we will have diagnosed the
8763 // corresponding defaulted 'operator<=>' already.
8764 if (!MD->isImplicit()) {
8765 Diag(Loc, diag::err_defaulted_comparison_non_const)
8766 << (int)DCK << FixItHint::CreateInsertion(InsertLoc, " const");
8767 }
8768
8769 // Add the 'const' to the type to recover.
8771 assert(T->isLValueReferenceType());
8773 T.getNonReferenceType().withConst()));
8774 } else {
8775 const auto *FPT = MD->getType()->castAs<FunctionProtoType>();
8776 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
8777 EPI.TypeQuals.addConst();
8778 MD->setType(Context.getFunctionType(FPT->getReturnType(),
8779 FPT->getParamTypes(), EPI));
8780 }
8781 }
8782
8783 if (MD->isVolatile()) {
8784 Diag(MD->getLocation(), diag::err_volatile_comparison_operator);
8785
8786 // Remove the 'volatile' from the type to recover.
8787 const auto *FPT = MD->getType()->castAs<FunctionProtoType>();
8788 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
8790 MD->setType(Context.getFunctionType(FPT->getReturnType(),
8791 FPT->getParamTypes(), EPI));
8792 }
8793 }
8794
8795 if ((FD->getNumParams() -
8796 (unsigned)FD->hasCXXExplicitFunctionObjectParameter()) !=
8797 (IsMethod ? 1 : 2)) {
8798 // Let's not worry about using a variadic template pack here -- who would do
8799 // such a thing?
8800 Diag(FD->getLocation(), diag::err_defaulted_comparison_num_args)
8801 << int(IsMethod) << int(DCK);
8802 return true;
8803 }
8804
8805 const ParmVarDecl *KnownParm = nullptr;
8806 for (const ParmVarDecl *Param : FD->parameters()) {
8807 QualType ParmTy = Param->getType();
8808 if (!KnownParm) {
8809 auto CTy = ParmTy;
8810 // Is it `T const &`?
8811 bool Ok = !IsMethod || FD->hasCXXExplicitFunctionObjectParameter();
8812 QualType ExpectedTy;
8813 if (RD)
8814 ExpectedTy = Context.getRecordType(RD);
8815 if (auto *Ref = CTy->getAs<LValueReferenceType>()) {
8816 CTy = Ref->getPointeeType();
8817 if (RD)
8818 ExpectedTy.addConst();
8819 Ok = true;
8820 }
8821
8822 // Is T a class?
8823 if (RD) {
8824 Ok &= RD->isDependentType() || Context.hasSameType(CTy, ExpectedTy);
8825 } else {
8826 RD = CTy->getAsCXXRecordDecl();
8827 Ok &= RD != nullptr;
8828 }
8829
8830 if (Ok) {
8831 KnownParm = Param;
8832 } else {
8833 // Don't diagnose an implicit 'operator=='; we will have diagnosed the
8834 // corresponding defaulted 'operator<=>' already.
8835 if (!FD->isImplicit()) {
8836 if (RD) {
8837 QualType PlainTy = Context.getRecordType(RD);
8838 QualType RefTy =
8840 Diag(FD->getLocation(), diag::err_defaulted_comparison_param)
8841 << int(DCK) << ParmTy << RefTy << int(!IsMethod) << PlainTy
8842 << Param->getSourceRange();
8843 } else {
8844 assert(!IsMethod && "should know expected type for method");
8845 Diag(FD->getLocation(),
8846 diag::err_defaulted_comparison_param_unknown)
8847 << int(DCK) << ParmTy << Param->getSourceRange();
8848 }
8849 }
8850 return true;
8851 }
8852 } else if (!Context.hasSameType(KnownParm->getType(), ParmTy)) {
8853 Diag(FD->getLocation(), diag::err_defaulted_comparison_param_mismatch)
8854 << int(DCK) << KnownParm->getType() << KnownParm->getSourceRange()
8855 << ParmTy << Param->getSourceRange();
8856 return true;
8857 }
8858 }
8859
8860 assert(RD && "must have determined class");
8861 if (IsMethod) {
8862 } else if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
8863 // In-class, must be a friend decl.
8864 assert(FD->getFriendObjectKind() && "expected a friend declaration");
8865 } else {
8866 // Out of class, require the defaulted comparison to be a friend (of a
8867 // complete type, per CWG2547).
8869 diag::err_defaulted_comparison_not_friend, int(DCK),
8870 int(1)))
8871 return true;
8872
8873 if (llvm::none_of(RD->friends(), [&](const FriendDecl *F) {
8874 return FD->getCanonicalDecl() ==
8875 F->getFriendDecl()->getCanonicalDecl();
8876 })) {
8877 Diag(FD->getLocation(), diag::err_defaulted_comparison_not_friend)
8878 << int(DCK) << int(0) << RD;
8879 Diag(RD->getCanonicalDecl()->getLocation(), diag::note_declared_at);
8880 return true;
8881 }
8882 }
8883
8884 // C++2a [class.eq]p1, [class.rel]p1:
8885 // A [defaulted comparison other than <=>] shall have a declared return
8886 // type bool.
8890 Diag(FD->getLocation(), diag::err_defaulted_comparison_return_type_not_bool)
8891 << (int)DCK << FD->getDeclaredReturnType() << Context.BoolTy
8892 << FD->getReturnTypeSourceRange();
8893 return true;
8894 }
8895 // C++2a [class.spaceship]p2 [P2002R0]:
8896 // Let R be the declared return type [...]. If R is auto, [...]. Otherwise,
8897 // R shall not contain a placeholder type.
8898 if (QualType RT = FD->getDeclaredReturnType();
8900 RT->getContainedDeducedType() &&
8902 RT->getContainedAutoType()->isConstrained())) {
8903 Diag(FD->getLocation(),
8904 diag::err_defaulted_comparison_deduced_return_type_not_auto)
8905 << (int)DCK << FD->getDeclaredReturnType() << Context.AutoDeductTy
8906 << FD->getReturnTypeSourceRange();
8907 return true;
8908 }
8909
8910 // For a defaulted function in a dependent class, defer all remaining checks
8911 // until instantiation.
8912 if (RD->isDependentType())
8913 return false;
8914
8915 // Determine whether the function should be defined as deleted.
8916 DefaultedComparisonInfo Info =
8917 DefaultedComparisonAnalyzer(*this, RD, FD, DCK).visit();
8918
8919 bool First = FD == FD->getCanonicalDecl();
8920
8921 if (!First) {
8922 if (Info.Deleted) {
8923 // C++11 [dcl.fct.def.default]p4:
8924 // [For a] user-provided explicitly-defaulted function [...] if such a
8925 // function is implicitly defined as deleted, the program is ill-formed.
8926 //
8927 // This is really just a consequence of the general rule that you can
8928 // only delete a function on its first declaration.
8929 Diag(FD->getLocation(), diag::err_non_first_default_compare_deletes)
8930 << FD->isImplicit() << (int)DCK;
8931 DefaultedComparisonAnalyzer(*this, RD, FD, DCK,
8932 DefaultedComparisonAnalyzer::ExplainDeleted)
8933 .visit();
8934 return true;
8935 }
8936 if (isa<CXXRecordDecl>(FD->getLexicalDeclContext())) {
8937 // C++20 [class.compare.default]p1:
8938 // [...] A definition of a comparison operator as defaulted that appears
8939 // in a class shall be the first declaration of that function.
8940 Diag(FD->getLocation(), diag::err_non_first_default_compare_in_class)
8941 << (int)DCK;
8943 diag::note_previous_declaration);
8944 return true;
8945 }
8946 }
8947
8948 // If we want to delete the function, then do so; there's nothing else to
8949 // check in that case.
8950 if (Info.Deleted) {
8951 SetDeclDeleted(FD, FD->getLocation());
8952 if (!inTemplateInstantiation() && !FD->isImplicit()) {
8953 Diag(FD->getLocation(), diag::warn_defaulted_comparison_deleted)
8954 << (int)DCK;
8955 DefaultedComparisonAnalyzer(*this, RD, FD, DCK,
8956 DefaultedComparisonAnalyzer::ExplainDeleted)
8957 .visit();
8958 if (FD->getDefaultLoc().isValid())
8959 Diag(FD->getDefaultLoc(), diag::note_replace_equals_default_to_delete)
8960 << FixItHint::CreateReplacement(FD->getDefaultLoc(), "delete");
8961 }
8962 return false;
8963 }
8964
8965 // C++2a [class.spaceship]p2:
8966 // The return type is deduced as the common comparison type of R0, R1, ...
8970 if (RetLoc.isInvalid())
8971 RetLoc = FD->getBeginLoc();
8972 // FIXME: Should we really care whether we have the complete type and the
8973 // 'enumerator' constants here? A forward declaration seems sufficient.
8975 Info.Category, RetLoc, ComparisonCategoryUsage::DefaultedOperator);
8976 if (Cat.isNull())
8977 return true;
8979 FD, SubstAutoType(FD->getDeclaredReturnType(), Cat));
8980 }
8981
8982 // C++2a [dcl.fct.def.default]p3 [P2002R0]:
8983 // An explicitly-defaulted function that is not defined as deleted may be
8984 // declared constexpr or consteval only if it is constexpr-compatible.
8985 // C++2a [class.compare.default]p3 [P2002R0]:
8986 // A defaulted comparison function is constexpr-compatible if it satisfies
8987 // the requirements for a constexpr function [...]
8988 // The only relevant requirements are that the parameter and return types are
8989 // literal types. The remaining conditions are checked by the analyzer.
8990 //
8991 // We support P2448R2 in language modes earlier than C++23 as an extension.
8992 // The concept of constexpr-compatible was removed.
8993 // C++23 [dcl.fct.def.default]p3 [P2448R2]
8994 // A function explicitly defaulted on its first declaration is implicitly
8995 // inline, and is implicitly constexpr if it is constexpr-suitable.
8996 // C++23 [dcl.constexpr]p3
8997 // A function is constexpr-suitable if
8998 // - it is not a coroutine, and
8999 // - if the function is a constructor or destructor, its class does not
9000 // have any virtual base classes.
9001 if (FD->isConstexpr()) {
9002 if (!getLangOpts().CPlusPlus23 &&
9005 !Info.Constexpr) {
9006 Diag(FD->getBeginLoc(), diag::err_defaulted_comparison_constexpr_mismatch)
9007 << FD->isImplicit() << (int)DCK << FD->isConsteval();
9008 DefaultedComparisonAnalyzer(*this, RD, FD, DCK,
9009 DefaultedComparisonAnalyzer::ExplainConstexpr)
9010 .visit();
9011 }
9012 }
9013
9014 // C++2a [dcl.fct.def.default]p3 [P2002R0]:
9015 // If a constexpr-compatible function is explicitly defaulted on its first
9016 // declaration, it is implicitly considered to be constexpr.
9017 // FIXME: Only applying this to the first declaration seems problematic, as
9018 // simple reorderings can affect the meaning of the program.
9019 if (First && !FD->isConstexpr() && Info.Constexpr)
9021
9022 // C++2a [except.spec]p3:
9023 // If a declaration of a function does not have a noexcept-specifier
9024 // [and] is defaulted on its first declaration, [...] the exception
9025 // specification is as specified below
9026 if (FD->getExceptionSpecType() == EST_None) {
9027 auto *FPT = FD->getType()->castAs<FunctionProtoType>();
9028 FunctionProtoType::ExtProtoInfo EPI = FPT->getExtProtoInfo();
9030 EPI.ExceptionSpec.SourceDecl = FD;
9031 FD->setType(Context.getFunctionType(FPT->getReturnType(),
9032 FPT->getParamTypes(), EPI));
9033 }
9034
9035 return false;
9036}
9037
9039 FunctionDecl *Spaceship) {
9042 Ctx.PointOfInstantiation = Spaceship->getEndLoc();
9043 Ctx.Entity = Spaceship;
9045
9046 if (FunctionDecl *EqualEqual = SubstSpaceshipAsEqualEqual(RD, Spaceship))
9047 EqualEqual->setImplicit();
9048
9050}
9051
9054 assert(FD->isDefaulted() && !FD->isDeleted() &&
9056 if (FD->willHaveBody() || FD->isInvalidDecl())
9057 return;
9058
9060
9061 // Add a context note for diagnostics produced after this point.
9062 Scope.addContextNote(UseLoc);
9063
9064 {
9065 // Build and set up the function body.
9066 // The first parameter has type maybe-ref-to maybe-const T, use that to get
9067 // the type of the class being compared.
9068 auto PT = FD->getParamDecl(0)->getType();
9069 CXXRecordDecl *RD = PT.getNonReferenceType()->getAsCXXRecordDecl();
9070 SourceLocation BodyLoc =
9071 FD->getEndLoc().isValid() ? FD->getEndLoc() : FD->getLocation();
9072 StmtResult Body =
9073 DefaultedComparisonSynthesizer(*this, RD, FD, DCK, BodyLoc).build();
9074 if (Body.isInvalid()) {
9075 FD->setInvalidDecl();
9076 return;
9077 }
9078 FD->setBody(Body.get());
9079 FD->markUsed(Context);
9080 }
9081
9082 // The exception specification is needed because we are defining the
9083 // function. Note that this will reuse the body we just built.
9085
9087 L->CompletedImplicitDefinition(FD);
9088}
9089
9092 FunctionDecl *FD,
9094 ComputingExceptionSpec CES(S, FD, Loc);
9096
9097 if (FD->isInvalidDecl())
9098 return ExceptSpec;
9099
9100 // The common case is that we just defined the comparison function. In that
9101 // case, just look at whether the body can throw.
9102 if (FD->hasBody()) {
9103 ExceptSpec.CalledStmt(FD->getBody());
9104 } else {
9105 // Otherwise, build a body so we can check it. This should ideally only
9106 // happen when we're not actually marking the function referenced. (This is
9107 // only really important for efficiency: we don't want to build and throw
9108 // away bodies for comparison functions more than we strictly need to.)
9109
9110 // Pretend to synthesize the function body in an unevaluated context.
9111 // Note that we can't actually just go ahead and define the function here:
9112 // we are not permitted to mark its callees as referenced.
9116
9117 CXXRecordDecl *RD =
9118 cast<CXXRecordDecl>(FD->getFriendObjectKind() == Decl::FOK_None
9119 ? FD->getDeclContext()
9120 : FD->getLexicalDeclContext());
9121 SourceLocation BodyLoc =
9122 FD->getEndLoc().isValid() ? FD->getEndLoc() : FD->getLocation();
9123 StmtResult Body =
9124 DefaultedComparisonSynthesizer(S, RD, FD, DCK, BodyLoc).build();
9125 if (!Body.isInvalid())
9126 ExceptSpec.CalledStmt(Body.get());
9127
9128 // FIXME: Can we hold onto this body and just transform it to potentially
9129 // evaluated when we're asked to define the function rather than rebuilding
9130 // it? Either that, or we should only build the bits of the body that we
9131 // need (the expressions, not the statements).
9132 }
9133
9134 return ExceptSpec;
9135}
9136
9138 decltype(DelayedOverridingExceptionSpecChecks) Overriding;
9140
9141 std::swap(Overriding, DelayedOverridingExceptionSpecChecks);
9143
9144 // Perform any deferred checking of exception specifications for virtual
9145 // destructors.
9146 for (auto &Check : Overriding)
9147 CheckOverridingFunctionExceptionSpec(Check.first, Check.second);
9148
9149 // Perform any deferred checking of exception specifications for befriended
9150 // special members.
9151 for (auto &Check : Equivalent)
9152 CheckEquivalentExceptionSpec(Check.second, Check.first);
9153}
9154
9155namespace {
9156/// CRTP base class for visiting operations performed by a special member
9157/// function (or inherited constructor).
9158template<typename Derived>
9159struct SpecialMemberVisitor {
9160 Sema &S;
9161 CXXMethodDecl *MD;
9164
9165 // Properties of the special member, computed for convenience.
9166 bool IsConstructor = false, IsAssignment = false, ConstArg = false;
9167
9168 SpecialMemberVisitor(Sema &S, CXXMethodDecl *MD, CXXSpecialMemberKind CSM,
9170 : S(S), MD(MD), CSM(CSM), ICI(ICI) {
9171 switch (CSM) {
9172 case CXXSpecialMemberKind::DefaultConstructor:
9173 case CXXSpecialMemberKind::CopyConstructor:
9174 case CXXSpecialMemberKind::MoveConstructor:
9175 IsConstructor = true;
9176 break;
9177 case CXXSpecialMemberKind::CopyAssignment:
9178 case CXXSpecialMemberKind::MoveAssignment:
9179 IsAssignment = true;
9180 break;
9181 case CXXSpecialMemberKind::Destructor:
9182 break;
9183 case CXXSpecialMemberKind::Invalid:
9184 llvm_unreachable("invalid special member kind");
9185 }
9186
9187 if (MD->getNumExplicitParams()) {
9188 if (const ReferenceType *RT =
9190 ConstArg = RT->getPointeeType().isConstQualified();
9191 }
9192 }
9193
9194 Derived &getDerived() { return static_cast<Derived&>(*this); }
9195
9196 /// Is this a "move" special member?
9197 bool isMove() const {
9198 return CSM == CXXSpecialMemberKind::MoveConstructor ||
9199 CSM == CXXSpecialMemberKind::MoveAssignment;
9200 }
9201
9202 /// Look up the corresponding special member in the given class.
9204 unsigned Quals, bool IsMutable) {
9205 return lookupCallFromSpecialMember(S, Class, CSM, Quals,
9206 ConstArg && !IsMutable);
9207 }
9208
9209 /// Look up the constructor for the specified base class to see if it's
9210 /// overridden due to this being an inherited constructor.
9211 Sema::SpecialMemberOverloadResult lookupInheritedCtor(CXXRecordDecl *Class) {
9212 if (!ICI)
9213 return {};
9214 assert(CSM == CXXSpecialMemberKind::DefaultConstructor);
9215 auto *BaseCtor =
9216 cast<CXXConstructorDecl>(MD)->getInheritedConstructor().getConstructor();
9217 if (auto *MD = ICI->findConstructorForBase(Class, BaseCtor).first)
9218 return MD;
9219 return {};
9220 }
9221
9222 /// A base or member subobject.
9223 typedef llvm::PointerUnion<CXXBaseSpecifier*, FieldDecl*> Subobject;
9224
9225 /// Get the location to use for a subobject in diagnostics.
9226 static SourceLocation getSubobjectLoc(Subobject Subobj) {
9227 // FIXME: For an indirect virtual base, the direct base leading to
9228 // the indirect virtual base would be a more useful choice.
9229 if (auto *B = Subobj.dyn_cast<CXXBaseSpecifier*>())
9230 return B->getBaseTypeLoc();
9231 else
9232 return cast<FieldDecl *>(Subobj)->getLocation();
9233 }
9234
9235 enum BasesToVisit {
9236 /// Visit all non-virtual (direct) bases.
9237 VisitNonVirtualBases,
9238 /// Visit all direct bases, virtual or not.
9239 VisitDirectBases,
9240 /// Visit all non-virtual bases, and all virtual bases if the class
9241 /// is not abstract.
9242 VisitPotentiallyConstructedBases,
9243 /// Visit all direct or virtual bases.
9244 VisitAllBases
9245 };
9246
9247 // Visit the bases and members of the class.
9248 bool visit(BasesToVisit Bases) {
9249 CXXRecordDecl *RD = MD->getParent();
9250
9251 if (Bases == VisitPotentiallyConstructedBases)
9252 Bases = RD->isAbstract() ? VisitNonVirtualBases : VisitAllBases;
9253
9254 for (auto &B : RD->bases())
9255 if ((Bases == VisitDirectBases || !B.isVirtual()) &&
9256 getDerived().visitBase(&B))
9257 return true;
9258
9259 if (Bases == VisitAllBases)
9260 for (auto &B : RD->vbases())
9261 if (getDerived().visitBase(&B))
9262 return true;
9263
9264 for (auto *F : RD->fields())
9265 if (!F->isInvalidDecl() && !F->isUnnamedBitField() &&
9266 getDerived().visitField(F))
9267 return true;
9268
9269 return false;
9270 }
9271};
9272}
9273
9274namespace {
9275struct SpecialMemberDeletionInfo
9276 : SpecialMemberVisitor<SpecialMemberDeletionInfo> {
9277 bool Diagnose;
9278
9280
9281 bool AllFieldsAreConst;
9282
9283 SpecialMemberDeletionInfo(Sema &S, CXXMethodDecl *MD,
9285 Sema::InheritedConstructorInfo *ICI, bool Diagnose)
9286 : SpecialMemberVisitor(S, MD, CSM, ICI), Diagnose(Diagnose),
9287 Loc(MD->getLocation()), AllFieldsAreConst(true) {}
9288
9289 bool inUnion() const { return MD->getParent()->isUnion(); }
9290
9291 CXXSpecialMemberKind getEffectiveCSM() {
9292 return ICI ? CXXSpecialMemberKind::Invalid : CSM;
9293 }
9294
9295 bool shouldDeleteForVariantObjCPtrMember(FieldDecl *FD, QualType FieldType);
9296
9297 bool visitBase(CXXBaseSpecifier *Base) { return shouldDeleteForBase(Base); }
9298 bool visitField(FieldDecl *Field) { return shouldDeleteForField(Field); }
9299
9300 bool shouldDeleteForBase(CXXBaseSpecifier *Base);
9301 bool shouldDeleteForField(FieldDecl *FD);
9302 bool shouldDeleteForAllConstMembers();
9303
9304 bool shouldDeleteForClassSubobject(CXXRecordDecl *Class, Subobject Subobj,
9305 unsigned Quals);
9306 bool shouldDeleteForSubobjectCall(Subobject Subobj,
9308 bool IsDtorCallInCtor);
9309
9310 bool isAccessible(Subobject Subobj, CXXMethodDecl *D);
9311};
9312}
9313
9314/// Is the given special member inaccessible when used on the given
9315/// sub-object.
9316bool SpecialMemberDeletionInfo::isAccessible(Subobject Subobj,
9317 CXXMethodDecl *target) {
9318 /// If we're operating on a base class, the object type is the
9319 /// type of this special member.
9320 QualType objectTy;
9321 AccessSpecifier access = target->getAccess();
9322 if (CXXBaseSpecifier *base = Subobj.dyn_cast<CXXBaseSpecifier*>()) {
9323 objectTy = S.Context.getTypeDeclType(MD->getParent());
9324 access = CXXRecordDecl::MergeAccess(base->getAccessSpecifier(), access);
9325
9326 // If we're operating on a field, the object type is the type of the field.
9327 } else {
9328 objectTy = S.Context.getTypeDeclType(target->getParent());
9329 }
9330
9332 target->getParent(), DeclAccessPair::make(target, access), objectTy);
9333}
9334
9335/// Check whether we should delete a special member due to the implicit
9336/// definition containing a call to a special member of a subobject.
9337bool SpecialMemberDeletionInfo::shouldDeleteForSubobjectCall(
9338 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR,
9339 bool IsDtorCallInCtor) {
9340 CXXMethodDecl *Decl = SMOR.getMethod();
9341 FieldDecl *Field = Subobj.dyn_cast<FieldDecl*>();
9342
9343 int DiagKind = -1;
9344
9346 DiagKind = !Decl ? 0 : 1;
9348 DiagKind = 2;
9349 else if (!isAccessible(Subobj, Decl))
9350 DiagKind = 3;
9351 else if (!IsDtorCallInCtor && Field && Field->getParent()->isUnion() &&
9352 !Decl->isTrivial()) {
9353 // A member of a union must have a trivial corresponding special member.
9354 // As a weird special case, a destructor call from a union's constructor
9355 // must be accessible and non-deleted, but need not be trivial. Such a
9356 // destructor is never actually called, but is semantically checked as
9357 // if it were.
9359 // [class.default.ctor]p2:
9360 // A defaulted default constructor for class X is defined as deleted if
9361 // - X is a union that has a variant member with a non-trivial default
9362 // constructor and no variant member of X has a default member
9363 // initializer
9364 const auto *RD = cast<CXXRecordDecl>(Field->getParent());
9365 if (!RD->hasInClassInitializer())
9366 DiagKind = 4;
9367 } else {
9368 DiagKind = 4;
9369 }
9370 }
9371
9372 if (DiagKind == -1)
9373 return false;
9374
9375 if (Diagnose) {
9376 if (Field) {
9377 S.Diag(Field->getLocation(),
9378 diag::note_deleted_special_member_class_subobject)
9379 << llvm::to_underlying(getEffectiveCSM()) << MD->getParent()
9380 << /*IsField*/ true << Field << DiagKind << IsDtorCallInCtor
9381 << /*IsObjCPtr*/ false;
9382 } else {
9383 CXXBaseSpecifier *Base = cast<CXXBaseSpecifier *>(Subobj);
9384 S.Diag(Base->getBeginLoc(),
9385 diag::note_deleted_special_member_class_subobject)
9386 << llvm::to_underlying(getEffectiveCSM()) << MD->getParent()
9387 << /*IsField*/ false << Base->getType() << DiagKind
9388 << IsDtorCallInCtor << /*IsObjCPtr*/ false;
9389 }
9390
9391 if (DiagKind == 1)
9393 // FIXME: Explain inaccessibility if DiagKind == 3.
9394 }
9395
9396 return true;
9397}
9398
9399/// Check whether we should delete a special member function due to having a
9400/// direct or virtual base class or non-static data member of class type M.
9401bool SpecialMemberDeletionInfo::shouldDeleteForClassSubobject(
9402 CXXRecordDecl *Class, Subobject Subobj, unsigned Quals) {
9403 FieldDecl *Field = Subobj.dyn_cast<FieldDecl*>();
9404 bool IsMutable = Field && Field->isMutable();
9405
9406 // C++11 [class.ctor]p5:
9407 // -- any direct or virtual base class, or non-static data member with no
9408 // brace-or-equal-initializer, has class type M (or array thereof) and
9409 // either M has no default constructor or overload resolution as applied
9410 // to M's default constructor results in an ambiguity or in a function
9411 // that is deleted or inaccessible
9412 // C++11 [class.copy]p11, C++11 [class.copy]p23:
9413 // -- a direct or virtual base class B that cannot be copied/moved because
9414 // overload resolution, as applied to B's corresponding special member,
9415 // results in an ambiguity or a function that is deleted or inaccessible
9416 // from the defaulted special member
9417 // C++11 [class.dtor]p5:
9418 // -- any direct or virtual base class [...] has a type with a destructor
9419 // that is deleted or inaccessible
9420 if (!(CSM == CXXSpecialMemberKind::DefaultConstructor && Field &&
9421 Field->hasInClassInitializer()) &&
9422 shouldDeleteForSubobjectCall(Subobj, lookupIn(Class, Quals, IsMutable),
9423 false))
9424 return true;
9425
9426 // C++11 [class.ctor]p5, C++11 [class.copy]p11:
9427 // -- any direct or virtual base class or non-static data member has a
9428 // type with a destructor that is deleted or inaccessible
9429 if (IsConstructor) {
9432 false, false, false, false);
9433 if (shouldDeleteForSubobjectCall(Subobj, SMOR, true))
9434 return true;
9435 }
9436
9437 return false;
9438}
9439
9440bool SpecialMemberDeletionInfo::shouldDeleteForVariantObjCPtrMember(
9441 FieldDecl *FD, QualType FieldType) {
9442 // The defaulted special functions are defined as deleted if this is a variant
9443 // member with a non-trivial ownership type, e.g., ObjC __strong or __weak
9444 // type under ARC.
9445 if (!FieldType.hasNonTrivialObjCLifetime())
9446 return false;
9447
9448 // Don't make the defaulted default constructor defined as deleted if the
9449 // member has an in-class initializer.
9452 return false;
9453
9454 if (Diagnose) {
9455 auto *ParentClass = cast<CXXRecordDecl>(FD->getParent());
9456 S.Diag(FD->getLocation(), diag::note_deleted_special_member_class_subobject)
9457 << llvm::to_underlying(getEffectiveCSM()) << ParentClass
9458 << /*IsField*/ true << FD << 4 << /*IsDtorCallInCtor*/ false
9459 << /*IsObjCPtr*/ true;
9460 }
9461
9462 return true;
9463}
9464
9465/// Check whether we should delete a special member function due to the class
9466/// having a particular direct or virtual base class.
9467bool SpecialMemberDeletionInfo::shouldDeleteForBase(CXXBaseSpecifier *Base) {
9468 CXXRecordDecl *BaseClass = Base->getType()->getAsCXXRecordDecl();
9469 // If program is correct, BaseClass cannot be null, but if it is, the error
9470 // must be reported elsewhere.
9471 if (!BaseClass)
9472 return false;
9473 // If we have an inheriting constructor, check whether we're calling an
9474 // inherited constructor instead of a default constructor.
9475 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
9476 if (auto *BaseCtor = SMOR.getMethod()) {
9477 // Note that we do not check access along this path; other than that,
9478 // this is the same as shouldDeleteForSubobjectCall(Base, BaseCtor, false);
9479 // FIXME: Check that the base has a usable destructor! Sink this into
9480 // shouldDeleteForClassSubobject.
9481 if (BaseCtor->isDeleted() && Diagnose) {
9482 S.Diag(Base->getBeginLoc(),
9483 diag::note_deleted_special_member_class_subobject)
9484 << llvm::to_underlying(getEffectiveCSM()) << MD->getParent()
9485 << /*IsField*/ false << Base->getType() << /*Deleted*/ 1
9486 << /*IsDtorCallInCtor*/ false << /*IsObjCPtr*/ false;
9487 S.NoteDeletedFunction(BaseCtor);
9488 }
9489 return BaseCtor->isDeleted();
9490 }
9491 return shouldDeleteForClassSubobject(BaseClass, Base, 0);
9492}
9493
9494/// Check whether we should delete a special member function due to the class
9495/// having a particular non-static data member.
9496bool SpecialMemberDeletionInfo::shouldDeleteForField(FieldDecl *FD) {
9497 QualType FieldType = S.Context.getBaseElementType(FD->getType());
9498 CXXRecordDecl *FieldRecord = FieldType->getAsCXXRecordDecl();
9499
9500 if (inUnion() && shouldDeleteForVariantObjCPtrMember(FD, FieldType))
9501 return true;
9502
9504 // For a default constructor, all references must be initialized in-class
9505 // and, if a union, it must have a non-const member.
9506 if (FieldType->isReferenceType() && !FD->hasInClassInitializer()) {
9507 if (Diagnose)
9508 S.Diag(FD->getLocation(), diag::note_deleted_default_ctor_uninit_field)
9509 << !!ICI << MD->getParent() << FD << FieldType << /*Reference*/0;
9510 return true;
9511 }
9512 // C++11 [class.ctor]p5 (modified by DR2394): any non-variant non-static
9513 // data member of const-qualified type (or array thereof) with no
9514 // brace-or-equal-initializer is not const-default-constructible.
9515 if (!inUnion() && FieldType.isConstQualified() &&
9516 !FD->hasInClassInitializer() &&
9517 (!FieldRecord || !FieldRecord->allowConstDefaultInit())) {
9518 if (Diagnose)
9519 S.Diag(FD->getLocation(), diag::note_deleted_default_ctor_uninit_field)
9520 << !!ICI << MD->getParent() << FD << FD->getType() << /*Const*/1;
9521 return true;
9522 }
9523
9524 if (inUnion() && !FieldType.isConstQualified())
9525 AllFieldsAreConst = false;
9526 } else if (CSM == CXXSpecialMemberKind::CopyConstructor) {
9527 // For a copy constructor, data members must not be of rvalue reference
9528 // type.
9529 if (FieldType->isRValueReferenceType()) {
9530 if (Diagnose)
9531 S.Diag(FD->getLocation(), diag::note_deleted_copy_ctor_rvalue_reference)
9532 << MD->getParent() << FD << FieldType;
9533 return true;
9534 }
9535 } else if (IsAssignment) {
9536 // For an assignment operator, data members must not be of reference type.
9537 if (FieldType->isReferenceType()) {
9538 if (Diagnose)
9539 S.Diag(FD->getLocation(), diag::note_deleted_assign_field)
9540 << isMove() << MD->getParent() << FD << FieldType << /*Reference*/0;
9541 return true;
9542 }
9543 if (!FieldRecord && FieldType.isConstQualified()) {
9544 // C++11 [class.copy]p23:
9545 // -- a non-static data member of const non-class type (or array thereof)
9546 if (Diagnose)
9547 S.Diag(FD->getLocation(), diag::note_deleted_assign_field)
9548 << isMove() << MD->getParent() << FD << FD->getType() << /*Const*/1;
9549 return true;
9550 }
9551 }
9552
9553 if (FieldRecord) {
9554 // Some additional restrictions exist on the variant members.
9555 if (!inUnion() && FieldRecord->isUnion() &&
9556 FieldRecord->isAnonymousStructOrUnion()) {
9557 bool AllVariantFieldsAreConst = true;
9558
9559 // FIXME: Handle anonymous unions declared within anonymous unions.
9560 for (auto *UI : FieldRecord->fields()) {
9561 QualType UnionFieldType = S.Context.getBaseElementType(UI->getType());
9562
9563 if (shouldDeleteForVariantObjCPtrMember(&*UI, UnionFieldType))
9564 return true;
9565
9566 if (!UnionFieldType.isConstQualified())
9567 AllVariantFieldsAreConst = false;
9568
9569 CXXRecordDecl *UnionFieldRecord = UnionFieldType->getAsCXXRecordDecl();
9570 if (UnionFieldRecord &&
9571 shouldDeleteForClassSubobject(UnionFieldRecord, UI,
9572 UnionFieldType.getCVRQualifiers()))
9573 return true;
9574 }
9575
9576 // At least one member in each anonymous union must be non-const
9578 AllVariantFieldsAreConst && !FieldRecord->field_empty()) {
9579 if (Diagnose)
9580 S.Diag(FieldRecord->getLocation(),
9581 diag::note_deleted_default_ctor_all_const)
9582 << !!ICI << MD->getParent() << /*anonymous union*/1;
9583 return true;
9584 }
9585
9586 // Don't check the implicit member of the anonymous union type.
9587 // This is technically non-conformant but supported, and we have a
9588 // diagnostic for this elsewhere.
9589 return false;
9590 }
9591
9592 if (shouldDeleteForClassSubobject(FieldRecord, FD,
9593 FieldType.getCVRQualifiers()))
9594 return true;
9595 }
9596
9597 return false;
9598}
9599
9600/// C++11 [class.ctor] p5:
9601/// A defaulted default constructor for a class X is defined as deleted if
9602/// X is a union and all of its variant members are of const-qualified type.
9603bool SpecialMemberDeletionInfo::shouldDeleteForAllConstMembers() {
9604 // This is a silly definition, because it gives an empty union a deleted
9605 // default constructor. Don't do that.
9606 if (CSM == CXXSpecialMemberKind::DefaultConstructor && inUnion() &&
9607 AllFieldsAreConst) {
9608 bool AnyFields = false;
9609 for (auto *F : MD->getParent()->fields())
9610 if ((AnyFields = !F->isUnnamedBitField()))
9611 break;
9612 if (!AnyFields)
9613 return false;
9614 if (Diagnose)
9615 S.Diag(MD->getParent()->getLocation(),
9616 diag::note_deleted_default_ctor_all_const)
9617 << !!ICI << MD->getParent() << /*not anonymous union*/0;
9618 return true;
9619 }
9620 return false;
9621}
9622
9623/// Determine whether a defaulted special member function should be defined as
9624/// deleted, as specified in C++11 [class.ctor]p5, C++11 [class.copy]p11,
9625/// C++11 [class.copy]p23, and C++11 [class.dtor]p5.
9629 bool Diagnose) {
9630 if (MD->isInvalidDecl())
9631 return false;
9632 CXXRecordDecl *RD = MD->getParent();
9633 assert(!RD->isDependentType() && "do deletion after instantiation");
9634 if (!LangOpts.CPlusPlus || (!LangOpts.CPlusPlus11 && !RD->isLambda()) ||
9635 RD->isInvalidDecl())
9636 return false;
9637
9638 // C++11 [expr.lambda.prim]p19:
9639 // The closure type associated with a lambda-expression has a
9640 // deleted (8.4.3) default constructor and a deleted copy
9641 // assignment operator.
9642 // C++2a adds back these operators if the lambda has no lambda-capture.
9646 if (Diagnose)
9647 Diag(RD->getLocation(), diag::note_lambda_decl);
9648 return true;
9649 }
9650
9651 // For an anonymous struct or union, the copy and assignment special members
9652 // will never be used, so skip the check. For an anonymous union declared at
9653 // namespace scope, the constructor and destructor are used.
9656 return false;
9657
9658 // C++11 [class.copy]p7, p18:
9659 // If the class definition declares a move constructor or move assignment
9660 // operator, an implicitly declared copy constructor or copy assignment
9661 // operator is defined as deleted.
9664 CXXMethodDecl *UserDeclaredMove = nullptr;
9665
9666 // In Microsoft mode up to MSVC 2013, a user-declared move only causes the
9667 // deletion of the corresponding copy operation, not both copy operations.
9668 // MSVC 2015 has adopted the standards conforming behavior.
9669 bool DeletesOnlyMatchingCopy =
9670 getLangOpts().MSVCCompat &&
9672
9674 (!DeletesOnlyMatchingCopy ||
9676 if (!Diagnose) return true;
9677
9678 // Find any user-declared move constructor.
9679 for (auto *I : RD->ctors()) {
9680 if (I->isMoveConstructor()) {
9681 UserDeclaredMove = I;
9682 break;
9683 }
9684 }
9685 assert(UserDeclaredMove);
9686 } else if (RD->hasUserDeclaredMoveAssignment() &&
9687 (!DeletesOnlyMatchingCopy ||
9689 if (!Diagnose) return true;
9690
9691 // Find any user-declared move assignment operator.
9692 for (auto *I : RD->methods()) {
9693 if (I->isMoveAssignmentOperator()) {
9694 UserDeclaredMove = I;
9695 break;
9696 }
9697 }
9698 assert(UserDeclaredMove);
9699 }
9700
9701 if (UserDeclaredMove) {
9702 Diag(UserDeclaredMove->getLocation(),
9703 diag::note_deleted_copy_user_declared_move)
9704 << (CSM == CXXSpecialMemberKind::CopyAssignment) << RD
9705 << UserDeclaredMove->isMoveAssignmentOperator();
9706 return true;
9707 }
9708 }
9709
9710 // Do access control from the special member function
9711 ContextRAII MethodContext(*this, MD);
9712
9713 // C++11 [class.dtor]p5:
9714 // -- for a virtual destructor, lookup of the non-array deallocation function
9715 // results in an ambiguity or in a function that is deleted or inaccessible
9716 if (CSM == CXXSpecialMemberKind::Destructor && MD->isVirtual()) {
9717 FunctionDecl *OperatorDelete = nullptr;
9718 DeclarationName Name =
9720 if (FindDeallocationFunction(MD->getLocation(), MD->getParent(), Name,
9721 OperatorDelete, /*Diagnose*/false)) {
9722 if (Diagnose)
9723 Diag(RD->getLocation(), diag::note_deleted_dtor_no_operator_delete);
9724 return true;
9725 }
9726 }
9727
9728 SpecialMemberDeletionInfo SMI(*this, MD, CSM, ICI, Diagnose);
9729
9730 // Per DR1611, do not consider virtual bases of constructors of abstract
9731 // classes, since we are not going to construct them.
9732 // Per DR1658, do not consider virtual bases of destructors of abstract
9733 // classes either.
9734 // Per DR2180, for assignment operators we only assign (and thus only
9735 // consider) direct bases.
9736 if (SMI.visit(SMI.IsAssignment ? SMI.VisitDirectBases
9737 : SMI.VisitPotentiallyConstructedBases))
9738 return true;
9739
9740 if (SMI.shouldDeleteForAllConstMembers())
9741 return true;
9742
9743 if (getLangOpts().CUDA) {
9744 // We should delete the special member in CUDA mode if target inference
9745 // failed.
9746 // For inherited constructors (non-null ICI), CSM may be passed so that MD
9747 // is treated as certain special member, which may not reflect what special
9748 // member MD really is. However inferTargetForImplicitSpecialMember
9749 // expects CSM to match MD, therefore recalculate CSM.
9750 assert(ICI || CSM == getSpecialMember(MD));
9751 auto RealCSM = CSM;
9752 if (ICI)
9753 RealCSM = getSpecialMember(MD);
9754
9755 return CUDA().inferTargetForImplicitSpecialMember(RD, RealCSM, MD,
9756 SMI.ConstArg, Diagnose);
9757 }
9758
9759 return false;
9760}
9761
9764 assert(DFK && "not a defaultable function");
9765 assert(FD->isDefaulted() && FD->isDeleted() && "not defaulted and deleted");
9766
9767 if (DFK.isSpecialMember()) {
9768 ShouldDeleteSpecialMember(cast<CXXMethodDecl>(FD), DFK.asSpecialMember(),
9769 nullptr, /*Diagnose=*/true);
9770 } else {
9771 DefaultedComparisonAnalyzer(
9772 *this, cast<CXXRecordDecl>(FD->getLexicalDeclContext()), FD,
9773 DFK.asComparison(), DefaultedComparisonAnalyzer::ExplainDeleted)
9774 .visit();
9775 }
9776}
9777
9778/// Perform lookup for a special member of the specified kind, and determine
9779/// whether it is trivial. If the triviality can be determined without the
9780/// lookup, skip it. This is intended for use when determining whether a
9781/// special member of a containing object is trivial, and thus does not ever
9782/// perform overload resolution for default constructors.
9783///
9784/// If \p Selected is not \c NULL, \c *Selected will be filled in with the
9785/// member that was most likely to be intended to be trivial, if any.
9786///
9787/// If \p ForCall is true, look at CXXRecord::HasTrivialSpecialMembersForCall to
9788/// determine whether the special member is trivial.
9790 CXXSpecialMemberKind CSM, unsigned Quals,
9791 bool ConstRHS,
9793 CXXMethodDecl **Selected) {
9794 if (Selected)
9795 *Selected = nullptr;
9796
9797 switch (CSM) {
9799 llvm_unreachable("not a special member");
9800
9802 // C++11 [class.ctor]p5:
9803 // A default constructor is trivial if:
9804 // - all the [direct subobjects] have trivial default constructors
9805 //
9806 // Note, no overload resolution is performed in this case.
9808 return true;
9809
9810 if (Selected) {
9811 // If there's a default constructor which could have been trivial, dig it
9812 // out. Otherwise, if there's any user-provided default constructor, point
9813 // to that as an example of why there's not a trivial one.
9814 CXXConstructorDecl *DefCtor = nullptr;
9817 for (auto *CI : RD->ctors()) {
9818 if (!CI->isDefaultConstructor())
9819 continue;
9820 DefCtor = CI;
9821 if (!DefCtor->isUserProvided())
9822 break;
9823 }
9824
9825 *Selected = DefCtor;
9826 }
9827
9828 return false;
9829
9831 // C++11 [class.dtor]p5:
9832 // A destructor is trivial if:
9833 // - all the direct [subobjects] have trivial destructors
9834 if (RD->hasTrivialDestructor() ||
9837 return true;
9838
9839 if (Selected) {
9840 if (RD->needsImplicitDestructor())
9842 *Selected = RD->getDestructor();
9843 }
9844
9845 return false;
9846
9848 // C++11 [class.copy]p12:
9849 // A copy constructor is trivial if:
9850 // - the constructor selected to copy each direct [subobject] is trivial
9851 if (RD->hasTrivialCopyConstructor() ||
9854 if (Quals == Qualifiers::Const)
9855 // We must either select the trivial copy constructor or reach an
9856 // ambiguity; no need to actually perform overload resolution.
9857 return true;
9858 } else if (!Selected) {
9859 return false;
9860 }
9861 // In C++98, we are not supposed to perform overload resolution here, but we
9862 // treat that as a language defect, as suggested on cxx-abi-dev, to treat
9863 // cases like B as having a non-trivial copy constructor:
9864 // struct A { template<typename T> A(T&); };
9865 // struct B { mutable A a; };
9866 goto NeedOverloadResolution;
9867
9869 // C++11 [class.copy]p25:
9870 // A copy assignment operator is trivial if:
9871 // - the assignment operator selected to copy each direct [subobject] is
9872 // trivial
9873 if (RD->hasTrivialCopyAssignment()) {
9874 if (Quals == Qualifiers::Const)
9875 return true;
9876 } else if (!Selected) {
9877 return false;
9878 }
9879 // In C++98, we are not supposed to perform overload resolution here, but we
9880 // treat that as a language defect.
9881 goto NeedOverloadResolution;
9882
9885 NeedOverloadResolution:
9887 lookupCallFromSpecialMember(S, RD, CSM, Quals, ConstRHS);
9888
9889 // The standard doesn't describe how to behave if the lookup is ambiguous.
9890 // We treat it as not making the member non-trivial, just like the standard
9891 // mandates for the default constructor. This should rarely matter, because
9892 // the member will also be deleted.
9894 return true;
9895
9896 if (!SMOR.getMethod()) {
9897 assert(SMOR.getKind() ==
9899 return false;
9900 }
9901
9902 // We deliberately don't check if we found a deleted special member. We're
9903 // not supposed to!
9904 if (Selected)
9905 *Selected = SMOR.getMethod();
9906
9907 if (TAH == Sema::TAH_ConsiderTrivialABI &&
9910 return SMOR.getMethod()->isTrivialForCall();
9911 return SMOR.getMethod()->isTrivial();
9912 }
9913
9914 llvm_unreachable("unknown special method kind");
9915}
9916
9918 for (auto *CI : RD->ctors())
9919 if (!CI->isImplicit())
9920 return CI;
9921
9922 // Look for constructor templates.
9924 for (tmpl_iter TI(RD->decls_begin()), TE(RD->decls_end()); TI != TE; ++TI) {
9925 if (CXXConstructorDecl *CD =
9926 dyn_cast<CXXConstructorDecl>(TI->getTemplatedDecl()))
9927 return CD;
9928 }
9929
9930 return nullptr;
9931}
9932
9933/// The kind of subobject we are checking for triviality. The values of this
9934/// enumeration are used in diagnostics.
9936 /// The subobject is a base class.
9938 /// The subobject is a non-static data member.
9940 /// The object is actually the complete object.
9943
9944/// Check whether the special member selected for a given type would be trivial.
9946 QualType SubType, bool ConstRHS,
9950 bool Diagnose) {
9951 CXXRecordDecl *SubRD = SubType->getAsCXXRecordDecl();
9952 if (!SubRD)
9953 return true;
9954
9955 CXXMethodDecl *Selected;
9956 if (findTrivialSpecialMember(S, SubRD, CSM, SubType.getCVRQualifiers(),
9957 ConstRHS, TAH, Diagnose ? &Selected : nullptr))
9958 return true;
9959
9960 if (Diagnose) {
9961 if (ConstRHS)
9962 SubType.addConst();
9963
9964 if (!Selected && CSM == CXXSpecialMemberKind::DefaultConstructor) {
9965 S.Diag(SubobjLoc, diag::note_nontrivial_no_def_ctor)
9966 << Kind << SubType.getUnqualifiedType();
9968 S.Diag(CD->getLocation(), diag::note_user_declared_ctor);
9969 } else if (!Selected)
9970 S.Diag(SubobjLoc, diag::note_nontrivial_no_copy)
9971 << Kind << SubType.getUnqualifiedType() << llvm::to_underlying(CSM)
9972 << SubType;
9973 else if (Selected->isUserProvided()) {
9974 if (Kind == TSK_CompleteObject)
9975 S.Diag(Selected->getLocation(), diag::note_nontrivial_user_provided)
9976 << Kind << SubType.getUnqualifiedType() << llvm::to_underlying(CSM);
9977 else {
9978 S.Diag(SubobjLoc, diag::note_nontrivial_user_provided)
9979 << Kind << SubType.getUnqualifiedType() << llvm::to_underlying(CSM);
9980 S.Diag(Selected->getLocation(), diag::note_declared_at);
9981 }
9982 } else {
9983 if (Kind != TSK_CompleteObject)
9984 S.Diag(SubobjLoc, diag::note_nontrivial_subobject)
9985 << Kind << SubType.getUnqualifiedType() << llvm::to_underlying(CSM);
9986
9987 // Explain why the defaulted or deleted special member isn't trivial.
9989 Diagnose);
9990 }
9991 }
9992
9993 return false;
9994}
9995
9996/// Check whether the members of a class type allow a special member to be
9997/// trivial.
9999 CXXSpecialMemberKind CSM, bool ConstArg,
10001 bool Diagnose) {
10002 for (const auto *FI : RD->fields()) {
10003 if (FI->isInvalidDecl() || FI->isUnnamedBitField())
10004 continue;
10005
10006 QualType FieldType = S.Context.getBaseElementType(FI->getType());
10007
10008 // Pretend anonymous struct or union members are members of this class.
10009 if (FI->isAnonymousStructOrUnion()) {
10010 if (!checkTrivialClassMembers(S, FieldType->getAsCXXRecordDecl(),
10011 CSM, ConstArg, TAH, Diagnose))
10012 return false;
10013 continue;
10014 }
10015
10016 // C++11 [class.ctor]p5:
10017 // A default constructor is trivial if [...]
10018 // -- no non-static data member of its class has a
10019 // brace-or-equal-initializer
10021 FI->hasInClassInitializer()) {
10022 if (Diagnose)
10023 S.Diag(FI->getLocation(), diag::note_nontrivial_default_member_init)
10024 << FI;
10025 return false;
10026 }
10027
10028 // Objective C ARC 4.3.5:
10029 // [...] nontrivally ownership-qualified types are [...] not trivially
10030 // default constructible, copy constructible, move constructible, copy
10031 // assignable, move assignable, or destructible [...]
10032 if (FieldType.hasNonTrivialObjCLifetime()) {
10033 if (Diagnose)
10034 S.Diag(FI->getLocation(), diag::note_nontrivial_objc_ownership)
10035 << RD << FieldType.getObjCLifetime();
10036 return false;
10037 }
10038
10039 bool ConstRHS = ConstArg && !FI->isMutable();
10040 if (!checkTrivialSubobjectCall(S, FI->getLocation(), FieldType, ConstRHS,
10041 CSM, TSK_Field, TAH, Diagnose))
10042 return false;
10043 }
10044
10045 return true;
10046}
10047
10051
10052 bool ConstArg = (CSM == CXXSpecialMemberKind::CopyConstructor ||
10054 checkTrivialSubobjectCall(*this, RD->getLocation(), Ty, ConstArg, CSM,
10056 /*Diagnose*/true);
10057}
10058
10060 TrivialABIHandling TAH, bool Diagnose) {
10061 assert(!MD->isUserProvided() && CSM != CXXSpecialMemberKind::Invalid &&
10062 "not special enough");
10063
10064 CXXRecordDecl *RD = MD->getParent();
10065
10066 bool ConstArg = false;
10067
10068 // C++11 [class.copy]p12, p25: [DR1593]
10069 // A [special member] is trivial if [...] its parameter-type-list is
10070 // equivalent to the parameter-type-list of an implicit declaration [...]
10071 switch (CSM) {
10074 // Trivial default constructors and destructors cannot have parameters.
10075 break;
10076
10079 const ParmVarDecl *Param0 = MD->getNonObjectParameter(0);
10080 const ReferenceType *RT = Param0->getType()->getAs<ReferenceType>();
10081
10082 // When ClangABICompat14 is true, CXX copy constructors will only be trivial
10083 // if they are not user-provided and their parameter-type-list is equivalent
10084 // to the parameter-type-list of an implicit declaration. This maintains the
10085 // behavior before dr2171 was implemented.
10086 //
10087 // Otherwise, if ClangABICompat14 is false, All copy constructors can be
10088 // trivial, if they are not user-provided, regardless of the qualifiers on
10089 // the reference type.
10090 const bool ClangABICompat14 = Context.getLangOpts().getClangABICompat() <=
10092 if (!RT ||
10094 ClangABICompat14)) {
10095 if (Diagnose)
10096 Diag(Param0->getLocation(), diag::note_nontrivial_param_type)
10097 << Param0->getSourceRange() << Param0->getType()
10100 return false;
10101 }
10102
10103 ConstArg = RT->getPointeeType().isConstQualified();
10104 break;
10105 }
10106
10109 // Trivial move operations always have non-cv-qualified parameters.
10110 const ParmVarDecl *Param0 = MD->getNonObjectParameter(0);
10111 const RValueReferenceType *RT =
10112 Param0->getType()->getAs<RValueReferenceType>();
10113 if (!RT || RT->getPointeeType().getCVRQualifiers()) {
10114 if (Diagnose)
10115 Diag(Param0->getLocation(), diag::note_nontrivial_param_type)
10116 << Param0->getSourceRange() << Param0->getType()
10118 return false;
10119 }
10120 break;
10121 }
10122
10124 llvm_unreachable("not a special member");
10125 }
10126
10127 if (MD->getMinRequiredArguments() < MD->getNumParams()) {
10128 if (Diagnose)
10130 diag::note_nontrivial_default_arg)
10132 return false;
10133 }
10134 if (MD->isVariadic()) {
10135 if (Diagnose)
10136 Diag(MD->getLocation(), diag::note_nontrivial_variadic);
10137 return false;
10138 }
10139
10140 // C++11 [class.ctor]p5, C++11 [class.dtor]p5:
10141 // A copy/move [constructor or assignment operator] is trivial if
10142 // -- the [member] selected to copy/move each direct base class subobject
10143 // is trivial
10144 //
10145 // C++11 [class.copy]p12, C++11 [class.copy]p25:
10146 // A [default constructor or destructor] is trivial if
10147 // -- all the direct base classes have trivial [default constructors or
10148 // destructors]
10149 for (const auto &BI : RD->bases())
10150 if (!checkTrivialSubobjectCall(*this, BI.getBeginLoc(), BI.getType(),
10151 ConstArg, CSM, TSK_BaseClass, TAH, Diagnose))
10152 return false;
10153
10154 // C++11 [class.ctor]p5, C++11 [class.dtor]p5:
10155 // A copy/move [constructor or assignment operator] for a class X is
10156 // trivial if
10157 // -- for each non-static data member of X that is of class type (or array
10158 // thereof), the constructor selected to copy/move that member is
10159 // trivial
10160 //
10161 // C++11 [class.copy]p12, C++11 [class.copy]p25:
10162 // A [default constructor or destructor] is trivial if
10163 // -- for all of the non-static data members of its class that are of class
10164 // type (or array thereof), each such class has a trivial [default
10165 // constructor or destructor]
10166 if (!checkTrivialClassMembers(*this, RD, CSM, ConstArg, TAH, Diagnose))
10167 return false;
10168
10169 // C++11 [class.dtor]p5:
10170 // A destructor is trivial if [...]
10171 // -- the destructor is not virtual
10172 if (CSM == CXXSpecialMemberKind::Destructor && MD->isVirtual()) {
10173 if (Diagnose)
10174 Diag(MD->getLocation(), diag::note_nontrivial_virtual_dtor) << RD;
10175 return false;
10176 }
10177
10178 // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25:
10179 // A [special member] for class X is trivial if [...]
10180 // -- class X has no virtual functions and no virtual base classes
10182 MD->getParent()->isDynamicClass()) {
10183 if (!Diagnose)
10184 return false;
10185
10186 if (RD->getNumVBases()) {
10187 // Check for virtual bases. We already know that the corresponding
10188 // member in all bases is trivial, so vbases must all be direct.
10189 CXXBaseSpecifier &BS = *RD->vbases_begin();
10190 assert(BS.isVirtual());
10191 Diag(BS.getBeginLoc(), diag::note_nontrivial_has_virtual) << RD << 1;
10192 return false;
10193 }
10194
10195 // Must have a virtual method.
10196 for (const auto *MI : RD->methods()) {
10197 if (MI->isVirtual()) {
10198 SourceLocation MLoc = MI->getBeginLoc();
10199 Diag(MLoc, diag::note_nontrivial_has_virtual) << RD << 0;
10200 return false;
10201 }
10202 }
10203
10204 llvm_unreachable("dynamic class with no vbases and no virtual functions");
10205 }
10206
10207 // Looks like it's trivial!
10208 return true;
10209}
10210
10211namespace {
10212struct FindHiddenVirtualMethod {
10213 Sema *S;
10214 CXXMethodDecl *Method;
10215 llvm::SmallPtrSet<const CXXMethodDecl *, 8> OverridenAndUsingBaseMethods;
10216 SmallVector<CXXMethodDecl *, 8> OverloadedMethods;
10217
10218private:
10219 /// Check whether any most overridden method from MD in Methods
10220 static bool CheckMostOverridenMethods(
10221 const CXXMethodDecl *MD,
10222 const llvm::SmallPtrSetImpl<const CXXMethodDecl *> &Methods) {
10223 if (MD->size_overridden_methods() == 0)
10224 return Methods.count(MD->getCanonicalDecl());
10225 for (const CXXMethodDecl *O : MD->overridden_methods())
10226 if (CheckMostOverridenMethods(O, Methods))
10227 return true;
10228 return false;
10229 }
10230
10231public:
10232 /// Member lookup function that determines whether a given C++
10233 /// method overloads virtual methods in a base class without overriding any,
10234 /// to be used with CXXRecordDecl::lookupInBases().
10235 bool operator()(const CXXBaseSpecifier *Specifier, CXXBasePath &Path) {
10236 RecordDecl *BaseRecord =
10237 Specifier->getType()->castAs<RecordType>()->getDecl();
10238
10239 DeclarationName Name = Method->getDeclName();
10240 assert(Name.getNameKind() == DeclarationName::Identifier);
10241
10242 bool foundSameNameMethod = false;
10243 SmallVector<CXXMethodDecl *, 8> overloadedMethods;
10244 for (Path.Decls = BaseRecord->lookup(Name).begin();
10245 Path.Decls != DeclContext::lookup_iterator(); ++Path.Decls) {
10246 NamedDecl *D = *Path.Decls;
10247 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
10248 MD = MD->getCanonicalDecl();
10249 foundSameNameMethod = true;
10250 // Interested only in hidden virtual methods.
10251 if (!MD->isVirtual())
10252 continue;
10253 // If the method we are checking overrides a method from its base
10254 // don't warn about the other overloaded methods. Clang deviates from
10255 // GCC by only diagnosing overloads of inherited virtual functions that
10256 // do not override any other virtual functions in the base. GCC's
10257 // -Woverloaded-virtual diagnoses any derived function hiding a virtual
10258 // function from a base class. These cases may be better served by a
10259 // warning (not specific to virtual functions) on call sites when the
10260 // call would select a different function from the base class, were it
10261 // visible.
10262 // See FIXME in test/SemaCXX/warn-overload-virtual.cpp for an example.
10263 if (!S->IsOverload(Method, MD, false))
10264 return true;
10265 // Collect the overload only if its hidden.
10266 if (!CheckMostOverridenMethods(MD, OverridenAndUsingBaseMethods))
10267 overloadedMethods.push_back(MD);
10268 }
10269 }
10270
10271 if (foundSameNameMethod)
10272 OverloadedMethods.append(overloadedMethods.begin(),
10273 overloadedMethods.end());
10274 return foundSameNameMethod;
10275 }
10276};
10277} // end anonymous namespace
10278
10279/// Add the most overridden methods from MD to Methods
10281 llvm::SmallPtrSetImpl<const CXXMethodDecl *>& Methods) {
10282 if (MD->size_overridden_methods() == 0)
10283 Methods.insert(MD->getCanonicalDecl());
10284 else
10285 for (const CXXMethodDecl *O : MD->overridden_methods())
10286 AddMostOverridenMethods(O, Methods);
10287}
10288
10290 SmallVectorImpl<CXXMethodDecl*> &OverloadedMethods) {
10291 if (!MD->getDeclName().isIdentifier())
10292 return;
10293
10294 CXXBasePaths Paths(/*FindAmbiguities=*/true, // true to look in all bases.
10295 /*bool RecordPaths=*/false,
10296 /*bool DetectVirtual=*/false);
10297 FindHiddenVirtualMethod FHVM;
10298 FHVM.Method = MD;
10299 FHVM.S = this;
10300
10301 // Keep the base methods that were overridden or introduced in the subclass
10302 // by 'using' in a set. A base method not in this set is hidden.
10303 CXXRecordDecl *DC = MD->getParent();
10305 for (DeclContext::lookup_iterator I = R.begin(), E = R.end(); I != E; ++I) {
10306 NamedDecl *ND = *I;
10307 if (UsingShadowDecl *shad = dyn_cast<UsingShadowDecl>(*I))
10308 ND = shad->getTargetDecl();
10309 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND))
10310 AddMostOverridenMethods(MD, FHVM.OverridenAndUsingBaseMethods);
10311 }
10312
10313 if (DC->lookupInBases(FHVM, Paths))
10314 OverloadedMethods = FHVM.OverloadedMethods;
10315}
10316
10318 SmallVectorImpl<CXXMethodDecl*> &OverloadedMethods) {
10319 for (unsigned i = 0, e = OverloadedMethods.size(); i != e; ++i) {
10320 CXXMethodDecl *overloadedMD = OverloadedMethods[i];
10322 diag::note_hidden_overloaded_virtual_declared_here) << overloadedMD;
10323 HandleFunctionTypeMismatch(PD, MD->getType(), overloadedMD->getType());
10324 Diag(overloadedMD->getLocation(), PD);
10325 }
10326}
10327
10329 if (MD->isInvalidDecl())
10330 return;
10331
10332 if (Diags.isIgnored(diag::warn_overloaded_virtual, MD->getLocation()))
10333 return;
10334
10335 SmallVector<CXXMethodDecl *, 8> OverloadedMethods;
10336 FindHiddenVirtualMethods(MD, OverloadedMethods);
10337 if (!OverloadedMethods.empty()) {
10338 Diag(MD->getLocation(), diag::warn_overloaded_virtual)
10339 << MD << (OverloadedMethods.size() > 1);
10340
10341 NoteHiddenVirtualMethods(MD, OverloadedMethods);
10342 }
10343}
10344
10346 auto PrintDiagAndRemoveAttr = [&](unsigned N) {
10347 // No diagnostics if this is a template instantiation.
10349 Diag(RD.getAttr<TrivialABIAttr>()->getLocation(),
10350 diag::ext_cannot_use_trivial_abi) << &RD;
10351 Diag(RD.getAttr<TrivialABIAttr>()->getLocation(),
10352 diag::note_cannot_use_trivial_abi_reason) << &RD << N;
10353 }
10354 RD.dropAttr<TrivialABIAttr>();
10355 };
10356
10357 // Ill-formed if the copy and move constructors are deleted.
10358 auto HasNonDeletedCopyOrMoveConstructor = [&]() {
10359 // If the type is dependent, then assume it might have
10360 // implicit copy or move ctor because we won't know yet at this point.
10361 if (RD.isDependentType())
10362 return true;
10365 return true;
10368 return true;
10369 for (const CXXConstructorDecl *CD : RD.ctors())
10370 if (CD->isCopyOrMoveConstructor() && !CD->isDeleted())
10371 return true;
10372 return false;
10373 };
10374
10375 if (!HasNonDeletedCopyOrMoveConstructor()) {
10376 PrintDiagAndRemoveAttr(0);
10377 return;
10378 }
10379
10380 // Ill-formed if the struct has virtual functions.
10381 if (RD.isPolymorphic()) {
10382 PrintDiagAndRemoveAttr(1);
10383 return;
10384 }
10385
10386 for (const auto &B : RD.bases()) {
10387 // Ill-formed if the base class is non-trivial for the purpose of calls or a
10388 // virtual base.
10389 if (!B.getType()->isDependentType() &&
10390 !B.getType()->getAsCXXRecordDecl()->canPassInRegisters()) {
10391 PrintDiagAndRemoveAttr(2);
10392 return;
10393 }
10394
10395 if (B.isVirtual()) {
10396 PrintDiagAndRemoveAttr(3);
10397 return;
10398 }
10399 }
10400
10401 for (const auto *FD : RD.fields()) {
10402 // Ill-formed if the field is an ObjectiveC pointer or of a type that is
10403 // non-trivial for the purpose of calls.
10404 QualType FT = FD->getType();
10406 PrintDiagAndRemoveAttr(4);
10407 return;
10408 }
10409
10410 if (const auto *RT = FT->getBaseElementTypeUnsafe()->getAs<RecordType>())
10411 if (!RT->isDependentType() &&
10412 !cast<CXXRecordDecl>(RT->getDecl())->canPassInRegisters()) {
10413 PrintDiagAndRemoveAttr(5);
10414 return;
10415 }
10416 }
10417}
10418
10420 CXXRecordDecl &RD) {
10422 diag::err_incomplete_type_vtable_pointer_auth))
10423 return;
10424
10425 const CXXRecordDecl *PrimaryBase = &RD;
10426 if (PrimaryBase->hasAnyDependentBases())
10427 return;
10428
10429 while (1) {
10430 assert(PrimaryBase);
10431 const CXXRecordDecl *Base = nullptr;
10432 for (const CXXBaseSpecifier &BasePtr : PrimaryBase->bases()) {
10433 if (!BasePtr.getType()->getAsCXXRecordDecl()->isDynamicClass())
10434 continue;
10435 Base = BasePtr.getType()->getAsCXXRecordDecl();
10436 break;
10437 }
10438 if (!Base || Base == PrimaryBase || !Base->isPolymorphic())
10439 break;
10440 Diag(RD.getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10441 diag::err_non_top_level_vtable_pointer_auth)
10442 << &RD << Base;
10443 PrimaryBase = Base;
10444 }
10445
10446 if (!RD.isPolymorphic())
10447 Diag(RD.getAttr<VTablePointerAuthenticationAttr>()->getLocation(),
10448 diag::err_non_polymorphic_vtable_pointer_auth)
10449 << &RD;
10450}
10451
10454 SourceLocation RBrac, const ParsedAttributesView &AttrList) {
10455 if (!TagDecl)
10456 return;
10457
10459
10460 for (const ParsedAttr &AL : AttrList) {
10461 if (AL.getKind() != ParsedAttr::AT_Visibility)
10462 continue;
10463 AL.setInvalid();
10464 Diag(AL.getLoc(), diag::warn_attribute_after_definition_ignored) << AL;
10465 }
10466
10467 ActOnFields(S, RLoc, TagDecl,
10469 // strict aliasing violation!
10470 reinterpret_cast<Decl **>(FieldCollector->getCurFields()),
10471 FieldCollector->getCurNumFields()),
10472 LBrac, RBrac, AttrList);
10473
10474 CheckCompletedCXXClass(S, cast<CXXRecordDecl>(TagDecl));
10475}
10476
10477/// Find the equality comparison functions that should be implicitly declared
10478/// in a given class definition, per C++2a [class.compare.default]p3.
10480 ASTContext &Ctx, CXXRecordDecl *RD,
10482 DeclarationName EqEq = Ctx.DeclarationNames.getCXXOperatorName(OO_EqualEqual);
10483 if (!RD->lookup(EqEq).empty())
10484 // Member operator== explicitly declared: no implicit operator==s.
10485 return;
10486
10487 // Traverse friends looking for an '==' or a '<=>'.
10488 for (FriendDecl *Friend : RD->friends()) {
10489 FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(Friend->getFriendDecl());
10490 if (!FD) continue;
10491
10492 if (FD->getOverloadedOperator() == OO_EqualEqual) {
10493 // Friend operator== explicitly declared: no implicit operator==s.
10494 Spaceships.clear();
10495 return;
10496 }
10497
10498 if (FD->getOverloadedOperator() == OO_Spaceship &&
10500 Spaceships.push_back(FD);
10501 }
10502
10503 // Look for members named 'operator<=>'.
10504 DeclarationName Cmp = Ctx.DeclarationNames.getCXXOperatorName(OO_Spaceship);
10505 for (NamedDecl *ND : RD->lookup(Cmp)) {
10506 // Note that we could find a non-function here (either a function template
10507 // or a using-declaration). Neither case results in an implicit
10508 // 'operator=='.
10509 if (auto *FD = dyn_cast<FunctionDecl>(ND))
10510 if (FD->isExplicitlyDefaulted())
10511 Spaceships.push_back(FD);
10512 }
10513}
10514
10516 // Don't add implicit special members to templated classes.
10517 // FIXME: This means unqualified lookups for 'operator=' within a class
10518 // template don't work properly.
10519 if (!ClassDecl->isDependentType()) {
10520 if (ClassDecl->needsImplicitDefaultConstructor()) {
10522
10523 if (ClassDecl->hasInheritedConstructor())
10525 }
10526
10527 if (ClassDecl->needsImplicitCopyConstructor()) {
10529
10530 // If the properties or semantics of the copy constructor couldn't be
10531 // determined while the class was being declared, force a declaration
10532 // of it now.
10534 ClassDecl->hasInheritedConstructor())
10536 // For the MS ABI we need to know whether the copy ctor is deleted. A
10537 // prerequisite for deleting the implicit copy ctor is that the class has
10538 // a move ctor or move assignment that is either user-declared or whose
10539 // semantics are inherited from a subobject. FIXME: We should provide a
10540 // more direct way for CodeGen to ask whether the constructor was deleted.
10541 else if (Context.getTargetInfo().getCXXABI().isMicrosoft() &&
10542 (ClassDecl->hasUserDeclaredMoveConstructor() ||
10544 ClassDecl->hasUserDeclaredMoveAssignment() ||
10547 }
10548
10549 if (getLangOpts().CPlusPlus11 &&
10550 ClassDecl->needsImplicitMoveConstructor()) {
10552
10554 ClassDecl->hasInheritedConstructor())
10556 }
10557
10558 if (ClassDecl->needsImplicitCopyAssignment()) {
10560
10561 // If we have a dynamic class, then the copy assignment operator may be
10562 // virtual, so we have to declare it immediately. This ensures that, e.g.,
10563 // it shows up in the right place in the vtable and that we diagnose
10564 // problems with the implicit exception specification.
10565 if (ClassDecl->isDynamicClass() ||
10567 ClassDecl->hasInheritedAssignment())
10569 }
10570
10571 if (getLangOpts().CPlusPlus11 && ClassDecl->needsImplicitMoveAssignment()) {
10573
10574 // Likewise for the move assignment operator.
10575 if (ClassDecl->isDynamicClass() ||
10577 ClassDecl->hasInheritedAssignment())
10579 }
10580
10581 if (ClassDecl->needsImplicitDestructor()) {
10583
10584 // If we have a dynamic class, then the destructor may be virtual, so we
10585 // have to declare the destructor immediately. This ensures that, e.g., it
10586 // shows up in the right place in the vtable and that we diagnose problems
10587 // with the implicit exception specification.
10588 if (ClassDecl->isDynamicClass() ||
10590 DeclareImplicitDestructor(ClassDecl);
10591 }
10592 }
10593
10594 // C++2a [class.compare.default]p3:
10595 // If the member-specification does not explicitly declare any member or
10596 // friend named operator==, an == operator function is declared implicitly
10597 // for each defaulted three-way comparison operator function defined in
10598 // the member-specification
10599 // FIXME: Consider doing this lazily.
10600 // We do this during the initial parse for a class template, not during
10601 // instantiation, so that we can handle unqualified lookups for 'operator=='
10602 // when parsing the template.
10604 llvm::SmallVector<FunctionDecl *, 4> DefaultedSpaceships;
10606 DefaultedSpaceships);
10607 for (auto *FD : DefaultedSpaceships)
10608 DeclareImplicitEqualityComparison(ClassDecl, FD);
10609 }
10610}
10611
10612unsigned
10614 llvm::function_ref<Scope *()> EnterScope) {
10615 if (!D)
10616 return 0;
10618
10619 // In order to get name lookup right, reenter template scopes in order from
10620 // outermost to innermost.
10622 DeclContext *LookupDC = dyn_cast<DeclContext>(D);
10623
10624 if (DeclaratorDecl *DD = dyn_cast<DeclaratorDecl>(D)) {
10625 for (unsigned i = 0; i < DD->getNumTemplateParameterLists(); ++i)
10626 ParameterLists.push_back(DD->getTemplateParameterList(i));
10627
10628 if (FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
10629 if (FunctionTemplateDecl *FTD = FD->getDescribedFunctionTemplate())
10630 ParameterLists.push_back(FTD->getTemplateParameters());
10631 } else if (VarDecl *VD = dyn_cast<VarDecl>(D)) {
10632 LookupDC = VD->getDeclContext();
10633
10635 ParameterLists.push_back(VTD->getTemplateParameters());
10636 else if (auto *PSD = dyn_cast<VarTemplatePartialSpecializationDecl>(D))
10637 ParameterLists.push_back(PSD->getTemplateParameters());
10638 }
10639 } else if (TagDecl *TD = dyn_cast<TagDecl>(D)) {
10640 for (unsigned i = 0; i < TD->getNumTemplateParameterLists(); ++i)
10641 ParameterLists.push_back(TD->getTemplateParameterList(i));
10642
10643 if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(TD)) {
10645 ParameterLists.push_back(CTD->getTemplateParameters());
10646 else if (auto *PSD = dyn_cast<ClassTemplatePartialSpecializationDecl>(D))
10647 ParameterLists.push_back(PSD->getTemplateParameters());
10648 }
10649 }
10650 // FIXME: Alias declarations and concepts.
10651
10652 unsigned Count = 0;
10653 Scope *InnermostTemplateScope = nullptr;
10654 for (TemplateParameterList *Params : ParameterLists) {
10655 // Ignore explicit specializations; they don't contribute to the template
10656 // depth.
10657 if (Params->size() == 0)
10658 continue;
10659
10660 InnermostTemplateScope = EnterScope();
10661 for (NamedDecl *Param : *Params) {
10662 if (Param->getDeclName()) {
10663 InnermostTemplateScope->AddDecl(Param);
10664 IdResolver.AddDecl(Param);
10665 }
10666 }
10667 ++Count;
10668 }
10669
10670 // Associate the new template scopes with the corresponding entities.
10671 if (InnermostTemplateScope) {
10672 assert(LookupDC && "no enclosing DeclContext for template lookup");
10673 EnterTemplatedContext(InnermostTemplateScope, LookupDC);
10674 }
10675
10676 return Count;
10677}
10678
10680 if (!RecordD) return;
10681 AdjustDeclIfTemplate(RecordD);
10682 CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordD);
10684}
10685
10687 if (!RecordD) return;
10689}
10690
10692 if (!Param)
10693 return;
10694
10695 S->AddDecl(Param);
10696 if (Param->getDeclName())
10697 IdResolver.AddDecl(Param);
10698}
10699
10701}
10702
10703/// ActOnDelayedCXXMethodParameter - We've already started a delayed
10704/// C++ method declaration. We're (re-)introducing the given
10705/// function parameter into scope for use in parsing later parts of
10706/// the method declaration. For example, we could see an
10707/// ActOnParamDefaultArgument event for this parameter.
10709 if (!ParamD)
10710 return;
10711
10712 ParmVarDecl *Param = cast<ParmVarDecl>(ParamD);
10713
10714 S->AddDecl(Param);
10715 if (Param->getDeclName())
10716 IdResolver.AddDecl(Param);
10717}
10718
10720 if (!MethodD)
10721 return;
10722
10723 AdjustDeclIfTemplate(MethodD);
10724
10725 FunctionDecl *Method = cast<FunctionDecl>(MethodD);
10726
10727 // Now that we have our default arguments, check the constructor
10728 // again. It could produce additional diagnostics or affect whether
10729 // the class has implicitly-declared destructors, among other
10730 // things.
10731 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(Method))
10732 CheckConstructor(Constructor);
10733
10734 // Check the default arguments, which we may have added.
10735 if (!Method->isInvalidDecl())
10737}
10738
10739// Emit the given diagnostic for each non-address-space qualifier.
10740// Common part of CheckConstructorDeclarator and CheckDestructorDeclarator.
10741static void checkMethodTypeQualifiers(Sema &S, Declarator &D, unsigned DiagID) {
10742 const DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
10743 if (FTI.hasMethodTypeQualifiers() && !D.isInvalidType()) {
10744 bool DiagOccured = false;
10746 [DiagID, &S, &DiagOccured](DeclSpec::TQ, StringRef QualName,
10747 SourceLocation SL) {
10748 // This diagnostic should be emitted on any qualifier except an addr
10749 // space qualifier. However, forEachQualifier currently doesn't visit
10750 // addr space qualifiers, so there's no way to write this condition
10751 // right now; we just diagnose on everything.
10752 S.Diag(SL, DiagID) << QualName << SourceRange(SL);
10753 DiagOccured = true;
10754 });
10755 if (DiagOccured)
10756 D.setInvalidType();
10757 }
10758}
10759
10761 StorageClass &SC) {
10762 bool isVirtual = D.getDeclSpec().isVirtualSpecified();
10763
10764 // C++ [class.ctor]p3:
10765 // A constructor shall not be virtual (10.3) or static (9.4). A
10766 // constructor can be invoked for a const, volatile or const
10767 // volatile object. A constructor shall not be declared const,
10768 // volatile, or const volatile (9.3.2).
10769 if (isVirtual) {
10770 if (!D.isInvalidType())
10771 Diag(D.getIdentifierLoc(), diag::err_constructor_cannot_be)
10772 << "virtual" << SourceRange(D.getDeclSpec().getVirtualSpecLoc())
10773 << SourceRange(D.getIdentifierLoc());
10774 D.setInvalidType();
10775 }
10776 if (SC == SC_Static) {
10777 if (!D.isInvalidType())
10778 Diag(D.getIdentifierLoc(), diag::err_constructor_cannot_be)
10779 << "static" << SourceRange(D.getDeclSpec().getStorageClassSpecLoc())
10780 << SourceRange(D.getIdentifierLoc());
10781 D.setInvalidType();
10782 SC = SC_None;
10783 }
10784
10785 if (unsigned TypeQuals = D.getDeclSpec().getTypeQualifiers()) {
10787 diag::err_constructor_return_type, TypeQuals, SourceLocation(),
10788 D.getDeclSpec().getConstSpecLoc(), D.getDeclSpec().getVolatileSpecLoc(),
10789 D.getDeclSpec().getRestrictSpecLoc(),
10790 D.getDeclSpec().getAtomicSpecLoc());
10791 D.setInvalidType();
10792 }
10793
10794 checkMethodTypeQualifiers(*this, D, diag::err_invalid_qualified_constructor);
10795
10796 // C++0x [class.ctor]p4:
10797 // A constructor shall not be declared with a ref-qualifier.
10798 DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
10799 if (FTI.hasRefQualifier()) {
10800 Diag(FTI.getRefQualifierLoc(), diag::err_ref_qualifier_constructor)
10803 D.setInvalidType();
10804 }
10805
10806 // Rebuild the function type "R" without any type qualifiers (in
10807 // case any of the errors above fired) and with "void" as the
10808 // return type, since constructors don't have return types.
10809 const FunctionProtoType *Proto = R->castAs<FunctionProtoType>();
10810 if (Proto->getReturnType() == Context.VoidTy && !D.isInvalidType())
10811 return R;
10812
10814 EPI.TypeQuals = Qualifiers();
10815 EPI.RefQualifier = RQ_None;
10816
10817 return Context.getFunctionType(Context.VoidTy, Proto->getParamTypes(), EPI);
10818}
10819
10821 CXXRecordDecl *ClassDecl
10822 = dyn_cast<CXXRecordDecl>(Constructor->getDeclContext());
10823 if (!ClassDecl)
10824 return Constructor->setInvalidDecl();
10825
10826 // C++ [class.copy]p3:
10827 // A declaration of a constructor for a class X is ill-formed if
10828 // its first parameter is of type (optionally cv-qualified) X and
10829 // either there are no other parameters or else all other
10830 // parameters have default arguments.
10831 if (!Constructor->isInvalidDecl() &&
10832 Constructor->hasOneParamOrDefaultArgs() &&
10833 Constructor->getTemplateSpecializationKind() !=
10835 QualType ParamType = Constructor->getParamDecl(0)->getType();
10836 QualType ClassTy = Context.getTagDeclType(ClassDecl);
10837 if (Context.getCanonicalType(ParamType).getUnqualifiedType() == ClassTy) {
10838 SourceLocation ParamLoc = Constructor->getParamDecl(0)->getLocation();
10839 const char *ConstRef
10840 = Constructor->getParamDecl(0)->getIdentifier() ? "const &"
10841 : " const &";
10842 Diag(ParamLoc, diag::err_constructor_byvalue_arg)
10843 << FixItHint::CreateInsertion(ParamLoc, ConstRef);
10844
10845 // FIXME: Rather that making the constructor invalid, we should endeavor
10846 // to fix the type.
10847 Constructor->setInvalidDecl();
10848 }
10849 }
10850}
10851
10853 CXXRecordDecl *RD = Destructor->getParent();
10854
10855 if (!Destructor->getOperatorDelete() && Destructor->isVirtual()) {
10857
10858 if (!Destructor->isImplicit())
10859 Loc = Destructor->getLocation();
10860 else
10861 Loc = RD->getLocation();
10862
10863 // If we have a virtual destructor, look up the deallocation function
10864 if (FunctionDecl *OperatorDelete =
10866 Expr *ThisArg = nullptr;
10867
10868 // If the notional 'delete this' expression requires a non-trivial
10869 // conversion from 'this' to the type of a destroying operator delete's
10870 // first parameter, perform that conversion now.
10871 if (OperatorDelete->isDestroyingOperatorDelete()) {
10872 QualType ParamType = OperatorDelete->getParamDecl(0)->getType();
10873 if (!declaresSameEntity(ParamType->getAsCXXRecordDecl(), RD)) {
10874 // C++ [class.dtor]p13:
10875 // ... as if for the expression 'delete this' appearing in a
10876 // non-virtual destructor of the destructor's class.
10877 ContextRAII SwitchContext(*this, Destructor);
10878 ExprResult This =
10879 ActOnCXXThis(OperatorDelete->getParamDecl(0)->getLocation());
10880 assert(!This.isInvalid() && "couldn't form 'this' expr in dtor?");
10881 This = PerformImplicitConversion(This.get(), ParamType,
10883 if (This.isInvalid()) {
10884 // FIXME: Register this as a context note so that it comes out
10885 // in the right order.
10886 Diag(Loc, diag::note_implicit_delete_this_in_destructor_here);
10887 return true;
10888 }
10889 ThisArg = This.get();
10890 }
10891 }
10892
10893 DiagnoseUseOfDecl(OperatorDelete, Loc);
10894 MarkFunctionReferenced(Loc, OperatorDelete);
10895 Destructor->setOperatorDelete(OperatorDelete, ThisArg);
10896 }
10897 }
10898
10899 return false;
10900}
10901
10903 StorageClass& SC) {
10904 // C++ [class.dtor]p1:
10905 // [...] A typedef-name that names a class is a class-name
10906 // (7.1.3); however, a typedef-name that names a class shall not
10907 // be used as the identifier in the declarator for a destructor
10908 // declaration.
10909 QualType DeclaratorType = GetTypeFromParser(D.getName().DestructorName);
10910 if (const TypedefType *TT = DeclaratorType->getAs<TypedefType>())
10911 Diag(D.getIdentifierLoc(), diag::ext_destructor_typedef_name)
10912 << DeclaratorType << isa<TypeAliasDecl>(TT->getDecl());
10913 else if (const TemplateSpecializationType *TST =
10914 DeclaratorType->getAs<TemplateSpecializationType>())
10915 if (TST->isTypeAlias())
10916 Diag(D.getIdentifierLoc(), diag::ext_destructor_typedef_name)
10917 << DeclaratorType << 1;
10918
10919 // C++ [class.dtor]p2:
10920 // A destructor is used to destroy objects of its class type. A
10921 // destructor takes no parameters, and no return type can be
10922 // specified for it (not even void). The address of a destructor
10923 // shall not be taken. A destructor shall not be static. A
10924 // destructor can be invoked for a const, volatile or const
10925 // volatile object. A destructor shall not be declared const,
10926 // volatile or const volatile (9.3.2).
10927 if (SC == SC_Static) {
10928 if (!D.isInvalidType())
10929 Diag(D.getIdentifierLoc(), diag::err_destructor_cannot_be)
10930 << "static" << SourceRange(D.getDeclSpec().getStorageClassSpecLoc())
10931 << SourceRange(D.getIdentifierLoc())
10932 << FixItHint::CreateRemoval(D.getDeclSpec().getStorageClassSpecLoc());
10933
10934 SC = SC_None;
10935 }
10936 if (!D.isInvalidType()) {
10937 // Destructors don't have return types, but the parser will
10938 // happily parse something like:
10939 //
10940 // class X {
10941 // float ~X();
10942 // };
10943 //
10944 // The return type will be eliminated later.
10945 if (D.getDeclSpec().hasTypeSpecifier())
10946 Diag(D.getIdentifierLoc(), diag::err_destructor_return_type)
10947 << SourceRange(D.getDeclSpec().getTypeSpecTypeLoc())
10948 << SourceRange(D.getIdentifierLoc());
10949 else if (unsigned TypeQuals = D.getDeclSpec().getTypeQualifiers()) {
10950 diagnoseIgnoredQualifiers(diag::err_destructor_return_type, TypeQuals,
10952 D.getDeclSpec().getConstSpecLoc(),
10953 D.getDeclSpec().getVolatileSpecLoc(),
10954 D.getDeclSpec().getRestrictSpecLoc(),
10955 D.getDeclSpec().getAtomicSpecLoc());
10956 D.setInvalidType();
10957 }
10958 }
10959
10960 checkMethodTypeQualifiers(*this, D, diag::err_invalid_qualified_destructor);
10961
10962 // C++0x [class.dtor]p2:
10963 // A destructor shall not be declared with a ref-qualifier.
10964 DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
10965 if (FTI.hasRefQualifier()) {
10966 Diag(FTI.getRefQualifierLoc(), diag::err_ref_qualifier_destructor)
10969 D.setInvalidType();
10970 }
10971
10972 // Make sure we don't have any parameters.
10973 if (FTIHasNonVoidParameters(FTI)) {
10974 Diag(D.getIdentifierLoc(), diag::err_destructor_with_params);
10975
10976 // Delete the parameters.
10977 FTI.freeParams();
10978 D.setInvalidType();
10979 }
10980
10981 // Make sure the destructor isn't variadic.
10982 if (FTI.isVariadic) {
10983 Diag(D.getIdentifierLoc(), diag::err_destructor_variadic);
10984 D.setInvalidType();
10985 }
10986
10987 // Rebuild the function type "R" without any type qualifiers or
10988 // parameters (in case any of the errors above fired) and with
10989 // "void" as the return type, since destructors don't have return
10990 // types.
10991 if (!D.isInvalidType())
10992 return R;
10993
10994 const FunctionProtoType *Proto = R->castAs<FunctionProtoType>();
10996 EPI.Variadic = false;
10997 EPI.TypeQuals = Qualifiers();
10998 EPI.RefQualifier = RQ_None;
10999 return Context.getFunctionType(Context.VoidTy, {}, EPI);
11000}
11001
11002static void extendLeft(SourceRange &R, SourceRange Before) {
11003 if (Before.isInvalid())
11004 return;
11005 R.setBegin(Before.getBegin());
11006 if (R.getEnd().isInvalid())
11007 R.setEnd(Before.getEnd());
11008}
11009
11010static void extendRight(SourceRange &R, SourceRange After) {
11011 if (After.isInvalid())
11012 return;
11013 if (R.getBegin().isInvalid())
11014 R.setBegin(After.getBegin());
11015 R.setEnd(After.getEnd());
11016}
11017
11019 StorageClass& SC) {
11020 // C++ [class.conv.fct]p1:
11021 // Neither parameter types nor return type can be specified. The
11022 // type of a conversion function (8.3.5) is "function taking no
11023 // parameter returning conversion-type-id."
11024 if (SC == SC_Static) {
11025 if (!D.isInvalidType())
11026 Diag(D.getIdentifierLoc(), diag::err_conv_function_not_member)
11027 << SourceRange(D.getDeclSpec().getStorageClassSpecLoc())
11028 << D.getName().getSourceRange();
11029 D.setInvalidType();
11030 SC = SC_None;
11031 }
11032
11033 TypeSourceInfo *ConvTSI = nullptr;
11034 QualType ConvType =
11035 GetTypeFromParser(D.getName().ConversionFunctionId, &ConvTSI);
11036
11037 const DeclSpec &DS = D.getDeclSpec();
11038 if (DS.hasTypeSpecifier() && !D.isInvalidType()) {
11039 // Conversion functions don't have return types, but the parser will
11040 // happily parse something like:
11041 //
11042 // class X {
11043 // float operator bool();
11044 // };
11045 //
11046 // The return type will be changed later anyway.
11047 Diag(D.getIdentifierLoc(), diag::err_conv_function_return_type)
11049 << SourceRange(D.getIdentifierLoc());
11050 D.setInvalidType();
11051 } else if (DS.getTypeQualifiers() && !D.isInvalidType()) {
11052 // It's also plausible that the user writes type qualifiers in the wrong
11053 // place, such as:
11054 // struct S { const operator int(); };
11055 // FIXME: we could provide a fixit to move the qualifiers onto the
11056 // conversion type.
11057 Diag(D.getIdentifierLoc(), diag::err_conv_function_with_complex_decl)
11058 << SourceRange(D.getIdentifierLoc()) << 0;
11059 D.setInvalidType();
11060 }
11061 const auto *Proto = R->castAs<FunctionProtoType>();
11062 // Make sure we don't have any parameters.
11063 DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
11064 unsigned NumParam = Proto->getNumParams();
11065
11066 // [C++2b]
11067 // A conversion function shall have no non-object parameters.
11068 if (NumParam == 1) {
11069 DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
11070 if (const auto *First =
11071 dyn_cast_if_present<ParmVarDecl>(FTI.Params[0].Param);
11072 First && First->isExplicitObjectParameter())
11073 NumParam--;
11074 }
11075
11076 if (NumParam != 0) {
11077 Diag(D.getIdentifierLoc(), diag::err_conv_function_with_params);
11078 // Delete the parameters.
11079 FTI.freeParams();
11080 D.setInvalidType();
11081 } else if (Proto->isVariadic()) {
11082 Diag(D.getIdentifierLoc(), diag::err_conv_function_variadic);
11083 D.setInvalidType();
11084 }
11085
11086 // Diagnose "&operator bool()" and other such nonsense. This
11087 // is actually a gcc extension which we don't support.
11088 if (Proto->getReturnType() != ConvType) {
11089 bool NeedsTypedef = false;
11090 SourceRange Before, After;
11091
11092 // Walk the chunks and extract information on them for our diagnostic.
11093 bool PastFunctionChunk = false;
11094 for (auto &Chunk : D.type_objects()) {
11095 switch (Chunk.Kind) {
11097 if (!PastFunctionChunk) {
11098 if (Chunk.Fun.HasTrailingReturnType) {
11099 TypeSourceInfo *TRT = nullptr;
11100 GetTypeFromParser(Chunk.Fun.getTrailingReturnType(), &TRT);
11101 if (TRT) extendRight(After, TRT->getTypeLoc().getSourceRange());
11102 }
11103 PastFunctionChunk = true;
11104 break;
11105 }
11106 [[fallthrough]];
11108 NeedsTypedef = true;
11109 extendRight(After, Chunk.getSourceRange());
11110 break;
11111
11117 extendLeft(Before, Chunk.getSourceRange());
11118 break;
11119
11121 extendLeft(Before, Chunk.Loc);
11122 extendRight(After, Chunk.EndLoc);
11123 break;
11124 }
11125 }
11126
11127 SourceLocation Loc = Before.isValid() ? Before.getBegin() :
11128 After.isValid() ? After.getBegin() :
11129 D.getIdentifierLoc();
11130 auto &&DB = Diag(Loc, diag::err_conv_function_with_complex_decl);
11131 DB << Before << After;
11132
11133 if (!NeedsTypedef) {
11134 DB << /*don't need a typedef*/0;
11135
11136 // If we can provide a correct fix-it hint, do so.
11137 if (After.isInvalid() && ConvTSI) {
11138 SourceLocation InsertLoc =
11140 DB << FixItHint::CreateInsertion(InsertLoc, " ")
11142 InsertLoc, CharSourceRange::getTokenRange(Before))
11143 << FixItHint::CreateRemoval(Before);
11144 }
11145 } else if (!Proto->getReturnType()->isDependentType()) {
11146 DB << /*typedef*/1 << Proto->getReturnType();
11147 } else if (getLangOpts().CPlusPlus11) {
11148 DB << /*alias template*/2 << Proto->getReturnType();
11149 } else {
11150 DB << /*might not be fixable*/3;
11151 }
11152
11153 // Recover by incorporating the other type chunks into the result type.
11154 // Note, this does *not* change the name of the function. This is compatible
11155 // with the GCC extension:
11156 // struct S { &operator int(); } s;
11157 // int &r = s.operator int(); // ok in GCC
11158 // S::operator int&() {} // error in GCC, function name is 'operator int'.
11159 ConvType = Proto->getReturnType();
11160 }
11161
11162 // C++ [class.conv.fct]p4:
11163 // The conversion-type-id shall not represent a function type nor
11164 // an array type.
11165 if (ConvType->isArrayType()) {
11166 Diag(D.getIdentifierLoc(), diag::err_conv_function_to_array);
11167 ConvType = Context.getPointerType(ConvType);
11168 D.setInvalidType();
11169 } else if (ConvType->isFunctionType()) {
11170 Diag(D.getIdentifierLoc(), diag::err_conv_function_to_function);
11171 ConvType = Context.getPointerType(ConvType);
11172 D.setInvalidType();
11173 }
11174
11175 // Rebuild the function type "R" without any parameters (in case any
11176 // of the errors above fired) and with the conversion type as the
11177 // return type.
11178 if (D.isInvalidType())
11179 R = Context.getFunctionType(ConvType, {}, Proto->getExtProtoInfo());
11180
11181 // C++0x explicit conversion operators.
11185 ? diag::warn_cxx98_compat_explicit_conversion_functions
11186 : diag::ext_explicit_conversion_functions)
11188}
11189
11191 assert(Conversion && "Expected to receive a conversion function declaration");
11192
11193 CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(Conversion->getDeclContext());
11194
11195 // Make sure we aren't redeclaring the conversion function.
11196 QualType ConvType = Context.getCanonicalType(Conversion->getConversionType());
11197 // C++ [class.conv.fct]p1:
11198 // [...] A conversion function is never used to convert a
11199 // (possibly cv-qualified) object to the (possibly cv-qualified)
11200 // same object type (or a reference to it), to a (possibly
11201 // cv-qualified) base class of that type (or a reference to it),
11202 // or to (possibly cv-qualified) void.
11203 QualType ClassType
11205 if (const ReferenceType *ConvTypeRef = ConvType->getAs<ReferenceType>())
11206 ConvType = ConvTypeRef->getPointeeType();
11207 if (Conversion->getTemplateSpecializationKind() != TSK_Undeclared &&
11209 /* Suppress diagnostics for instantiations. */;
11210 else if (Conversion->size_overridden_methods() != 0)
11211 /* Suppress diagnostics for overriding virtual function in a base class. */;
11212 else if (ConvType->isRecordType()) {
11213 ConvType = Context.getCanonicalType(ConvType).getUnqualifiedType();
11214 if (ConvType == ClassType)
11215 Diag(Conversion->getLocation(), diag::warn_conv_to_self_not_used)
11216 << ClassType;
11217 else if (IsDerivedFrom(Conversion->getLocation(), ClassType, ConvType))
11218 Diag(Conversion->getLocation(), diag::warn_conv_to_base_not_used)
11219 << ClassType << ConvType;
11220 } else if (ConvType->isVoidType()) {
11221 Diag(Conversion->getLocation(), diag::warn_conv_to_void_not_used)
11222 << ClassType << ConvType;
11223 }
11224
11225 if (FunctionTemplateDecl *ConversionTemplate =
11226 Conversion->getDescribedFunctionTemplate()) {
11227 if (const auto *ConvTypePtr = ConvType->getAs<PointerType>()) {
11228 ConvType = ConvTypePtr->getPointeeType();
11229 }
11230 if (ConvType->isUndeducedAutoType()) {
11231 Diag(Conversion->getTypeSpecStartLoc(), diag::err_auto_not_allowed)
11232 << getReturnTypeLoc(Conversion).getSourceRange()
11233 << llvm::to_underlying(ConvType->castAs<AutoType>()->getKeyword())
11234 << /* in declaration of conversion function template= */ 24;
11235 }
11236
11237 return ConversionTemplate;
11238 }
11239
11240 return Conversion;
11241}
11242
11244 DeclarationName Name, QualType R) {
11245 CheckExplicitObjectMemberFunction(D, Name, R, false, DC);
11246}
11247
11249 CheckExplicitObjectMemberFunction(D, {}, {}, true);
11250}
11251
11253 DeclarationName Name, QualType R,
11254 bool IsLambda, DeclContext *DC) {
11255 if (!D.isFunctionDeclarator())
11256 return;
11257
11258 DeclaratorChunk::FunctionTypeInfo &FTI = D.getFunctionTypeInfo();
11259 if (FTI.NumParams == 0)
11260 return;
11261 ParmVarDecl *ExplicitObjectParam = nullptr;
11262 for (unsigned Idx = 0; Idx < FTI.NumParams; Idx++) {
11263 const auto &ParamInfo = FTI.Params[Idx];
11264 if (!ParamInfo.Param)
11265 continue;
11266 ParmVarDecl *Param = cast<ParmVarDecl>(ParamInfo.Param);
11267 if (!Param->isExplicitObjectParameter())
11268 continue;
11269 if (Idx == 0) {
11270 ExplicitObjectParam = Param;
11271 continue;
11272 } else {
11273 Diag(Param->getLocation(),
11274 diag::err_explicit_object_parameter_must_be_first)
11275 << IsLambda << Param->getSourceRange();
11276 }
11277 }
11278 if (!ExplicitObjectParam)
11279 return;
11280
11281 if (ExplicitObjectParam->hasDefaultArg()) {
11282 Diag(ExplicitObjectParam->getLocation(),
11283 diag::err_explicit_object_default_arg)
11284 << ExplicitObjectParam->getSourceRange();
11285 }
11286
11287 if (D.getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
11288 (D.getContext() == clang::DeclaratorContext::Member &&
11289 D.isStaticMember())) {
11290 Diag(ExplicitObjectParam->getBeginLoc(),
11291 diag::err_explicit_object_parameter_nonmember)
11292 << D.getSourceRange() << /*static=*/0 << IsLambda;
11293 D.setInvalidType();
11294 }
11295
11296 if (D.getDeclSpec().isVirtualSpecified()) {
11297 Diag(ExplicitObjectParam->getBeginLoc(),
11298 diag::err_explicit_object_parameter_nonmember)
11299 << D.getSourceRange() << /*virtual=*/1 << IsLambda;
11300 D.setInvalidType();
11301 }
11302
11303 // Friend declarations require some care. Consider:
11304 //
11305 // namespace N {
11306 // struct A{};
11307 // int f(A);
11308 // }
11309 //
11310 // struct S {
11311 // struct T {
11312 // int f(this T);
11313 // };
11314 //
11315 // friend int T::f(this T); // Allow this.
11316 // friend int f(this S); // But disallow this.
11317 // friend int N::f(this A); // And disallow this.
11318 // };
11319 //
11320 // Here, it seems to suffice to check whether the scope
11321 // specifier designates a class type.
11322 if (D.getDeclSpec().isFriendSpecified() &&
11323 !isa_and_present<CXXRecordDecl>(
11324 computeDeclContext(D.getCXXScopeSpec()))) {
11325 Diag(ExplicitObjectParam->getBeginLoc(),
11326 diag::err_explicit_object_parameter_nonmember)
11327 << D.getSourceRange() << /*non-member=*/2 << IsLambda;
11328 D.setInvalidType();
11329 }
11330
11331 if (IsLambda && FTI.hasMutableQualifier()) {
11332 Diag(ExplicitObjectParam->getBeginLoc(),
11333 diag::err_explicit_object_parameter_mutable)
11334 << D.getSourceRange();
11335 }
11336
11337 if (IsLambda)
11338 return;
11339
11340 if (!DC || !DC->isRecord()) {
11341 assert(D.isInvalidType() && "Explicit object parameter in non-member "
11342 "should have been diagnosed already");
11343 return;
11344 }
11345
11346 // CWG2674: constructors and destructors cannot have explicit parameters.
11347 if (Name.getNameKind() == DeclarationName::CXXConstructorName ||
11348 Name.getNameKind() == DeclarationName::CXXDestructorName) {
11349 Diag(ExplicitObjectParam->getBeginLoc(),
11350 diag::err_explicit_object_parameter_constructor)
11351 << (Name.getNameKind() == DeclarationName::CXXDestructorName)
11352 << D.getSourceRange();
11353 D.setInvalidType();
11354 }
11355}
11356
11357namespace {
11358/// Utility class to accumulate and print a diagnostic listing the invalid
11359/// specifier(s) on a declaration.
11360struct BadSpecifierDiagnoser {
11361 BadSpecifierDiagnoser(Sema &S, SourceLocation Loc, unsigned DiagID)
11362 : S(S), Diagnostic(S.Diag(Loc, DiagID)) {}
11363 ~BadSpecifierDiagnoser() {
11364 Diagnostic << Specifiers;
11365 }
11366
11367 template<typename T> void check(SourceLocation SpecLoc, T Spec) {
11368 return check(SpecLoc, DeclSpec::getSpecifierName(Spec));
11369 }
11370 void check(SourceLocation SpecLoc, DeclSpec::TST Spec) {
11371 return check(SpecLoc,
11373 }
11374 void check(SourceLocation SpecLoc, const char *Spec) {
11375 if (SpecLoc.isInvalid()) return;
11376 Diagnostic << SourceRange(SpecLoc, SpecLoc);
11377 if (!Specifiers.empty()) Specifiers += " ";
11378 Specifiers += Spec;
11379 }
11380
11381 Sema &S;
11383 std::string Specifiers;
11384};
11385}
11386
11388 StorageClass &SC) {
11389 TemplateName GuidedTemplate = D.getName().TemplateName.get().get();
11390 TemplateDecl *GuidedTemplateDecl = GuidedTemplate.getAsTemplateDecl();
11391 assert(GuidedTemplateDecl && "missing template decl for deduction guide");
11392
11393 // C++ [temp.deduct.guide]p3:
11394 // A deduction-gide shall be declared in the same scope as the
11395 // corresponding class template.
11397 GuidedTemplateDecl->getDeclContext()->getRedeclContext())) {
11398 Diag(D.getIdentifierLoc(), diag::err_deduction_guide_wrong_scope)
11399 << GuidedTemplateDecl;
11400 NoteTemplateLocation(*GuidedTemplateDecl);
11401 }
11402
11403 auto &DS = D.getMutableDeclSpec();
11404 // We leave 'friend' and 'virtual' to be rejected in the normal way.
11405 if (DS.hasTypeSpecifier() || DS.getTypeQualifiers() ||
11406 DS.getStorageClassSpecLoc().isValid() || DS.isInlineSpecified() ||
11407 DS.isNoreturnSpecified() || DS.hasConstexprSpecifier()) {
11408 BadSpecifierDiagnoser Diagnoser(
11409 *this, D.getIdentifierLoc(),
11410 diag::err_deduction_guide_invalid_specifier);
11411
11412 Diagnoser.check(DS.getStorageClassSpecLoc(), DS.getStorageClassSpec());
11413 DS.ClearStorageClassSpecs();
11414 SC = SC_None;
11415
11416 // 'explicit' is permitted.
11417 Diagnoser.check(DS.getInlineSpecLoc(), "inline");
11418 Diagnoser.check(DS.getNoreturnSpecLoc(), "_Noreturn");
11419 Diagnoser.check(DS.getConstexprSpecLoc(), "constexpr");
11420 DS.ClearConstexprSpec();
11421
11422 Diagnoser.check(DS.getConstSpecLoc(), "const");
11423 Diagnoser.check(DS.getRestrictSpecLoc(), "__restrict");
11424 Diagnoser.check(DS.getVolatileSpecLoc(), "volatile");
11425 Diagnoser.check(DS.getAtomicSpecLoc(), "_Atomic");
11426 Diagnoser.check(DS.getUnalignedSpecLoc(), "__unaligned");
11427 DS.ClearTypeQualifiers();
11428
11429 Diagnoser.check(DS.getTypeSpecComplexLoc(), DS.getTypeSpecComplex());
11430 Diagnoser.check(DS.getTypeSpecSignLoc(), DS.getTypeSpecSign());
11431 Diagnoser.check(DS.getTypeSpecWidthLoc(), DS.getTypeSpecWidth());
11432 Diagnoser.check(DS.getTypeSpecTypeLoc(), DS.getTypeSpecType());
11433 DS.ClearTypeSpecType();
11434 }
11435
11436 if (D.isInvalidType())
11437 return true;
11438
11439 // Check the declarator is simple enough.
11440 bool FoundFunction = false;
11441 for (const DeclaratorChunk &Chunk : llvm::reverse(D.type_objects())) {
11442 if (Chunk.Kind == DeclaratorChunk::Paren)
11443 continue;
11444 if (Chunk.Kind != DeclaratorChunk::Function || FoundFunction) {
11445 Diag(D.getDeclSpec().getBeginLoc(),
11446 diag::err_deduction_guide_with_complex_decl)
11447 << D.getSourceRange();
11448 break;
11449 }
11450 if (!Chunk.Fun.hasTrailingReturnType())
11451 return Diag(D.getName().getBeginLoc(),
11452 diag::err_deduction_guide_no_trailing_return_type);
11453
11454 // Check that the return type is written as a specialization of
11455 // the template specified as the deduction-guide's name.
11456 // The template name may not be qualified. [temp.deduct.guide]
11457 ParsedType TrailingReturnType = Chunk.Fun.getTrailingReturnType();
11458 TypeSourceInfo *TSI = nullptr;
11459 QualType RetTy = GetTypeFromParser(TrailingReturnType, &TSI);
11460 assert(TSI && "deduction guide has valid type but invalid return type?");
11461 bool AcceptableReturnType = false;
11462 bool MightInstantiateToSpecialization = false;
11463 if (auto RetTST =
11465 TemplateName SpecifiedName = RetTST.getTypePtr()->getTemplateName();
11466 bool TemplateMatches = Context.hasSameTemplateName(
11467 SpecifiedName, GuidedTemplate, /*IgnoreDeduced=*/true);
11468
11470 SpecifiedName.getAsQualifiedTemplateName();
11471 assert(Qualifiers && "expected QualifiedTemplate");
11472 bool SimplyWritten = !Qualifiers->hasTemplateKeyword() &&
11473 Qualifiers->getQualifier() == nullptr;
11474 if (SimplyWritten && TemplateMatches)
11475 AcceptableReturnType = true;
11476 else {
11477 // This could still instantiate to the right type, unless we know it
11478 // names the wrong class template.
11479 auto *TD = SpecifiedName.getAsTemplateDecl();
11480 MightInstantiateToSpecialization =
11481 !(TD && isa<ClassTemplateDecl>(TD) && !TemplateMatches);
11482 }
11483 } else if (!RetTy.hasQualifiers() && RetTy->isDependentType()) {
11484 MightInstantiateToSpecialization = true;
11485 }
11486
11487 if (!AcceptableReturnType)
11488 return Diag(TSI->getTypeLoc().getBeginLoc(),
11489 diag::err_deduction_guide_bad_trailing_return_type)
11490 << GuidedTemplate << TSI->getType()
11491 << MightInstantiateToSpecialization
11492 << TSI->getTypeLoc().getSourceRange();
11493
11494 // Keep going to check that we don't have any inner declarator pieces (we
11495 // could still have a function returning a pointer to a function).
11496 FoundFunction = true;
11497 }
11498
11499 if (D.isFunctionDefinition())
11500 // we can still create a valid deduction guide here.
11501 Diag(D.getIdentifierLoc(), diag::err_deduction_guide_defines_function);
11502 return false;
11503}
11504
11505//===----------------------------------------------------------------------===//
11506// Namespace Handling
11507//===----------------------------------------------------------------------===//
11508
11509/// Diagnose a mismatch in 'inline' qualifiers when a namespace is
11510/// reopened.
11513 IdentifierInfo *II, bool *IsInline,
11514 NamespaceDecl *PrevNS) {
11515 assert(*IsInline != PrevNS->isInline());
11516
11517 // 'inline' must appear on the original definition, but not necessarily
11518 // on all extension definitions, so the note should point to the first
11519 // definition to avoid confusion.
11520 PrevNS = PrevNS->getFirstDecl();
11521
11522 if (PrevNS->isInline())
11523 // The user probably just forgot the 'inline', so suggest that it
11524 // be added back.
11525 S.Diag(Loc, diag::warn_inline_namespace_reopened_noninline)
11526 << FixItHint::CreateInsertion(KeywordLoc, "inline ");
11527 else
11528 S.Diag(Loc, diag::err_inline_namespace_mismatch);
11529
11530 S.Diag(PrevNS->getLocation(), diag::note_previous_definition);
11531 *IsInline = PrevNS->isInline();
11532}
11533
11534/// ActOnStartNamespaceDef - This is called at the start of a namespace
11535/// definition.
11537 SourceLocation InlineLoc,
11538 SourceLocation NamespaceLoc,
11539 SourceLocation IdentLoc, IdentifierInfo *II,
11540 SourceLocation LBrace,
11541 const ParsedAttributesView &AttrList,
11542 UsingDirectiveDecl *&UD, bool IsNested) {
11543 SourceLocation StartLoc = InlineLoc.isValid() ? InlineLoc : NamespaceLoc;
11544 // For anonymous namespace, take the location of the left brace.
11545 SourceLocation Loc = II ? IdentLoc : LBrace;
11546 bool IsInline = InlineLoc.isValid();
11547 bool IsInvalid = false;
11548 bool IsStd = false;
11549 bool AddToKnown = false;
11550 Scope *DeclRegionScope = NamespcScope->getParent();
11551
11552 NamespaceDecl *PrevNS = nullptr;
11553 if (II) {
11554 // C++ [namespace.std]p7:
11555 // A translation unit shall not declare namespace std to be an inline
11556 // namespace (9.8.2).
11557 //
11558 // Precondition: the std namespace is in the file scope and is declared to
11559 // be inline
11560 auto DiagnoseInlineStdNS = [&]() {
11561 assert(IsInline && II->isStr("std") &&
11563 "Precondition of DiagnoseInlineStdNS not met");
11564 Diag(InlineLoc, diag::err_inline_namespace_std)
11565 << SourceRange(InlineLoc, InlineLoc.getLocWithOffset(6));
11566 IsInline = false;
11567 };
11568 // C++ [namespace.def]p2:
11569 // The identifier in an original-namespace-definition shall not
11570 // have been previously defined in the declarative region in
11571 // which the original-namespace-definition appears. The
11572 // identifier in an original-namespace-definition is the name of
11573 // the namespace. Subsequently in that declarative region, it is
11574 // treated as an original-namespace-name.
11575 //
11576 // Since namespace names are unique in their scope, and we don't
11577 // look through using directives, just look for any ordinary names
11578 // as if by qualified name lookup.
11579 LookupResult R(*this, II, IdentLoc, LookupOrdinaryName,
11580 RedeclarationKind::ForExternalRedeclaration);
11582 NamedDecl *PrevDecl =
11583 R.isSingleResult() ? R.getRepresentativeDecl() : nullptr;
11584 PrevNS = dyn_cast_or_null<NamespaceDecl>(PrevDecl);
11585
11586 if (PrevNS) {
11587 // This is an extended namespace definition.
11588 if (IsInline && II->isStr("std") &&
11590 DiagnoseInlineStdNS();
11591 else if (IsInline != PrevNS->isInline())
11592 DiagnoseNamespaceInlineMismatch(*this, NamespaceLoc, Loc, II,
11593 &IsInline, PrevNS);
11594 } else if (PrevDecl) {
11595 // This is an invalid name redefinition.
11596 Diag(Loc, diag::err_redefinition_different_kind)
11597 << II;
11598 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
11599 IsInvalid = true;
11600 // Continue on to push Namespc as current DeclContext and return it.
11601 } else if (II->isStr("std") &&
11603 if (IsInline)
11604 DiagnoseInlineStdNS();
11605 // This is the first "real" definition of the namespace "std", so update
11606 // our cache of the "std" namespace to point at this definition.
11607 PrevNS = getStdNamespace();
11608 IsStd = true;
11609 AddToKnown = !IsInline;
11610 } else {
11611 // We've seen this namespace for the first time.
11612 AddToKnown = !IsInline;
11613 }
11614 } else {
11615 // Anonymous namespaces.
11616
11617 // Determine whether the parent already has an anonymous namespace.
11619 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(Parent)) {
11620 PrevNS = TU->getAnonymousNamespace();
11621 } else {
11622 NamespaceDecl *ND = cast<NamespaceDecl>(Parent);
11623 PrevNS = ND->getAnonymousNamespace();
11624 }
11625
11626 if (PrevNS && IsInline != PrevNS->isInline())
11627 DiagnoseNamespaceInlineMismatch(*this, NamespaceLoc, NamespaceLoc, II,
11628 &IsInline, PrevNS);
11629 }
11630
11632 Context, CurContext, IsInline, StartLoc, Loc, II, PrevNS, IsNested);
11633 if (IsInvalid)
11634 Namespc->setInvalidDecl();
11635
11636 ProcessDeclAttributeList(DeclRegionScope, Namespc, AttrList);
11637 AddPragmaAttributes(DeclRegionScope, Namespc);
11638 ProcessAPINotes(Namespc);
11639
11640 // FIXME: Should we be merging attributes?
11641 if (const VisibilityAttr *Attr = Namespc->getAttr<VisibilityAttr>())
11643
11644 if (IsStd)
11645 StdNamespace = Namespc;
11646 if (AddToKnown)
11647 KnownNamespaces[Namespc] = false;
11648
11649 if (II) {
11650 PushOnScopeChains(Namespc, DeclRegionScope);
11651 } else {
11652 // Link the anonymous namespace into its parent.
11654 if (TranslationUnitDecl *TU = dyn_cast<TranslationUnitDecl>(Parent)) {
11655 TU->setAnonymousNamespace(Namespc);
11656 } else {
11657 cast<NamespaceDecl>(Parent)->setAnonymousNamespace(Namespc);
11658 }
11659
11660 CurContext->addDecl(Namespc);
11661
11662 // C++ [namespace.unnamed]p1. An unnamed-namespace-definition
11663 // behaves as if it were replaced by
11664 // namespace unique { /* empty body */ }
11665 // using namespace unique;
11666 // namespace unique { namespace-body }
11667 // where all occurrences of 'unique' in a translation unit are
11668 // replaced by the same identifier and this identifier differs
11669 // from all other identifiers in the entire program.
11670
11671 // We just create the namespace with an empty name and then add an
11672 // implicit using declaration, just like the standard suggests.
11673 //
11674 // CodeGen enforces the "universally unique" aspect by giving all
11675 // declarations semantically contained within an anonymous
11676 // namespace internal linkage.
11677
11678 if (!PrevNS) {
11680 /* 'using' */ LBrace,
11681 /* 'namespace' */ SourceLocation(),
11682 /* qualifier */ NestedNameSpecifierLoc(),
11683 /* identifier */ SourceLocation(),
11684 Namespc,
11685 /* Ancestor */ Parent);
11686 UD->setImplicit();
11687 Parent->addDecl(UD);
11688 }
11689 }
11690
11691 ActOnDocumentableDecl(Namespc);
11692
11693 // Although we could have an invalid decl (i.e. the namespace name is a
11694 // redefinition), push it as current DeclContext and try to continue parsing.
11695 // FIXME: We should be able to push Namespc here, so that the each DeclContext
11696 // for the namespace has the declarations that showed up in that particular
11697 // namespace definition.
11698 PushDeclContext(NamespcScope, Namespc);
11699 return Namespc;
11700}
11701
11702/// getNamespaceDecl - Returns the namespace a decl represents. If the decl
11703/// is a namespace alias, returns the namespace it points to.
11705 if (NamespaceAliasDecl *AD = dyn_cast_or_null<NamespaceAliasDecl>(D))
11706 return AD->getNamespace();
11707 return dyn_cast_or_null<NamespaceDecl>(D);
11708}
11709
11711 NamespaceDecl *Namespc = dyn_cast_or_null<NamespaceDecl>(Dcl);
11712 assert(Namespc && "Invalid parameter, expected NamespaceDecl");
11713 Namespc->setRBraceLoc(RBrace);
11715 if (Namespc->hasAttr<VisibilityAttr>())
11716 PopPragmaVisibility(true, RBrace);
11717 // If this namespace contains an export-declaration, export it now.
11718 if (DeferredExportedNamespaces.erase(Namespc))
11720}
11721
11723 return cast_or_null<CXXRecordDecl>(
11725}
11726
11728 return cast_or_null<EnumDecl>(StdAlignValT.get(Context.getExternalSource()));
11729}
11730
11732 return cast_or_null<NamespaceDecl>(
11734}
11735namespace {
11736
11737enum UnsupportedSTLSelect {
11738 USS_InvalidMember,
11739 USS_MissingMember,
11740 USS_NonTrivial,
11741 USS_Other
11742};
11743
11744struct InvalidSTLDiagnoser {
11745 Sema &S;
11747 QualType TyForDiags;
11748
11749 QualType operator()(UnsupportedSTLSelect Sel = USS_Other, StringRef Name = "",
11750 const VarDecl *VD = nullptr) {
11751 {
11752 auto D = S.Diag(Loc, diag::err_std_compare_type_not_supported)
11753 << TyForDiags << ((int)Sel);
11754 if (Sel == USS_InvalidMember || Sel == USS_MissingMember) {
11755 assert(!Name.empty());
11756 D << Name;
11757 }
11758 }
11759 if (Sel == USS_InvalidMember) {
11760 S.Diag(VD->getLocation(), diag::note_var_declared_here)
11761 << VD << VD->getSourceRange();
11762 }
11763 return QualType();
11764 }
11765};
11766} // namespace
11767
11771 assert(getLangOpts().CPlusPlus &&
11772 "Looking for comparison category type outside of C++.");
11773
11774 // Use an elaborated type for diagnostics which has a name containing the
11775 // prepended 'std' namespace but not any inline namespace names.
11776 auto TyForDiags = [&](ComparisonCategoryInfo *Info) {
11777 auto *NNS =
11780 Info->getType());
11781 };
11782
11783 // Check if we've already successfully checked the comparison category type
11784 // before. If so, skip checking it again.
11786 if (Info && FullyCheckedComparisonCategories[static_cast<unsigned>(Kind)]) {
11787 // The only thing we need to check is that the type has a reachable
11788 // definition in the current context.
11789 if (RequireCompleteType(Loc, TyForDiags(Info), diag::err_incomplete_type))
11790 return QualType();
11791
11792 return Info->getType();
11793 }
11794
11795 // If lookup failed
11796 if (!Info) {
11797 std::string NameForDiags = "std::";
11798 NameForDiags += ComparisonCategories::getCategoryString(Kind);
11799 Diag(Loc, diag::err_implied_comparison_category_type_not_found)
11800 << NameForDiags << (int)Usage;
11801 return QualType();
11802 }
11803
11804 assert(Info->Kind == Kind);
11805 assert(Info->Record);
11806
11807 // Update the Record decl in case we encountered a forward declaration on our
11808 // first pass. FIXME: This is a bit of a hack.
11809 if (Info->Record->hasDefinition())
11810 Info->Record = Info->Record->getDefinition();
11811
11812 if (RequireCompleteType(Loc, TyForDiags(Info), diag::err_incomplete_type))
11813 return QualType();
11814
11815 InvalidSTLDiagnoser UnsupportedSTLError{*this, Loc, TyForDiags(Info)};
11816
11817 if (!Info->Record->isTriviallyCopyable())
11818 return UnsupportedSTLError(USS_NonTrivial);
11819
11820 for (const CXXBaseSpecifier &BaseSpec : Info->Record->bases()) {
11821 CXXRecordDecl *Base = BaseSpec.getType()->getAsCXXRecordDecl();
11822 // Tolerate empty base classes.
11823 if (Base->isEmpty())
11824 continue;
11825 // Reject STL implementations which have at least one non-empty base.
11826 return UnsupportedSTLError();
11827 }
11828
11829 // Check that the STL has implemented the types using a single integer field.
11830 // This expectation allows better codegen for builtin operators. We require:
11831 // (1) The class has exactly one field.
11832 // (2) The field is an integral or enumeration type.
11833 auto FIt = Info->Record->field_begin(), FEnd = Info->Record->field_end();
11834 if (std::distance(FIt, FEnd) != 1 ||
11835 !FIt->getType()->isIntegralOrEnumerationType()) {
11836 return UnsupportedSTLError();
11837 }
11838
11839 // Build each of the require values and store them in Info.
11840 for (ComparisonCategoryResult CCR :
11842 StringRef MemName = ComparisonCategories::getResultString(CCR);
11843 ComparisonCategoryInfo::ValueInfo *ValInfo = Info->lookupValueInfo(CCR);
11844
11845 if (!ValInfo)
11846 return UnsupportedSTLError(USS_MissingMember, MemName);
11847
11848 VarDecl *VD = ValInfo->VD;
11849 assert(VD && "should not be null!");
11850
11851 // Attempt to diagnose reasons why the STL definition of this type
11852 // might be foobar, including it failing to be a constant expression.
11853 // TODO Handle more ways the lookup or result can be invalid.
11854 if (!VD->isStaticDataMember() ||
11856 return UnsupportedSTLError(USS_InvalidMember, MemName, VD);
11857
11858 // Attempt to evaluate the var decl as a constant expression and extract
11859 // the value of its first field as a ICE. If this fails, the STL
11860 // implementation is not supported.
11861 if (!ValInfo->hasValidIntValue())
11862 return UnsupportedSTLError();
11863
11865 }
11866
11867 // We've successfully built the required types and expressions. Update
11868 // the cache and return the newly cached value.
11869 FullyCheckedComparisonCategories[static_cast<unsigned>(Kind)] = true;
11870 return Info->getType();
11871}
11872
11874 if (!StdNamespace) {
11875 // The "std" namespace has not yet been defined, so build one implicitly.
11878 /*Inline=*/false, SourceLocation(), SourceLocation(),
11879 &PP.getIdentifierTable().get("std"),
11880 /*PrevDecl=*/nullptr, /*Nested=*/false);
11882 // We want the created NamespaceDecl to be available for redeclaration
11883 // lookups, but not for regular name lookups.
11886 }
11887
11888 return getStdNamespace();
11889}
11890
11892 assert(getLangOpts().CPlusPlus &&
11893 "Looking for std::initializer_list outside of C++.");
11894
11895 // We're looking for implicit instantiations of
11896 // template <typename E> class std::initializer_list.
11897
11898 if (!StdNamespace) // If we haven't seen namespace std yet, this can't be it.
11899 return false;
11900
11901 ClassTemplateDecl *Template = nullptr;
11902 const TemplateArgument *Arguments = nullptr;
11903
11904 if (const RecordType *RT = Ty->getAs<RecordType>()) {
11905
11907 dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
11908 if (!Specialization)
11909 return false;
11910
11911 Template = Specialization->getSpecializedTemplate();
11912 Arguments = Specialization->getTemplateArgs().data();
11913 } else {
11914 const TemplateSpecializationType *TST = nullptr;
11915 if (auto *ICN = Ty->getAs<InjectedClassNameType>())
11916 TST = ICN->getInjectedTST();
11917 else
11918 TST = Ty->getAs<TemplateSpecializationType>();
11919 if (TST) {
11920 Template = dyn_cast_or_null<ClassTemplateDecl>(
11922 Arguments = TST->template_arguments().begin();
11923 }
11924 }
11925 if (!Template)
11926 return false;
11927
11928 if (!StdInitializerList) {
11929 // Haven't recognized std::initializer_list yet, maybe this is it.
11930 CXXRecordDecl *TemplateClass = Template->getTemplatedDecl();
11931 if (TemplateClass->getIdentifier() !=
11932 &PP.getIdentifierTable().get("initializer_list") ||
11933 !getStdNamespace()->InEnclosingNamespaceSetOf(
11934 TemplateClass->getNonTransparentDeclContext()))
11935 return false;
11936 // This is a template called std::initializer_list, but is it the right
11937 // template?
11938 TemplateParameterList *Params = Template->getTemplateParameters();
11939 if (Params->getMinRequiredArguments() != 1)
11940 return false;
11941 if (!isa<TemplateTypeParmDecl>(Params->getParam(0)))
11942 return false;
11943
11944 // It's the right template.
11945 StdInitializerList = Template;
11946 }
11947
11949 return false;
11950
11951 // This is an instance of std::initializer_list. Find the argument type.
11952 if (Element)
11953 *Element = Arguments[0].getAsType();
11954 return true;
11955}
11956
11959 if (!Std) {
11960 S.Diag(Loc, diag::err_implied_std_initializer_list_not_found);
11961 return nullptr;
11962 }
11963
11964 LookupResult Result(S, &S.PP.getIdentifierTable().get("initializer_list"),
11966 if (!S.LookupQualifiedName(Result, Std)) {
11967 S.Diag(Loc, diag::err_implied_std_initializer_list_not_found);
11968 return nullptr;
11969 }
11970 ClassTemplateDecl *Template = Result.getAsSingle<ClassTemplateDecl>();
11971 if (!Template) {
11972 Result.suppressDiagnostics();
11973 // We found something weird. Complain about the first thing we found.
11974 NamedDecl *Found = *Result.begin();
11975 S.Diag(Found->getLocation(), diag::err_malformed_std_initializer_list);
11976 return nullptr;
11977 }
11978
11979 // We found some template called std::initializer_list. Now verify that it's
11980 // correct.
11981 TemplateParameterList *Params = Template->getTemplateParameters();
11982 if (Params->getMinRequiredArguments() != 1 ||
11983 !isa<TemplateTypeParmDecl>(Params->getParam(0))) {
11984 S.Diag(Template->getLocation(), diag::err_malformed_std_initializer_list);
11985 return nullptr;
11986 }
11987
11988 return Template;
11989}
11990
11992 if (!StdInitializerList) {
11994 if (!StdInitializerList)
11995 return QualType();
11996 }
11997
12001 Loc)));
12006}
12007
12009 // C++ [dcl.init.list]p2:
12010 // A constructor is an initializer-list constructor if its first parameter
12011 // is of type std::initializer_list<E> or reference to possibly cv-qualified
12012 // std::initializer_list<E> for some type E, and either there are no other
12013 // parameters or else all other parameters have default arguments.
12014 if (!Ctor->hasOneParamOrDefaultArgs())
12015 return false;
12016
12017 QualType ArgType = Ctor->getParamDecl(0)->getType();
12018 if (const ReferenceType *RT = ArgType->getAs<ReferenceType>())
12019 ArgType = RT->getPointeeType().getUnqualifiedType();
12020
12021 return isStdInitializerList(ArgType, nullptr);
12022}
12023
12024/// Determine whether a using statement is in a context where it will be
12025/// apply in all contexts.
12027 switch (CurContext->getDeclKind()) {
12028 case Decl::TranslationUnit:
12029 return true;
12030 case Decl::LinkageSpec:
12032 default:
12033 return false;
12034 }
12035}
12036
12037namespace {
12038
12039// Callback to only accept typo corrections that are namespaces.
12040class NamespaceValidatorCCC final : public CorrectionCandidateCallback {
12041public:
12042 bool ValidateCandidate(const TypoCorrection &candidate) override {
12043 if (NamedDecl *ND = candidate.getCorrectionDecl())
12044 return isa<NamespaceDecl>(ND) || isa<NamespaceAliasDecl>(ND);
12045 return false;
12046 }
12047
12048 std::unique_ptr<CorrectionCandidateCallback> clone() override {
12049 return std::make_unique<NamespaceValidatorCCC>(*this);
12050 }
12051};
12052
12053}
12054
12055static void DiagnoseInvisibleNamespace(const TypoCorrection &Corrected,
12056 Sema &S) {
12057 auto *ND = cast<NamespaceDecl>(Corrected.getFoundDecl());
12058 Module *M = ND->getOwningModule();
12059 assert(M && "hidden namespace definition not in a module?");
12060
12061 if (M->isExplicitGlobalModule())
12062 S.Diag(Corrected.getCorrectionRange().getBegin(),
12063 diag::err_module_unimported_use_header)
12065 << /*Header Name*/ false;
12066 else
12067 S.Diag(Corrected.getCorrectionRange().getBegin(),
12068 diag::err_module_unimported_use)
12070 << M->getTopLevelModuleName();
12071}
12072
12074 CXXScopeSpec &SS,
12075 SourceLocation IdentLoc,
12076 IdentifierInfo *Ident) {
12077 R.clear();
12078 NamespaceValidatorCCC CCC{};
12079 if (TypoCorrection Corrected =
12080 S.CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), Sc, &SS, CCC,
12082 // Generally we find it is confusing more than helpful to diagnose the
12083 // invisible namespace.
12084 // See https://github.com/llvm/llvm-project/issues/73893.
12085 //
12086 // However, we should diagnose when the users are trying to using an
12087 // invisible namespace. So we handle the case specially here.
12088 if (isa_and_nonnull<NamespaceDecl>(Corrected.getFoundDecl()) &&
12089 Corrected.requiresImport()) {
12090 DiagnoseInvisibleNamespace(Corrected, S);
12091 } else if (DeclContext *DC = S.computeDeclContext(SS, false)) {
12092 std::string CorrectedStr(Corrected.getAsString(S.getLangOpts()));
12093 bool DroppedSpecifier =
12094 Corrected.WillReplaceSpecifier() && Ident->getName() == CorrectedStr;
12095 S.diagnoseTypo(Corrected,
12096 S.PDiag(diag::err_using_directive_member_suggest)
12097 << Ident << DC << DroppedSpecifier << SS.getRange(),
12098 S.PDiag(diag::note_namespace_defined_here));
12099 } else {
12100 S.diagnoseTypo(Corrected,
12101 S.PDiag(diag::err_using_directive_suggest) << Ident,
12102 S.PDiag(diag::note_namespace_defined_here));
12103 }
12104 R.addDecl(Corrected.getFoundDecl());
12105 return true;
12106 }
12107 return false;
12108}
12109
12111 SourceLocation NamespcLoc, CXXScopeSpec &SS,
12112 SourceLocation IdentLoc,
12113 IdentifierInfo *NamespcName,
12114 const ParsedAttributesView &AttrList) {
12115 assert(!SS.isInvalid() && "Invalid CXXScopeSpec.");
12116 assert(NamespcName && "Invalid NamespcName.");
12117 assert(IdentLoc.isValid() && "Invalid NamespceName location.");
12118
12119 // Get the innermost enclosing declaration scope.
12120 S = S->getDeclParent();
12121
12122 UsingDirectiveDecl *UDir = nullptr;
12123 NestedNameSpecifier *Qualifier = nullptr;
12124 if (SS.isSet())
12125 Qualifier = SS.getScopeRep();
12126
12127 // Lookup namespace name.
12128 LookupResult R(*this, NamespcName, IdentLoc, LookupNamespaceName);
12129 LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
12130 if (R.isAmbiguous())
12131 return nullptr;
12132
12133 if (R.empty()) {
12134 R.clear();
12135 // Allow "using namespace std;" or "using namespace ::std;" even if
12136 // "std" hasn't been defined yet, for GCC compatibility.
12137 if ((!Qualifier || Qualifier->getKind() == NestedNameSpecifier::Global) &&
12138 NamespcName->isStr("std")) {
12139 Diag(IdentLoc, diag::ext_using_undefined_std);
12141 R.resolveKind();
12142 }
12143 // Otherwise, attempt typo correction.
12144 else TryNamespaceTypoCorrection(*this, R, S, SS, IdentLoc, NamespcName);
12145 }
12146
12147 if (!R.empty()) {
12148 NamedDecl *Named = R.getRepresentativeDecl();
12150 assert(NS && "expected namespace decl");
12151
12152 // The use of a nested name specifier may trigger deprecation warnings.
12153 DiagnoseUseOfDecl(Named, IdentLoc);
12154
12155 // C++ [namespace.udir]p1:
12156 // A using-directive specifies that the names in the nominated
12157 // namespace can be used in the scope in which the
12158 // using-directive appears after the using-directive. During
12159 // unqualified name lookup (3.4.1), the names appear as if they
12160 // were declared in the nearest enclosing namespace which
12161 // contains both the using-directive and the nominated
12162 // namespace. [Note: in this context, "contains" means "contains
12163 // directly or indirectly". ]
12164
12165 // Find enclosing context containing both using-directive and
12166 // nominated namespace.
12167 DeclContext *CommonAncestor = NS;
12168 while (CommonAncestor && !CommonAncestor->Encloses(CurContext))
12169 CommonAncestor = CommonAncestor->getParent();
12170
12171 UDir = UsingDirectiveDecl::Create(Context, CurContext, UsingLoc, NamespcLoc,
12173 IdentLoc, Named, CommonAncestor);
12174
12177 Diag(IdentLoc, diag::warn_using_directive_in_header);
12178 }
12179
12180 PushUsingDirective(S, UDir);
12181 } else {
12182 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.getRange();
12183 }
12184
12185 if (UDir) {
12186 ProcessDeclAttributeList(S, UDir, AttrList);
12187 ProcessAPINotes(UDir);
12188 }
12189
12190 return UDir;
12191}
12192
12194 // If the scope has an associated entity and the using directive is at
12195 // namespace or translation unit scope, add the UsingDirectiveDecl into
12196 // its lookup structure so qualified name lookup can find it.
12197 DeclContext *Ctx = S->getEntity();
12198 if (Ctx && !Ctx->isFunctionOrMethod())
12199 Ctx->addDecl(UDir);
12200 else
12201 // Otherwise, it is at block scope. The using-directives will affect lookup
12202 // only to the end of the scope.
12203 S->PushUsingDirective(UDir);
12204}
12205
12207 SourceLocation UsingLoc,
12208 SourceLocation TypenameLoc, CXXScopeSpec &SS,
12209 UnqualifiedId &Name,
12210 SourceLocation EllipsisLoc,
12211 const ParsedAttributesView &AttrList) {
12212 assert(S->getFlags() & Scope::DeclScope && "Invalid Scope.");
12213
12214 if (SS.isEmpty()) {
12215 Diag(Name.getBeginLoc(), diag::err_using_requires_qualname);
12216 return nullptr;
12217 }
12218
12219 switch (Name.getKind()) {
12225 break;
12226
12229 // C++11 inheriting constructors.
12230 Diag(Name.getBeginLoc(),
12232 ? diag::warn_cxx98_compat_using_decl_constructor
12233 : diag::err_using_decl_constructor)
12234 << SS.getRange();
12235
12236 if (getLangOpts().CPlusPlus11) break;
12237
12238 return nullptr;
12239
12241 Diag(Name.getBeginLoc(), diag::err_using_decl_destructor) << SS.getRange();
12242 return nullptr;
12243
12245 Diag(Name.getBeginLoc(), diag::err_using_decl_template_id)
12246 << SourceRange(Name.TemplateId->LAngleLoc, Name.TemplateId->RAngleLoc);
12247 return nullptr;
12248
12250 llvm_unreachable("cannot parse qualified deduction guide name");
12251 }
12252
12253 DeclarationNameInfo TargetNameInfo = GetNameFromUnqualifiedId(Name);
12254 DeclarationName TargetName = TargetNameInfo.getName();
12255 if (!TargetName)
12256 return nullptr;
12257
12258 // Warn about access declarations.
12259 if (UsingLoc.isInvalid()) {
12260 Diag(Name.getBeginLoc(), getLangOpts().CPlusPlus11
12261 ? diag::err_access_decl
12262 : diag::warn_access_decl_deprecated)
12263 << FixItHint::CreateInsertion(SS.getRange().getBegin(), "using ");
12264 }
12265
12266 if (EllipsisLoc.isInvalid()) {
12269 return nullptr;
12270 } else {
12272 !TargetNameInfo.containsUnexpandedParameterPack()) {
12273 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
12274 << SourceRange(SS.getBeginLoc(), TargetNameInfo.getEndLoc());
12275 EllipsisLoc = SourceLocation();
12276 }
12277 }
12278
12279 NamedDecl *UD =
12280 BuildUsingDeclaration(S, AS, UsingLoc, TypenameLoc.isValid(), TypenameLoc,
12281 SS, TargetNameInfo, EllipsisLoc, AttrList,
12282 /*IsInstantiation*/ false,
12283 AttrList.hasAttribute(ParsedAttr::AT_UsingIfExists));
12284 if (UD)
12285 PushOnScopeChains(UD, S, /*AddToContext*/ false);
12286
12287 return UD;
12288}
12289
12291 SourceLocation UsingLoc,
12292 SourceLocation EnumLoc, SourceRange TyLoc,
12293 const IdentifierInfo &II, ParsedType Ty,
12294 CXXScopeSpec *SS) {
12295 assert(SS && !SS->isInvalid() && "ScopeSpec is invalid");
12296 TypeSourceInfo *TSI = nullptr;
12297 SourceLocation IdentLoc = TyLoc.getBegin();
12298 QualType EnumTy = GetTypeFromParser(Ty, &TSI);
12299 if (EnumTy.isNull()) {
12300 Diag(IdentLoc, isDependentScopeSpecifier(*SS)
12301 ? diag::err_using_enum_is_dependent
12302 : diag::err_unknown_typename)
12303 << II.getName() << SourceRange(SS->getBeginLoc(), TyLoc.getEnd());
12304 return nullptr;
12305 }
12306
12307 if (EnumTy->isDependentType()) {
12308 Diag(IdentLoc, diag::err_using_enum_is_dependent);
12309 return nullptr;
12310 }
12311
12312 auto *Enum = dyn_cast_if_present<EnumDecl>(EnumTy->getAsTagDecl());
12313 if (!Enum) {
12314 Diag(IdentLoc, diag::err_using_enum_not_enum) << EnumTy;
12315 return nullptr;
12316 }
12317
12318 if (auto *Def = Enum->getDefinition())
12319 Enum = Def;
12320
12321 if (TSI == nullptr)
12322 TSI = Context.getTrivialTypeSourceInfo(EnumTy, IdentLoc);
12323
12324 auto *UD =
12325 BuildUsingEnumDeclaration(S, AS, UsingLoc, EnumLoc, IdentLoc, TSI, Enum);
12326
12327 if (UD)
12328 PushOnScopeChains(UD, S, /*AddToContext*/ false);
12329
12330 return UD;
12331}
12332
12333/// Determine whether a using declaration considers the given
12334/// declarations as "equivalent", e.g., if they are redeclarations of
12335/// the same entity or are both typedefs of the same type.
12336static bool
12338 if (D1->getCanonicalDecl() == D2->getCanonicalDecl())
12339 return true;
12340
12341 if (TypedefNameDecl *TD1 = dyn_cast<TypedefNameDecl>(D1))
12342 if (TypedefNameDecl *TD2 = dyn_cast<TypedefNameDecl>(D2))
12343 return Context.hasSameType(TD1->getUnderlyingType(),
12344 TD2->getUnderlyingType());
12345
12346 // Two using_if_exists using-declarations are equivalent if both are
12347 // unresolved.
12348 if (isa<UnresolvedUsingIfExistsDecl>(D1) &&
12349 isa<UnresolvedUsingIfExistsDecl>(D2))
12350 return true;
12351
12352 return false;
12353}
12354
12356 const LookupResult &Previous,
12357 UsingShadowDecl *&PrevShadow) {
12358 // Diagnose finding a decl which is not from a base class of the
12359 // current class. We do this now because there are cases where this
12360 // function will silently decide not to build a shadow decl, which
12361 // will pre-empt further diagnostics.
12362 //
12363 // We don't need to do this in C++11 because we do the check once on
12364 // the qualifier.
12365 //
12366 // FIXME: diagnose the following if we care enough:
12367 // struct A { int foo; };
12368 // struct B : A { using A::foo; };
12369 // template <class T> struct C : A {};
12370 // template <class T> struct D : C<T> { using B::foo; } // <---
12371 // This is invalid (during instantiation) in C++03 because B::foo
12372 // resolves to the using decl in B, which is not a base class of D<T>.
12373 // We can't diagnose it immediately because C<T> is an unknown
12374 // specialization. The UsingShadowDecl in D<T> then points directly
12375 // to A::foo, which will look well-formed when we instantiate.
12376 // The right solution is to not collapse the shadow-decl chain.
12378 if (auto *Using = dyn_cast<UsingDecl>(BUD)) {
12379 DeclContext *OrigDC = Orig->getDeclContext();
12380
12381 // Handle enums and anonymous structs.
12382 if (isa<EnumDecl>(OrigDC))
12383 OrigDC = OrigDC->getParent();
12384 CXXRecordDecl *OrigRec = cast<CXXRecordDecl>(OrigDC);
12385 while (OrigRec->isAnonymousStructOrUnion())
12386 OrigRec = cast<CXXRecordDecl>(OrigRec->getDeclContext());
12387
12388 if (cast<CXXRecordDecl>(CurContext)->isProvablyNotDerivedFrom(OrigRec)) {
12389 if (OrigDC == CurContext) {
12390 Diag(Using->getLocation(),
12391 diag::err_using_decl_nested_name_specifier_is_current_class)
12392 << Using->getQualifierLoc().getSourceRange();
12393 Diag(Orig->getLocation(), diag::note_using_decl_target);
12394 Using->setInvalidDecl();
12395 return true;
12396 }
12397
12398 Diag(Using->getQualifierLoc().getBeginLoc(),
12399 diag::err_using_decl_nested_name_specifier_is_not_base_class)
12400 << Using->getQualifier() << cast<CXXRecordDecl>(CurContext)
12401 << Using->getQualifierLoc().getSourceRange();
12402 Diag(Orig->getLocation(), diag::note_using_decl_target);
12403 Using->setInvalidDecl();
12404 return true;
12405 }
12406 }
12407
12408 if (Previous.empty()) return false;
12409
12410 NamedDecl *Target = Orig;
12411 if (isa<UsingShadowDecl>(Target))
12412 Target = cast<UsingShadowDecl>(Target)->getTargetDecl();
12413
12414 // If the target happens to be one of the previous declarations, we
12415 // don't have a conflict.
12416 //
12417 // FIXME: but we might be increasing its access, in which case we
12418 // should redeclare it.
12419 NamedDecl *NonTag = nullptr, *Tag = nullptr;
12420 bool FoundEquivalentDecl = false;
12421 for (LookupResult::iterator I = Previous.begin(), E = Previous.end();
12422 I != E; ++I) {
12423 NamedDecl *D = (*I)->getUnderlyingDecl();
12424 // We can have UsingDecls in our Previous results because we use the same
12425 // LookupResult for checking whether the UsingDecl itself is a valid
12426 // redeclaration.
12427 if (isa<UsingDecl>(D) || isa<UsingPackDecl>(D) || isa<UsingEnumDecl>(D))
12428 continue;
12429
12430 if (auto *RD = dyn_cast<CXXRecordDecl>(D)) {
12431 // C++ [class.mem]p19:
12432 // If T is the name of a class, then [every named member other than
12433 // a non-static data member] shall have a name different from T
12434 if (RD->isInjectedClassName() && !isa<FieldDecl>(Target) &&
12435 !isa<IndirectFieldDecl>(Target) &&
12436 !isa<UnresolvedUsingValueDecl>(Target) &&
12438 CurContext,
12440 return true;
12441 }
12442
12444 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(*I))
12445 PrevShadow = Shadow;
12446 FoundEquivalentDecl = true;
12448 // We don't conflict with an existing using shadow decl of an equivalent
12449 // declaration, but we're not a redeclaration of it.
12450 FoundEquivalentDecl = true;
12451 }
12452
12453 if (isVisible(D))
12454 (isa<TagDecl>(D) ? Tag : NonTag) = D;
12455 }
12456
12457 if (FoundEquivalentDecl)
12458 return false;
12459
12460 // Always emit a diagnostic for a mismatch between an unresolved
12461 // using_if_exists and a resolved using declaration in either direction.
12462 if (isa<UnresolvedUsingIfExistsDecl>(Target) !=
12463 (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
12464 if (!NonTag && !Tag)
12465 return false;
12466 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12467 Diag(Target->getLocation(), diag::note_using_decl_target);
12468 Diag((NonTag ? NonTag : Tag)->getLocation(),
12469 diag::note_using_decl_conflict);
12470 BUD->setInvalidDecl();
12471 return true;
12472 }
12473
12474 if (FunctionDecl *FD = Target->getAsFunction()) {
12475 NamedDecl *OldDecl = nullptr;
12476 switch (CheckOverload(nullptr, FD, Previous, OldDecl,
12477 /*IsForUsingDecl*/ true)) {
12478 case Ovl_Overload:
12479 return false;
12480
12481 case Ovl_NonFunction:
12482 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12483 break;
12484
12485 // We found a decl with the exact signature.
12486 case Ovl_Match:
12487 // If we're in a record, we want to hide the target, so we
12488 // return true (without a diagnostic) to tell the caller not to
12489 // build a shadow decl.
12490 if (CurContext->isRecord())
12491 return true;
12492
12493 // If we're not in a record, this is an error.
12494 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12495 break;
12496 }
12497
12498 Diag(Target->getLocation(), diag::note_using_decl_target);
12499 Diag(OldDecl->getLocation(), diag::note_using_decl_conflict);
12500 BUD->setInvalidDecl();
12501 return true;
12502 }
12503
12504 // Target is not a function.
12505
12506 if (isa<TagDecl>(Target)) {
12507 // No conflict between a tag and a non-tag.
12508 if (!Tag) return false;
12509
12510 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12511 Diag(Target->getLocation(), diag::note_using_decl_target);
12512 Diag(Tag->getLocation(), diag::note_using_decl_conflict);
12513 BUD->setInvalidDecl();
12514 return true;
12515 }
12516
12517 // No conflict between a tag and a non-tag.
12518 if (!NonTag) return false;
12519
12520 Diag(BUD->getLocation(), diag::err_using_decl_conflict);
12521 Diag(Target->getLocation(), diag::note_using_decl_target);
12522 Diag(NonTag->getLocation(), diag::note_using_decl_conflict);
12523 BUD->setInvalidDecl();
12524 return true;
12525}
12526
12527/// Determine whether a direct base class is a virtual base class.
12529 if (!Derived->getNumVBases())
12530 return false;
12531 for (auto &B : Derived->bases())
12532 if (B.getType()->getAsCXXRecordDecl() == Base)
12533 return B.isVirtual();
12534 llvm_unreachable("not a direct base class");
12535}
12536
12538 NamedDecl *Orig,
12539 UsingShadowDecl *PrevDecl) {
12540 // If we resolved to another shadow declaration, just coalesce them.
12541 NamedDecl *Target = Orig;
12542 if (isa<UsingShadowDecl>(Target)) {
12543 Target = cast<UsingShadowDecl>(Target)->getTargetDecl();
12544 assert(!isa<UsingShadowDecl>(Target) && "nested shadow declaration");
12545 }
12546
12547 NamedDecl *NonTemplateTarget = Target;
12548 if (auto *TargetTD = dyn_cast<TemplateDecl>(Target))
12549 NonTemplateTarget = TargetTD->getTemplatedDecl();
12550
12551 UsingShadowDecl *Shadow;
12552 if (NonTemplateTarget && isa<CXXConstructorDecl>(NonTemplateTarget)) {
12553 UsingDecl *Using = cast<UsingDecl>(BUD);
12554 bool IsVirtualBase =
12555 isVirtualDirectBase(cast<CXXRecordDecl>(CurContext),
12556 Using->getQualifier()->getAsRecordDecl());
12558 Context, CurContext, Using->getLocation(), Using, Orig, IsVirtualBase);
12559 } else {
12561 Target->getDeclName(), BUD, Target);
12562 }
12563 BUD->addShadowDecl(Shadow);
12564
12565 Shadow->setAccess(BUD->getAccess());
12566 if (Orig->isInvalidDecl() || BUD->isInvalidDecl())
12567 Shadow->setInvalidDecl();
12568
12569 Shadow->setPreviousDecl(PrevDecl);
12570
12571 if (S)
12572 PushOnScopeChains(Shadow, S);
12573 else
12574 CurContext->addDecl(Shadow);
12575
12576
12577 return Shadow;
12578}
12579
12581 if (Shadow->getDeclName().getNameKind() ==
12583 cast<CXXRecordDecl>(Shadow->getDeclContext())->removeConversion(Shadow);
12584
12585 // Remove it from the DeclContext...
12586 Shadow->getDeclContext()->removeDecl(Shadow);
12587
12588 // ...and the scope, if applicable...
12589 if (S) {
12590 S->RemoveDecl(Shadow);
12591 IdResolver.RemoveDecl(Shadow);
12592 }
12593
12594 // ...and the using decl.
12595 Shadow->getIntroducer()->removeShadowDecl(Shadow);
12596
12597 // TODO: complain somehow if Shadow was used. It shouldn't
12598 // be possible for this to happen, because...?
12599}
12600
12601/// Find the base specifier for a base class with the given type.
12603 QualType DesiredBase,
12604 bool &AnyDependentBases) {
12605 // Check whether the named type is a direct base class.
12606 CanQualType CanonicalDesiredBase = DesiredBase->getCanonicalTypeUnqualified()
12608 for (auto &Base : Derived->bases()) {
12609 CanQualType BaseType = Base.getType()->getCanonicalTypeUnqualified();
12610 if (CanonicalDesiredBase == BaseType)
12611 return &Base;
12612 if (BaseType->isDependentType())
12613 AnyDependentBases = true;
12614 }
12615 return nullptr;
12616}
12617
12618namespace {
12619class UsingValidatorCCC final : public CorrectionCandidateCallback {
12620public:
12621 UsingValidatorCCC(bool HasTypenameKeyword, bool IsInstantiation,
12622 NestedNameSpecifier *NNS, CXXRecordDecl *RequireMemberOf)
12623 : HasTypenameKeyword(HasTypenameKeyword),
12624 IsInstantiation(IsInstantiation), OldNNS(NNS),
12625 RequireMemberOf(RequireMemberOf) {}
12626
12627 bool ValidateCandidate(const TypoCorrection &Candidate) override {
12628 NamedDecl *ND = Candidate.getCorrectionDecl();
12629
12630 // Keywords are not valid here.
12631 if (!ND || isa<NamespaceDecl>(ND))
12632 return false;
12633
12634 // Completely unqualified names are invalid for a 'using' declaration.
12635 if (Candidate.WillReplaceSpecifier() && !Candidate.getCorrectionSpecifier())
12636 return false;
12637
12638 // FIXME: Don't correct to a name that CheckUsingDeclRedeclaration would
12639 // reject.
12640
12641 if (RequireMemberOf) {
12642 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
12643 if (FoundRecord && FoundRecord->isInjectedClassName()) {
12644 // No-one ever wants a using-declaration to name an injected-class-name
12645 // of a base class, unless they're declaring an inheriting constructor.
12646 ASTContext &Ctx = ND->getASTContext();
12647 if (!Ctx.getLangOpts().CPlusPlus11)
12648 return false;
12649 QualType FoundType = Ctx.getRecordType(FoundRecord);
12650
12651 // Check that the injected-class-name is named as a member of its own
12652 // type; we don't want to suggest 'using Derived::Base;', since that
12653 // means something else.
12655 Candidate.WillReplaceSpecifier()
12656 ? Candidate.getCorrectionSpecifier()
12657 : OldNNS;
12658 if (!Specifier->getAsType() ||
12659 !Ctx.hasSameType(QualType(Specifier->getAsType(), 0), FoundType))
12660 return false;
12661
12662 // Check that this inheriting constructor declaration actually names a
12663 // direct base class of the current class.
12664 bool AnyDependentBases = false;
12665 if (!findDirectBaseWithType(RequireMemberOf,
12666 Ctx.getRecordType(FoundRecord),
12667 AnyDependentBases) &&
12668 !AnyDependentBases)
12669 return false;
12670 } else {
12671 auto *RD = dyn_cast<CXXRecordDecl>(ND->getDeclContext());
12672 if (!RD || RequireMemberOf->isProvablyNotDerivedFrom(RD))
12673 return false;
12674
12675 // FIXME: Check that the base class member is accessible?
12676 }
12677 } else {
12678 auto *FoundRecord = dyn_cast<CXXRecordDecl>(ND);
12679 if (FoundRecord && FoundRecord->isInjectedClassName())
12680 return false;
12681 }
12682
12683 if (isa<TypeDecl>(ND))
12684 return HasTypenameKeyword || !IsInstantiation;
12685
12686 return !HasTypenameKeyword;
12687 }
12688
12689 std::unique_ptr<CorrectionCandidateCallback> clone() override {
12690 return std::make_unique<UsingValidatorCCC>(*this);
12691 }
12692
12693private:
12694 bool HasTypenameKeyword;
12695 bool IsInstantiation;
12696 NestedNameSpecifier *OldNNS;
12697 CXXRecordDecl *RequireMemberOf;
12698};
12699} // end anonymous namespace
12700
12702 // It is really dumb that we have to do this.
12703 LookupResult::Filter F = Previous.makeFilter();
12704 while (F.hasNext()) {
12705 NamedDecl *D = F.next();
12706 if (!isDeclInScope(D, CurContext, S))
12707 F.erase();
12708 // If we found a local extern declaration that's not ordinarily visible,
12709 // and this declaration is being added to a non-block scope, ignore it.
12710 // We're only checking for scope conflicts here, not also for violations
12711 // of the linkage rules.
12712 else if (!CurContext->isFunctionOrMethod() && D->isLocalExternDecl() &&
12714 F.erase();
12715 }
12716 F.done();
12717}
12718
12720 Scope *S, AccessSpecifier AS, SourceLocation UsingLoc,
12721 bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS,
12722 DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc,
12723 const ParsedAttributesView &AttrList, bool IsInstantiation,
12724 bool IsUsingIfExists) {
12725 assert(!SS.isInvalid() && "Invalid CXXScopeSpec.");
12726 SourceLocation IdentLoc = NameInfo.getLoc();
12727 assert(IdentLoc.isValid() && "Invalid TargetName location.");
12728
12729 // FIXME: We ignore attributes for now.
12730
12731 // For an inheriting constructor declaration, the name of the using
12732 // declaration is the name of a constructor in this class, not in the
12733 // base class.
12734 DeclarationNameInfo UsingName = NameInfo;
12736 if (auto *RD = dyn_cast<CXXRecordDecl>(CurContext))
12739
12740 // Do the redeclaration lookup in the current scope.
12741 LookupResult Previous(*this, UsingName, LookupUsingDeclName,
12742 RedeclarationKind::ForVisibleRedeclaration);
12743 Previous.setHideTags(false);
12744 if (S) {
12745 LookupName(Previous, S);
12746
12748 } else {
12749 assert(IsInstantiation && "no scope in non-instantiation");
12750 if (CurContext->isRecord())
12752 else {
12753 // No redeclaration check is needed here; in non-member contexts we
12754 // diagnosed all possible conflicts with other using-declarations when
12755 // building the template:
12756 //
12757 // For a dependent non-type using declaration, the only valid case is
12758 // if we instantiate to a single enumerator. We check for conflicts
12759 // between shadow declarations we introduce, and we check in the template
12760 // definition for conflicts between a non-type using declaration and any
12761 // other declaration, which together covers all cases.
12762 //
12763 // A dependent typename using declaration will never successfully
12764 // instantiate, since it will always name a class member, so we reject
12765 // that in the template definition.
12766 }
12767 }
12768
12769 // Check for invalid redeclarations.
12770 if (CheckUsingDeclRedeclaration(UsingLoc, HasTypenameKeyword,
12771 SS, IdentLoc, Previous))
12772 return nullptr;
12773
12774 // 'using_if_exists' doesn't make sense on an inherited constructor.
12775 if (IsUsingIfExists && UsingName.getName().getNameKind() ==
12777 Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
12778 return nullptr;
12779 }
12780
12781 DeclContext *LookupContext = computeDeclContext(SS);
12783 if (!LookupContext || EllipsisLoc.isValid()) {
12784 NamedDecl *D;
12785 // Dependent scope, or an unexpanded pack
12786 if (!LookupContext && CheckUsingDeclQualifier(UsingLoc, HasTypenameKeyword,
12787 SS, NameInfo, IdentLoc))
12788 return nullptr;
12789
12790 if (HasTypenameKeyword) {
12791 // FIXME: not all declaration name kinds are legal here
12793 UsingLoc, TypenameLoc,
12794 QualifierLoc,
12795 IdentLoc, NameInfo.getName(),
12796 EllipsisLoc);
12797 } else {
12799 QualifierLoc, NameInfo, EllipsisLoc);
12800 }
12801 D->setAccess(AS);
12803 ProcessDeclAttributeList(S, D, AttrList);
12804 return D;
12805 }
12806
12807 auto Build = [&](bool Invalid) {
12808 UsingDecl *UD =
12809 UsingDecl::Create(Context, CurContext, UsingLoc, QualifierLoc,
12810 UsingName, HasTypenameKeyword);
12811 UD->setAccess(AS);
12812 CurContext->addDecl(UD);
12813 ProcessDeclAttributeList(S, UD, AttrList);
12815 return UD;
12816 };
12817 auto BuildInvalid = [&]{ return Build(true); };
12818 auto BuildValid = [&]{ return Build(false); };
12819
12820 if (RequireCompleteDeclContext(SS, LookupContext))
12821 return BuildInvalid();
12822
12823 // Look up the target name.
12824 LookupResult R(*this, NameInfo, LookupOrdinaryName);
12825
12826 // Unlike most lookups, we don't always want to hide tag
12827 // declarations: tag names are visible through the using declaration
12828 // even if hidden by ordinary names, *except* in a dependent context
12829 // where they may be used by two-phase lookup.
12830 if (!IsInstantiation)
12831 R.setHideTags(false);
12832
12833 // For the purposes of this lookup, we have a base object type
12834 // equal to that of the current context.
12835 if (CurContext->isRecord()) {
12837 Context.getTypeDeclType(cast<CXXRecordDecl>(CurContext)));
12838 }
12839
12840 LookupQualifiedName(R, LookupContext);
12841
12842 // Validate the context, now we have a lookup
12843 if (CheckUsingDeclQualifier(UsingLoc, HasTypenameKeyword, SS, NameInfo,
12844 IdentLoc, &R))
12845 return nullptr;
12846
12847 if (R.empty() && IsUsingIfExists)
12849 UsingName.getName()),
12850 AS_public);
12851
12852 // Try to correct typos if possible. If constructor name lookup finds no
12853 // results, that means the named class has no explicit constructors, and we
12854 // suppressed declaring implicit ones (probably because it's dependent or
12855 // invalid).
12856 if (R.empty() &&
12858 // HACK 2017-01-08: Work around an issue with libstdc++'s detection of
12859 // ::gets. Sometimes it believes that glibc provides a ::gets in cases where
12860 // it does not. The issue was fixed in libstdc++ 6.3 (2016-12-21) and later.
12861 auto *II = NameInfo.getName().getAsIdentifierInfo();
12862 if (getLangOpts().CPlusPlus14 && II && II->isStr("gets") &&
12864 isa<TranslationUnitDecl>(LookupContext) &&
12865 getSourceManager().isInSystemHeader(UsingLoc))
12866 return nullptr;
12867 UsingValidatorCCC CCC(HasTypenameKeyword, IsInstantiation, SS.getScopeRep(),
12868 dyn_cast<CXXRecordDecl>(CurContext));
12869 if (TypoCorrection Corrected =
12870 CorrectTypo(R.getLookupNameInfo(), R.getLookupKind(), S, &SS, CCC,
12872 // We reject candidates where DroppedSpecifier == true, hence the
12873 // literal '0' below.
12874 diagnoseTypo(Corrected, PDiag(diag::err_no_member_suggest)
12875 << NameInfo.getName() << LookupContext << 0
12876 << SS.getRange());
12877
12878 // If we picked a correction with no attached Decl we can't do anything
12879 // useful with it, bail out.
12880 NamedDecl *ND = Corrected.getCorrectionDecl();
12881 if (!ND)
12882 return BuildInvalid();
12883
12884 // If we corrected to an inheriting constructor, handle it as one.
12885 auto *RD = dyn_cast<CXXRecordDecl>(ND);
12886 if (RD && RD->isInjectedClassName()) {
12887 // The parent of the injected class name is the class itself.
12888 RD = cast<CXXRecordDecl>(RD->getParent());
12889
12890 // Fix up the information we'll use to build the using declaration.
12891 if (Corrected.WillReplaceSpecifier()) {
12893 Builder.MakeTrivial(Context, Corrected.getCorrectionSpecifier(),
12894 QualifierLoc.getSourceRange());
12895 QualifierLoc = Builder.getWithLocInContext(Context);
12896 }
12897
12898 // In this case, the name we introduce is the name of a derived class
12899 // constructor.
12900 auto *CurClass = cast<CXXRecordDecl>(CurContext);
12903 UsingName.setNamedTypeInfo(nullptr);
12904 for (auto *Ctor : LookupConstructors(RD))
12905 R.addDecl(Ctor);
12906 R.resolveKind();
12907 } else {
12908 // FIXME: Pick up all the declarations if we found an overloaded
12909 // function.
12910 UsingName.setName(ND->getDeclName());
12911 R.addDecl(ND);
12912 }
12913 } else {
12914 Diag(IdentLoc, diag::err_no_member)
12915 << NameInfo.getName() << LookupContext << SS.getRange();
12916 return BuildInvalid();
12917 }
12918 }
12919
12920 if (R.isAmbiguous())
12921 return BuildInvalid();
12922
12923 if (HasTypenameKeyword) {
12924 // If we asked for a typename and got a non-type decl, error out.
12925 if (!R.getAsSingle<TypeDecl>() &&
12927 Diag(IdentLoc, diag::err_using_typename_non_type);
12928 for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I)
12929 Diag((*I)->getUnderlyingDecl()->getLocation(),
12930 diag::note_using_decl_target);
12931 return BuildInvalid();
12932 }
12933 } else {
12934 // If we asked for a non-typename and we got a type, error out,
12935 // but only if this is an instantiation of an unresolved using
12936 // decl. Otherwise just silently find the type name.
12937 if (IsInstantiation && R.getAsSingle<TypeDecl>()) {
12938 Diag(IdentLoc, diag::err_using_dependent_value_is_type);
12939 Diag(R.getFoundDecl()->getLocation(), diag::note_using_decl_target);
12940 return BuildInvalid();
12941 }
12942 }
12943
12944 // C++14 [namespace.udecl]p6:
12945 // A using-declaration shall not name a namespace.
12946 if (R.getAsSingle<NamespaceDecl>()) {
12947 Diag(IdentLoc, diag::err_using_decl_can_not_refer_to_namespace)
12948 << SS.getRange();
12949 // Suggest using 'using namespace ...' instead.
12950 Diag(SS.getBeginLoc(), diag::note_namespace_using_decl)
12951 << FixItHint::CreateInsertion(SS.getBeginLoc(), "namespace ");
12952 return BuildInvalid();
12953 }
12954
12955 UsingDecl *UD = BuildValid();
12956
12957 // Some additional rules apply to inheriting constructors.
12958 if (UsingName.getName().getNameKind() ==
12960 // Suppress access diagnostics; the access check is instead performed at the
12961 // point of use for an inheriting constructor.
12964 return UD;
12965 }
12966
12967 for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I) {
12968 UsingShadowDecl *PrevDecl = nullptr;
12969 if (!CheckUsingShadowDecl(UD, *I, Previous, PrevDecl))
12970 BuildUsingShadowDecl(S, UD, *I, PrevDecl);
12971 }
12972
12973 return UD;
12974}
12975
12977 SourceLocation UsingLoc,
12978 SourceLocation EnumLoc,
12979 SourceLocation NameLoc,
12981 EnumDecl *ED) {
12982 bool Invalid = false;
12983
12985 /// In class scope, check if this is a duplicate, for better a diagnostic.
12986 DeclarationNameInfo UsingEnumName(ED->getDeclName(), NameLoc);
12987 LookupResult Previous(*this, UsingEnumName, LookupUsingDeclName,
12988 RedeclarationKind::ForVisibleRedeclaration);
12989
12990 LookupName(Previous, S);
12991
12992 for (NamedDecl *D : Previous)
12993 if (UsingEnumDecl *UED = dyn_cast<UsingEnumDecl>(D))
12994 if (UED->getEnumDecl() == ED) {
12995 Diag(UsingLoc, diag::err_using_enum_decl_redeclaration)
12996 << SourceRange(EnumLoc, NameLoc);
12997 Diag(D->getLocation(), diag::note_using_enum_decl) << 1;
12998 Invalid = true;
12999 break;
13000 }
13001 }
13002
13003 if (RequireCompleteEnumDecl(ED, NameLoc))
13004 Invalid = true;
13005
13007 EnumLoc, NameLoc, EnumType);
13008 UD->setAccess(AS);
13009 CurContext->addDecl(UD);
13010
13011 if (Invalid) {
13012 UD->setInvalidDecl();
13013 return UD;
13014 }
13015
13016 // Create the shadow decls for each enumerator
13017 for (EnumConstantDecl *EC : ED->enumerators()) {
13018 UsingShadowDecl *PrevDecl = nullptr;
13019 DeclarationNameInfo DNI(EC->getDeclName(), EC->getLocation());
13021 RedeclarationKind::ForVisibleRedeclaration);
13022 LookupName(Previous, S);
13024
13025 if (!CheckUsingShadowDecl(UD, EC, Previous, PrevDecl))
13026 BuildUsingShadowDecl(S, UD, EC, PrevDecl);
13027 }
13028
13029 return UD;
13030}
13031
13033 ArrayRef<NamedDecl *> Expansions) {
13034 assert(isa<UnresolvedUsingValueDecl>(InstantiatedFrom) ||
13035 isa<UnresolvedUsingTypenameDecl>(InstantiatedFrom) ||
13036 isa<UsingPackDecl>(InstantiatedFrom));
13037
13038 auto *UPD =
13039 UsingPackDecl::Create(Context, CurContext, InstantiatedFrom, Expansions);
13040 UPD->setAccess(InstantiatedFrom->getAccess());
13041 CurContext->addDecl(UPD);
13042 return UPD;
13043}
13044
13046 assert(!UD->hasTypename() && "expecting a constructor name");
13047
13048 const Type *SourceType = UD->getQualifier()->getAsType();
13049 assert(SourceType &&
13050 "Using decl naming constructor doesn't have type in scope spec.");
13051 CXXRecordDecl *TargetClass = cast<CXXRecordDecl>(CurContext);
13052
13053 // Check whether the named type is a direct base class.
13054 bool AnyDependentBases = false;
13055 auto *Base = findDirectBaseWithType(TargetClass, QualType(SourceType, 0),
13056 AnyDependentBases);
13057 if (!Base && !AnyDependentBases) {
13058 Diag(UD->getUsingLoc(),
13059 diag::err_using_decl_constructor_not_in_direct_base)
13060 << UD->getNameInfo().getSourceRange()
13061 << QualType(SourceType, 0) << TargetClass;
13062 UD->setInvalidDecl();
13063 return true;
13064 }
13065
13066 if (Base)
13067 Base->setInheritConstructors();
13068
13069 return false;
13070}
13071
13073 bool HasTypenameKeyword,
13074 const CXXScopeSpec &SS,
13075 SourceLocation NameLoc,
13076 const LookupResult &Prev) {
13077 NestedNameSpecifier *Qual = SS.getScopeRep();
13078
13079 // C++03 [namespace.udecl]p8:
13080 // C++0x [namespace.udecl]p10:
13081 // A using-declaration is a declaration and can therefore be used
13082 // repeatedly where (and only where) multiple declarations are
13083 // allowed.
13084 //
13085 // That's in non-member contexts.
13087 // A dependent qualifier outside a class can only ever resolve to an
13088 // enumeration type. Therefore it conflicts with any other non-type
13089 // declaration in the same scope.
13090 // FIXME: How should we check for dependent type-type conflicts at block
13091 // scope?
13092 if (Qual->isDependent() && !HasTypenameKeyword) {
13093 for (auto *D : Prev) {
13094 if (!isa<TypeDecl>(D) && !isa<UsingDecl>(D) && !isa<UsingPackDecl>(D)) {
13095 bool OldCouldBeEnumerator =
13096 isa<UnresolvedUsingValueDecl>(D) || isa<EnumConstantDecl>(D);
13097 Diag(NameLoc,
13098 OldCouldBeEnumerator ? diag::err_redefinition
13099 : diag::err_redefinition_different_kind)
13100 << Prev.getLookupName();
13101 Diag(D->getLocation(), diag::note_previous_definition);
13102 return true;
13103 }
13104 }
13105 }
13106 return false;
13107 }
13108
13109 const NestedNameSpecifier *CNNS =
13111 for (LookupResult::iterator I = Prev.begin(), E = Prev.end(); I != E; ++I) {
13112 NamedDecl *D = *I;
13113
13114 bool DTypename;
13115 NestedNameSpecifier *DQual;
13116 if (UsingDecl *UD = dyn_cast<UsingDecl>(D)) {
13117 DTypename = UD->hasTypename();
13118 DQual = UD->getQualifier();
13119 } else if (UnresolvedUsingValueDecl *UD
13120 = dyn_cast<UnresolvedUsingValueDecl>(D)) {
13121 DTypename = false;
13122 DQual = UD->getQualifier();
13123 } else if (UnresolvedUsingTypenameDecl *UD
13124 = dyn_cast<UnresolvedUsingTypenameDecl>(D)) {
13125 DTypename = true;
13126 DQual = UD->getQualifier();
13127 } else continue;
13128
13129 // using decls differ if one says 'typename' and the other doesn't.
13130 // FIXME: non-dependent using decls?
13131 if (HasTypenameKeyword != DTypename) continue;
13132
13133 // using decls differ if they name different scopes (but note that
13134 // template instantiation can cause this check to trigger when it
13135 // didn't before instantiation).
13136 if (CNNS != Context.getCanonicalNestedNameSpecifier(DQual))
13137 continue;
13138
13139 Diag(NameLoc, diag::err_using_decl_redeclaration) << SS.getRange();
13140 Diag(D->getLocation(), diag::note_using_decl) << 1;
13141 return true;
13142 }
13143
13144 return false;
13145}
13146
13147bool Sema::CheckUsingDeclQualifier(SourceLocation UsingLoc, bool HasTypename,
13148 const CXXScopeSpec &SS,
13149 const DeclarationNameInfo &NameInfo,
13150 SourceLocation NameLoc,
13151 const LookupResult *R, const UsingDecl *UD) {
13152 DeclContext *NamedContext = computeDeclContext(SS);
13153 assert(bool(NamedContext) == (R || UD) && !(R && UD) &&
13154 "resolvable context must have exactly one set of decls");
13155
13156 // C++ 20 permits using an enumerator that does not have a class-hierarchy
13157 // relationship.
13158 bool Cxx20Enumerator = false;
13159 if (NamedContext) {
13160 EnumConstantDecl *EC = nullptr;
13161 if (R)
13162 EC = R->getAsSingle<EnumConstantDecl>();
13163 else if (UD && UD->shadow_size() == 1)
13164 EC = dyn_cast<EnumConstantDecl>(UD->shadow_begin()->getTargetDecl());
13165 if (EC)
13166 Cxx20Enumerator = getLangOpts().CPlusPlus20;
13167
13168 if (auto *ED = dyn_cast<EnumDecl>(NamedContext)) {
13169 // C++14 [namespace.udecl]p7:
13170 // A using-declaration shall not name a scoped enumerator.
13171 // C++20 p1099 permits enumerators.
13172 if (EC && R && ED->isScoped())
13173 Diag(SS.getBeginLoc(),
13175 ? diag::warn_cxx17_compat_using_decl_scoped_enumerator
13176 : diag::ext_using_decl_scoped_enumerator)
13177 << SS.getRange();
13178
13179 // We want to consider the scope of the enumerator
13180 NamedContext = ED->getDeclContext();
13181 }
13182 }
13183
13184 if (!CurContext->isRecord()) {
13185 // C++03 [namespace.udecl]p3:
13186 // C++0x [namespace.udecl]p8:
13187 // A using-declaration for a class member shall be a member-declaration.
13188 // C++20 [namespace.udecl]p7
13189 // ... other than an enumerator ...
13190
13191 // If we weren't able to compute a valid scope, it might validly be a
13192 // dependent class or enumeration scope. If we have a 'typename' keyword,
13193 // the scope must resolve to a class type.
13194 if (NamedContext ? !NamedContext->getRedeclContext()->isRecord()
13195 : !HasTypename)
13196 return false; // OK
13197
13198 Diag(NameLoc,
13199 Cxx20Enumerator
13200 ? diag::warn_cxx17_compat_using_decl_class_member_enumerator
13201 : diag::err_using_decl_can_not_refer_to_class_member)
13202 << SS.getRange();
13203
13204 if (Cxx20Enumerator)
13205 return false; // OK
13206
13207 auto *RD = NamedContext
13208 ? cast<CXXRecordDecl>(NamedContext->getRedeclContext())
13209 : nullptr;
13210 if (RD && !RequireCompleteDeclContext(const_cast<CXXScopeSpec &>(SS), RD)) {
13211 // See if there's a helpful fixit
13212
13213 if (!R) {
13214 // We will have already diagnosed the problem on the template
13215 // definition, Maybe we should do so again?
13216 } else if (R->getAsSingle<TypeDecl>()) {
13217 if (getLangOpts().CPlusPlus11) {
13218 // Convert 'using X::Y;' to 'using Y = X::Y;'.
13219 Diag(SS.getBeginLoc(), diag::note_using_decl_class_member_workaround)
13220 << diag::MemClassWorkaround::AliasDecl
13222 NameInfo.getName().getAsString() +
13223 " = ");
13224 } else {
13225 // Convert 'using X::Y;' to 'typedef X::Y Y;'.
13226 SourceLocation InsertLoc = getLocForEndOfToken(NameInfo.getEndLoc());
13227 Diag(InsertLoc, diag::note_using_decl_class_member_workaround)
13228 << diag::MemClassWorkaround::TypedefDecl
13229 << FixItHint::CreateReplacement(UsingLoc, "typedef")
13231 InsertLoc, " " + NameInfo.getName().getAsString());
13232 }
13233 } else if (R->getAsSingle<VarDecl>()) {
13234 // Don't provide a fixit outside C++11 mode; we don't want to suggest
13235 // repeating the type of the static data member here.
13236 FixItHint FixIt;
13237 if (getLangOpts().CPlusPlus11) {
13238 // Convert 'using X::Y;' to 'auto &Y = X::Y;'.
13240 UsingLoc, "auto &" + NameInfo.getName().getAsString() + " = ");
13241 }
13242
13243 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13244 << diag::MemClassWorkaround::ReferenceDecl << FixIt;
13245 } else if (R->getAsSingle<EnumConstantDecl>()) {
13246 // Don't provide a fixit outside C++11 mode; we don't want to suggest
13247 // repeating the type of the enumeration here, and we can't do so if
13248 // the type is anonymous.
13249 FixItHint FixIt;
13250 if (getLangOpts().CPlusPlus11) {
13251 // Convert 'using X::Y;' to 'auto &Y = X::Y;'.
13253 UsingLoc,
13254 "constexpr auto " + NameInfo.getName().getAsString() + " = ");
13255 }
13256
13257 Diag(UsingLoc, diag::note_using_decl_class_member_workaround)
13258 << (getLangOpts().CPlusPlus11
13259 ? diag::MemClassWorkaround::ConstexprVar
13260 : diag::MemClassWorkaround::ConstVar)
13261 << FixIt;
13262 }
13263 }
13264
13265 return true; // Fail
13266 }
13267
13268 // If the named context is dependent, we can't decide much.
13269 if (!NamedContext) {
13270 // FIXME: in C++0x, we can diagnose if we can prove that the
13271 // nested-name-specifier does not refer to a base class, which is
13272 // still possible in some cases.
13273
13274 // Otherwise we have to conservatively report that things might be
13275 // okay.
13276 return false;
13277 }
13278
13279 // The current scope is a record.
13280 if (!NamedContext->isRecord()) {
13281 // Ideally this would point at the last name in the specifier,
13282 // but we don't have that level of source info.
13283 Diag(SS.getBeginLoc(),
13284 Cxx20Enumerator
13285 ? diag::warn_cxx17_compat_using_decl_non_member_enumerator
13286 : diag::err_using_decl_nested_name_specifier_is_not_class)
13287 << SS.getScopeRep() << SS.getRange();
13288
13289 if (Cxx20Enumerator)
13290 return false; // OK
13291
13292 return true;
13293 }
13294
13295 if (!NamedContext->isDependentContext() &&
13296 RequireCompleteDeclContext(const_cast<CXXScopeSpec&>(SS), NamedContext))
13297 return true;
13298
13299 if (getLangOpts().CPlusPlus11) {
13300 // C++11 [namespace.udecl]p3:
13301 // In a using-declaration used as a member-declaration, the
13302 // nested-name-specifier shall name a base class of the class
13303 // being defined.
13304
13305 if (cast<CXXRecordDecl>(CurContext)->isProvablyNotDerivedFrom(
13306 cast<CXXRecordDecl>(NamedContext))) {
13307
13308 if (Cxx20Enumerator) {
13309 Diag(NameLoc, diag::warn_cxx17_compat_using_decl_non_member_enumerator)
13310 << SS.getRange();
13311 return false;
13312 }
13313
13314 if (CurContext == NamedContext) {
13315 Diag(SS.getBeginLoc(),
13316 diag::err_using_decl_nested_name_specifier_is_current_class)
13317 << SS.getRange();
13318 return !getLangOpts().CPlusPlus20;
13319 }
13320
13321 if (!cast<CXXRecordDecl>(NamedContext)->isInvalidDecl()) {
13322 Diag(SS.getBeginLoc(),
13323 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13324 << SS.getScopeRep() << cast<CXXRecordDecl>(CurContext)
13325 << SS.getRange();
13326 }
13327 return true;
13328 }
13329
13330 return false;
13331 }
13332
13333 // C++03 [namespace.udecl]p4:
13334 // A using-declaration used as a member-declaration shall refer
13335 // to a member of a base class of the class being defined [etc.].
13336
13337 // Salient point: SS doesn't have to name a base class as long as
13338 // lookup only finds members from base classes. Therefore we can
13339 // diagnose here only if we can prove that can't happen,
13340 // i.e. if the class hierarchies provably don't intersect.
13341
13342 // TODO: it would be nice if "definitely valid" results were cached
13343 // in the UsingDecl and UsingShadowDecl so that these checks didn't
13344 // need to be repeated.
13345
13347 auto Collect = [&Bases](const CXXRecordDecl *Base) {
13348 Bases.insert(Base);
13349 return true;
13350 };
13351
13352 // Collect all bases. Return false if we find a dependent base.
13353 if (!cast<CXXRecordDecl>(CurContext)->forallBases(Collect))
13354 return false;
13355
13356 // Returns true if the base is dependent or is one of the accumulated base
13357 // classes.
13358 auto IsNotBase = [&Bases](const CXXRecordDecl *Base) {
13359 return !Bases.count(Base);
13360 };
13361
13362 // Return false if the class has a dependent base or if it or one
13363 // of its bases is present in the base set of the current context.
13364 if (Bases.count(cast<CXXRecordDecl>(NamedContext)) ||
13365 !cast<CXXRecordDecl>(NamedContext)->forallBases(IsNotBase))
13366 return false;
13367
13368 Diag(SS.getRange().getBegin(),
13369 diag::err_using_decl_nested_name_specifier_is_not_base_class)
13370 << SS.getScopeRep()
13371 << cast<CXXRecordDecl>(CurContext)
13372 << SS.getRange();
13373
13374 return true;
13375}
13376
13378 MultiTemplateParamsArg TemplateParamLists,
13379 SourceLocation UsingLoc, UnqualifiedId &Name,
13380 const ParsedAttributesView &AttrList,
13381 TypeResult Type, Decl *DeclFromDeclSpec) {
13382 // Get the innermost enclosing declaration scope.
13383 S = S->getDeclParent();
13384
13385 if (Type.isInvalid())
13386 return nullptr;
13387
13388 bool Invalid = false;
13390 TypeSourceInfo *TInfo = nullptr;
13391 GetTypeFromParser(Type.get(), &TInfo);
13392
13393 if (DiagnoseClassNameShadow(CurContext, NameInfo))
13394 return nullptr;
13395
13396 if (DiagnoseUnexpandedParameterPack(Name.StartLocation, TInfo,
13398 Invalid = true;
13400 TInfo->getTypeLoc().getBeginLoc());
13401 }
13402
13403 LookupResult Previous(*this, NameInfo, LookupOrdinaryName,
13404 TemplateParamLists.size()
13406 : RedeclarationKind::ForVisibleRedeclaration);
13407 LookupName(Previous, S);
13408
13409 // Warn about shadowing the name of a template parameter.
13410 if (Previous.isSingleResult() &&
13411 Previous.getFoundDecl()->isTemplateParameter()) {
13412 DiagnoseTemplateParameterShadow(Name.StartLocation,Previous.getFoundDecl());
13413 Previous.clear();
13414 }
13415
13416 assert(Name.getKind() == UnqualifiedIdKind::IK_Identifier &&
13417 "name in alias declaration must be an identifier");
13419 Name.StartLocation,
13420 Name.Identifier, TInfo);
13421
13422 NewTD->setAccess(AS);
13423
13424 if (Invalid)
13425 NewTD->setInvalidDecl();
13426
13427 ProcessDeclAttributeList(S, NewTD, AttrList);
13428 AddPragmaAttributes(S, NewTD);
13429 ProcessAPINotes(NewTD);
13430
13432 Invalid |= NewTD->isInvalidDecl();
13433
13434 bool Redeclaration = false;
13435
13436 NamedDecl *NewND;
13437 if (TemplateParamLists.size()) {
13438 TypeAliasTemplateDecl *OldDecl = nullptr;
13439 TemplateParameterList *OldTemplateParams = nullptr;
13440
13441 if (TemplateParamLists.size() != 1) {
13442 Diag(UsingLoc, diag::err_alias_template_extra_headers)
13443 << SourceRange(TemplateParamLists[1]->getTemplateLoc(),
13444 TemplateParamLists[TemplateParamLists.size()-1]->getRAngleLoc());
13445 Invalid = true;
13446 }
13447 TemplateParameterList *TemplateParams = TemplateParamLists[0];
13448
13449 // Check that we can declare a template here.
13450 if (CheckTemplateDeclScope(S, TemplateParams))
13451 return nullptr;
13452
13453 // Only consider previous declarations in the same scope.
13454 FilterLookupForScope(Previous, CurContext, S, /*ConsiderLinkage*/false,
13455 /*ExplicitInstantiationOrSpecialization*/false);
13456 if (!Previous.empty()) {
13457 Redeclaration = true;
13458
13459 OldDecl = Previous.getAsSingle<TypeAliasTemplateDecl>();
13460 if (!OldDecl && !Invalid) {
13461 Diag(UsingLoc, diag::err_redefinition_different_kind)
13462 << Name.Identifier;
13463
13464 NamedDecl *OldD = Previous.getRepresentativeDecl();
13465 if (OldD->getLocation().isValid())
13466 Diag(OldD->getLocation(), diag::note_previous_definition);
13467
13468 Invalid = true;
13469 }
13470
13471 if (!Invalid && OldDecl && !OldDecl->isInvalidDecl()) {
13472 if (TemplateParameterListsAreEqual(TemplateParams,
13473 OldDecl->getTemplateParameters(),
13474 /*Complain=*/true,
13476 OldTemplateParams =
13478 else
13479 Invalid = true;
13480
13481 TypeAliasDecl *OldTD = OldDecl->getTemplatedDecl();
13482 if (!Invalid &&
13484 NewTD->getUnderlyingType())) {
13485 // FIXME: The C++0x standard does not clearly say this is ill-formed,
13486 // but we can't reasonably accept it.
13487 Diag(NewTD->getLocation(), diag::err_redefinition_different_typedef)
13488 << 2 << NewTD->getUnderlyingType() << OldTD->getUnderlyingType();
13489 if (OldTD->getLocation().isValid())
13490 Diag(OldTD->getLocation(), diag::note_previous_definition);
13491 Invalid = true;
13492 }
13493 }
13494 }
13495
13496 // Merge any previous default template arguments into our parameters,
13497 // and check the parameter list.
13498 if (CheckTemplateParameterList(TemplateParams, OldTemplateParams,
13500 return nullptr;
13501
13502 TypeAliasTemplateDecl *NewDecl =
13504 Name.Identifier, TemplateParams,
13505 NewTD);
13506 NewTD->setDescribedAliasTemplate(NewDecl);
13507
13508 NewDecl->setAccess(AS);
13509
13510 if (Invalid)
13511 NewDecl->setInvalidDecl();
13512 else if (OldDecl) {
13513 NewDecl->setPreviousDecl(OldDecl);
13514 CheckRedeclarationInModule(NewDecl, OldDecl);
13515 }
13516
13517 NewND = NewDecl;
13518 } else {
13519 if (auto *TD = dyn_cast_or_null<TagDecl>(DeclFromDeclSpec)) {
13521 handleTagNumbering(TD, S);
13522 }
13523 ActOnTypedefNameDecl(S, CurContext, NewTD, Previous, Redeclaration);
13524 NewND = NewTD;
13525 }
13526
13527 PushOnScopeChains(NewND, S);
13528 ActOnDocumentableDecl(NewND);
13529 return NewND;
13530}
13531
13533 SourceLocation AliasLoc,
13534 IdentifierInfo *Alias, CXXScopeSpec &SS,
13535 SourceLocation IdentLoc,
13536 IdentifierInfo *Ident) {
13537
13538 // Lookup the namespace name.
13539 LookupResult R(*this, Ident, IdentLoc, LookupNamespaceName);
13540 LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
13541
13542 if (R.isAmbiguous())
13543 return nullptr;
13544
13545 if (R.empty()) {
13546 if (!TryNamespaceTypoCorrection(*this, R, S, SS, IdentLoc, Ident)) {
13547 Diag(IdentLoc, diag::err_expected_namespace_name) << SS.getRange();
13548 return nullptr;
13549 }
13550 }
13551 assert(!R.isAmbiguous() && !R.empty());
13553
13554 // Check if we have a previous declaration with the same name.
13555 LookupResult PrevR(*this, Alias, AliasLoc, LookupOrdinaryName,
13556 RedeclarationKind::ForVisibleRedeclaration);
13557 LookupName(PrevR, S);
13558
13559 // Check we're not shadowing a template parameter.
13560 if (PrevR.isSingleResult() && PrevR.getFoundDecl()->isTemplateParameter()) {
13562 PrevR.clear();
13563 }
13564
13565 // Filter out any other lookup result from an enclosing scope.
13566 FilterLookupForScope(PrevR, CurContext, S, /*ConsiderLinkage*/false,
13567 /*AllowInlineNamespace*/false);
13568
13569 // Find the previous declaration and check that we can redeclare it.
13570 NamespaceAliasDecl *Prev = nullptr;
13571 if (PrevR.isSingleResult()) {
13572 NamedDecl *PrevDecl = PrevR.getRepresentativeDecl();
13573 if (NamespaceAliasDecl *AD = dyn_cast<NamespaceAliasDecl>(PrevDecl)) {
13574 // We already have an alias with the same name that points to the same
13575 // namespace; check that it matches.
13576 if (AD->getNamespace()->Equals(getNamespaceDecl(ND))) {
13577 Prev = AD;
13578 } else if (isVisible(PrevDecl)) {
13579 Diag(AliasLoc, diag::err_redefinition_different_namespace_alias)
13580 << Alias;
13581 Diag(AD->getLocation(), diag::note_previous_namespace_alias)
13582 << AD->getNamespace();
13583 return nullptr;
13584 }
13585 } else if (isVisible(PrevDecl)) {
13586 unsigned DiagID = isa<NamespaceDecl>(PrevDecl->getUnderlyingDecl())
13587 ? diag::err_redefinition
13588 : diag::err_redefinition_different_kind;
13589 Diag(AliasLoc, DiagID) << Alias;
13590 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
13591 return nullptr;
13592 }
13593 }
13594
13595 // The use of a nested name specifier may trigger deprecation warnings.
13596 DiagnoseUseOfDecl(ND, IdentLoc);
13597
13599 NamespaceAliasDecl::Create(Context, CurContext, NamespaceLoc, AliasLoc,
13600 Alias, SS.getWithLocInContext(Context),
13601 IdentLoc, ND);
13602 if (Prev)
13603 AliasDecl->setPreviousDecl(Prev);
13604
13606 return AliasDecl;
13607}
13608
13609namespace {
13610struct SpecialMemberExceptionSpecInfo
13611 : SpecialMemberVisitor<SpecialMemberExceptionSpecInfo> {
13614
13615 SpecialMemberExceptionSpecInfo(Sema &S, CXXMethodDecl *MD,
13619 : SpecialMemberVisitor(S, MD, CSM, ICI), Loc(Loc), ExceptSpec(S) {}
13620
13621 bool visitBase(CXXBaseSpecifier *Base);
13622 bool visitField(FieldDecl *FD);
13623
13624 void visitClassSubobject(CXXRecordDecl *Class, Subobject Subobj,
13625 unsigned Quals);
13626
13627 void visitSubobjectCall(Subobject Subobj,
13629};
13630}
13631
13632bool SpecialMemberExceptionSpecInfo::visitBase(CXXBaseSpecifier *Base) {
13633 auto *RT = Base->getType()->getAs<RecordType>();
13634 if (!RT)
13635 return false;
13636
13637 auto *BaseClass = cast<CXXRecordDecl>(RT->getDecl());
13638 Sema::SpecialMemberOverloadResult SMOR = lookupInheritedCtor(BaseClass);
13639 if (auto *BaseCtor = SMOR.getMethod()) {
13640 visitSubobjectCall(Base, BaseCtor);
13641 return false;
13642 }
13643
13644 visitClassSubobject(BaseClass, Base, 0);
13645 return false;
13646}
13647
13648bool SpecialMemberExceptionSpecInfo::visitField(FieldDecl *FD) {
13650 FD->hasInClassInitializer()) {
13651 Expr *E = FD->getInClassInitializer();
13652 if (!E)
13653 // FIXME: It's a little wasteful to build and throw away a
13654 // CXXDefaultInitExpr here.
13655 // FIXME: We should have a single context note pointing at Loc, and
13656 // this location should be MD->getLocation() instead, since that's
13657 // the location where we actually use the default init expression.
13658 E = S.BuildCXXDefaultInitExpr(Loc, FD).get();
13659 if (E)
13660 ExceptSpec.CalledExpr(E);
13661 } else if (auto *RT = S.Context.getBaseElementType(FD->getType())
13662 ->getAs<RecordType>()) {
13663 visitClassSubobject(cast<CXXRecordDecl>(RT->getDecl()), FD,
13664 FD->getType().getCVRQualifiers());
13665 }
13666 return false;
13667}
13668
13669void SpecialMemberExceptionSpecInfo::visitClassSubobject(CXXRecordDecl *Class,
13670 Subobject Subobj,
13671 unsigned Quals) {
13672 FieldDecl *Field = Subobj.dyn_cast<FieldDecl*>();
13673 bool IsMutable = Field && Field->isMutable();
13674 visitSubobjectCall(Subobj, lookupIn(Class, Quals, IsMutable));
13675}
13676
13677void SpecialMemberExceptionSpecInfo::visitSubobjectCall(
13678 Subobject Subobj, Sema::SpecialMemberOverloadResult SMOR) {
13679 // Note, if lookup fails, it doesn't matter what exception specification we
13680 // choose because the special member will be deleted.
13681 if (CXXMethodDecl *MD = SMOR.getMethod())
13682 ExceptSpec.CalledDecl(getSubobjectLoc(Subobj), MD);
13683}
13684
13686 llvm::APSInt Result;
13688 ExplicitSpec.getExpr(), Context.BoolTy, Result, CCEK_ExplicitBool);
13689 ExplicitSpec.setExpr(Converted.get());
13690 if (Converted.isUsable() && !Converted.get()->isValueDependent()) {
13691 ExplicitSpec.setKind(Result.getBoolValue()
13694 return true;
13695 }
13697 return false;
13698}
13699
13702 if (!ExplicitExpr->isTypeDependent())
13704 return ES;
13705}
13706
13711 ComputingExceptionSpec CES(S, MD, Loc);
13712
13713 CXXRecordDecl *ClassDecl = MD->getParent();
13714
13715 // C++ [except.spec]p14:
13716 // An implicitly declared special member function (Clause 12) shall have an
13717 // exception-specification. [...]
13718 SpecialMemberExceptionSpecInfo Info(S, MD, CSM, ICI, MD->getLocation());
13719 if (ClassDecl->isInvalidDecl())
13720 return Info.ExceptSpec;
13721
13722 // FIXME: If this diagnostic fires, we're probably missing a check for
13723 // attempting to resolve an exception specification before it's known
13724 // at a higher level.
13725 if (S.RequireCompleteType(MD->getLocation(),
13726 S.Context.getRecordType(ClassDecl),
13727 diag::err_exception_spec_incomplete_type))
13728 return Info.ExceptSpec;
13729
13730 // C++1z [except.spec]p7:
13731 // [Look for exceptions thrown by] a constructor selected [...] to
13732 // initialize a potentially constructed subobject,
13733 // C++1z [except.spec]p8:
13734 // The exception specification for an implicitly-declared destructor, or a
13735 // destructor without a noexcept-specifier, is potentially-throwing if and
13736 // only if any of the destructors for any of its potentially constructed
13737 // subojects is potentially throwing.
13738 // FIXME: We respect the first rule but ignore the "potentially constructed"
13739 // in the second rule to resolve a core issue (no number yet) that would have
13740 // us reject:
13741 // struct A { virtual void f() = 0; virtual ~A() noexcept(false) = 0; };
13742 // struct B : A {};
13743 // struct C : B { void f(); };
13744 // ... due to giving B::~B() a non-throwing exception specification.
13745 Info.visit(Info.IsConstructor ? Info.VisitPotentiallyConstructedBases
13746 : Info.VisitAllBases);
13747
13748 return Info.ExceptSpec;
13749}
13750
13751namespace {
13752/// RAII object to register a special member as being currently declared.
13753struct DeclaringSpecialMember {
13754 Sema &S;
13756 Sema::ContextRAII SavedContext;
13757 bool WasAlreadyBeingDeclared;
13758
13759 DeclaringSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM)
13760 : S(S), D(RD, CSM), SavedContext(S, RD) {
13761 WasAlreadyBeingDeclared = !S.SpecialMembersBeingDeclared.insert(D).second;
13762 if (WasAlreadyBeingDeclared)
13763 // This almost never happens, but if it does, ensure that our cache
13764 // doesn't contain a stale result.
13765 S.SpecialMemberCache.clear();
13766 else {
13767 // Register a note to be produced if we encounter an error while
13768 // declaring the special member.
13771 // FIXME: We don't have a location to use here. Using the class's
13772 // location maintains the fiction that we declare all special members
13773 // with the class, but (1) it's not clear that lying about that helps our
13774 // users understand what's going on, and (2) there may be outer contexts
13775 // on the stack (some of which are relevant) and printing them exposes
13776 // our lies.
13778 Ctx.Entity = RD;
13779 Ctx.SpecialMember = CSM;
13781 }
13782 }
13783 ~DeclaringSpecialMember() {
13784 if (!WasAlreadyBeingDeclared) {
13787 }
13788 }
13789
13790 /// Are we already trying to declare this special member?
13791 bool isAlreadyBeingDeclared() const {
13792 return WasAlreadyBeingDeclared;
13793 }
13794};
13795}
13796
13798 // Look up any existing declarations, but don't trigger declaration of all
13799 // implicit special members with this name.
13800 DeclarationName Name = FD->getDeclName();
13802 RedeclarationKind::ForExternalRedeclaration);
13803 for (auto *D : FD->getParent()->lookup(Name))
13804 if (auto *Acceptable = R.getAcceptableDecl(D))
13805 R.addDecl(Acceptable);
13806 R.resolveKind();
13808
13809 CheckFunctionDeclaration(S, FD, R, /*IsMemberSpecialization*/ false,
13811}
13812
13813void Sema::setupImplicitSpecialMemberType(CXXMethodDecl *SpecialMem,
13814 QualType ResultTy,
13815 ArrayRef<QualType> Args) {
13816 // Build an exception specification pointing back at this constructor.
13818
13820 if (AS != LangAS::Default) {
13821 EPI.TypeQuals.addAddressSpace(AS);
13822 }
13823
13824 auto QT = Context.getFunctionType(ResultTy, Args, EPI);
13825 SpecialMem->setType(QT);
13826
13827 // During template instantiation of implicit special member functions we need
13828 // a reliable TypeSourceInfo for the function prototype in order to allow
13829 // functions to be substituted.
13831 cast<CXXRecordDecl>(SpecialMem->getParent())->isLambda()) {
13832 TypeSourceInfo *TSI =
13834 SpecialMem->setTypeSourceInfo(TSI);
13835 }
13836}
13837
13839 CXXRecordDecl *ClassDecl) {
13840 // C++ [class.ctor]p5:
13841 // A default constructor for a class X is a constructor of class X
13842 // that can be called without an argument. If there is no
13843 // user-declared constructor for class X, a default constructor is
13844 // implicitly declared. An implicitly-declared default constructor
13845 // is an inline public member of its class.
13846 assert(ClassDecl->needsImplicitDefaultConstructor() &&
13847 "Should not build implicit default constructor!");
13848
13849 DeclaringSpecialMember DSM(*this, ClassDecl,
13851 if (DSM.isAlreadyBeingDeclared())
13852 return nullptr;
13853
13855 *this, ClassDecl, CXXSpecialMemberKind::DefaultConstructor, false);
13856
13857 // Create the actual constructor declaration.
13858 CanQualType ClassType
13860 SourceLocation ClassLoc = ClassDecl->getLocation();
13861 DeclarationName Name
13863 DeclarationNameInfo NameInfo(Name, ClassLoc);
13865 Context, ClassDecl, ClassLoc, NameInfo, /*Type*/ QualType(),
13866 /*TInfo=*/nullptr, ExplicitSpecifier(),
13867 getCurFPFeatures().isFPConstrained(),
13868 /*isInline=*/true, /*isImplicitlyDeclared=*/true,
13871 DefaultCon->setAccess(AS_public);
13872 DefaultCon->setDefaulted();
13873
13874 setupImplicitSpecialMemberType(DefaultCon, Context.VoidTy, {});
13875
13876 if (getLangOpts().CUDA)
13878 ClassDecl, CXXSpecialMemberKind::DefaultConstructor, DefaultCon,
13879 /* ConstRHS */ false,
13880 /* Diagnose */ false);
13881
13882 // We don't need to use SpecialMemberIsTrivial here; triviality for default
13883 // constructors is easy to compute.
13884 DefaultCon->setTrivial(ClassDecl->hasTrivialDefaultConstructor());
13885
13886 // Note that we have declared this constructor.
13888
13889 Scope *S = getScopeForContext(ClassDecl);
13891
13892 if (ShouldDeleteSpecialMember(DefaultCon,
13894 SetDeclDeleted(DefaultCon, ClassLoc);
13895
13896 if (S)
13897 PushOnScopeChains(DefaultCon, S, false);
13898 ClassDecl->addDecl(DefaultCon);
13899
13900 return DefaultCon;
13901}
13902
13904 CXXConstructorDecl *Constructor) {
13905 assert((Constructor->isDefaulted() && Constructor->isDefaultConstructor() &&
13906 !Constructor->doesThisDeclarationHaveABody() &&
13907 !Constructor->isDeleted()) &&
13908 "DefineImplicitDefaultConstructor - call it for implicit default ctor");
13909 if (Constructor->willHaveBody() || Constructor->isInvalidDecl())
13910 return;
13911
13912 CXXRecordDecl *ClassDecl = Constructor->getParent();
13913 assert(ClassDecl && "DefineImplicitDefaultConstructor - invalid constructor");
13914 if (ClassDecl->isInvalidDecl()) {
13915 return;
13916 }
13917
13918 SynthesizedFunctionScope Scope(*this, Constructor);
13919
13920 // The exception specification is needed because we are defining the
13921 // function.
13922 ResolveExceptionSpec(CurrentLocation,
13923 Constructor->getType()->castAs<FunctionProtoType>());
13924 MarkVTableUsed(CurrentLocation, ClassDecl);
13925
13926 // Add a context note for diagnostics produced after this point.
13927 Scope.addContextNote(CurrentLocation);
13928
13929 if (SetCtorInitializers(Constructor, /*AnyErrors=*/false)) {
13930 Constructor->setInvalidDecl();
13931 return;
13932 }
13933
13934 SourceLocation Loc = Constructor->getEndLoc().isValid()
13935 ? Constructor->getEndLoc()
13936 : Constructor->getLocation();
13937 Constructor->setBody(new (Context) CompoundStmt(Loc));
13938 Constructor->markUsed(Context);
13939
13941 L->CompletedImplicitDefinition(Constructor);
13942 }
13943
13944 DiagnoseUninitializedFields(*this, Constructor);
13945}
13946
13948 // Perform any delayed checks on exception specifications.
13950}
13951
13952/// Find or create the fake constructor we synthesize to model constructing an
13953/// object of a derived class via a constructor of a base class.
13956 CXXConstructorDecl *BaseCtor,
13958 CXXRecordDecl *Derived = Shadow->getParent();
13959 SourceLocation UsingLoc = Shadow->getLocation();
13960
13961 // FIXME: Add a new kind of DeclarationName for an inherited constructor.
13962 // For now we use the name of the base class constructor as a member of the
13963 // derived class to indicate a (fake) inherited constructor name.
13964 DeclarationName Name = BaseCtor->getDeclName();
13965
13966 // Check to see if we already have a fake constructor for this inherited
13967 // constructor call.
13968 for (NamedDecl *Ctor : Derived->lookup(Name))
13969 if (declaresSameEntity(cast<CXXConstructorDecl>(Ctor)
13970 ->getInheritedConstructor()
13971 .getConstructor(),
13972 BaseCtor))
13973 return cast<CXXConstructorDecl>(Ctor);
13974
13975 DeclarationNameInfo NameInfo(Name, UsingLoc);
13976 TypeSourceInfo *TInfo =
13977 Context.getTrivialTypeSourceInfo(BaseCtor->getType(), UsingLoc);
13978 FunctionProtoTypeLoc ProtoLoc =
13980
13981 // Check the inherited constructor is valid and find the list of base classes
13982 // from which it was inherited.
13983 InheritedConstructorInfo ICI(*this, Loc, Shadow);
13984
13985 bool Constexpr = BaseCtor->isConstexpr() &&
13988 false, BaseCtor, &ICI);
13989
13991 Context, Derived, UsingLoc, NameInfo, TInfo->getType(), TInfo,
13992 BaseCtor->getExplicitSpecifier(), getCurFPFeatures().isFPConstrained(),
13993 /*isInline=*/true,
13994 /*isImplicitlyDeclared=*/true,
13996 InheritedConstructor(Shadow, BaseCtor),
13997 BaseCtor->getTrailingRequiresClause());
13998 if (Shadow->isInvalidDecl())
13999 DerivedCtor->setInvalidDecl();
14000
14001 // Build an unevaluated exception specification for this fake constructor.
14002 const FunctionProtoType *FPT = TInfo->getType()->castAs<FunctionProtoType>();
14005 EPI.ExceptionSpec.SourceDecl = DerivedCtor;
14006 DerivedCtor->setType(Context.getFunctionType(FPT->getReturnType(),
14007 FPT->getParamTypes(), EPI));
14008
14009 // Build the parameter declarations.
14011 for (unsigned I = 0, N = FPT->getNumParams(); I != N; ++I) {
14012 TypeSourceInfo *TInfo =
14015 Context, DerivedCtor, UsingLoc, UsingLoc, /*IdentifierInfo=*/nullptr,
14016 FPT->getParamType(I), TInfo, SC_None, /*DefArg=*/nullptr);
14017 PD->setScopeInfo(0, I);
14018 PD->setImplicit();
14019 // Ensure attributes are propagated onto parameters (this matters for
14020 // format, pass_object_size, ...).
14021 mergeDeclAttributes(PD, BaseCtor->getParamDecl(I));
14022 ParamDecls.push_back(PD);
14023 ProtoLoc.setParam(I, PD);
14024 }
14025
14026 // Set up the new constructor.
14027 assert(!BaseCtor->isDeleted() && "should not use deleted constructor");
14028 DerivedCtor->setAccess(BaseCtor->getAccess());
14029 DerivedCtor->setParams(ParamDecls);
14030 Derived->addDecl(DerivedCtor);
14031
14032 if (ShouldDeleteSpecialMember(DerivedCtor,
14034 SetDeclDeleted(DerivedCtor, UsingLoc);
14035
14036 return DerivedCtor;
14037}
14038
14040 InheritedConstructorInfo ICI(*this, Ctor->getLocation(),
14043 &ICI,
14044 /*Diagnose*/ true);
14045}
14046
14048 CXXConstructorDecl *Constructor) {
14049 CXXRecordDecl *ClassDecl = Constructor->getParent();
14050 assert(Constructor->getInheritedConstructor() &&
14051 !Constructor->doesThisDeclarationHaveABody() &&
14052 !Constructor->isDeleted());
14053 if (Constructor->willHaveBody() || Constructor->isInvalidDecl())
14054 return;
14055
14056 // Initializations are performed "as if by a defaulted default constructor",
14057 // so enter the appropriate scope.
14058 SynthesizedFunctionScope Scope(*this, Constructor);
14059
14060 // The exception specification is needed because we are defining the
14061 // function.
14062 ResolveExceptionSpec(CurrentLocation,
14063 Constructor->getType()->castAs<FunctionProtoType>());
14064 MarkVTableUsed(CurrentLocation, ClassDecl);
14065
14066 // Add a context note for diagnostics produced after this point.
14067 Scope.addContextNote(CurrentLocation);
14068
14070 Constructor->getInheritedConstructor().getShadowDecl();
14071 CXXConstructorDecl *InheritedCtor =
14072 Constructor->getInheritedConstructor().getConstructor();
14073
14074 // [class.inhctor.init]p1:
14075 // initialization proceeds as if a defaulted default constructor is used to
14076 // initialize the D object and each base class subobject from which the
14077 // constructor was inherited
14078
14079 InheritedConstructorInfo ICI(*this, CurrentLocation, Shadow);
14080 CXXRecordDecl *RD = Shadow->getParent();
14081 SourceLocation InitLoc = Shadow->getLocation();
14082
14083 // Build explicit initializers for all base classes from which the
14084 // constructor was inherited.
14086 for (bool VBase : {false, true}) {
14087 for (CXXBaseSpecifier &B : VBase ? RD->vbases() : RD->bases()) {
14088 if (B.isVirtual() != VBase)
14089 continue;
14090
14091 auto *BaseRD = B.getType()->getAsCXXRecordDecl();
14092 if (!BaseRD)
14093 continue;
14094
14095 auto BaseCtor = ICI.findConstructorForBase(BaseRD, InheritedCtor);
14096 if (!BaseCtor.first)
14097 continue;
14098
14099 MarkFunctionReferenced(CurrentLocation, BaseCtor.first);
14101 InitLoc, B.getType(), BaseCtor.first, VBase, BaseCtor.second);
14102
14103 auto *TInfo = Context.getTrivialTypeSourceInfo(B.getType(), InitLoc);
14104 Inits.push_back(new (Context) CXXCtorInitializer(
14105 Context, TInfo, VBase, InitLoc, Init.get(), InitLoc,
14106 SourceLocation()));
14107 }
14108 }
14109
14110 // We now proceed as if for a defaulted default constructor, with the relevant
14111 // initializers replaced.
14112
14113 if (SetCtorInitializers(Constructor, /*AnyErrors*/false, Inits)) {
14114 Constructor->setInvalidDecl();
14115 return;
14116 }
14117
14118 Constructor->setBody(new (Context) CompoundStmt(InitLoc));
14119 Constructor->markUsed(Context);
14120
14122 L->CompletedImplicitDefinition(Constructor);
14123 }
14124
14125 DiagnoseUninitializedFields(*this, Constructor);
14126}
14127
14129 // C++ [class.dtor]p2:
14130 // If a class has no user-declared destructor, a destructor is
14131 // declared implicitly. An implicitly-declared destructor is an
14132 // inline public member of its class.
14133 assert(ClassDecl->needsImplicitDestructor());
14134
14135 DeclaringSpecialMember DSM(*this, ClassDecl,
14137 if (DSM.isAlreadyBeingDeclared())
14138 return nullptr;
14139
14141 *this, ClassDecl, CXXSpecialMemberKind::Destructor, false);
14142
14143 // Create the actual destructor declaration.
14144 CanQualType ClassType
14146 SourceLocation ClassLoc = ClassDecl->getLocation();
14147 DeclarationName Name
14149 DeclarationNameInfo NameInfo(Name, ClassLoc);
14151 Context, ClassDecl, ClassLoc, NameInfo, QualType(), nullptr,
14152 getCurFPFeatures().isFPConstrained(),
14153 /*isInline=*/true,
14154 /*isImplicitlyDeclared=*/true,
14157 Destructor->setAccess(AS_public);
14158 Destructor->setDefaulted();
14159
14160 setupImplicitSpecialMemberType(Destructor, Context.VoidTy, {});
14161
14162 if (getLangOpts().CUDA)
14165 /* ConstRHS */ false,
14166 /* Diagnose */ false);
14167
14168 // We don't need to use SpecialMemberIsTrivial here; triviality for
14169 // destructors is easy to compute.
14170 Destructor->setTrivial(ClassDecl->hasTrivialDestructor());
14171 Destructor->setTrivialForCall(ClassDecl->hasAttr<TrivialABIAttr>() ||
14172 ClassDecl->hasTrivialDestructorForCall());
14173
14174 // Note that we have declared this destructor.
14176
14177 Scope *S = getScopeForContext(ClassDecl);
14179
14180 // We can't check whether an implicit destructor is deleted before we complete
14181 // the definition of the class, because its validity depends on the alignment
14182 // of the class. We'll check this from ActOnFields once the class is complete.
14183 if (ClassDecl->isCompleteDefinition() &&
14185 SetDeclDeleted(Destructor, ClassLoc);
14186
14187 // Introduce this destructor into its scope.
14188 if (S)
14189 PushOnScopeChains(Destructor, S, false);
14190 ClassDecl->addDecl(Destructor);
14191
14192 return Destructor;
14193}
14194
14197 assert((Destructor->isDefaulted() &&
14198 !Destructor->doesThisDeclarationHaveABody() &&
14199 !Destructor->isDeleted()) &&
14200 "DefineImplicitDestructor - call it for implicit default dtor");
14201 if (Destructor->willHaveBody() || Destructor->isInvalidDecl())
14202 return;
14203
14204 CXXRecordDecl *ClassDecl = Destructor->getParent();
14205 assert(ClassDecl && "DefineImplicitDestructor - invalid destructor");
14206
14208
14209 // The exception specification is needed because we are defining the
14210 // function.
14211 ResolveExceptionSpec(CurrentLocation,
14212 Destructor->getType()->castAs<FunctionProtoType>());
14213 MarkVTableUsed(CurrentLocation, ClassDecl);
14214
14215 // Add a context note for diagnostics produced after this point.
14216 Scope.addContextNote(CurrentLocation);
14217
14219 Destructor->getParent());
14220
14222 Destructor->setInvalidDecl();
14223 return;
14224 }
14225
14226 SourceLocation Loc = Destructor->getEndLoc().isValid()
14227 ? Destructor->getEndLoc()
14228 : Destructor->getLocation();
14229 Destructor->setBody(new (Context) CompoundStmt(Loc));
14230 Destructor->markUsed(Context);
14231
14233 L->CompletedImplicitDefinition(Destructor);
14234 }
14235}
14236
14239 if (Destructor->isInvalidDecl())
14240 return;
14241
14242 CXXRecordDecl *ClassDecl = Destructor->getParent();
14244 "implicit complete dtors unneeded outside MS ABI");
14245 assert(ClassDecl->getNumVBases() > 0 &&
14246 "complete dtor only exists for classes with vbases");
14247
14249
14250 // Add a context note for diagnostics produced after this point.
14251 Scope.addContextNote(CurrentLocation);
14252
14253 MarkVirtualBaseDestructorsReferenced(Destructor->getLocation(), ClassDecl);
14254}
14255
14257 // If the context is an invalid C++ class, just suppress these checks.
14258 if (CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(CurContext)) {
14259 if (Record->isInvalidDecl()) {
14262 return;
14263 }
14265 }
14266}
14267
14270
14271 if (!DelayedDllExportMemberFunctions.empty()) {
14273 std::swap(DelayedDllExportMemberFunctions, WorkList);
14274 for (CXXMethodDecl *M : WorkList) {
14275 DefineDefaultedFunction(*this, M, M->getLocation());
14276
14277 // Pass the method to the consumer to get emitted. This is not necessary
14278 // for explicit instantiation definitions, as they will get emitted
14279 // anyway.
14280 if (M->getParent()->getTemplateSpecializationKind() !=
14283 }
14284 }
14285}
14286
14288 if (!DelayedDllExportClasses.empty()) {
14289 // Calling ReferenceDllExportedMembers might cause the current function to
14290 // be called again, so use a local copy of DelayedDllExportClasses.
14292 std::swap(DelayedDllExportClasses, WorkList);
14293 for (CXXRecordDecl *Class : WorkList)
14295 }
14296}
14297
14299 assert(getLangOpts().CPlusPlus11 &&
14300 "adjusting dtor exception specs was introduced in c++11");
14301
14302 if (Destructor->isDependentContext())
14303 return;
14304
14305 // C++11 [class.dtor]p3:
14306 // A declaration of a destructor that does not have an exception-
14307 // specification is implicitly considered to have the same exception-
14308 // specification as an implicit declaration.
14309 const auto *DtorType = Destructor->getType()->castAs<FunctionProtoType>();
14310 if (DtorType->hasExceptionSpec())
14311 return;
14312
14313 // Replace the destructor's type, building off the existing one. Fortunately,
14314 // the only thing of interest in the destructor type is its extended info.
14315 // The return and arguments are fixed.
14316 FunctionProtoType::ExtProtoInfo EPI = DtorType->getExtProtoInfo();
14319 Destructor->setType(Context.getFunctionType(Context.VoidTy, {}, EPI));
14320
14321 // FIXME: If the destructor has a body that could throw, and the newly created
14322 // spec doesn't allow exceptions, we should emit a warning, because this
14323 // change in behavior can break conforming C++03 programs at runtime.
14324 // However, we don't have a body or an exception specification yet, so it
14325 // needs to be done somewhere else.
14326}
14327
14328namespace {
14329/// An abstract base class for all helper classes used in building the
14330// copy/move operators. These classes serve as factory functions and help us
14331// avoid using the same Expr* in the AST twice.
14332class ExprBuilder {
14333 ExprBuilder(const ExprBuilder&) = delete;
14334 ExprBuilder &operator=(const ExprBuilder&) = delete;
14335
14336protected:
14337 static Expr *assertNotNull(Expr *E) {
14338 assert(E && "Expression construction must not fail.");
14339 return E;
14340 }
14341
14342public:
14343 ExprBuilder() {}
14344 virtual ~ExprBuilder() {}
14345
14346 virtual Expr *build(Sema &S, SourceLocation Loc) const = 0;
14347};
14348
14349class RefBuilder: public ExprBuilder {
14350 VarDecl *Var;
14351 QualType VarType;
14352
14353public:
14354 Expr *build(Sema &S, SourceLocation Loc) const override {
14355 return assertNotNull(S.BuildDeclRefExpr(Var, VarType, VK_LValue, Loc));
14356 }
14357
14358 RefBuilder(VarDecl *Var, QualType VarType)
14359 : Var(Var), VarType(VarType) {}
14360};
14361
14362class ThisBuilder: public ExprBuilder {
14363public:
14364 Expr *build(Sema &S, SourceLocation Loc) const override {
14365 return assertNotNull(S.ActOnCXXThis(Loc).getAs<Expr>());
14366 }
14367};
14368
14369class CastBuilder: public ExprBuilder {
14370 const ExprBuilder &Builder;
14371 QualType Type;
14373 const CXXCastPath &Path;
14374
14375public:
14376 Expr *build(Sema &S, SourceLocation Loc) const override {
14377 return assertNotNull(S.ImpCastExprToType(Builder.build(S, Loc), Type,
14378 CK_UncheckedDerivedToBase, Kind,
14379 &Path).get());
14380 }
14381
14382 CastBuilder(const ExprBuilder &Builder, QualType Type, ExprValueKind Kind,
14383 const CXXCastPath &Path)
14384 : Builder(Builder), Type(Type), Kind(Kind), Path(Path) {}
14385};
14386
14387class DerefBuilder: public ExprBuilder {
14388 const ExprBuilder &Builder;
14389
14390public:
14391 Expr *build(Sema &S, SourceLocation Loc) const override {
14392 return assertNotNull(
14393 S.CreateBuiltinUnaryOp(Loc, UO_Deref, Builder.build(S, Loc)).get());
14394 }
14395
14396 DerefBuilder(const ExprBuilder &Builder) : Builder(Builder) {}
14397};
14398
14399class MemberBuilder: public ExprBuilder {
14400 const ExprBuilder &Builder;
14401 QualType Type;
14402 CXXScopeSpec SS;
14403 bool IsArrow;
14404 LookupResult &MemberLookup;
14405
14406public:
14407 Expr *build(Sema &S, SourceLocation Loc) const override {
14408 return assertNotNull(S.BuildMemberReferenceExpr(
14409 Builder.build(S, Loc), Type, Loc, IsArrow, SS, SourceLocation(),
14410 nullptr, MemberLookup, nullptr, nullptr).get());
14411 }
14412
14413 MemberBuilder(const ExprBuilder &Builder, QualType Type, bool IsArrow,
14414 LookupResult &MemberLookup)
14415 : Builder(Builder), Type(Type), IsArrow(IsArrow),
14416 MemberLookup(MemberLookup) {}
14417};
14418
14419class MoveCastBuilder: public ExprBuilder {
14420 const ExprBuilder &Builder;
14421
14422public:
14423 Expr *build(Sema &S, SourceLocation Loc) const override {
14424 return assertNotNull(CastForMoving(S, Builder.build(S, Loc)));
14425 }
14426
14427 MoveCastBuilder(const ExprBuilder &Builder) : Builder(Builder) {}
14428};
14429
14430class LvalueConvBuilder: public ExprBuilder {
14431 const ExprBuilder &Builder;
14432
14433public:
14434 Expr *build(Sema &S, SourceLocation Loc) const override {
14435 return assertNotNull(
14436 S.DefaultLvalueConversion(Builder.build(S, Loc)).get());
14437 }
14438
14439 LvalueConvBuilder(const ExprBuilder &Builder) : Builder(Builder) {}
14440};
14441
14442class SubscriptBuilder: public ExprBuilder {
14443 const ExprBuilder &Base;
14444 const ExprBuilder &Index;
14445
14446public:
14447 Expr *build(Sema &S, SourceLocation Loc) const override {
14448 return assertNotNull(S.CreateBuiltinArraySubscriptExpr(
14449 Base.build(S, Loc), Loc, Index.build(S, Loc), Loc).get());
14450 }
14451
14452 SubscriptBuilder(const ExprBuilder &Base, const ExprBuilder &Index)
14453 : Base(Base), Index(Index) {}
14454};
14455
14456} // end anonymous namespace
14457
14458/// When generating a defaulted copy or move assignment operator, if a field
14459/// should be copied with __builtin_memcpy rather than via explicit assignments,
14460/// do so. This optimization only applies for arrays of scalars, and for arrays
14461/// of class type where the selected copy/move-assignment operator is trivial.
14462static StmtResult
14464 const ExprBuilder &ToB, const ExprBuilder &FromB) {
14465 // Compute the size of the memory buffer to be copied.
14466 QualType SizeType = S.Context.getSizeType();
14467 llvm::APInt Size(S.Context.getTypeSize(SizeType),
14469
14470 // Take the address of the field references for "from" and "to". We
14471 // directly construct UnaryOperators here because semantic analysis
14472 // does not permit us to take the address of an xvalue.
14473 Expr *From = FromB.build(S, Loc);
14474 From = UnaryOperator::Create(
14475 S.Context, From, UO_AddrOf, S.Context.getPointerType(From->getType()),
14477 Expr *To = ToB.build(S, Loc);
14479 S.Context, To, UO_AddrOf, S.Context.getPointerType(To->getType()),
14481
14482 const Type *E = T->getBaseElementTypeUnsafe();
14483 bool NeedsCollectableMemCpy =
14484 E->isRecordType() &&
14485 E->castAs<RecordType>()->getDecl()->hasObjectMember();
14486
14487 // Create a reference to the __builtin_objc_memmove_collectable function
14488 StringRef MemCpyName = NeedsCollectableMemCpy ?
14489 "__builtin_objc_memmove_collectable" :
14490 "__builtin_memcpy";
14491 LookupResult R(S, &S.Context.Idents.get(MemCpyName), Loc,
14493 S.LookupName(R, S.TUScope, true);
14494
14495 FunctionDecl *MemCpy = R.getAsSingle<FunctionDecl>();
14496 if (!MemCpy)
14497 // Something went horribly wrong earlier, and we will have complained
14498 // about it.
14499 return StmtError();
14500
14501 ExprResult MemCpyRef = S.BuildDeclRefExpr(MemCpy, S.Context.BuiltinFnTy,
14502 VK_PRValue, Loc, nullptr);
14503 assert(MemCpyRef.isUsable() && "Builtin reference cannot fail");
14504
14505 Expr *CallArgs[] = {
14506 To, From, IntegerLiteral::Create(S.Context, Size, SizeType, Loc)
14507 };
14508 ExprResult Call = S.BuildCallExpr(/*Scope=*/nullptr, MemCpyRef.get(),
14509 Loc, CallArgs, Loc);
14510
14511 assert(!Call.isInvalid() && "Call to __builtin_memcpy cannot fail!");
14512 return Call.getAs<Stmt>();
14513}
14514
14515/// Builds a statement that copies/moves the given entity from \p From to
14516/// \c To.
14517///
14518/// This routine is used to copy/move the members of a class with an
14519/// implicitly-declared copy/move assignment operator. When the entities being
14520/// copied are arrays, this routine builds for loops to copy them.
14521///
14522/// \param S The Sema object used for type-checking.
14523///
14524/// \param Loc The location where the implicit copy/move is being generated.
14525///
14526/// \param T The type of the expressions being copied/moved. Both expressions
14527/// must have this type.
14528///
14529/// \param To The expression we are copying/moving to.
14530///
14531/// \param From The expression we are copying/moving from.
14532///
14533/// \param CopyingBaseSubobject Whether we're copying/moving a base subobject.
14534/// Otherwise, it's a non-static member subobject.
14535///
14536/// \param Copying Whether we're copying or moving.
14537///
14538/// \param Depth Internal parameter recording the depth of the recursion.
14539///
14540/// \returns A statement or a loop that copies the expressions, or StmtResult(0)
14541/// if a memcpy should be used instead.
14542static StmtResult
14544 const ExprBuilder &To, const ExprBuilder &From,
14545 bool CopyingBaseSubobject, bool Copying,
14546 unsigned Depth = 0) {
14547 // C++11 [class.copy]p28:
14548 // Each subobject is assigned in the manner appropriate to its type:
14549 //
14550 // - if the subobject is of class type, as if by a call to operator= with
14551 // the subobject as the object expression and the corresponding
14552 // subobject of x as a single function argument (as if by explicit
14553 // qualification; that is, ignoring any possible virtual overriding
14554 // functions in more derived classes);
14555 //
14556 // C++03 [class.copy]p13:
14557 // - if the subobject is of class type, the copy assignment operator for
14558 // the class is used (as if by explicit qualification; that is,
14559 // ignoring any possible virtual overriding functions in more derived
14560 // classes);
14561 if (const RecordType *RecordTy = T->getAs<RecordType>()) {
14562 CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(RecordTy->getDecl());
14563
14564 // Look for operator=.
14565 DeclarationName Name
14567 LookupResult OpLookup(S, Name, Loc, Sema::LookupOrdinaryName);
14568 S.LookupQualifiedName(OpLookup, ClassDecl, false);
14569
14570 // Prior to C++11, filter out any result that isn't a copy/move-assignment
14571 // operator.
14572 if (!S.getLangOpts().CPlusPlus11) {
14573 LookupResult::Filter F = OpLookup.makeFilter();
14574 while (F.hasNext()) {
14575 NamedDecl *D = F.next();
14576 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D))
14577 if (Method->isCopyAssignmentOperator() ||
14578 (!Copying && Method->isMoveAssignmentOperator()))
14579 continue;
14580
14581 F.erase();
14582 }
14583 F.done();
14584 }
14585
14586 // Suppress the protected check (C++ [class.protected]) for each of the
14587 // assignment operators we found. This strange dance is required when
14588 // we're assigning via a base classes's copy-assignment operator. To
14589 // ensure that we're getting the right base class subobject (without
14590 // ambiguities), we need to cast "this" to that subobject type; to
14591 // ensure that we don't go through the virtual call mechanism, we need
14592 // to qualify the operator= name with the base class (see below). However,
14593 // this means that if the base class has a protected copy assignment
14594 // operator, the protected member access check will fail. So, we
14595 // rewrite "protected" access to "public" access in this case, since we
14596 // know by construction that we're calling from a derived class.
14597 if (CopyingBaseSubobject) {
14598 for (LookupResult::iterator L = OpLookup.begin(), LEnd = OpLookup.end();
14599 L != LEnd; ++L) {
14600 if (L.getAccess() == AS_protected)
14601 L.setAccess(AS_public);
14602 }
14603 }
14604
14605 // Create the nested-name-specifier that will be used to qualify the
14606 // reference to operator=; this is required to suppress the virtual
14607 // call mechanism.
14608 CXXScopeSpec SS;
14609 const Type *CanonicalT = S.Context.getCanonicalType(T.getTypePtr());
14610 SS.MakeTrivial(S.Context,
14611 NestedNameSpecifier::Create(S.Context, nullptr, false,
14612 CanonicalT),
14613 Loc);
14614
14615 // Create the reference to operator=.
14616 ExprResult OpEqualRef
14617 = S.BuildMemberReferenceExpr(To.build(S, Loc), T, Loc, /*IsArrow=*/false,
14618 SS, /*TemplateKWLoc=*/SourceLocation(),
14619 /*FirstQualifierInScope=*/nullptr,
14620 OpLookup,
14621 /*TemplateArgs=*/nullptr, /*S*/nullptr,
14622 /*SuppressQualifierCheck=*/true);
14623 if (OpEqualRef.isInvalid())
14624 return StmtError();
14625
14626 // Build the call to the assignment operator.
14627
14628 Expr *FromInst = From.build(S, Loc);
14629 ExprResult Call = S.BuildCallToMemberFunction(/*Scope=*/nullptr,
14630 OpEqualRef.getAs<Expr>(),
14631 Loc, FromInst, Loc);
14632 if (Call.isInvalid())
14633 return StmtError();
14634
14635 // If we built a call to a trivial 'operator=' while copying an array,
14636 // bail out. We'll replace the whole shebang with a memcpy.
14637 CXXMemberCallExpr *CE = dyn_cast<CXXMemberCallExpr>(Call.get());
14638 if (CE && CE->getMethodDecl()->isTrivial() && Depth)
14639 return StmtResult((Stmt*)nullptr);
14640
14641 // Convert to an expression-statement, and clean up any produced
14642 // temporaries.
14643 return S.ActOnExprStmt(Call);
14644 }
14645
14646 // - if the subobject is of scalar type, the built-in assignment
14647 // operator is used.
14649 if (!ArrayTy) {
14650 ExprResult Assignment = S.CreateBuiltinBinOp(
14651 Loc, BO_Assign, To.build(S, Loc), From.build(S, Loc));
14652 if (Assignment.isInvalid())
14653 return StmtError();
14654 return S.ActOnExprStmt(Assignment);
14655 }
14656
14657 // - if the subobject is an array, each element is assigned, in the
14658 // manner appropriate to the element type;
14659
14660 // Construct a loop over the array bounds, e.g.,
14661 //
14662 // for (__SIZE_TYPE__ i0 = 0; i0 != array-size; ++i0)
14663 //
14664 // that will copy each of the array elements.
14665 QualType SizeType = S.Context.getSizeType();
14666
14667 // Create the iteration variable.
14668 IdentifierInfo *IterationVarName = nullptr;
14669 {
14670 SmallString<8> Str;
14671 llvm::raw_svector_ostream OS(Str);
14672 OS << "__i" << Depth;
14673 IterationVarName = &S.Context.Idents.get(OS.str());
14674 }
14675 VarDecl *IterationVar = VarDecl::Create(S.Context, S.CurContext, Loc, Loc,
14676 IterationVarName, SizeType,
14678 SC_None);
14679
14680 // Initialize the iteration variable to zero.
14681 llvm::APInt Zero(S.Context.getTypeSize(SizeType), 0);
14682 IterationVar->setInit(IntegerLiteral::Create(S.Context, Zero, SizeType, Loc));
14683
14684 // Creates a reference to the iteration variable.
14685 RefBuilder IterationVarRef(IterationVar, SizeType);
14686 LvalueConvBuilder IterationVarRefRVal(IterationVarRef);
14687
14688 // Create the DeclStmt that holds the iteration variable.
14689 Stmt *InitStmt = new (S.Context) DeclStmt(DeclGroupRef(IterationVar),Loc,Loc);
14690
14691 // Subscript the "from" and "to" expressions with the iteration variable.
14692 SubscriptBuilder FromIndexCopy(From, IterationVarRefRVal);
14693 MoveCastBuilder FromIndexMove(FromIndexCopy);
14694 const ExprBuilder *FromIndex;
14695 if (Copying)
14696 FromIndex = &FromIndexCopy;
14697 else
14698 FromIndex = &FromIndexMove;
14699
14700 SubscriptBuilder ToIndex(To, IterationVarRefRVal);
14701
14702 // Build the copy/move for an individual element of the array.
14705 ToIndex, *FromIndex, CopyingBaseSubobject,
14706 Copying, Depth + 1);
14707 // Bail out if copying fails or if we determined that we should use memcpy.
14708 if (Copy.isInvalid() || !Copy.get())
14709 return Copy;
14710
14711 // Create the comparison against the array bound.
14712 llvm::APInt Upper
14713 = ArrayTy->getSize().zextOrTrunc(S.Context.getTypeSize(SizeType));
14714 Expr *Comparison = BinaryOperator::Create(
14715 S.Context, IterationVarRefRVal.build(S, Loc),
14716 IntegerLiteral::Create(S.Context, Upper, SizeType, Loc), BO_NE,
14719
14720 // Create the pre-increment of the iteration variable. We can determine
14721 // whether the increment will overflow based on the value of the array
14722 // bound.
14723 Expr *Increment = UnaryOperator::Create(
14724 S.Context, IterationVarRef.build(S, Loc), UO_PreInc, SizeType, VK_LValue,
14725 OK_Ordinary, Loc, Upper.isMaxValue(), S.CurFPFeatureOverrides());
14726
14727 // Construct the loop that copies all elements of this array.
14728 return S.ActOnForStmt(
14729 Loc, Loc, InitStmt,
14730 S.ActOnCondition(nullptr, Loc, Comparison, Sema::ConditionKind::Boolean),
14731 S.MakeFullDiscardedValueExpr(Increment), Loc, Copy.get());
14732}
14733
14734static StmtResult
14736 const ExprBuilder &To, const ExprBuilder &From,
14737 bool CopyingBaseSubobject, bool Copying) {
14738 // Maybe we should use a memcpy?
14739 if (T->isArrayType() && !T.isConstQualified() && !T.isVolatileQualified() &&
14740 T.isTriviallyCopyableType(S.Context))
14741 return buildMemcpyForAssignmentOp(S, Loc, T, To, From);
14742
14744 CopyingBaseSubobject,
14745 Copying, 0));
14746
14747 // If we ended up picking a trivial assignment operator for an array of a
14748 // non-trivially-copyable class type, just emit a memcpy.
14749 if (!Result.isInvalid() && !Result.get())
14750 return buildMemcpyForAssignmentOp(S, Loc, T, To, From);
14751
14752 return Result;
14753}
14754
14756 // Note: The following rules are largely analoguous to the copy
14757 // constructor rules. Note that virtual bases are not taken into account
14758 // for determining the argument type of the operator. Note also that
14759 // operators taking an object instead of a reference are allowed.
14760 assert(ClassDecl->needsImplicitCopyAssignment());
14761
14762 DeclaringSpecialMember DSM(*this, ClassDecl,
14764 if (DSM.isAlreadyBeingDeclared())
14765 return nullptr;
14766
14767 QualType ArgType = Context.getTypeDeclType(ClassDecl);
14769 ArgType, nullptr);
14771 if (AS != LangAS::Default)
14772 ArgType = Context.getAddrSpaceQualType(ArgType, AS);
14773 QualType RetType = Context.getLValueReferenceType(ArgType);
14774 bool Const = ClassDecl->implicitCopyAssignmentHasConstParam();
14775 if (Const)
14776 ArgType = ArgType.withConst();
14777
14778 ArgType = Context.getLValueReferenceType(ArgType);
14779
14781 *this, ClassDecl, CXXSpecialMemberKind::CopyAssignment, Const);
14782
14783 // An implicitly-declared copy assignment operator is an inline public
14784 // member of its class.
14786 SourceLocation ClassLoc = ClassDecl->getLocation();
14787 DeclarationNameInfo NameInfo(Name, ClassLoc);
14789 Context, ClassDecl, ClassLoc, NameInfo, QualType(),
14790 /*TInfo=*/nullptr, /*StorageClass=*/SC_None,
14791 getCurFPFeatures().isFPConstrained(),
14792 /*isInline=*/true,
14794 SourceLocation());
14795 CopyAssignment->setAccess(AS_public);
14796 CopyAssignment->setDefaulted();
14797 CopyAssignment->setImplicit();
14798
14799 setupImplicitSpecialMemberType(CopyAssignment, RetType, ArgType);
14800
14801 if (getLangOpts().CUDA)
14804 /* ConstRHS */ Const,
14805 /* Diagnose */ false);
14806
14807 // Add the parameter to the operator.
14809 ClassLoc, ClassLoc,
14810 /*Id=*/nullptr, ArgType,
14811 /*TInfo=*/nullptr, SC_None,
14812 nullptr);
14813 CopyAssignment->setParams(FromParam);
14814
14815 CopyAssignment->setTrivial(
14819 : ClassDecl->hasTrivialCopyAssignment());
14820
14821 // Note that we have added this copy-assignment operator.
14823
14824 Scope *S = getScopeForContext(ClassDecl);
14826
14830 SetDeclDeleted(CopyAssignment, ClassLoc);
14831 }
14832
14833 if (S)
14835 ClassDecl->addDecl(CopyAssignment);
14836
14837 return CopyAssignment;
14838}
14839
14840/// Diagnose an implicit copy operation for a class which is odr-used, but
14841/// which is deprecated because the class has a user-declared copy constructor,
14842/// copy assignment operator, or destructor.
14844 assert(CopyOp->isImplicit());
14845
14846 CXXRecordDecl *RD = CopyOp->getParent();
14847 CXXMethodDecl *UserDeclaredOperation = nullptr;
14848
14849 if (RD->hasUserDeclaredDestructor()) {
14850 UserDeclaredOperation = RD->getDestructor();
14851 } else if (!isa<CXXConstructorDecl>(CopyOp) &&
14853 // Find any user-declared copy constructor.
14854 for (auto *I : RD->ctors()) {
14855 if (I->isCopyConstructor()) {
14856 UserDeclaredOperation = I;
14857 break;
14858 }
14859 }
14860 assert(UserDeclaredOperation);
14861 } else if (isa<CXXConstructorDecl>(CopyOp) &&
14863 // Find any user-declared move assignment operator.
14864 for (auto *I : RD->methods()) {
14865 if (I->isCopyAssignmentOperator()) {
14866 UserDeclaredOperation = I;
14867 break;
14868 }
14869 }
14870 assert(UserDeclaredOperation);
14871 }
14872
14873 if (UserDeclaredOperation) {
14874 bool UDOIsUserProvided = UserDeclaredOperation->isUserProvided();
14875 bool UDOIsDestructor = isa<CXXDestructorDecl>(UserDeclaredOperation);
14876 bool IsCopyAssignment = !isa<CXXConstructorDecl>(CopyOp);
14877 unsigned DiagID =
14878 (UDOIsUserProvided && UDOIsDestructor)
14879 ? diag::warn_deprecated_copy_with_user_provided_dtor
14880 : (UDOIsUserProvided && !UDOIsDestructor)
14881 ? diag::warn_deprecated_copy_with_user_provided_copy
14882 : (!UDOIsUserProvided && UDOIsDestructor)
14883 ? diag::warn_deprecated_copy_with_dtor
14884 : diag::warn_deprecated_copy;
14885 S.Diag(UserDeclaredOperation->getLocation(), DiagID)
14886 << RD << IsCopyAssignment;
14887 }
14888}
14889
14891 CXXMethodDecl *CopyAssignOperator) {
14892 assert((CopyAssignOperator->isDefaulted() &&
14893 CopyAssignOperator->isOverloadedOperator() &&
14894 CopyAssignOperator->getOverloadedOperator() == OO_Equal &&
14895 !CopyAssignOperator->doesThisDeclarationHaveABody() &&
14896 !CopyAssignOperator->isDeleted()) &&
14897 "DefineImplicitCopyAssignment called for wrong function");
14898 if (CopyAssignOperator->willHaveBody() || CopyAssignOperator->isInvalidDecl())
14899 return;
14900
14901 CXXRecordDecl *ClassDecl = CopyAssignOperator->getParent();
14902 if (ClassDecl->isInvalidDecl()) {
14903 CopyAssignOperator->setInvalidDecl();
14904 return;
14905 }
14906
14907 SynthesizedFunctionScope Scope(*this, CopyAssignOperator);
14908
14909 // The exception specification is needed because we are defining the
14910 // function.
14911 ResolveExceptionSpec(CurrentLocation,
14912 CopyAssignOperator->getType()->castAs<FunctionProtoType>());
14913
14914 // Add a context note for diagnostics produced after this point.
14915 Scope.addContextNote(CurrentLocation);
14916
14917 // C++11 [class.copy]p18:
14918 // The [definition of an implicitly declared copy assignment operator] is
14919 // deprecated if the class has a user-declared copy constructor or a
14920 // user-declared destructor.
14921 if (getLangOpts().CPlusPlus11 && CopyAssignOperator->isImplicit())
14922 diagnoseDeprecatedCopyOperation(*this, CopyAssignOperator);
14923
14924 // C++0x [class.copy]p30:
14925 // The implicitly-defined or explicitly-defaulted copy assignment operator
14926 // for a non-union class X performs memberwise copy assignment of its
14927 // subobjects. The direct base classes of X are assigned first, in the
14928 // order of their declaration in the base-specifier-list, and then the
14929 // immediate non-static data members of X are assigned, in the order in
14930 // which they were declared in the class definition.
14931
14932 // The statements that form the synthesized function body.
14933 SmallVector<Stmt*, 8> Statements;
14934
14935 // The parameter for the "other" object, which we are copying from.
14936 ParmVarDecl *Other = CopyAssignOperator->getNonObjectParameter(0);
14937 Qualifiers OtherQuals = Other->getType().getQualifiers();
14938 QualType OtherRefType = Other->getType();
14939 if (OtherRefType->isLValueReferenceType()) {
14940 OtherRefType = OtherRefType->getPointeeType();
14941 OtherQuals = OtherRefType.getQualifiers();
14942 }
14943
14944 // Our location for everything implicitly-generated.
14945 SourceLocation Loc = CopyAssignOperator->getEndLoc().isValid()
14946 ? CopyAssignOperator->getEndLoc()
14947 : CopyAssignOperator->getLocation();
14948
14949 // Builds a DeclRefExpr for the "other" object.
14950 RefBuilder OtherRef(Other, OtherRefType);
14951
14952 // Builds the function object parameter.
14953 std::optional<ThisBuilder> This;
14954 std::optional<DerefBuilder> DerefThis;
14955 std::optional<RefBuilder> ExplicitObject;
14956 bool IsArrow = false;
14957 QualType ObjectType;
14958 if (CopyAssignOperator->isExplicitObjectMemberFunction()) {
14959 ObjectType = CopyAssignOperator->getParamDecl(0)->getType();
14960 if (ObjectType->isReferenceType())
14961 ObjectType = ObjectType->getPointeeType();
14962 ExplicitObject.emplace(CopyAssignOperator->getParamDecl(0), ObjectType);
14963 } else {
14964 ObjectType = getCurrentThisType();
14965 This.emplace();
14966 DerefThis.emplace(*This);
14967 IsArrow = !LangOpts.HLSL;
14968 }
14969 ExprBuilder &ObjectParameter =
14970 ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
14971 : static_cast<ExprBuilder &>(*This);
14972
14973 // Assign base classes.
14974 bool Invalid = false;
14975 for (auto &Base : ClassDecl->bases()) {
14976 // Form the assignment:
14977 // static_cast<Base*>(this)->Base::operator=(static_cast<Base&>(other));
14978 QualType BaseType = Base.getType().getUnqualifiedType();
14979 if (!BaseType->isRecordType()) {
14980 Invalid = true;
14981 continue;
14982 }
14983
14984 CXXCastPath BasePath;
14985 BasePath.push_back(&Base);
14986
14987 // Construct the "from" expression, which is an implicit cast to the
14988 // appropriately-qualified base type.
14989 CastBuilder From(OtherRef, Context.getQualifiedType(BaseType, OtherQuals),
14990 VK_LValue, BasePath);
14991
14992 // Dereference "this".
14993 CastBuilder To(
14994 ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
14995 : static_cast<ExprBuilder &>(*DerefThis),
14996 Context.getQualifiedType(BaseType, ObjectType.getQualifiers()),
14997 VK_LValue, BasePath);
14998
14999 // Build the copy.
15000 StmtResult Copy = buildSingleCopyAssign(*this, Loc, BaseType,
15001 To, From,
15002 /*CopyingBaseSubobject=*/true,
15003 /*Copying=*/true);
15004 if (Copy.isInvalid()) {
15005 CopyAssignOperator->setInvalidDecl();
15006 return;
15007 }
15008
15009 // Success! Record the copy.
15010 Statements.push_back(Copy.getAs<Expr>());
15011 }
15012
15013 // Assign non-static members.
15014 for (auto *Field : ClassDecl->fields()) {
15015 // FIXME: We should form some kind of AST representation for the implied
15016 // memcpy in a union copy operation.
15017 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15018 continue;
15019
15020 if (Field->isInvalidDecl()) {
15021 Invalid = true;
15022 continue;
15023 }
15024
15025 // Check for members of reference type; we can't copy those.
15026 if (Field->getType()->isReferenceType()) {
15027 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15028 << Context.getTagDeclType(ClassDecl) << 0 << Field->getDeclName();
15029 Diag(Field->getLocation(), diag::note_declared_at);
15030 Invalid = true;
15031 continue;
15032 }
15033
15034 // Check for members of const-qualified, non-class type.
15035 QualType BaseType = Context.getBaseElementType(Field->getType());
15036 if (!BaseType->getAs<RecordType>() && BaseType.isConstQualified()) {
15037 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15038 << Context.getTagDeclType(ClassDecl) << 1 << Field->getDeclName();
15039 Diag(Field->getLocation(), diag::note_declared_at);
15040 Invalid = true;
15041 continue;
15042 }
15043
15044 // Suppress assigning zero-width bitfields.
15045 if (Field->isZeroLengthBitField())
15046 continue;
15047
15048 QualType FieldType = Field->getType().getNonReferenceType();
15049 if (FieldType->isIncompleteArrayType()) {
15050 assert(ClassDecl->hasFlexibleArrayMember() &&
15051 "Incomplete array type is not valid");
15052 continue;
15053 }
15054
15055 // Build references to the field in the object we're copying from and to.
15056 CXXScopeSpec SS; // Intentionally empty
15057 LookupResult MemberLookup(*this, Field->getDeclName(), Loc,
15059 MemberLookup.addDecl(Field);
15060 MemberLookup.resolveKind();
15061
15062 MemberBuilder From(OtherRef, OtherRefType, /*IsArrow=*/false, MemberLookup);
15063 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15064 // Build the copy of this field.
15065 StmtResult Copy = buildSingleCopyAssign(*this, Loc, FieldType,
15066 To, From,
15067 /*CopyingBaseSubobject=*/false,
15068 /*Copying=*/true);
15069 if (Copy.isInvalid()) {
15070 CopyAssignOperator->setInvalidDecl();
15071 return;
15072 }
15073
15074 // Success! Record the copy.
15075 Statements.push_back(Copy.getAs<Stmt>());
15076 }
15077
15078 if (!Invalid) {
15079 // Add a "return *this;"
15080 Expr *ThisExpr =
15081 (ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15082 : LangOpts.HLSL ? static_cast<ExprBuilder &>(*This)
15083 : static_cast<ExprBuilder &>(*DerefThis))
15084 .build(*this, Loc);
15085 StmtResult Return = BuildReturnStmt(Loc, ThisExpr);
15086 if (Return.isInvalid())
15087 Invalid = true;
15088 else
15089 Statements.push_back(Return.getAs<Stmt>());
15090 }
15091
15092 if (Invalid) {
15093 CopyAssignOperator->setInvalidDecl();
15094 return;
15095 }
15096
15097 StmtResult Body;
15098 {
15099 CompoundScopeRAII CompoundScope(*this);
15100 Body = ActOnCompoundStmt(Loc, Loc, Statements,
15101 /*isStmtExpr=*/false);
15102 assert(!Body.isInvalid() && "Compound statement creation cannot fail");
15103 }
15104 CopyAssignOperator->setBody(Body.getAs<Stmt>());
15105 CopyAssignOperator->markUsed(Context);
15106
15108 L->CompletedImplicitDefinition(CopyAssignOperator);
15109 }
15110}
15111
15113 assert(ClassDecl->needsImplicitMoveAssignment());
15114
15115 DeclaringSpecialMember DSM(*this, ClassDecl,
15117 if (DSM.isAlreadyBeingDeclared())
15118 return nullptr;
15119
15120 // Note: The following rules are largely analoguous to the move
15121 // constructor rules.
15122
15123 QualType ArgType = Context.getTypeDeclType(ClassDecl);
15125 ArgType, nullptr);
15127 if (AS != LangAS::Default)
15128 ArgType = Context.getAddrSpaceQualType(ArgType, AS);
15129 QualType RetType = Context.getLValueReferenceType(ArgType);
15130 ArgType = Context.getRValueReferenceType(ArgType);
15131
15133 *this, ClassDecl, CXXSpecialMemberKind::MoveAssignment, false);
15134
15135 // An implicitly-declared move assignment operator is an inline public
15136 // member of its class.
15138 SourceLocation ClassLoc = ClassDecl->getLocation();
15139 DeclarationNameInfo NameInfo(Name, ClassLoc);
15141 Context, ClassDecl, ClassLoc, NameInfo, QualType(),
15142 /*TInfo=*/nullptr, /*StorageClass=*/SC_None,
15143 getCurFPFeatures().isFPConstrained(),
15144 /*isInline=*/true,
15146 SourceLocation());
15147 MoveAssignment->setAccess(AS_public);
15148 MoveAssignment->setDefaulted();
15149 MoveAssignment->setImplicit();
15150
15151 setupImplicitSpecialMemberType(MoveAssignment, RetType, ArgType);
15152
15153 if (getLangOpts().CUDA)
15156 /* ConstRHS */ false,
15157 /* Diagnose */ false);
15158
15159 // Add the parameter to the operator.
15161 ClassLoc, ClassLoc,
15162 /*Id=*/nullptr, ArgType,
15163 /*TInfo=*/nullptr, SC_None,
15164 nullptr);
15165 MoveAssignment->setParams(FromParam);
15166
15167 MoveAssignment->setTrivial(
15171 : ClassDecl->hasTrivialMoveAssignment());
15172
15173 // Note that we have added this copy-assignment operator.
15175
15176 Scope *S = getScopeForContext(ClassDecl);
15178
15182 SetDeclDeleted(MoveAssignment, ClassLoc);
15183 }
15184
15185 if (S)
15187 ClassDecl->addDecl(MoveAssignment);
15188
15189 return MoveAssignment;
15190}
15191
15192/// Check if we're implicitly defining a move assignment operator for a class
15193/// with virtual bases. Such a move assignment might move-assign the virtual
15194/// base multiple times.
15196 SourceLocation CurrentLocation) {
15197 assert(!Class->isDependentContext() && "should not define dependent move");
15198
15199 // Only a virtual base could get implicitly move-assigned multiple times.
15200 // Only a non-trivial move assignment can observe this. We only want to
15201 // diagnose if we implicitly define an assignment operator that assigns
15202 // two base classes, both of which move-assign the same virtual base.
15203 if (Class->getNumVBases() == 0 || Class->hasTrivialMoveAssignment() ||
15204 Class->getNumBases() < 2)
15205 return;
15206
15208 typedef llvm::DenseMap<CXXRecordDecl*, CXXBaseSpecifier*> VBaseMap;
15209 VBaseMap VBases;
15210
15211 for (auto &BI : Class->bases()) {
15212 Worklist.push_back(&BI);
15213 while (!Worklist.empty()) {
15214 CXXBaseSpecifier *BaseSpec = Worklist.pop_back_val();
15215 CXXRecordDecl *Base = BaseSpec->getType()->getAsCXXRecordDecl();
15216
15217 // If the base has no non-trivial move assignment operators,
15218 // we don't care about moves from it.
15219 if (!Base->hasNonTrivialMoveAssignment())
15220 continue;
15221
15222 // If there's nothing virtual here, skip it.
15223 if (!BaseSpec->isVirtual() && !Base->getNumVBases())
15224 continue;
15225
15226 // If we're not actually going to call a move assignment for this base,
15227 // or the selected move assignment is trivial, skip it.
15230 /*ConstArg*/ false, /*VolatileArg*/ false,
15231 /*RValueThis*/ true, /*ConstThis*/ false,
15232 /*VolatileThis*/ false);
15233 if (!SMOR.getMethod() || SMOR.getMethod()->isTrivial() ||
15235 continue;
15236
15237 if (BaseSpec->isVirtual()) {
15238 // We're going to move-assign this virtual base, and its move
15239 // assignment operator is not trivial. If this can happen for
15240 // multiple distinct direct bases of Class, diagnose it. (If it
15241 // only happens in one base, we'll diagnose it when synthesizing
15242 // that base class's move assignment operator.)
15243 CXXBaseSpecifier *&Existing =
15244 VBases.insert(std::make_pair(Base->getCanonicalDecl(), &BI))
15245 .first->second;
15246 if (Existing && Existing != &BI) {
15247 S.Diag(CurrentLocation, diag::warn_vbase_moved_multiple_times)
15248 << Class << Base;
15249 S.Diag(Existing->getBeginLoc(), diag::note_vbase_moved_here)
15250 << (Base->getCanonicalDecl() ==
15252 << Base << Existing->getType() << Existing->getSourceRange();
15253 S.Diag(BI.getBeginLoc(), diag::note_vbase_moved_here)
15254 << (Base->getCanonicalDecl() ==
15255 BI.getType()->getAsCXXRecordDecl()->getCanonicalDecl())
15256 << Base << BI.getType() << BaseSpec->getSourceRange();
15257
15258 // Only diagnose each vbase once.
15259 Existing = nullptr;
15260 }
15261 } else {
15262 // Only walk over bases that have defaulted move assignment operators.
15263 // We assume that any user-provided move assignment operator handles
15264 // the multiple-moves-of-vbase case itself somehow.
15265 if (!SMOR.getMethod()->isDefaulted())
15266 continue;
15267
15268 // We're going to move the base classes of Base. Add them to the list.
15269 llvm::append_range(Worklist, llvm::make_pointer_range(Base->bases()));
15270 }
15271 }
15272 }
15273}
15274
15276 CXXMethodDecl *MoveAssignOperator) {
15277 assert((MoveAssignOperator->isDefaulted() &&
15278 MoveAssignOperator->isOverloadedOperator() &&
15279 MoveAssignOperator->getOverloadedOperator() == OO_Equal &&
15280 !MoveAssignOperator->doesThisDeclarationHaveABody() &&
15281 !MoveAssignOperator->isDeleted()) &&
15282 "DefineImplicitMoveAssignment called for wrong function");
15283 if (MoveAssignOperator->willHaveBody() || MoveAssignOperator->isInvalidDecl())
15284 return;
15285
15286 CXXRecordDecl *ClassDecl = MoveAssignOperator->getParent();
15287 if (ClassDecl->isInvalidDecl()) {
15288 MoveAssignOperator->setInvalidDecl();
15289 return;
15290 }
15291
15292 // C++0x [class.copy]p28:
15293 // The implicitly-defined or move assignment operator for a non-union class
15294 // X performs memberwise move assignment of its subobjects. The direct base
15295 // classes of X are assigned first, in the order of their declaration in the
15296 // base-specifier-list, and then the immediate non-static data members of X
15297 // are assigned, in the order in which they were declared in the class
15298 // definition.
15299
15300 // Issue a warning if our implicit move assignment operator will move
15301 // from a virtual base more than once.
15302 checkMoveAssignmentForRepeatedMove(*this, ClassDecl, CurrentLocation);
15303
15304 SynthesizedFunctionScope Scope(*this, MoveAssignOperator);
15305
15306 // The exception specification is needed because we are defining the
15307 // function.
15308 ResolveExceptionSpec(CurrentLocation,
15309 MoveAssignOperator->getType()->castAs<FunctionProtoType>());
15310
15311 // Add a context note for diagnostics produced after this point.
15312 Scope.addContextNote(CurrentLocation);
15313
15314 // The statements that form the synthesized function body.
15315 SmallVector<Stmt*, 8> Statements;
15316
15317 // The parameter for the "other" object, which we are move from.
15318 ParmVarDecl *Other = MoveAssignOperator->getNonObjectParameter(0);
15319 QualType OtherRefType =
15320 Other->getType()->castAs<RValueReferenceType>()->getPointeeType();
15321
15322 // Our location for everything implicitly-generated.
15323 SourceLocation Loc = MoveAssignOperator->getEndLoc().isValid()
15324 ? MoveAssignOperator->getEndLoc()
15325 : MoveAssignOperator->getLocation();
15326
15327 // Builds a reference to the "other" object.
15328 RefBuilder OtherRef(Other, OtherRefType);
15329 // Cast to rvalue.
15330 MoveCastBuilder MoveOther(OtherRef);
15331
15332 // Builds the function object parameter.
15333 std::optional<ThisBuilder> This;
15334 std::optional<DerefBuilder> DerefThis;
15335 std::optional<RefBuilder> ExplicitObject;
15336 QualType ObjectType;
15337 bool IsArrow = false;
15338 if (MoveAssignOperator->isExplicitObjectMemberFunction()) {
15339 ObjectType = MoveAssignOperator->getParamDecl(0)->getType();
15340 if (ObjectType->isReferenceType())
15341 ObjectType = ObjectType->getPointeeType();
15342 ExplicitObject.emplace(MoveAssignOperator->getParamDecl(0), ObjectType);
15343 } else {
15344 ObjectType = getCurrentThisType();
15345 This.emplace();
15346 DerefThis.emplace(*This);
15347 IsArrow = !getLangOpts().HLSL;
15348 }
15349 ExprBuilder &ObjectParameter =
15350 ExplicitObject ? *ExplicitObject : static_cast<ExprBuilder &>(*This);
15351
15352 // Assign base classes.
15353 bool Invalid = false;
15354 for (auto &Base : ClassDecl->bases()) {
15355 // C++11 [class.copy]p28:
15356 // It is unspecified whether subobjects representing virtual base classes
15357 // are assigned more than once by the implicitly-defined copy assignment
15358 // operator.
15359 // FIXME: Do not assign to a vbase that will be assigned by some other base
15360 // class. For a move-assignment, this can result in the vbase being moved
15361 // multiple times.
15362
15363 // Form the assignment:
15364 // static_cast<Base*>(this)->Base::operator=(static_cast<Base&&>(other));
15365 QualType BaseType = Base.getType().getUnqualifiedType();
15366 if (!BaseType->isRecordType()) {
15367 Invalid = true;
15368 continue;
15369 }
15370
15371 CXXCastPath BasePath;
15372 BasePath.push_back(&Base);
15373
15374 // Construct the "from" expression, which is an implicit cast to the
15375 // appropriately-qualified base type.
15376 CastBuilder From(OtherRef, BaseType, VK_XValue, BasePath);
15377
15378 // Implicitly cast "this" to the appropriately-qualified base type.
15379 // Dereference "this".
15380 CastBuilder To(
15381 ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15382 : static_cast<ExprBuilder &>(*DerefThis),
15383 Context.getQualifiedType(BaseType, ObjectType.getQualifiers()),
15384 VK_LValue, BasePath);
15385
15386 // Build the move.
15387 StmtResult Move = buildSingleCopyAssign(*this, Loc, BaseType,
15388 To, From,
15389 /*CopyingBaseSubobject=*/true,
15390 /*Copying=*/false);
15391 if (Move.isInvalid()) {
15392 MoveAssignOperator->setInvalidDecl();
15393 return;
15394 }
15395
15396 // Success! Record the move.
15397 Statements.push_back(Move.getAs<Expr>());
15398 }
15399
15400 // Assign non-static members.
15401 for (auto *Field : ClassDecl->fields()) {
15402 // FIXME: We should form some kind of AST representation for the implied
15403 // memcpy in a union copy operation.
15404 if (Field->isUnnamedBitField() || Field->getParent()->isUnion())
15405 continue;
15406
15407 if (Field->isInvalidDecl()) {
15408 Invalid = true;
15409 continue;
15410 }
15411
15412 // Check for members of reference type; we can't move those.
15413 if (Field->getType()->isReferenceType()) {
15414 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15415 << Context.getTagDeclType(ClassDecl) << 0 << Field->getDeclName();
15416 Diag(Field->getLocation(), diag::note_declared_at);
15417 Invalid = true;
15418 continue;
15419 }
15420
15421 // Check for members of const-qualified, non-class type.
15422 QualType BaseType = Context.getBaseElementType(Field->getType());
15423 if (!BaseType->getAs<RecordType>() && BaseType.isConstQualified()) {
15424 Diag(ClassDecl->getLocation(), diag::err_uninitialized_member_for_assign)
15425 << Context.getTagDeclType(ClassDecl) << 1 << Field->getDeclName();
15426 Diag(Field->getLocation(), diag::note_declared_at);
15427 Invalid = true;
15428 continue;
15429 }
15430
15431 // Suppress assigning zero-width bitfields.
15432 if (Field->isZeroLengthBitField())
15433 continue;
15434
15435 QualType FieldType = Field->getType().getNonReferenceType();
15436 if (FieldType->isIncompleteArrayType()) {
15437 assert(ClassDecl->hasFlexibleArrayMember() &&
15438 "Incomplete array type is not valid");
15439 continue;
15440 }
15441
15442 // Build references to the field in the object we're copying from and to.
15443 LookupResult MemberLookup(*this, Field->getDeclName(), Loc,
15445 MemberLookup.addDecl(Field);
15446 MemberLookup.resolveKind();
15447 MemberBuilder From(MoveOther, OtherRefType,
15448 /*IsArrow=*/false, MemberLookup);
15449 MemberBuilder To(ObjectParameter, ObjectType, IsArrow, MemberLookup);
15450
15451 assert(!From.build(*this, Loc)->isLValue() && // could be xvalue or prvalue
15452 "Member reference with rvalue base must be rvalue except for reference "
15453 "members, which aren't allowed for move assignment.");
15454
15455 // Build the move of this field.
15456 StmtResult Move = buildSingleCopyAssign(*this, Loc, FieldType,
15457 To, From,
15458 /*CopyingBaseSubobject=*/false,
15459 /*Copying=*/false);
15460 if (Move.isInvalid()) {
15461 MoveAssignOperator->setInvalidDecl();
15462 return;
15463 }
15464
15465 // Success! Record the copy.
15466 Statements.push_back(Move.getAs<Stmt>());
15467 }
15468
15469 if (!Invalid) {
15470 // Add a "return *this;"
15471 Expr *ThisExpr =
15472 (ExplicitObject ? static_cast<ExprBuilder &>(*ExplicitObject)
15473 : LangOpts.HLSL ? static_cast<ExprBuilder &>(*This)
15474 : static_cast<ExprBuilder &>(*DerefThis))
15475 .build(*this, Loc);
15476
15477 StmtResult Return = BuildReturnStmt(Loc, ThisExpr);
15478 if (Return.isInvalid())
15479 Invalid = true;
15480 else
15481 Statements.push_back(Return.getAs<Stmt>());
15482 }
15483
15484 if (Invalid) {
15485 MoveAssignOperator->setInvalidDecl();
15486 return;
15487 }
15488
15489 StmtResult Body;
15490 {
15491 CompoundScopeRAII CompoundScope(*this);
15492 Body = ActOnCompoundStmt(Loc, Loc, Statements,
15493 /*isStmtExpr=*/false);
15494 assert(!Body.isInvalid() && "Compound statement creation cannot fail");
15495 }
15496 MoveAssignOperator->setBody(Body.getAs<Stmt>());
15497 MoveAssignOperator->markUsed(Context);
15498
15500 L->CompletedImplicitDefinition(MoveAssignOperator);
15501 }
15502}
15503
15505 CXXRecordDecl *ClassDecl) {
15506 // C++ [class.copy]p4:
15507 // If the class definition does not explicitly declare a copy
15508 // constructor, one is declared implicitly.
15509 assert(ClassDecl->needsImplicitCopyConstructor());
15510
15511 DeclaringSpecialMember DSM(*this, ClassDecl,
15513 if (DSM.isAlreadyBeingDeclared())
15514 return nullptr;
15515
15516 QualType ClassType = Context.getTypeDeclType(ClassDecl);
15517 QualType ArgType = ClassType;
15519 ArgType, nullptr);
15520 bool Const = ClassDecl->implicitCopyConstructorHasConstParam();
15521 if (Const)
15522 ArgType = ArgType.withConst();
15523
15525 if (AS != LangAS::Default)
15526 ArgType = Context.getAddrSpaceQualType(ArgType, AS);
15527
15528 ArgType = Context.getLValueReferenceType(ArgType);
15529
15531 *this, ClassDecl, CXXSpecialMemberKind::CopyConstructor, Const);
15532
15533 DeclarationName Name
15535 Context.getCanonicalType(ClassType));
15536 SourceLocation ClassLoc = ClassDecl->getLocation();
15537 DeclarationNameInfo NameInfo(Name, ClassLoc);
15538
15539 // An implicitly-declared copy constructor is an inline public
15540 // member of its class.
15542 Context, ClassDecl, ClassLoc, NameInfo, QualType(), /*TInfo=*/nullptr,
15543 ExplicitSpecifier(), getCurFPFeatures().isFPConstrained(),
15544 /*isInline=*/true,
15545 /*isImplicitlyDeclared=*/true,
15548 CopyConstructor->setAccess(AS_public);
15549 CopyConstructor->setDefaulted();
15550
15551 setupImplicitSpecialMemberType(CopyConstructor, Context.VoidTy, ArgType);
15552
15553 if (getLangOpts().CUDA)
15556 /* ConstRHS */ Const,
15557 /* Diagnose */ false);
15558
15559 // During template instantiation of special member functions we need a
15560 // reliable TypeSourceInfo for the parameter types in order to allow functions
15561 // to be substituted.
15562 TypeSourceInfo *TSI = nullptr;
15563 if (inTemplateInstantiation() && ClassDecl->isLambda())
15564 TSI = Context.getTrivialTypeSourceInfo(ArgType);
15565
15566 // Add the parameter to the constructor.
15567 ParmVarDecl *FromParam =
15568 ParmVarDecl::Create(Context, CopyConstructor, ClassLoc, ClassLoc,
15569 /*IdentifierInfo=*/nullptr, ArgType,
15570 /*TInfo=*/TSI, SC_None, nullptr);
15571 CopyConstructor->setParams(FromParam);
15572
15573 CopyConstructor->setTrivial(
15577 : ClassDecl->hasTrivialCopyConstructor());
15578
15579 CopyConstructor->setTrivialForCall(
15580 ClassDecl->hasAttr<TrivialABIAttr>() ||
15585 : ClassDecl->hasTrivialCopyConstructorForCall()));
15586
15587 // Note that we have declared this constructor.
15589
15590 Scope *S = getScopeForContext(ClassDecl);
15592
15597 }
15598
15599 if (S)
15601 ClassDecl->addDecl(CopyConstructor);
15602
15603 return CopyConstructor;
15604}
15605
15608 assert((CopyConstructor->isDefaulted() &&
15609 CopyConstructor->isCopyConstructor() &&
15610 !CopyConstructor->doesThisDeclarationHaveABody() &&
15611 !CopyConstructor->isDeleted()) &&
15612 "DefineImplicitCopyConstructor - call it for implicit copy ctor");
15613 if (CopyConstructor->willHaveBody() || CopyConstructor->isInvalidDecl())
15614 return;
15615
15616 CXXRecordDecl *ClassDecl = CopyConstructor->getParent();
15617 assert(ClassDecl && "DefineImplicitCopyConstructor - invalid constructor");
15618
15620
15621 // The exception specification is needed because we are defining the
15622 // function.
15623 ResolveExceptionSpec(CurrentLocation,
15624 CopyConstructor->getType()->castAs<FunctionProtoType>());
15625 MarkVTableUsed(CurrentLocation, ClassDecl);
15626
15627 // Add a context note for diagnostics produced after this point.
15628 Scope.addContextNote(CurrentLocation);
15629
15630 // C++11 [class.copy]p7:
15631 // The [definition of an implicitly declared copy constructor] is
15632 // deprecated if the class has a user-declared copy assignment operator
15633 // or a user-declared destructor.
15634 if (getLangOpts().CPlusPlus11 && CopyConstructor->isImplicit())
15636
15637 if (SetCtorInitializers(CopyConstructor, /*AnyErrors=*/false)) {
15638 CopyConstructor->setInvalidDecl();
15639 } else {
15640 SourceLocation Loc = CopyConstructor->getEndLoc().isValid()
15641 ? CopyConstructor->getEndLoc()
15642 : CopyConstructor->getLocation();
15643 Sema::CompoundScopeRAII CompoundScope(*this);
15644 CopyConstructor->setBody(
15645 ActOnCompoundStmt(Loc, Loc, {}, /*isStmtExpr=*/false).getAs<Stmt>());
15646 CopyConstructor->markUsed(Context);
15647 }
15648
15650 L->CompletedImplicitDefinition(CopyConstructor);
15651 }
15652}
15653
15655 CXXRecordDecl *ClassDecl) {
15656 assert(ClassDecl->needsImplicitMoveConstructor());
15657
15658 DeclaringSpecialMember DSM(*this, ClassDecl,
15660 if (DSM.isAlreadyBeingDeclared())
15661 return nullptr;
15662
15663 QualType ClassType = Context.getTypeDeclType(ClassDecl);
15664
15665 QualType ArgType = ClassType;
15667 ArgType, nullptr);
15669 if (AS != LangAS::Default)
15670 ArgType = Context.getAddrSpaceQualType(ClassType, AS);
15671 ArgType = Context.getRValueReferenceType(ArgType);
15672
15674 *this, ClassDecl, CXXSpecialMemberKind::MoveConstructor, false);
15675
15676 DeclarationName Name
15678 Context.getCanonicalType(ClassType));
15679 SourceLocation ClassLoc = ClassDecl->getLocation();
15680 DeclarationNameInfo NameInfo(Name, ClassLoc);
15681
15682 // C++11 [class.copy]p11:
15683 // An implicitly-declared copy/move constructor is an inline public
15684 // member of its class.
15686 Context, ClassDecl, ClassLoc, NameInfo, QualType(), /*TInfo=*/nullptr,
15687 ExplicitSpecifier(), getCurFPFeatures().isFPConstrained(),
15688 /*isInline=*/true,
15689 /*isImplicitlyDeclared=*/true,
15692 MoveConstructor->setAccess(AS_public);
15693 MoveConstructor->setDefaulted();
15694
15695 setupImplicitSpecialMemberType(MoveConstructor, Context.VoidTy, ArgType);
15696
15697 if (getLangOpts().CUDA)
15700 /* ConstRHS */ false,
15701 /* Diagnose */ false);
15702
15703 // Add the parameter to the constructor.
15705 ClassLoc, ClassLoc,
15706 /*IdentifierInfo=*/nullptr,
15707 ArgType, /*TInfo=*/nullptr,
15708 SC_None, nullptr);
15709 MoveConstructor->setParams(FromParam);
15710
15711 MoveConstructor->setTrivial(
15715 : ClassDecl->hasTrivialMoveConstructor());
15716
15717 MoveConstructor->setTrivialForCall(
15718 ClassDecl->hasAttr<TrivialABIAttr>() ||
15723 : ClassDecl->hasTrivialMoveConstructorForCall()));
15724
15725 // Note that we have declared this constructor.
15727
15728 Scope *S = getScopeForContext(ClassDecl);
15730
15735 }
15736
15737 if (S)
15739 ClassDecl->addDecl(MoveConstructor);
15740
15741 return MoveConstructor;
15742}
15743
15746 assert((MoveConstructor->isDefaulted() &&
15747 MoveConstructor->isMoveConstructor() &&
15748 !MoveConstructor->doesThisDeclarationHaveABody() &&
15749 !MoveConstructor->isDeleted()) &&
15750 "DefineImplicitMoveConstructor - call it for implicit move ctor");
15751 if (MoveConstructor->willHaveBody() || MoveConstructor->isInvalidDecl())
15752 return;
15753
15754 CXXRecordDecl *ClassDecl = MoveConstructor->getParent();
15755 assert(ClassDecl && "DefineImplicitMoveConstructor - invalid constructor");
15756
15758
15759 // The exception specification is needed because we are defining the
15760 // function.
15761 ResolveExceptionSpec(CurrentLocation,
15762 MoveConstructor->getType()->castAs<FunctionProtoType>());
15763 MarkVTableUsed(CurrentLocation, ClassDecl);
15764
15765 // Add a context note for diagnostics produced after this point.
15766 Scope.addContextNote(CurrentLocation);
15767
15768 if (SetCtorInitializers(MoveConstructor, /*AnyErrors=*/false)) {
15769 MoveConstructor->setInvalidDecl();
15770 } else {
15771 SourceLocation Loc = MoveConstructor->getEndLoc().isValid()
15772 ? MoveConstructor->getEndLoc()
15773 : MoveConstructor->getLocation();
15774 Sema::CompoundScopeRAII CompoundScope(*this);
15775 MoveConstructor->setBody(
15776 ActOnCompoundStmt(Loc, Loc, {}, /*isStmtExpr=*/false).getAs<Stmt>());
15777 MoveConstructor->markUsed(Context);
15778 }
15779
15781 L->CompletedImplicitDefinition(MoveConstructor);
15782 }
15783}
15784
15786 return FD->isDeleted() && FD->isDefaulted() && isa<CXXMethodDecl>(FD);
15787}
15788
15790 SourceLocation CurrentLocation,
15791 CXXConversionDecl *Conv) {
15792 SynthesizedFunctionScope Scope(*this, Conv);
15793 assert(!Conv->getReturnType()->isUndeducedType());
15794
15795 QualType ConvRT = Conv->getType()->castAs<FunctionType>()->getReturnType();
15796 CallingConv CC =
15797 ConvRT->getPointeeType()->castAs<FunctionType>()->getCallConv();
15798
15799 CXXRecordDecl *Lambda = Conv->getParent();
15800 FunctionDecl *CallOp = Lambda->getLambdaCallOperator();
15801 FunctionDecl *Invoker =
15802 CallOp->hasCXXExplicitFunctionObjectParameter() || CallOp->isStatic()
15803 ? CallOp
15804 : Lambda->getLambdaStaticInvoker(CC);
15805
15806 if (auto *TemplateArgs = Conv->getTemplateSpecializationArgs()) {
15808 CallOp->getDescribedFunctionTemplate(), TemplateArgs, CurrentLocation);
15809 if (!CallOp)
15810 return;
15811
15812 if (CallOp != Invoker) {
15814 Invoker->getDescribedFunctionTemplate(), TemplateArgs,
15815 CurrentLocation);
15816 if (!Invoker)
15817 return;
15818 }
15819 }
15820
15821 if (CallOp->isInvalidDecl())
15822 return;
15823
15824 // Mark the call operator referenced (and add to pending instantiations
15825 // if necessary).
15826 // For both the conversion and static-invoker template specializations
15827 // we construct their body's in this function, so no need to add them
15828 // to the PendingInstantiations.
15829 MarkFunctionReferenced(CurrentLocation, CallOp);
15830
15831 if (Invoker != CallOp) {
15832 // Fill in the __invoke function with a dummy implementation. IR generation
15833 // will fill in the actual details. Update its type in case it contained
15834 // an 'auto'.
15835 Invoker->markUsed(Context);
15836 Invoker->setReferenced();
15837 Invoker->setType(Conv->getReturnType()->getPointeeType());
15838 Invoker->setBody(new (Context) CompoundStmt(Conv->getLocation()));
15839 }
15840
15841 // Construct the body of the conversion function { return __invoke; }.
15842 Expr *FunctionRef = BuildDeclRefExpr(Invoker, Invoker->getType(), VK_LValue,
15843 Conv->getLocation());
15844 assert(FunctionRef && "Can't refer to __invoke function?");
15845 Stmt *Return = BuildReturnStmt(Conv->getLocation(), FunctionRef).get();
15847 Conv->getLocation(), Conv->getLocation()));
15848 Conv->markUsed(Context);
15849 Conv->setReferenced();
15850
15852 L->CompletedImplicitDefinition(Conv);
15853 if (Invoker != CallOp)
15854 L->CompletedImplicitDefinition(Invoker);
15855 }
15856}
15857
15859 SourceLocation CurrentLocation, CXXConversionDecl *Conv) {
15860 assert(!Conv->getParent()->isGenericLambda());
15861
15862 SynthesizedFunctionScope Scope(*this, Conv);
15863
15864 // Copy-initialize the lambda object as needed to capture it.
15865 Expr *This = ActOnCXXThis(CurrentLocation).get();
15866 Expr *DerefThis =CreateBuiltinUnaryOp(CurrentLocation, UO_Deref, This).get();
15867
15868 ExprResult BuildBlock = BuildBlockForLambdaConversion(CurrentLocation,
15869 Conv->getLocation(),
15870 Conv, DerefThis);
15871
15872 // If we're not under ARC, make sure we still get the _Block_copy/autorelease
15873 // behavior. Note that only the general conversion function does this
15874 // (since it's unusable otherwise); in the case where we inline the
15875 // block literal, it has block literal lifetime semantics.
15876 if (!BuildBlock.isInvalid() && !getLangOpts().ObjCAutoRefCount)
15877 BuildBlock = ImplicitCastExpr::Create(
15878 Context, BuildBlock.get()->getType(), CK_CopyAndAutoreleaseBlockObject,
15879 BuildBlock.get(), nullptr, VK_PRValue, FPOptionsOverride());
15880
15881 if (BuildBlock.isInvalid()) {
15882 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
15883 Conv->setInvalidDecl();
15884 return;
15885 }
15886
15887 // Create the return statement that returns the block from the conversion
15888 // function.
15889 StmtResult Return = BuildReturnStmt(Conv->getLocation(), BuildBlock.get());
15890 if (Return.isInvalid()) {
15891 Diag(CurrentLocation, diag::note_lambda_to_block_conv);
15892 Conv->setInvalidDecl();
15893 return;
15894 }
15895
15896 // Set the body of the conversion function.
15897 Stmt *ReturnS = Return.get();
15899 Conv->getLocation(), Conv->getLocation()));
15900 Conv->markUsed(Context);
15901
15902 // We're done; notify the mutation listener, if any.
15904 L->CompletedImplicitDefinition(Conv);
15905 }
15906}
15907
15908/// Determine whether the given list arguments contains exactly one
15909/// "real" (non-default) argument.
15911 switch (Args.size()) {
15912 case 0:
15913 return false;
15914
15915 default:
15916 if (!Args[1]->isDefaultArgument())
15917 return false;
15918
15919 [[fallthrough]];
15920 case 1:
15921 return !Args[0]->isDefaultArgument();
15922 }
15923
15924 return false;
15925}
15926
15928 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
15929 CXXConstructorDecl *Constructor, MultiExprArg ExprArgs,
15930 bool HadMultipleCandidates, bool IsListInitialization,
15931 bool IsStdInitListInitialization, bool RequiresZeroInit,
15932 CXXConstructionKind ConstructKind, SourceRange ParenRange) {
15933 bool Elidable = false;
15934
15935 // C++0x [class.copy]p34:
15936 // When certain criteria are met, an implementation is allowed to
15937 // omit the copy/move construction of a class object, even if the
15938 // copy/move constructor and/or destructor for the object have
15939 // side effects. [...]
15940 // - when a temporary class object that has not been bound to a
15941 // reference (12.2) would be copied/moved to a class object
15942 // with the same cv-unqualified type, the copy/move operation
15943 // can be omitted by constructing the temporary object
15944 // directly into the target of the omitted copy/move
15945 if (ConstructKind == CXXConstructionKind::Complete && Constructor &&
15946 // FIXME: Converting constructors should also be accepted.
15947 // But to fix this, the logic that digs down into a CXXConstructExpr
15948 // to find the source object needs to handle it.
15949 // Right now it assumes the source object is passed directly as the
15950 // first argument.
15951 Constructor->isCopyOrMoveConstructor() && hasOneRealArgument(ExprArgs)) {
15952 Expr *SubExpr = ExprArgs[0];
15953 // FIXME: Per above, this is also incorrect if we want to accept
15954 // converting constructors, as isTemporaryObject will
15955 // reject temporaries with different type from the
15956 // CXXRecord itself.
15957 Elidable = SubExpr->isTemporaryObject(
15958 Context, cast<CXXRecordDecl>(FoundDecl->getDeclContext()));
15959 }
15960
15961 return BuildCXXConstructExpr(ConstructLoc, DeclInitType,
15962 FoundDecl, Constructor,
15963 Elidable, ExprArgs, HadMultipleCandidates,
15964 IsListInitialization,
15965 IsStdInitListInitialization, RequiresZeroInit,
15966 ConstructKind, ParenRange);
15967}
15968
15970 SourceLocation ConstructLoc, QualType DeclInitType, NamedDecl *FoundDecl,
15971 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg ExprArgs,
15972 bool HadMultipleCandidates, bool IsListInitialization,
15973 bool IsStdInitListInitialization, bool RequiresZeroInit,
15974 CXXConstructionKind ConstructKind, SourceRange ParenRange) {
15975 if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl)) {
15976 Constructor = findInheritingConstructor(ConstructLoc, Constructor, Shadow);
15977 // The only way to get here is if we did overload resolution to find the
15978 // shadow decl, so we don't need to worry about re-checking the trailing
15979 // requires clause.
15980 if (DiagnoseUseOfOverloadedDecl(Constructor, ConstructLoc))
15981 return ExprError();
15982 }
15983
15984 return BuildCXXConstructExpr(
15985 ConstructLoc, DeclInitType, Constructor, Elidable, ExprArgs,
15986 HadMultipleCandidates, IsListInitialization, IsStdInitListInitialization,
15987 RequiresZeroInit, ConstructKind, ParenRange);
15988}
15989
15990/// BuildCXXConstructExpr - Creates a complete call to a constructor,
15991/// including handling of its default argument expressions.
15993 SourceLocation ConstructLoc, QualType DeclInitType,
15994 CXXConstructorDecl *Constructor, bool Elidable, MultiExprArg ExprArgs,
15995 bool HadMultipleCandidates, bool IsListInitialization,
15996 bool IsStdInitListInitialization, bool RequiresZeroInit,
15997 CXXConstructionKind ConstructKind, SourceRange ParenRange) {
15998 assert(declaresSameEntity(
15999 Constructor->getParent(),
16000 DeclInitType->getBaseElementTypeUnsafe()->getAsCXXRecordDecl()) &&
16001 "given constructor for wrong type");
16002 MarkFunctionReferenced(ConstructLoc, Constructor);
16003 if (getLangOpts().CUDA && !CUDA().CheckCall(ConstructLoc, Constructor))
16004 return ExprError();
16005
16008 Context, DeclInitType, ConstructLoc, Constructor, Elidable, ExprArgs,
16009 HadMultipleCandidates, IsListInitialization,
16010 IsStdInitListInitialization, RequiresZeroInit,
16011 static_cast<CXXConstructionKind>(ConstructKind), ParenRange),
16012 Constructor);
16013}
16014
16016 if (VD->isInvalidDecl()) return;
16017 // If initializing the variable failed, don't also diagnose problems with
16018 // the destructor, they're likely related.
16019 if (VD->getInit() && VD->getInit()->containsErrors())
16020 return;
16021
16022 CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(Record->getDecl());
16023 if (ClassDecl->isInvalidDecl()) return;
16024 if (ClassDecl->hasIrrelevantDestructor()) return;
16025 if (ClassDecl->isDependentContext()) return;
16026
16027 if (VD->isNoDestroy(getASTContext()))
16028 return;
16029
16031 // The result of `LookupDestructor` might be nullptr if the destructor is
16032 // invalid, in which case it is marked as `IneligibleOrNotSelected` and
16033 // will not be selected by `CXXRecordDecl::getDestructor()`.
16034 if (!Destructor)
16035 return;
16036 // If this is an array, we'll require the destructor during initialization, so
16037 // we can skip over this. We still want to emit exit-time destructor warnings
16038 // though.
16039 if (!VD->getType()->isArrayType()) {
16042 PDiag(diag::err_access_dtor_var)
16043 << VD->getDeclName() << VD->getType());
16045 }
16046
16047 if (Destructor->isTrivial()) return;
16048
16049 // If the destructor is constexpr, check whether the variable has constant
16050 // destruction now.
16051 if (Destructor->isConstexpr()) {
16052 bool HasConstantInit = false;
16053 if (VD->getInit() && !VD->getInit()->isValueDependent())
16054 HasConstantInit = VD->evaluateValue();
16056 if (!VD->evaluateDestruction(Notes) && VD->isConstexpr() &&
16057 HasConstantInit) {
16058 Diag(VD->getLocation(),
16059 diag::err_constexpr_var_requires_const_destruction) << VD;
16060 for (unsigned I = 0, N = Notes.size(); I != N; ++I)
16061 Diag(Notes[I].first, Notes[I].second);
16062 }
16063 }
16064
16065 if (!VD->hasGlobalStorage() || !VD->needsDestruction(Context))
16066 return;
16067
16068 // Emit warning for non-trivial dtor in global scope (a real global,
16069 // class-static, function-static).
16070 if (!VD->hasAttr<AlwaysDestroyAttr>())
16071 Diag(VD->getLocation(), diag::warn_exit_time_destructor);
16072
16073 // TODO: this should be re-enabled for static locals by !CXAAtExit
16074 if (!VD->isStaticLocal())
16075 Diag(VD->getLocation(), diag::warn_global_destructor);
16076}
16077
16079 QualType DeclInitType, MultiExprArg ArgsPtr,
16081 SmallVectorImpl<Expr *> &ConvertedArgs,
16082 bool AllowExplicit,
16083 bool IsListInitialization) {
16084 // FIXME: This duplicates a lot of code from Sema::ConvertArgumentsForCall.
16085 unsigned NumArgs = ArgsPtr.size();
16086 Expr **Args = ArgsPtr.data();
16087
16088 const auto *Proto = Constructor->getType()->castAs<FunctionProtoType>();
16089 unsigned NumParams = Proto->getNumParams();
16090
16091 // If too few arguments are available, we'll fill in the rest with defaults.
16092 if (NumArgs < NumParams)
16093 ConvertedArgs.reserve(NumParams);
16094 else
16095 ConvertedArgs.reserve(NumArgs);
16096
16097 VariadicCallType CallType =
16098 Proto->isVariadic() ? VariadicConstructor : VariadicDoesNotApply;
16099 SmallVector<Expr *, 8> AllArgs;
16101 Loc, Constructor, Proto, 0, llvm::ArrayRef(Args, NumArgs), AllArgs,
16102 CallType, AllowExplicit, IsListInitialization);
16103 ConvertedArgs.append(AllArgs.begin(), AllArgs.end());
16104
16105 DiagnoseSentinelCalls(Constructor, Loc, AllArgs);
16106
16107 CheckConstructorCall(Constructor, DeclInitType,
16108 llvm::ArrayRef(AllArgs.data(), AllArgs.size()), Proto,
16109 Loc);
16110
16111 return Invalid;
16112}
16113
16114static inline bool
16116 const FunctionDecl *FnDecl) {
16117 const DeclContext *DC = FnDecl->getDeclContext()->getRedeclContext();
16118 if (isa<NamespaceDecl>(DC)) {
16119 return SemaRef.Diag(FnDecl->getLocation(),
16120 diag::err_operator_new_delete_declared_in_namespace)
16121 << FnDecl->getDeclName();
16122 }
16123
16124 if (isa<TranslationUnitDecl>(DC) &&
16125 FnDecl->getStorageClass() == SC_Static) {
16126 return SemaRef.Diag(FnDecl->getLocation(),
16127 diag::err_operator_new_delete_declared_static)
16128 << FnDecl->getDeclName();
16129 }
16130
16131 return false;
16132}
16133
16135 const PointerType *PtrTy) {
16136 auto &Ctx = SemaRef.Context;
16137 Qualifiers PtrQuals = PtrTy->getPointeeType().getQualifiers();
16138 PtrQuals.removeAddressSpace();
16139 return Ctx.getPointerType(Ctx.getCanonicalType(Ctx.getQualifiedType(
16140 PtrTy->getPointeeType().getUnqualifiedType(), PtrQuals)));
16141}
16142
16143static inline bool
16145 CanQualType ExpectedResultType,
16146 CanQualType ExpectedFirstParamType,
16147 unsigned DependentParamTypeDiag,
16148 unsigned InvalidParamTypeDiag) {
16149 QualType ResultType =
16150 FnDecl->getType()->castAs<FunctionType>()->getReturnType();
16151
16152 if (SemaRef.getLangOpts().OpenCLCPlusPlus) {
16153 // The operator is valid on any address space for OpenCL.
16154 // Drop address space from actual and expected result types.
16155 if (const auto *PtrTy = ResultType->getAs<PointerType>())
16156 ResultType = RemoveAddressSpaceFromPtr(SemaRef, PtrTy);
16157
16158 if (auto ExpectedPtrTy = ExpectedResultType->getAs<PointerType>())
16159 ExpectedResultType = RemoveAddressSpaceFromPtr(SemaRef, ExpectedPtrTy);
16160 }
16161
16162 // Check that the result type is what we expect.
16163 if (SemaRef.Context.getCanonicalType(ResultType) != ExpectedResultType) {
16164 // Reject even if the type is dependent; an operator delete function is
16165 // required to have a non-dependent result type.
16166 return SemaRef.Diag(
16167 FnDecl->getLocation(),
16168 ResultType->isDependentType()
16169 ? diag::err_operator_new_delete_dependent_result_type
16170 : diag::err_operator_new_delete_invalid_result_type)
16171 << FnDecl->getDeclName() << ExpectedResultType;
16172 }
16173
16174 // A function template must have at least 2 parameters.
16175 if (FnDecl->getDescribedFunctionTemplate() && FnDecl->getNumParams() < 2)
16176 return SemaRef.Diag(FnDecl->getLocation(),
16177 diag::err_operator_new_delete_template_too_few_parameters)
16178 << FnDecl->getDeclName();
16179
16180 // The function decl must have at least 1 parameter.
16181 if (FnDecl->getNumParams() == 0)
16182 return SemaRef.Diag(FnDecl->getLocation(),
16183 diag::err_operator_new_delete_too_few_parameters)
16184 << FnDecl->getDeclName();
16185
16186 QualType FirstParamType = FnDecl->getParamDecl(0)->getType();
16187 if (SemaRef.getLangOpts().OpenCLCPlusPlus) {
16188 // The operator is valid on any address space for OpenCL.
16189 // Drop address space from actual and expected first parameter types.
16190 if (const auto *PtrTy =
16191 FnDecl->getParamDecl(0)->getType()->getAs<PointerType>())
16192 FirstParamType = RemoveAddressSpaceFromPtr(SemaRef, PtrTy);
16193
16194 if (auto ExpectedPtrTy = ExpectedFirstParamType->getAs<PointerType>())
16195 ExpectedFirstParamType =
16196 RemoveAddressSpaceFromPtr(SemaRef, ExpectedPtrTy);
16197 }
16198
16199 // Check that the first parameter type is what we expect.
16200 if (SemaRef.Context.getCanonicalType(FirstParamType).getUnqualifiedType() !=
16201 ExpectedFirstParamType) {
16202 // The first parameter type is not allowed to be dependent. As a tentative
16203 // DR resolution, we allow a dependent parameter type if it is the right
16204 // type anyway, to allow destroying operator delete in class templates.
16205 return SemaRef.Diag(FnDecl->getLocation(), FirstParamType->isDependentType()
16206 ? DependentParamTypeDiag
16207 : InvalidParamTypeDiag)
16208 << FnDecl->getDeclName() << ExpectedFirstParamType;
16209 }
16210
16211 return false;
16212}
16213
16214static bool
16216 // C++ [basic.stc.dynamic.allocation]p1:
16217 // A program is ill-formed if an allocation function is declared in a
16218 // namespace scope other than global scope or declared static in global
16219 // scope.
16221 return true;
16222
16223 CanQualType SizeTy =
16225
16226 // C++ [basic.stc.dynamic.allocation]p1:
16227 // The return type shall be void*. The first parameter shall have type
16228 // std::size_t.
16230 SizeTy,
16231 diag::err_operator_new_dependent_param_type,
16232 diag::err_operator_new_param_type))
16233 return true;
16234
16235 // C++ [basic.stc.dynamic.allocation]p1:
16236 // The first parameter shall not have an associated default argument.
16237 if (FnDecl->getParamDecl(0)->hasDefaultArg())
16238 return SemaRef.Diag(FnDecl->getLocation(),
16239 diag::err_operator_new_default_arg)
16240 << FnDecl->getDeclName() << FnDecl->getParamDecl(0)->getDefaultArgRange();
16241
16242 return false;
16243}
16244
16245static bool
16247 // C++ [basic.stc.dynamic.deallocation]p1:
16248 // A program is ill-formed if deallocation functions are declared in a
16249 // namespace scope other than global scope or declared static in global
16250 // scope.
16252 return true;
16253
16254 auto *MD = dyn_cast<CXXMethodDecl>(FnDecl);
16255
16256 // C++ P0722:
16257 // Within a class C, the first parameter of a destroying operator delete
16258 // shall be of type C *. The first parameter of any other deallocation
16259 // function shall be of type void *.
16260 CanQualType ExpectedFirstParamType =
16261 MD && MD->isDestroyingOperatorDelete()
16265
16266 // C++ [basic.stc.dynamic.deallocation]p2:
16267 // Each deallocation function shall return void
16269 SemaRef, FnDecl, SemaRef.Context.VoidTy, ExpectedFirstParamType,
16270 diag::err_operator_delete_dependent_param_type,
16271 diag::err_operator_delete_param_type))
16272 return true;
16273
16274 // C++ P0722:
16275 // A destroying operator delete shall be a usual deallocation function.
16276 if (MD && !MD->getParent()->isDependentContext() &&
16279 SemaRef.Diag(MD->getLocation(),
16280 diag::err_destroying_operator_delete_not_usual);
16281 return true;
16282 }
16283
16284 return false;
16285}
16286
16288 assert(FnDecl && FnDecl->isOverloadedOperator() &&
16289 "Expected an overloaded operator declaration");
16290
16292
16293 // C++ [over.oper]p5:
16294 // The allocation and deallocation functions, operator new,
16295 // operator new[], operator delete and operator delete[], are
16296 // described completely in 3.7.3. The attributes and restrictions
16297 // found in the rest of this subclause do not apply to them unless
16298 // explicitly stated in 3.7.3.
16299 if (Op == OO_Delete || Op == OO_Array_Delete)
16300 return CheckOperatorDeleteDeclaration(*this, FnDecl);
16301
16302 if (Op == OO_New || Op == OO_Array_New)
16303 return CheckOperatorNewDeclaration(*this, FnDecl);
16304
16305 // C++ [over.oper]p7:
16306 // An operator function shall either be a member function or
16307 // be a non-member function and have at least one parameter
16308 // whose type is a class, a reference to a class, an enumeration,
16309 // or a reference to an enumeration.
16310 // Note: Before C++23, a member function could not be static. The only member
16311 // function allowed to be static is the call operator function.
16312 if (CXXMethodDecl *MethodDecl = dyn_cast<CXXMethodDecl>(FnDecl)) {
16313 if (MethodDecl->isStatic()) {
16314 if (Op == OO_Call || Op == OO_Subscript)
16315 Diag(FnDecl->getLocation(),
16316 (LangOpts.CPlusPlus23
16317 ? diag::warn_cxx20_compat_operator_overload_static
16318 : diag::ext_operator_overload_static))
16319 << FnDecl;
16320 else
16321 return Diag(FnDecl->getLocation(), diag::err_operator_overload_static)
16322 << FnDecl;
16323 }
16324 } else {
16325 bool ClassOrEnumParam = false;
16326 for (auto *Param : FnDecl->parameters()) {
16327 QualType ParamType = Param->getType().getNonReferenceType();
16328 if (ParamType->isDependentType() || ParamType->isRecordType() ||
16329 ParamType->isEnumeralType()) {
16330 ClassOrEnumParam = true;
16331 break;
16332 }
16333 }
16334
16335 if (!ClassOrEnumParam)
16336 return Diag(FnDecl->getLocation(),
16337 diag::err_operator_overload_needs_class_or_enum)
16338 << FnDecl->getDeclName();
16339 }
16340
16341 // C++ [over.oper]p8:
16342 // An operator function cannot have default arguments (8.3.6),
16343 // except where explicitly stated below.
16344 //
16345 // Only the function-call operator (C++ [over.call]p1) and the subscript
16346 // operator (CWG2507) allow default arguments.
16347 if (Op != OO_Call) {
16348 ParmVarDecl *FirstDefaultedParam = nullptr;
16349 for (auto *Param : FnDecl->parameters()) {
16350 if (Param->hasDefaultArg()) {
16351 FirstDefaultedParam = Param;
16352 break;
16353 }
16354 }
16355 if (FirstDefaultedParam) {
16356 if (Op == OO_Subscript) {
16357 Diag(FnDecl->getLocation(), LangOpts.CPlusPlus23
16358 ? diag::ext_subscript_overload
16359 : diag::error_subscript_overload)
16360 << FnDecl->getDeclName() << 1
16361 << FirstDefaultedParam->getDefaultArgRange();
16362 } else {
16363 return Diag(FirstDefaultedParam->getLocation(),
16364 diag::err_operator_overload_default_arg)
16365 << FnDecl->getDeclName()
16366 << FirstDefaultedParam->getDefaultArgRange();
16367 }
16368 }
16369 }
16370
16371 static const bool OperatorUses[NUM_OVERLOADED_OPERATORS][3] = {
16372 { false, false, false }
16373#define OVERLOADED_OPERATOR(Name,Spelling,Token,Unary,Binary,MemberOnly) \
16374 , { Unary, Binary, MemberOnly }
16375#include "clang/Basic/OperatorKinds.def"
16376 };
16377
16378 bool CanBeUnaryOperator = OperatorUses[Op][0];
16379 bool CanBeBinaryOperator = OperatorUses[Op][1];
16380 bool MustBeMemberOperator = OperatorUses[Op][2];
16381
16382 // C++ [over.oper]p8:
16383 // [...] Operator functions cannot have more or fewer parameters
16384 // than the number required for the corresponding operator, as
16385 // described in the rest of this subclause.
16386 unsigned NumParams = FnDecl->getNumParams() +
16387 (isa<CXXMethodDecl>(FnDecl) &&
16389 ? 1
16390 : 0);
16391 if (Op != OO_Call && Op != OO_Subscript &&
16392 ((NumParams == 1 && !CanBeUnaryOperator) ||
16393 (NumParams == 2 && !CanBeBinaryOperator) || (NumParams < 1) ||
16394 (NumParams > 2))) {
16395 // We have the wrong number of parameters.
16396 unsigned ErrorKind;
16397 if (CanBeUnaryOperator && CanBeBinaryOperator) {
16398 ErrorKind = 2; // 2 -> unary or binary.
16399 } else if (CanBeUnaryOperator) {
16400 ErrorKind = 0; // 0 -> unary
16401 } else {
16402 assert(CanBeBinaryOperator &&
16403 "All non-call overloaded operators are unary or binary!");
16404 ErrorKind = 1; // 1 -> binary
16405 }
16406 return Diag(FnDecl->getLocation(), diag::err_operator_overload_must_be)
16407 << FnDecl->getDeclName() << NumParams << ErrorKind;
16408 }
16409
16410 if (Op == OO_Subscript && NumParams != 2) {
16411 Diag(FnDecl->getLocation(), LangOpts.CPlusPlus23
16412 ? diag::ext_subscript_overload
16413 : diag::error_subscript_overload)
16414 << FnDecl->getDeclName() << (NumParams == 1 ? 0 : 2);
16415 }
16416
16417 // Overloaded operators other than operator() and operator[] cannot be
16418 // variadic.
16419 if (Op != OO_Call &&
16420 FnDecl->getType()->castAs<FunctionProtoType>()->isVariadic()) {
16421 return Diag(FnDecl->getLocation(), diag::err_operator_overload_variadic)
16422 << FnDecl->getDeclName();
16423 }
16424
16425 // Some operators must be member functions.
16426 if (MustBeMemberOperator && !isa<CXXMethodDecl>(FnDecl)) {
16427 return Diag(FnDecl->getLocation(),
16428 diag::err_operator_overload_must_be_member)
16429 << FnDecl->getDeclName();
16430 }
16431
16432 // C++ [over.inc]p1:
16433 // The user-defined function called operator++ implements the
16434 // prefix and postfix ++ operator. If this function is a member
16435 // function with no parameters, or a non-member function with one
16436 // parameter of class or enumeration type, it defines the prefix
16437 // increment operator ++ for objects of that type. If the function
16438 // is a member function with one parameter (which shall be of type
16439 // int) or a non-member function with two parameters (the second
16440 // of which shall be of type int), it defines the postfix
16441 // increment operator ++ for objects of that type.
16442 if ((Op == OO_PlusPlus || Op == OO_MinusMinus) && NumParams == 2) {
16443 ParmVarDecl *LastParam = FnDecl->getParamDecl(FnDecl->getNumParams() - 1);
16444 QualType ParamType = LastParam->getType();
16445
16446 if (!ParamType->isSpecificBuiltinType(BuiltinType::Int) &&
16447 !ParamType->isDependentType())
16448 return Diag(LastParam->getLocation(),
16449 diag::err_operator_overload_post_incdec_must_be_int)
16450 << LastParam->getType() << (Op == OO_MinusMinus);
16451 }
16452
16453 return false;
16454}
16455
16456static bool
16458 FunctionTemplateDecl *TpDecl) {
16459 TemplateParameterList *TemplateParams = TpDecl->getTemplateParameters();
16460
16461 // Must have one or two template parameters.
16462 if (TemplateParams->size() == 1) {
16463 NonTypeTemplateParmDecl *PmDecl =
16464 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->getParam(0));
16465
16466 // The template parameter must be a char parameter pack.
16467 if (PmDecl && PmDecl->isTemplateParameterPack() &&
16469 return false;
16470
16471 // C++20 [over.literal]p5:
16472 // A string literal operator template is a literal operator template
16473 // whose template-parameter-list comprises a single non-type
16474 // template-parameter of class type.
16475 //
16476 // As a DR resolution, we also allow placeholders for deduced class
16477 // template specializations.
16478 if (SemaRef.getLangOpts().CPlusPlus20 && PmDecl &&
16479 !PmDecl->isTemplateParameterPack() &&
16480 (PmDecl->getType()->isRecordType() ||
16482 return false;
16483 } else if (TemplateParams->size() == 2) {
16484 TemplateTypeParmDecl *PmType =
16485 dyn_cast<TemplateTypeParmDecl>(TemplateParams->getParam(0));
16486 NonTypeTemplateParmDecl *PmArgs =
16487 dyn_cast<NonTypeTemplateParmDecl>(TemplateParams->getParam(1));
16488
16489 // The second template parameter must be a parameter pack with the
16490 // first template parameter as its type.
16491 if (PmType && PmArgs && !PmType->isTemplateParameterPack() &&
16492 PmArgs->isTemplateParameterPack()) {
16493 const TemplateTypeParmType *TArgs =
16494 PmArgs->getType()->getAs<TemplateTypeParmType>();
16495 if (TArgs && TArgs->getDepth() == PmType->getDepth() &&
16496 TArgs->getIndex() == PmType->getIndex()) {
16498 SemaRef.Diag(TpDecl->getLocation(),
16499 diag::ext_string_literal_operator_template);
16500 return false;
16501 }
16502 }
16503 }
16504
16506 diag::err_literal_operator_template)
16507 << TpDecl->getTemplateParameters()->getSourceRange();
16508 return true;
16509}
16510
16512 if (isa<CXXMethodDecl>(FnDecl)) {
16513 Diag(FnDecl->getLocation(), diag::err_literal_operator_outside_namespace)
16514 << FnDecl->getDeclName();
16515 return true;
16516 }
16517
16518 if (FnDecl->isExternC()) {
16519 Diag(FnDecl->getLocation(), diag::err_literal_operator_extern_c);
16520 if (const LinkageSpecDecl *LSD =
16521 FnDecl->getDeclContext()->getExternCContext())
16522 Diag(LSD->getExternLoc(), diag::note_extern_c_begins_here);
16523 return true;
16524 }
16525
16526 // This might be the definition of a literal operator template.
16528
16529 // This might be a specialization of a literal operator template.
16530 if (!TpDecl)
16531 TpDecl = FnDecl->getPrimaryTemplate();
16532
16533 // template <char...> type operator "" name() and
16534 // template <class T, T...> type operator "" name() are the only valid
16535 // template signatures, and the only valid signatures with no parameters.
16536 //
16537 // C++20 also allows template <SomeClass T> type operator "" name().
16538 if (TpDecl) {
16539 if (FnDecl->param_size() != 0) {
16540 Diag(FnDecl->getLocation(),
16541 diag::err_literal_operator_template_with_params);
16542 return true;
16543 }
16544
16546 return true;
16547
16548 } else if (FnDecl->param_size() == 1) {
16549 const ParmVarDecl *Param = FnDecl->getParamDecl(0);
16550
16551 QualType ParamType = Param->getType().getUnqualifiedType();
16552
16553 // Only unsigned long long int, long double, any character type, and const
16554 // char * are allowed as the only parameters.
16555 if (ParamType->isSpecificBuiltinType(BuiltinType::ULongLong) ||
16556 ParamType->isSpecificBuiltinType(BuiltinType::LongDouble) ||
16557 Context.hasSameType(ParamType, Context.CharTy) ||
16558 Context.hasSameType(ParamType, Context.WideCharTy) ||
16559 Context.hasSameType(ParamType, Context.Char8Ty) ||
16560 Context.hasSameType(ParamType, Context.Char16Ty) ||
16561 Context.hasSameType(ParamType, Context.Char32Ty)) {
16562 } else if (const PointerType *Ptr = ParamType->getAs<PointerType>()) {
16563 QualType InnerType = Ptr->getPointeeType();
16564
16565 // Pointer parameter must be a const char *.
16566 if (!(Context.hasSameType(InnerType.getUnqualifiedType(),
16567 Context.CharTy) &&
16568 InnerType.isConstQualified() && !InnerType.isVolatileQualified())) {
16569 Diag(Param->getSourceRange().getBegin(),
16570 diag::err_literal_operator_param)
16571 << ParamType << "'const char *'" << Param->getSourceRange();
16572 return true;
16573 }
16574
16575 } else if (ParamType->isRealFloatingType()) {
16576 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
16577 << ParamType << Context.LongDoubleTy << Param->getSourceRange();
16578 return true;
16579
16580 } else if (ParamType->isIntegerType()) {
16581 Diag(Param->getSourceRange().getBegin(), diag::err_literal_operator_param)
16582 << ParamType << Context.UnsignedLongLongTy << Param->getSourceRange();
16583 return true;
16584
16585 } else {
16586 Diag(Param->getSourceRange().getBegin(),
16587 diag::err_literal_operator_invalid_param)
16588 << ParamType << Param->getSourceRange();
16589 return true;
16590 }
16591
16592 } else if (FnDecl->param_size() == 2) {
16593 FunctionDecl::param_iterator Param = FnDecl->param_begin();
16594
16595 // First, verify that the first parameter is correct.
16596
16597 QualType FirstParamType = (*Param)->getType().getUnqualifiedType();
16598
16599 // Two parameter function must have a pointer to const as a
16600 // first parameter; let's strip those qualifiers.
16601 const PointerType *PT = FirstParamType->getAs<PointerType>();
16602
16603 if (!PT) {
16604 Diag((*Param)->getSourceRange().getBegin(),
16605 diag::err_literal_operator_param)
16606 << FirstParamType << "'const char *'" << (*Param)->getSourceRange();
16607 return true;
16608 }
16609
16610 QualType PointeeType = PT->getPointeeType();
16611 // First parameter must be const
16612 if (!PointeeType.isConstQualified() || PointeeType.isVolatileQualified()) {
16613 Diag((*Param)->getSourceRange().getBegin(),
16614 diag::err_literal_operator_param)
16615 << FirstParamType << "'const char *'" << (*Param)->getSourceRange();
16616 return true;
16617 }
16618
16619 QualType InnerType = PointeeType.getUnqualifiedType();
16620 // Only const char *, const wchar_t*, const char8_t*, const char16_t*, and
16621 // const char32_t* are allowed as the first parameter to a two-parameter
16622 // function
16623 if (!(Context.hasSameType(InnerType, Context.CharTy) ||
16624 Context.hasSameType(InnerType, Context.WideCharTy) ||
16625 Context.hasSameType(InnerType, Context.Char8Ty) ||
16626 Context.hasSameType(InnerType, Context.Char16Ty) ||
16627 Context.hasSameType(InnerType, Context.Char32Ty))) {
16628 Diag((*Param)->getSourceRange().getBegin(),
16629 diag::err_literal_operator_param)
16630 << FirstParamType << "'const char *'" << (*Param)->getSourceRange();
16631 return true;
16632 }
16633
16634 // Move on to the second and final parameter.
16635 ++Param;
16636
16637 // The second parameter must be a std::size_t.
16638 QualType SecondParamType = (*Param)->getType().getUnqualifiedType();
16639 if (!Context.hasSameType(SecondParamType, Context.getSizeType())) {
16640 Diag((*Param)->getSourceRange().getBegin(),
16641 diag::err_literal_operator_param)
16642 << SecondParamType << Context.getSizeType()
16643 << (*Param)->getSourceRange();
16644 return true;
16645 }
16646 } else {
16647 Diag(FnDecl->getLocation(), diag::err_literal_operator_bad_param_count);
16648 return true;
16649 }
16650
16651 // Parameters are good.
16652
16653 // A parameter-declaration-clause containing a default argument is not
16654 // equivalent to any of the permitted forms.
16655 for (auto *Param : FnDecl->parameters()) {
16656 if (Param->hasDefaultArg()) {
16657 Diag(Param->getDefaultArgRange().getBegin(),
16658 diag::err_literal_operator_default_argument)
16659 << Param->getDefaultArgRange();
16660 break;
16661 }
16662 }
16663
16664 const IdentifierInfo *II = FnDecl->getDeclName().getCXXLiteralIdentifier();
16667 !getSourceManager().isInSystemHeader(FnDecl->getLocation())) {
16668 // C++23 [usrlit.suffix]p1:
16669 // Literal suffix identifiers that do not start with an underscore are
16670 // reserved for future standardization. Literal suffix identifiers that
16671 // contain a double underscore __ are reserved for use by C++
16672 // implementations.
16673 Diag(FnDecl->getLocation(), diag::warn_user_literal_reserved)
16674 << static_cast<int>(Status)
16676 }
16677
16678 return false;
16679}
16680
16682 Expr *LangStr,
16683 SourceLocation LBraceLoc) {
16684 StringLiteral *Lit = cast<StringLiteral>(LangStr);
16685 assert(Lit->isUnevaluated() && "Unexpected string literal kind");
16686
16687 StringRef Lang = Lit->getString();
16689 if (Lang == "C")
16691 else if (Lang == "C++")
16693 else {
16694 Diag(LangStr->getExprLoc(), diag::err_language_linkage_spec_unknown)
16695 << LangStr->getSourceRange();
16696 return nullptr;
16697 }
16698
16699 // FIXME: Add all the various semantics of linkage specifications
16700
16702 LangStr->getExprLoc(), Language,
16703 LBraceLoc.isValid());
16704
16705 /// C++ [module.unit]p7.2.3
16706 /// - Otherwise, if the declaration
16707 /// - ...
16708 /// - ...
16709 /// - appears within a linkage-specification,
16710 /// it is attached to the global module.
16711 ///
16712 /// If the declaration is already in global module fragment, we don't
16713 /// need to attach it again.
16714 if (getLangOpts().CPlusPlusModules && isCurrentModulePurview()) {
16715 Module *GlobalModule = PushImplicitGlobalModuleFragment(ExternLoc);
16716 D->setLocalOwningModule(GlobalModule);
16717 }
16718
16720 PushDeclContext(S, D);
16721 return D;
16722}
16723
16725 Decl *LinkageSpec,
16726 SourceLocation RBraceLoc) {
16727 if (RBraceLoc.isValid()) {
16728 LinkageSpecDecl* LSDecl = cast<LinkageSpecDecl>(LinkageSpec);
16729 LSDecl->setRBraceLoc(RBraceLoc);
16730 }
16731
16732 // If the current module doesn't has Parent, it implies that the
16733 // LinkageSpec isn't in the module created by itself. So we don't
16734 // need to pop it.
16735 if (getLangOpts().CPlusPlusModules && getCurrentModule() &&
16736 getCurrentModule()->isImplicitGlobalModule() &&
16738 PopImplicitGlobalModuleFragment();
16739
16741 return LinkageSpec;
16742}
16743
16745 const ParsedAttributesView &AttrList,
16746 SourceLocation SemiLoc) {
16747 Decl *ED = EmptyDecl::Create(Context, CurContext, SemiLoc);
16748 // Attribute declarations appertain to empty declaration so we handle
16749 // them here.
16750 ProcessDeclAttributeList(S, ED, AttrList);
16751
16752 CurContext->addDecl(ED);
16753 return ED;
16754}
16755
16757 SourceLocation StartLoc,
16759 const IdentifierInfo *Name) {
16760 bool Invalid = false;
16761 QualType ExDeclType = TInfo->getType();
16762
16763 // Arrays and functions decay.
16764 if (ExDeclType->isArrayType())
16765 ExDeclType = Context.getArrayDecayedType(ExDeclType);
16766 else if (ExDeclType->isFunctionType())
16767 ExDeclType = Context.getPointerType(ExDeclType);
16768
16769 // C++ 15.3p1: The exception-declaration shall not denote an incomplete type.
16770 // The exception-declaration shall not denote a pointer or reference to an
16771 // incomplete type, other than [cv] void*.
16772 // N2844 forbids rvalue references.
16773 if (!ExDeclType->isDependentType() && ExDeclType->isRValueReferenceType()) {
16774 Diag(Loc, diag::err_catch_rvalue_ref);
16775 Invalid = true;
16776 }
16777
16778 if (ExDeclType->isVariablyModifiedType()) {
16779 Diag(Loc, diag::err_catch_variably_modified) << ExDeclType;
16780 Invalid = true;
16781 }
16782
16783 QualType BaseType = ExDeclType;
16784 int Mode = 0; // 0 for direct type, 1 for pointer, 2 for reference
16785 unsigned DK = diag::err_catch_incomplete;
16786 if (const PointerType *Ptr = BaseType->getAs<PointerType>()) {
16787 BaseType = Ptr->getPointeeType();
16788 Mode = 1;
16789 DK = diag::err_catch_incomplete_ptr;
16790 } else if (const ReferenceType *Ref = BaseType->getAs<ReferenceType>()) {
16791 // For the purpose of error recovery, we treat rvalue refs like lvalue refs.
16792 BaseType = Ref->getPointeeType();
16793 Mode = 2;
16794 DK = diag::err_catch_incomplete_ref;
16795 }
16796 if (!Invalid && (Mode == 0 || !BaseType->isVoidType()) &&
16797 !BaseType->isDependentType() && RequireCompleteType(Loc, BaseType, DK))
16798 Invalid = true;
16799
16800 if (!Invalid && BaseType.isWebAssemblyReferenceType()) {
16801 Diag(Loc, diag::err_wasm_reftype_tc) << 1;
16802 Invalid = true;
16803 }
16804
16805 if (!Invalid && Mode != 1 && BaseType->isSizelessType()) {
16806 Diag(Loc, diag::err_catch_sizeless) << (Mode == 2 ? 1 : 0) << BaseType;
16807 Invalid = true;
16808 }
16809
16810 if (!Invalid && !ExDeclType->isDependentType() &&
16811 RequireNonAbstractType(Loc, ExDeclType,
16812 diag::err_abstract_type_in_decl,
16814 Invalid = true;
16815
16816 // Only the non-fragile NeXT runtime currently supports C++ catches
16817 // of ObjC types, and no runtime supports catching ObjC types by value.
16818 if (!Invalid && getLangOpts().ObjC) {
16819 QualType T = ExDeclType;
16820 if (const ReferenceType *RT = T->getAs<ReferenceType>())
16821 T = RT->getPointeeType();
16822
16823 if (T->isObjCObjectType()) {
16824 Diag(Loc, diag::err_objc_object_catch);
16825 Invalid = true;
16826 } else if (T->isObjCObjectPointerType()) {
16827 // FIXME: should this be a test for macosx-fragile specifically?
16829 Diag(Loc, diag::warn_objc_pointer_cxx_catch_fragile);
16830 }
16831 }
16832
16833 VarDecl *ExDecl = VarDecl::Create(Context, CurContext, StartLoc, Loc, Name,
16834 ExDeclType, TInfo, SC_None);
16835 ExDecl->setExceptionVariable(true);
16836
16837 // In ARC, infer 'retaining' for variables of retainable type.
16838 if (getLangOpts().ObjCAutoRefCount && ObjC().inferObjCARCLifetime(ExDecl))
16839 Invalid = true;
16840
16841 if (!Invalid && !ExDeclType->isDependentType()) {
16842 if (const RecordType *recordType = ExDeclType->getAs<RecordType>()) {
16843 // Insulate this from anything else we might currently be parsing.
16846
16847 // C++ [except.handle]p16:
16848 // The object declared in an exception-declaration or, if the
16849 // exception-declaration does not specify a name, a temporary (12.2) is
16850 // copy-initialized (8.5) from the exception object. [...]
16851 // The object is destroyed when the handler exits, after the destruction
16852 // of any automatic objects initialized within the handler.
16853 //
16854 // We just pretend to initialize the object with itself, then make sure
16855 // it can be destroyed later.
16856 QualType initType = Context.getExceptionObjectType(ExDeclType);
16857
16858 InitializedEntity entity =
16860 InitializationKind initKind =
16862
16863 Expr *opaqueValue =
16864 new (Context) OpaqueValueExpr(Loc, initType, VK_LValue, OK_Ordinary);
16865 InitializationSequence sequence(*this, entity, initKind, opaqueValue);
16866 ExprResult result = sequence.Perform(*this, entity, initKind, opaqueValue);
16867 if (result.isInvalid())
16868 Invalid = true;
16869 else {
16870 // If the constructor used was non-trivial, set this as the
16871 // "initializer".
16872 CXXConstructExpr *construct = result.getAs<CXXConstructExpr>();
16873 if (!construct->getConstructor()->isTrivial()) {
16874 Expr *init = MaybeCreateExprWithCleanups(construct);
16875 ExDecl->setInit(init);
16876 }
16877
16878 // And make sure it's destructable.
16880 }
16881 }
16882 }
16883
16884 if (Invalid)
16885 ExDecl->setInvalidDecl();
16886
16887 return ExDecl;
16888}
16889
16892 bool Invalid = D.isInvalidType();
16893
16894 // Check for unexpanded parameter packs.
16895 if (DiagnoseUnexpandedParameterPack(D.getIdentifierLoc(), TInfo,
16898 D.getIdentifierLoc());
16899 Invalid = true;
16900 }
16901
16902 const IdentifierInfo *II = D.getIdentifier();
16903 if (NamedDecl *PrevDecl =
16904 LookupSingleName(S, II, D.getIdentifierLoc(), LookupOrdinaryName,
16905 RedeclarationKind::ForVisibleRedeclaration)) {
16906 // The scope should be freshly made just for us. There is just no way
16907 // it contains any previous declaration, except for function parameters in
16908 // a function-try-block's catch statement.
16909 assert(!S->isDeclScope(PrevDecl));
16910 if (isDeclInScope(PrevDecl, CurContext, S)) {
16911 Diag(D.getIdentifierLoc(), diag::err_redefinition)
16912 << D.getIdentifier();
16913 Diag(PrevDecl->getLocation(), diag::note_previous_definition);
16914 Invalid = true;
16915 } else if (PrevDecl->isTemplateParameter())
16916 // Maybe we will complain about the shadowed template parameter.
16917 DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl);
16918 }
16919
16920 if (D.getCXXScopeSpec().isSet() && !Invalid) {
16921 Diag(D.getIdentifierLoc(), diag::err_qualified_catch_declarator)
16922 << D.getCXXScopeSpec().getRange();
16923 Invalid = true;
16924 }
16925
16927 S, TInfo, D.getBeginLoc(), D.getIdentifierLoc(), D.getIdentifier());
16928 if (Invalid)
16929 ExDecl->setInvalidDecl();
16930
16931 // Add the exception declaration into this scope.
16932 if (II)
16933 PushOnScopeChains(ExDecl, S);
16934 else
16935 CurContext->addDecl(ExDecl);
16936
16937 ProcessDeclAttributes(S, ExDecl, D);
16938 return ExDecl;
16939}
16940
16942 Expr *AssertExpr,
16943 Expr *AssertMessageExpr,
16944 SourceLocation RParenLoc) {
16946 return nullptr;
16947
16948 return BuildStaticAssertDeclaration(StaticAssertLoc, AssertExpr,
16949 AssertMessageExpr, RParenLoc, false);
16950}
16951
16952static void WriteCharTypePrefix(BuiltinType::Kind BTK, llvm::raw_ostream &OS) {
16953 switch (BTK) {
16954 case BuiltinType::Char_S:
16955 case BuiltinType::Char_U:
16956 break;
16957 case BuiltinType::Char8:
16958 OS << "u8";
16959 break;
16960 case BuiltinType::Char16:
16961 OS << 'u';
16962 break;
16963 case BuiltinType::Char32:
16964 OS << 'U';
16965 break;
16966 case BuiltinType::WChar_S:
16967 case BuiltinType::WChar_U:
16968 OS << 'L';
16969 break;
16970 default:
16971 llvm_unreachable("Non-character type");
16972 }
16973}
16974
16975/// Convert character's value, interpreted as a code unit, to a string.
16976/// The value needs to be zero-extended to 32-bits.
16977/// FIXME: This assumes Unicode literal encodings
16978static void WriteCharValueForDiagnostic(uint32_t Value, const BuiltinType *BTy,
16979 unsigned TyWidth,
16980 SmallVectorImpl<char> &Str) {
16981 char Arr[UNI_MAX_UTF8_BYTES_PER_CODE_POINT];
16982 char *Ptr = Arr;
16983 BuiltinType::Kind K = BTy->getKind();
16984 llvm::raw_svector_ostream OS(Str);
16985
16986 // This should catch Char_S, Char_U, Char8, and use of escaped characters in
16987 // other types.
16988 if (K == BuiltinType::Char_S || K == BuiltinType::Char_U ||
16989 K == BuiltinType::Char8 || Value <= 0x7F) {
16990 StringRef Escaped = escapeCStyle<EscapeChar::Single>(Value);
16991 if (!Escaped.empty())
16992 EscapeStringForDiagnostic(Escaped, Str);
16993 else
16994 OS << static_cast<char>(Value);
16995 return;
16996 }
16997
16998 switch (K) {
16999 case BuiltinType::Char16:
17000 case BuiltinType::Char32:
17001 case BuiltinType::WChar_S:
17002 case BuiltinType::WChar_U: {
17003 if (llvm::ConvertCodePointToUTF8(Value, Ptr))
17004 EscapeStringForDiagnostic(StringRef(Arr, Ptr - Arr), Str);
17005 else
17006 OS << "\\x"
17007 << llvm::format_hex_no_prefix(Value, TyWidth / 4, /*Upper=*/true);
17008 break;
17009 }
17010 default:
17011 llvm_unreachable("Non-character type is passed");
17012 }
17013}
17014
17015/// Convert \V to a string we can present to the user in a diagnostic
17016/// \T is the type of the expression that has been evaluated into \V
17020 if (!V.hasValue())
17021 return false;
17022
17023 switch (V.getKind()) {
17025 if (T->isBooleanType()) {
17026 // Bools are reduced to ints during evaluation, but for
17027 // diagnostic purposes we want to print them as
17028 // true or false.
17029 int64_t BoolValue = V.getInt().getExtValue();
17030 assert((BoolValue == 0 || BoolValue == 1) &&
17031 "Bool type, but value is not 0 or 1");
17032 llvm::raw_svector_ostream OS(Str);
17033 OS << (BoolValue ? "true" : "false");
17034 } else {
17035 llvm::raw_svector_ostream OS(Str);
17036 // Same is true for chars.
17037 // We want to print the character representation for textual types
17038 const auto *BTy = T->getAs<BuiltinType>();
17039 if (BTy) {
17040 switch (BTy->getKind()) {
17041 case BuiltinType::Char_S:
17042 case BuiltinType::Char_U:
17043 case BuiltinType::Char8:
17044 case BuiltinType::Char16:
17045 case BuiltinType::Char32:
17046 case BuiltinType::WChar_S:
17047 case BuiltinType::WChar_U: {
17048 unsigned TyWidth = Context.getIntWidth(T);
17049 assert(8 <= TyWidth && TyWidth <= 32 && "Unexpected integer width");
17050 uint32_t CodeUnit = static_cast<uint32_t>(V.getInt().getZExtValue());
17051 WriteCharTypePrefix(BTy->getKind(), OS);
17052 OS << '\'';
17053 WriteCharValueForDiagnostic(CodeUnit, BTy, TyWidth, Str);
17054 OS << "' (0x"
17055 << llvm::format_hex_no_prefix(CodeUnit, /*Width=*/2,
17056 /*Upper=*/true)
17057 << ", " << V.getInt() << ')';
17058 return true;
17059 }
17060 default:
17061 break;
17062 }
17063 }
17064 V.getInt().toString(Str);
17065 }
17066
17067 break;
17068
17070 V.getFloat().toString(Str);
17071 break;
17072
17074 if (V.isNullPointer()) {
17075 llvm::raw_svector_ostream OS(Str);
17076 OS << "nullptr";
17077 } else
17078 return false;
17079 break;
17080
17082 llvm::raw_svector_ostream OS(Str);
17083 OS << '(';
17084 V.getComplexFloatReal().toString(Str);
17085 OS << " + ";
17086 V.getComplexFloatImag().toString(Str);
17087 OS << "i)";
17088 } break;
17089
17091 llvm::raw_svector_ostream OS(Str);
17092 OS << '(';
17093 V.getComplexIntReal().toString(Str);
17094 OS << " + ";
17095 V.getComplexIntImag().toString(Str);
17096 OS << "i)";
17097 } break;
17098
17099 default:
17100 return false;
17101 }
17102
17103 return true;
17104}
17105
17106/// Some Expression types are not useful to print notes about,
17107/// e.g. literals and values that have already been expanded
17108/// before such as int-valued template parameters.
17109static bool UsefulToPrintExpr(const Expr *E) {
17110 E = E->IgnoreParenImpCasts();
17111 // Literals are pretty easy for humans to understand.
17114 return false;
17115
17116 // These have been substituted from template parameters
17117 // and appear as literals in the static assert error.
17118 if (isa<SubstNonTypeTemplateParmExpr>(E))
17119 return false;
17120
17121 // -5 is also simple to understand.
17122 if (const auto *UnaryOp = dyn_cast<UnaryOperator>(E))
17123 return UsefulToPrintExpr(UnaryOp->getSubExpr());
17124
17125 // Only print nested arithmetic operators.
17126 if (const auto *BO = dyn_cast<BinaryOperator>(E))
17127 return (BO->isShiftOp() || BO->isAdditiveOp() || BO->isMultiplicativeOp() ||
17128 BO->isBitwiseOp());
17129
17130 return true;
17131}
17132
17134 if (const auto *Op = dyn_cast<BinaryOperator>(E);
17135 Op && Op->getOpcode() != BO_LOr) {
17136 const Expr *LHS = Op->getLHS()->IgnoreParenImpCasts();
17137 const Expr *RHS = Op->getRHS()->IgnoreParenImpCasts();
17138
17139 // Ignore comparisons of boolean expressions with a boolean literal.
17140 if ((isa<CXXBoolLiteralExpr>(LHS) && RHS->getType()->isBooleanType()) ||
17141 (isa<CXXBoolLiteralExpr>(RHS) && LHS->getType()->isBooleanType()))
17142 return;
17143
17144 // Don't print obvious expressions.
17145 if (!UsefulToPrintExpr(LHS) && !UsefulToPrintExpr(RHS))
17146 return;
17147
17148 struct {
17149 const clang::Expr *Cond;
17151 SmallString<12> ValueString;
17152 bool Print;
17153 } DiagSide[2] = {{LHS, Expr::EvalResult(), {}, false},
17154 {RHS, Expr::EvalResult(), {}, false}};
17155 for (unsigned I = 0; I < 2; I++) {
17156 const Expr *Side = DiagSide[I].Cond;
17157
17158 Side->EvaluateAsRValue(DiagSide[I].Result, Context, true);
17159
17160 DiagSide[I].Print =
17161 ConvertAPValueToString(DiagSide[I].Result.Val, Side->getType(),
17162 DiagSide[I].ValueString, Context);
17163 }
17164 if (DiagSide[0].Print && DiagSide[1].Print) {
17165 Diag(Op->getExprLoc(), diag::note_expr_evaluates_to)
17166 << DiagSide[0].ValueString << Op->getOpcodeStr()
17167 << DiagSide[1].ValueString << Op->getSourceRange();
17168 }
17169 }
17170}
17171
17173 std::string &Result,
17174 ASTContext &Ctx,
17175 bool ErrorOnInvalidMessage) {
17176 assert(Message);
17177 assert(!Message->isTypeDependent() && !Message->isValueDependent() &&
17178 "can't evaluate a dependant static assert message");
17179
17180 if (const auto *SL = dyn_cast<StringLiteral>(Message)) {
17181 assert(SL->isUnevaluated() && "expected an unevaluated string");
17182 Result.assign(SL->getString().begin(), SL->getString().end());
17183 return true;
17184 }
17185
17186 SourceLocation Loc = Message->getBeginLoc();
17187 QualType T = Message->getType().getNonReferenceType();
17188 auto *RD = T->getAsCXXRecordDecl();
17189 if (!RD) {
17190 Diag(Loc, diag::err_static_assert_invalid_message);
17191 return false;
17192 }
17193
17194 auto FindMember = [&](StringRef Member, bool &Empty,
17195 bool Diag = false) -> std::optional<LookupResult> {
17197 LookupResult MemberLookup(*this, DN, Loc, Sema::LookupMemberName);
17198 LookupQualifiedName(MemberLookup, RD);
17199 Empty = MemberLookup.empty();
17200 OverloadCandidateSet Candidates(MemberLookup.getNameLoc(),
17202 if (MemberLookup.empty())
17203 return std::nullopt;
17204 return std::move(MemberLookup);
17205 };
17206
17207 bool SizeNotFound, DataNotFound;
17208 std::optional<LookupResult> SizeMember = FindMember("size", SizeNotFound);
17209 std::optional<LookupResult> DataMember = FindMember("data", DataNotFound);
17210 if (SizeNotFound || DataNotFound) {
17211 Diag(Loc, diag::err_static_assert_missing_member_function)
17212 << ((SizeNotFound && DataNotFound) ? 2
17213 : SizeNotFound ? 0
17214 : 1);
17215 return false;
17216 }
17217
17218 if (!SizeMember || !DataMember) {
17219 if (!SizeMember)
17220 FindMember("size", SizeNotFound, /*Diag=*/true);
17221 if (!DataMember)
17222 FindMember("data", DataNotFound, /*Diag=*/true);
17223 return false;
17224 }
17225
17226 auto BuildExpr = [&](LookupResult &LR) {
17228 Message, Message->getType(), Message->getBeginLoc(), false,
17229 CXXScopeSpec(), SourceLocation(), nullptr, LR, nullptr, nullptr);
17230 if (Res.isInvalid())
17231 return ExprError();
17232 Res = BuildCallExpr(nullptr, Res.get(), Loc, {}, Loc, nullptr, false, true);
17233 if (Res.isInvalid())
17234 return ExprError();
17235 if (Res.get()->isTypeDependent() || Res.get()->isValueDependent())
17236 return ExprError();
17238 };
17239
17240 ExprResult SizeE = BuildExpr(*SizeMember);
17241 ExprResult DataE = BuildExpr(*DataMember);
17242
17243 QualType SizeT = Context.getSizeType();
17244 QualType ConstCharPtr =
17246
17247 ExprResult EvaluatedSize =
17248 SizeE.isInvalid() ? ExprError()
17250 SizeE.get(), SizeT, CCEK_StaticAssertMessageSize);
17251 if (EvaluatedSize.isInvalid()) {
17252 Diag(Loc, diag::err_static_assert_invalid_mem_fn_ret_ty) << /*size*/ 0;
17253 return false;
17254 }
17255
17256 ExprResult EvaluatedData =
17257 DataE.isInvalid()
17258 ? ExprError()
17259 : BuildConvertedConstantExpression(DataE.get(), ConstCharPtr,
17261 if (EvaluatedData.isInvalid()) {
17262 Diag(Loc, diag::err_static_assert_invalid_mem_fn_ret_ty) << /*data*/ 1;
17263 return false;
17264 }
17265
17266 if (!ErrorOnInvalidMessage &&
17267 Diags.isIgnored(diag::warn_static_assert_message_constexpr, Loc))
17268 return true;
17269
17270 Expr::EvalResult Status;
17272 Status.Diag = &Notes;
17273 if (!Message->EvaluateCharRangeAsString(Result, EvaluatedSize.get(),
17274 EvaluatedData.get(), Ctx, Status) ||
17275 !Notes.empty()) {
17276 Diag(Message->getBeginLoc(),
17277 ErrorOnInvalidMessage ? diag::err_static_assert_message_constexpr
17278 : diag::warn_static_assert_message_constexpr);
17279 for (const auto &Note : Notes)
17280 Diag(Note.first, Note.second);
17281 return !ErrorOnInvalidMessage;
17282 }
17283 return true;
17284}
17285
17287 Expr *AssertExpr, Expr *AssertMessage,
17288 SourceLocation RParenLoc,
17289 bool Failed) {
17290 assert(AssertExpr != nullptr && "Expected non-null condition");
17291 if (!AssertExpr->isTypeDependent() && !AssertExpr->isValueDependent() &&
17292 (!AssertMessage || (!AssertMessage->isTypeDependent() &&
17293 !AssertMessage->isValueDependent())) &&
17294 !Failed) {
17295 // In a static_assert-declaration, the constant-expression shall be a
17296 // constant expression that can be contextually converted to bool.
17297 ExprResult Converted = PerformContextuallyConvertToBool(AssertExpr);
17298 if (Converted.isInvalid())
17299 Failed = true;
17300
17301 ExprResult FullAssertExpr =
17302 ActOnFinishFullExpr(Converted.get(), StaticAssertLoc,
17303 /*DiscardedValue*/ false,
17304 /*IsConstexpr*/ true);
17305 if (FullAssertExpr.isInvalid())
17306 Failed = true;
17307 else
17308 AssertExpr = FullAssertExpr.get();
17309
17310 llvm::APSInt Cond;
17311 Expr *BaseExpr = AssertExpr;
17312 AllowFoldKind FoldKind = NoFold;
17313
17314 if (!getLangOpts().CPlusPlus) {
17315 // In C mode, allow folding as an extension for better compatibility with
17316 // C++ in terms of expressions like static_assert("test") or
17317 // static_assert(nullptr).
17318 FoldKind = AllowFold;
17319 }
17320
17321 if (!Failed && VerifyIntegerConstantExpression(
17322 BaseExpr, &Cond,
17323 diag::err_static_assert_expression_is_not_constant,
17324 FoldKind).isInvalid())
17325 Failed = true;
17326
17327 // If the static_assert passes, only verify that
17328 // the message is grammatically valid without evaluating it.
17329 if (!Failed && AssertMessage && Cond.getBoolValue()) {
17330 std::string Str;
17331 EvaluateStaticAssertMessageAsString(AssertMessage, Str, Context,
17332 /*ErrorOnInvalidMessage=*/false);
17333 }
17334
17335 // CWG2518
17336 // [dcl.pre]/p10 If [...] the expression is evaluated in the context of a
17337 // template definition, the declaration has no effect.
17338 bool InTemplateDefinition =
17339 getLangOpts().CPlusPlus && CurContext->isDependentContext();
17340
17341 if (!Failed && !Cond && !InTemplateDefinition) {
17342 SmallString<256> MsgBuffer;
17343 llvm::raw_svector_ostream Msg(MsgBuffer);
17344 bool HasMessage = AssertMessage;
17345 if (AssertMessage) {
17346 std::string Str;
17347 HasMessage =
17349 AssertMessage, Str, Context, /*ErrorOnInvalidMessage=*/true) ||
17350 !Str.empty();
17351 Msg << Str;
17352 }
17353 Expr *InnerCond = nullptr;
17354 std::string InnerCondDescription;
17355 std::tie(InnerCond, InnerCondDescription) =
17356 findFailedBooleanCondition(Converted.get());
17357 if (InnerCond && isa<ConceptSpecializationExpr>(InnerCond)) {
17358 // Drill down into concept specialization expressions to see why they
17359 // weren't satisfied.
17360 Diag(AssertExpr->getBeginLoc(), diag::err_static_assert_failed)
17361 << !HasMessage << Msg.str() << AssertExpr->getSourceRange();
17362 ConstraintSatisfaction Satisfaction;
17363 if (!CheckConstraintSatisfaction(InnerCond, Satisfaction))
17364 DiagnoseUnsatisfiedConstraint(Satisfaction);
17365 } else if (InnerCond && !isa<CXXBoolLiteralExpr>(InnerCond)
17366 && !isa<IntegerLiteral>(InnerCond)) {
17367 Diag(InnerCond->getBeginLoc(),
17368 diag::err_static_assert_requirement_failed)
17369 << InnerCondDescription << !HasMessage << Msg.str()
17370 << InnerCond->getSourceRange();
17371 DiagnoseStaticAssertDetails(InnerCond);
17372 } else {
17373 Diag(AssertExpr->getBeginLoc(), diag::err_static_assert_failed)
17374 << !HasMessage << Msg.str() << AssertExpr->getSourceRange();
17376 }
17377 Failed = true;
17378 }
17379 } else {
17380 ExprResult FullAssertExpr = ActOnFinishFullExpr(AssertExpr, StaticAssertLoc,
17381 /*DiscardedValue*/false,
17382 /*IsConstexpr*/true);
17383 if (FullAssertExpr.isInvalid())
17384 Failed = true;
17385 else
17386 AssertExpr = FullAssertExpr.get();
17387 }
17388
17390 AssertExpr, AssertMessage, RParenLoc,
17391 Failed);
17392
17394 return Decl;
17395}
17396
17398 Scope *S, SourceLocation FriendLoc, unsigned TagSpec, SourceLocation TagLoc,
17399 CXXScopeSpec &SS, IdentifierInfo *Name, SourceLocation NameLoc,
17400 SourceLocation EllipsisLoc, const ParsedAttributesView &Attr,
17401 MultiTemplateParamsArg TempParamLists) {
17403
17404 bool IsMemberSpecialization = false;
17405 bool Invalid = false;
17406
17407 if (TemplateParameterList *TemplateParams =
17409 TagLoc, NameLoc, SS, nullptr, TempParamLists, /*friend*/ true,
17410 IsMemberSpecialization, Invalid)) {
17411 if (TemplateParams->size() > 0) {
17412 // This is a declaration of a class template.
17413 if (Invalid)
17414 return true;
17415
17416 return CheckClassTemplate(S, TagSpec, TagUseKind::Friend, TagLoc, SS,
17417 Name, NameLoc, Attr, TemplateParams, AS_public,
17418 /*ModulePrivateLoc=*/SourceLocation(),
17419 FriendLoc, TempParamLists.size() - 1,
17420 TempParamLists.data())
17421 .get();
17422 } else {
17423 // The "template<>" header is extraneous.
17424 Diag(TemplateParams->getTemplateLoc(), diag::err_template_tag_noparams)
17425 << TypeWithKeyword::getTagTypeKindName(Kind) << Name;
17426 IsMemberSpecialization = true;
17427 }
17428 }
17429
17430 if (Invalid) return true;
17431
17432 bool isAllExplicitSpecializations = true;
17433 for (unsigned I = TempParamLists.size(); I-- > 0; ) {
17434 if (TempParamLists[I]->size()) {
17435 isAllExplicitSpecializations = false;
17436 break;
17437 }
17438 }
17439
17440 // FIXME: don't ignore attributes.
17441
17442 // If it's explicit specializations all the way down, just forget
17443 // about the template header and build an appropriate non-templated
17444 // friend. TODO: for source fidelity, remember the headers.
17446 if (isAllExplicitSpecializations) {
17447 if (SS.isEmpty()) {
17448 bool Owned = false;
17449 bool IsDependent = false;
17450 return ActOnTag(S, TagSpec, TagUseKind::Friend, TagLoc, SS, Name, NameLoc,
17451 Attr, AS_public,
17452 /*ModulePrivateLoc=*/SourceLocation(),
17453 MultiTemplateParamsArg(), Owned, IsDependent,
17454 /*ScopedEnumKWLoc=*/SourceLocation(),
17455 /*ScopedEnumUsesClassTag=*/false,
17456 /*UnderlyingType=*/TypeResult(),
17457 /*IsTypeSpecifier=*/false,
17458 /*IsTemplateParamOrArg=*/false, /*OOK=*/OOK_Outside);
17459 }
17460
17461 ElaboratedTypeKeyword Keyword
17463 QualType T = CheckTypenameType(Keyword, TagLoc, QualifierLoc,
17464 *Name, NameLoc);
17465 if (T.isNull())
17466 return true;
17467
17469 if (isa<DependentNameType>(T)) {
17472 TL.setElaboratedKeywordLoc(TagLoc);
17473 TL.setQualifierLoc(QualifierLoc);
17474 TL.setNameLoc(NameLoc);
17475 } else {
17477 TL.setElaboratedKeywordLoc(TagLoc);
17478 TL.setQualifierLoc(QualifierLoc);
17479 TL.getNamedTypeLoc().castAs<TypeSpecTypeLoc>().setNameLoc(NameLoc);
17480 }
17481
17483 FriendDecl::Create(Context, CurContext, NameLoc, TSI, FriendLoc,
17484 EllipsisLoc, TempParamLists);
17485 Friend->setAccess(AS_public);
17487 return Friend;
17488 }
17489
17490 assert(SS.isNotEmpty() && "valid templated tag with no SS and no direct?");
17491
17492 // CWG 2917: if it (= the friend-type-specifier) is a pack expansion
17493 // (13.7.4 [temp.variadic]), any packs expanded by that pack expansion
17494 // shall not have been introduced by the template-declaration.
17496 collectUnexpandedParameterPacks(QualifierLoc, Unexpanded);
17497 unsigned FriendDeclDepth = TempParamLists.front()->getDepth();
17498 for (UnexpandedParameterPack &U : Unexpanded) {
17499 if (getDepthAndIndex(U).first >= FriendDeclDepth) {
17500 auto *ND = U.first.dyn_cast<NamedDecl *>();
17501 if (!ND)
17502 ND = cast<const TemplateTypeParmType *>(U.first)->getDecl();
17503 Diag(U.second, diag::friend_template_decl_malformed_pack_expansion)
17504 << ND->getDeclName() << SourceRange(SS.getBeginLoc(), EllipsisLoc);
17505 return true;
17506 }
17507 }
17508
17509 // Handle the case of a templated-scope friend class. e.g.
17510 // template <class T> class A<T>::B;
17511 // FIXME: we don't support these right now.
17512 Diag(NameLoc, diag::warn_template_qualified_friend_unsupported)
17513 << SS.getScopeRep() << SS.getRange() << cast<CXXRecordDecl>(CurContext);
17518 TL.setElaboratedKeywordLoc(TagLoc);
17520 TL.setNameLoc(NameLoc);
17521
17523 FriendDecl::Create(Context, CurContext, NameLoc, TSI, FriendLoc,
17524 EllipsisLoc, TempParamLists);
17525 Friend->setAccess(AS_public);
17526 Friend->setUnsupportedFriend(true);
17528 return Friend;
17529}
17530
17532 MultiTemplateParamsArg TempParams,
17533 SourceLocation EllipsisLoc) {
17535 SourceLocation FriendLoc = DS.getFriendSpecLoc();
17536
17537 assert(DS.isFriendSpecified());
17539
17540 // C++ [class.friend]p3:
17541 // A friend declaration that does not declare a function shall have one of
17542 // the following forms:
17543 // friend elaborated-type-specifier ;
17544 // friend simple-type-specifier ;
17545 // friend typename-specifier ;
17546 //
17547 // If the friend keyword isn't first, or if the declarations has any type
17548 // qualifiers, then the declaration doesn't have that form.
17550 Diag(FriendLoc, diag::err_friend_not_first_in_declaration);
17551 if (DS.getTypeQualifiers()) {
17553 Diag(DS.getConstSpecLoc(), diag::err_friend_decl_spec) << "const";
17555 Diag(DS.getVolatileSpecLoc(), diag::err_friend_decl_spec) << "volatile";
17557 Diag(DS.getRestrictSpecLoc(), diag::err_friend_decl_spec) << "restrict";
17559 Diag(DS.getAtomicSpecLoc(), diag::err_friend_decl_spec) << "_Atomic";
17561 Diag(DS.getUnalignedSpecLoc(), diag::err_friend_decl_spec) << "__unaligned";
17562 }
17563
17564 // Try to convert the decl specifier to a type. This works for
17565 // friend templates because ActOnTag never produces a ClassTemplateDecl
17566 // for a TagUseKind::Friend.
17567 Declarator TheDeclarator(DS, ParsedAttributesView::none(),
17569 TypeSourceInfo *TSI = GetTypeForDeclarator(TheDeclarator);
17570 QualType T = TSI->getType();
17571 if (TheDeclarator.isInvalidType())
17572 return nullptr;
17573
17574 // If '...' is present, the type must contain an unexpanded parameter
17575 // pack, and vice versa.
17576 bool Invalid = false;
17577 if (EllipsisLoc.isInvalid() &&
17579 return nullptr;
17580 if (EllipsisLoc.isValid() &&
17582 Diag(EllipsisLoc, diag::err_pack_expansion_without_parameter_packs)
17583 << TSI->getTypeLoc().getSourceRange();
17584 Invalid = true;
17585 }
17586
17587 if (!T->isElaboratedTypeSpecifier()) {
17588 if (TempParams.size()) {
17589 // C++23 [dcl.pre]p5:
17590 // In a simple-declaration, the optional init-declarator-list can be
17591 // omitted only when declaring a class or enumeration, that is, when
17592 // the decl-specifier-seq contains either a class-specifier, an
17593 // elaborated-type-specifier with a class-key, or an enum-specifier.
17594 //
17595 // The declaration of a template-declaration or explicit-specialization
17596 // is never a member-declaration, so this must be a simple-declaration
17597 // with no init-declarator-list. Therefore, this is ill-formed.
17598 Diag(Loc, diag::err_tagless_friend_type_template) << DS.getSourceRange();
17599 return nullptr;
17600 } else if (const RecordDecl *RD = T->getAsRecordDecl()) {
17601 SmallString<16> InsertionText(" ");
17602 InsertionText += RD->getKindName();
17603
17605 ? diag::warn_cxx98_compat_unelaborated_friend_type
17606 : diag::ext_unelaborated_friend_type)
17607 << (unsigned)RD->getTagKind() << T
17609 InsertionText);
17610 } else {
17611 Diag(FriendLoc, getLangOpts().CPlusPlus11
17612 ? diag::warn_cxx98_compat_nonclass_type_friend
17613 : diag::ext_nonclass_type_friend)
17614 << T << DS.getSourceRange();
17615 }
17616 }
17617
17618 // C++98 [class.friend]p1: A friend of a class is a function
17619 // or class that is not a member of the class . . .
17620 // This is fixed in DR77, which just barely didn't make the C++03
17621 // deadline. It's also a very silly restriction that seriously
17622 // affects inner classes and which nobody else seems to implement;
17623 // thus we never diagnose it, not even in -pedantic.
17624 //
17625 // But note that we could warn about it: it's always useless to
17626 // friend one of your own members (it's not, however, worthless to
17627 // friend a member of an arbitrary specialization of your template).
17628
17629 Decl *D;
17630 if (!TempParams.empty())
17631 // TODO: Support variadic friend template decls?
17632 D = FriendTemplateDecl::Create(Context, CurContext, Loc, TempParams, TSI,
17633 FriendLoc);
17634 else
17636 TSI, FriendLoc, EllipsisLoc);
17637
17638 if (!D)
17639 return nullptr;
17640
17643
17644 if (Invalid)
17645 D->setInvalidDecl();
17646
17647 return D;
17648}
17649
17651 MultiTemplateParamsArg TemplateParams) {
17652 const DeclSpec &DS = D.getDeclSpec();
17653
17654 assert(DS.isFriendSpecified());
17656
17657 SourceLocation Loc = D.getIdentifierLoc();
17659
17660 // C++ [class.friend]p1
17661 // A friend of a class is a function or class....
17662 // Note that this sees through typedefs, which is intended.
17663 // It *doesn't* see through dependent types, which is correct
17664 // according to [temp.arg.type]p3:
17665 // If a declaration acquires a function type through a
17666 // type dependent on a template-parameter and this causes
17667 // a declaration that does not use the syntactic form of a
17668 // function declarator to have a function type, the program
17669 // is ill-formed.
17670 if (!TInfo->getType()->isFunctionType()) {
17671 Diag(Loc, diag::err_unexpected_friend);
17672
17673 // It might be worthwhile to try to recover by creating an
17674 // appropriate declaration.
17675 return nullptr;
17676 }
17677
17678 // C++ [namespace.memdef]p3
17679 // - If a friend declaration in a non-local class first declares a
17680 // class or function, the friend class or function is a member
17681 // of the innermost enclosing namespace.
17682 // - The name of the friend is not found by simple name lookup
17683 // until a matching declaration is provided in that namespace
17684 // scope (either before or after the class declaration granting
17685 // friendship).
17686 // - If a friend function is called, its name may be found by the
17687 // name lookup that considers functions from namespaces and
17688 // classes associated with the types of the function arguments.
17689 // - When looking for a prior declaration of a class or a function
17690 // declared as a friend, scopes outside the innermost enclosing
17691 // namespace scope are not considered.
17692
17693 CXXScopeSpec &SS = D.getCXXScopeSpec();
17695 assert(NameInfo.getName());
17696
17697 // Check for unexpanded parameter packs.
17701 return nullptr;
17702
17703 // The context we found the declaration in, or in which we should
17704 // create the declaration.
17705 DeclContext *DC;
17706 Scope *DCScope = S;
17707 LookupResult Previous(*this, NameInfo, LookupOrdinaryName,
17708 RedeclarationKind::ForExternalRedeclaration);
17709
17710 bool isTemplateId = D.getName().getKind() == UnqualifiedIdKind::IK_TemplateId;
17711
17712 // There are five cases here.
17713 // - There's no scope specifier and we're in a local class. Only look
17714 // for functions declared in the immediately-enclosing block scope.
17715 // We recover from invalid scope qualifiers as if they just weren't there.
17716 FunctionDecl *FunctionContainingLocalClass = nullptr;
17717 if ((SS.isInvalid() || !SS.isSet()) &&
17718 (FunctionContainingLocalClass =
17719 cast<CXXRecordDecl>(CurContext)->isLocalClass())) {
17720 // C++11 [class.friend]p11:
17721 // If a friend declaration appears in a local class and the name
17722 // specified is an unqualified name, a prior declaration is
17723 // looked up without considering scopes that are outside the
17724 // innermost enclosing non-class scope. For a friend function
17725 // declaration, if there is no prior declaration, the program is
17726 // ill-formed.
17727
17728 // Find the innermost enclosing non-class scope. This is the block
17729 // scope containing the local class definition (or for a nested class,
17730 // the outer local class).
17731 DCScope = S->getFnParent();
17732
17733 // Look up the function name in the scope.
17735 LookupName(Previous, S, /*AllowBuiltinCreation*/false);
17736
17737 if (!Previous.empty()) {
17738 // All possible previous declarations must have the same context:
17739 // either they were declared at block scope or they are members of
17740 // one of the enclosing local classes.
17741 DC = Previous.getRepresentativeDecl()->getDeclContext();
17742 } else {
17743 // This is ill-formed, but provide the context that we would have
17744 // declared the function in, if we were permitted to, for error recovery.
17745 DC = FunctionContainingLocalClass;
17746 }
17748
17749 // - There's no scope specifier, in which case we just go to the
17750 // appropriate scope and look for a function or function template
17751 // there as appropriate.
17752 } else if (SS.isInvalid() || !SS.isSet()) {
17753 // C++11 [namespace.memdef]p3:
17754 // If the name in a friend declaration is neither qualified nor
17755 // a template-id and the declaration is a function or an
17756 // elaborated-type-specifier, the lookup to determine whether
17757 // the entity has been previously declared shall not consider
17758 // any scopes outside the innermost enclosing namespace.
17759
17760 // Find the appropriate context according to the above.
17761 DC = CurContext;
17762
17763 // Skip class contexts. If someone can cite chapter and verse
17764 // for this behavior, that would be nice --- it's what GCC and
17765 // EDG do, and it seems like a reasonable intent, but the spec
17766 // really only says that checks for unqualified existing
17767 // declarations should stop at the nearest enclosing namespace,
17768 // not that they should only consider the nearest enclosing
17769 // namespace.
17770 while (DC->isRecord())
17771 DC = DC->getParent();
17772
17773 DeclContext *LookupDC = DC->getNonTransparentContext();
17774 while (true) {
17775 LookupQualifiedName(Previous, LookupDC);
17776
17777 if (!Previous.empty()) {
17778 DC = LookupDC;
17779 break;
17780 }
17781
17782 if (isTemplateId) {
17783 if (isa<TranslationUnitDecl>(LookupDC)) break;
17784 } else {
17785 if (LookupDC->isFileContext()) break;
17786 }
17787 LookupDC = LookupDC->getParent();
17788 }
17789
17790 DCScope = getScopeForDeclContext(S, DC);
17791
17792 // - There's a non-dependent scope specifier, in which case we
17793 // compute it and do a previous lookup there for a function
17794 // or function template.
17795 } else if (!SS.getScopeRep()->isDependent()) {
17796 DC = computeDeclContext(SS);
17797 if (!DC) return nullptr;
17798
17799 if (RequireCompleteDeclContext(SS, DC)) return nullptr;
17800
17802
17803 // C++ [class.friend]p1: A friend of a class is a function or
17804 // class that is not a member of the class . . .
17805 if (DC->Equals(CurContext))
17808 diag::warn_cxx98_compat_friend_is_member :
17809 diag::err_friend_is_member);
17810
17811 // - There's a scope specifier that does not match any template
17812 // parameter lists, in which case we use some arbitrary context,
17813 // create a method or method template, and wait for instantiation.
17814 // - There's a scope specifier that does match some template
17815 // parameter lists, which we don't handle right now.
17816 } else {
17817 DC = CurContext;
17818 assert(isa<CXXRecordDecl>(DC) && "friend declaration not in class?");
17819 }
17820
17821 if (!DC->isRecord()) {
17822 int DiagArg = -1;
17823 switch (D.getName().getKind()) {
17826 DiagArg = 0;
17827 break;
17829 DiagArg = 1;
17830 break;
17832 DiagArg = 2;
17833 break;
17835 DiagArg = 3;
17836 break;
17842 break;
17843 }
17844 // This implies that it has to be an operator or function.
17845 if (DiagArg >= 0) {
17846 Diag(Loc, diag::err_introducing_special_friend) << DiagArg;
17847 return nullptr;
17848 }
17849 }
17850
17851 // FIXME: This is an egregious hack to cope with cases where the scope stack
17852 // does not contain the declaration context, i.e., in an out-of-line
17853 // definition of a class.
17854 Scope FakeDCScope(S, Scope::DeclScope, Diags);
17855 if (!DCScope) {
17856 FakeDCScope.setEntity(DC);
17857 DCScope = &FakeDCScope;
17858 }
17859
17860 bool AddToScope = true;
17861 NamedDecl *ND = ActOnFunctionDeclarator(DCScope, D, DC, TInfo, Previous,
17862 TemplateParams, AddToScope);
17863 if (!ND) return nullptr;
17864
17865 assert(ND->getLexicalDeclContext() == CurContext);
17866
17867 // If we performed typo correction, we might have added a scope specifier
17868 // and changed the decl context.
17869 DC = ND->getDeclContext();
17870
17871 // Add the function declaration to the appropriate lookup tables,
17872 // adjusting the redeclarations list as necessary. We don't
17873 // want to do this yet if the friending class is dependent.
17874 //
17875 // Also update the scope-based lookup if the target context's
17876 // lookup context is in lexical scope.
17878 DC = DC->getRedeclContext();
17880 if (Scope *EnclosingScope = getScopeForDeclContext(S, DC))
17881 PushOnScopeChains(ND, EnclosingScope, /*AddToContext=*/ false);
17882 }
17883
17885 D.getIdentifierLoc(), ND,
17886 DS.getFriendSpecLoc());
17887 FrD->setAccess(AS_public);
17888 CurContext->addDecl(FrD);
17889
17890 if (ND->isInvalidDecl()) {
17891 FrD->setInvalidDecl();
17892 } else {
17893 if (DC->isRecord()) CheckFriendAccess(ND);
17894
17895 FunctionDecl *FD;
17896 if (FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(ND))
17897 FD = FTD->getTemplatedDecl();
17898 else
17899 FD = cast<FunctionDecl>(ND);
17900
17901 // C++ [class.friend]p6:
17902 // A function may be defined in a friend declaration of a class if and
17903 // only if the class is a non-local class, and the function name is
17904 // unqualified.
17905 if (D.isFunctionDefinition()) {
17906 // Qualified friend function definition.
17907 if (SS.isNotEmpty()) {
17908 // FIXME: We should only do this if the scope specifier names the
17909 // innermost enclosing namespace; otherwise the fixit changes the
17910 // meaning of the code.
17912 Diag(SS.getRange().getBegin(), diag::err_qualified_friend_def);
17913
17914 DB << SS.getScopeRep();
17915 if (DC->isFileContext())
17917
17918 // Friend function defined in a local class.
17919 } else if (FunctionContainingLocalClass) {
17920 Diag(NameInfo.getBeginLoc(), diag::err_friend_def_in_local_class);
17921
17922 // Per [basic.pre]p4, a template-id is not a name. Therefore, if we have
17923 // a template-id, the function name is not unqualified because these is
17924 // no name. While the wording requires some reading in-between the
17925 // lines, GCC, MSVC, and EDG all consider a friend function
17926 // specialization definitions // to be de facto explicit specialization
17927 // and diagnose them as such.
17928 } else if (isTemplateId) {
17929 Diag(NameInfo.getBeginLoc(), diag::err_friend_specialization_def);
17930 }
17931 }
17932
17933 // C++11 [dcl.fct.default]p4: If a friend declaration specifies a
17934 // default argument expression, that declaration shall be a definition
17935 // and shall be the only declaration of the function or function
17936 // template in the translation unit.
17938 // We can't look at FD->getPreviousDecl() because it may not have been set
17939 // if we're in a dependent context. If the function is known to be a
17940 // redeclaration, we will have narrowed Previous down to the right decl.
17941 if (D.isRedeclaration()) {
17942 Diag(FD->getLocation(), diag::err_friend_decl_with_def_arg_redeclared);
17943 Diag(Previous.getRepresentativeDecl()->getLocation(),
17944 diag::note_previous_declaration);
17945 } else if (!D.isFunctionDefinition())
17946 Diag(FD->getLocation(), diag::err_friend_decl_with_def_arg_must_be_def);
17947 }
17948
17949 // Mark templated-scope function declarations as unsupported.
17950 if (FD->getNumTemplateParameterLists() && SS.isValid()) {
17951 Diag(FD->getLocation(), diag::warn_template_qualified_friend_unsupported)
17952 << SS.getScopeRep() << SS.getRange()
17953 << cast<CXXRecordDecl>(CurContext);
17954 FrD->setUnsupportedFriend(true);
17955 }
17956 }
17957
17959
17960 return ND;
17961}
17962
17964 StringLiteral *Message) {
17966
17967 FunctionDecl *Fn = dyn_cast_or_null<FunctionDecl>(Dcl);
17968 if (!Fn) {
17969 Diag(DelLoc, diag::err_deleted_non_function);
17970 return;
17971 }
17972
17973 // Deleted function does not have a body.
17974 Fn->setWillHaveBody(false);
17975
17976 if (const FunctionDecl *Prev = Fn->getPreviousDecl()) {
17977 // Don't consider the implicit declaration we generate for explicit
17978 // specializations. FIXME: Do not generate these implicit declarations.
17979 if ((Prev->getTemplateSpecializationKind() != TSK_ExplicitSpecialization ||
17980 Prev->getPreviousDecl()) &&
17981 !Prev->isDefined()) {
17982 Diag(DelLoc, diag::err_deleted_decl_not_first);
17983 Diag(Prev->getLocation().isInvalid() ? DelLoc : Prev->getLocation(),
17984 Prev->isImplicit() ? diag::note_previous_implicit_declaration
17985 : diag::note_previous_declaration);
17986 // We can't recover from this; the declaration might have already
17987 // been used.
17988 Fn->setInvalidDecl();
17989 return;
17990 }
17991
17992 // To maintain the invariant that functions are only deleted on their first
17993 // declaration, mark the implicitly-instantiated declaration of the
17994 // explicitly-specialized function as deleted instead of marking the
17995 // instantiated redeclaration.
17996 Fn = Fn->getCanonicalDecl();
17997 }
17998
17999 // dllimport/dllexport cannot be deleted.
18000 if (const InheritableAttr *DLLAttr = getDLLAttr(Fn)) {
18001 Diag(Fn->getLocation(), diag::err_attribute_dll_deleted) << DLLAttr;
18002 Fn->setInvalidDecl();
18003 }
18004
18005 // C++11 [basic.start.main]p3:
18006 // A program that defines main as deleted [...] is ill-formed.
18007 if (Fn->isMain())
18008 Diag(DelLoc, diag::err_deleted_main);
18009
18010 // C++11 [dcl.fct.def.delete]p4:
18011 // A deleted function is implicitly inline.
18012 Fn->setImplicitlyInline();
18013 Fn->setDeletedAsWritten(true, Message);
18014}
18015
18017 if (!Dcl || Dcl->isInvalidDecl())
18018 return;
18019
18020 auto *FD = dyn_cast<FunctionDecl>(Dcl);
18021 if (!FD) {
18022 if (auto *FTD = dyn_cast<FunctionTemplateDecl>(Dcl)) {
18023 if (getDefaultedFunctionKind(FTD->getTemplatedDecl()).isComparison()) {
18024 Diag(DefaultLoc, diag::err_defaulted_comparison_template);
18025 return;
18026 }
18027 }
18028
18029 Diag(DefaultLoc, diag::err_default_special_members)
18030 << getLangOpts().CPlusPlus20;
18031 return;
18032 }
18033
18034 // Reject if this can't possibly be a defaultable function.
18036 if (!DefKind &&
18037 // A dependent function that doesn't locally look defaultable can
18038 // still instantiate to a defaultable function if it's a constructor
18039 // or assignment operator.
18040 (!FD->isDependentContext() ||
18041 (!isa<CXXConstructorDecl>(FD) &&
18042 FD->getDeclName().getCXXOverloadedOperator() != OO_Equal))) {
18043 Diag(DefaultLoc, diag::err_default_special_members)
18044 << getLangOpts().CPlusPlus20;
18045 return;
18046 }
18047
18048 // Issue compatibility warning. We already warned if the operator is
18049 // 'operator<=>' when parsing the '<=>' token.
18050 if (DefKind.isComparison() &&
18052 Diag(DefaultLoc, getLangOpts().CPlusPlus20
18053 ? diag::warn_cxx17_compat_defaulted_comparison
18054 : diag::ext_defaulted_comparison);
18055 }
18056
18057 FD->setDefaulted();
18058 FD->setExplicitlyDefaulted();
18059 FD->setDefaultLoc(DefaultLoc);
18060
18061 // Defer checking functions that are defaulted in a dependent context.
18062 if (FD->isDependentContext())
18063 return;
18064
18065 // Unset that we will have a body for this function. We might not,
18066 // if it turns out to be trivial, and we don't need this marking now
18067 // that we've marked it as defaulted.
18068 FD->setWillHaveBody(false);
18069
18070 if (DefKind.isComparison()) {
18071 // If this comparison's defaulting occurs within the definition of its
18072 // lexical class context, we have to do the checking when complete.
18073 if (auto const *RD = dyn_cast<CXXRecordDecl>(FD->getLexicalDeclContext()))
18074 if (!RD->isCompleteDefinition())
18075 return;
18076 }
18077
18078 // If this member fn was defaulted on its first declaration, we will have
18079 // already performed the checking in CheckCompletedCXXClass. Such a
18080 // declaration doesn't trigger an implicit definition.
18081 if (isa<CXXMethodDecl>(FD)) {
18082 const FunctionDecl *Primary = FD;
18083 if (const FunctionDecl *Pattern = FD->getTemplateInstantiationPattern())
18084 // Ask the template instantiation pattern that actually had the
18085 // '= default' on it.
18086 Primary = Pattern;
18087 if (Primary->getCanonicalDecl()->isDefaulted())
18088 return;
18089 }
18090
18091 if (DefKind.isComparison()) {
18092 if (CheckExplicitlyDefaultedComparison(nullptr, FD, DefKind.asComparison()))
18093 FD->setInvalidDecl();
18094 else
18095 DefineDefaultedComparison(DefaultLoc, FD, DefKind.asComparison());
18096 } else {
18097 auto *MD = cast<CXXMethodDecl>(FD);
18098
18100 DefaultLoc))
18101 MD->setInvalidDecl();
18102 else
18103 DefineDefaultedFunction(*this, MD, DefaultLoc);
18104 }
18105}
18106
18108 for (Stmt *SubStmt : S->children()) {
18109 if (!SubStmt)
18110 continue;
18111 if (isa<ReturnStmt>(SubStmt))
18112 Self.Diag(SubStmt->getBeginLoc(),
18113 diag::err_return_in_constructor_handler);
18114 if (!isa<Expr>(SubStmt))
18115 SearchForReturnInStmt(Self, SubStmt);
18116 }
18117}
18118
18120 for (unsigned I = 0, E = TryBlock->getNumHandlers(); I != E; ++I) {
18121 CXXCatchStmt *Handler = TryBlock->getHandler(I);
18122 SearchForReturnInStmt(*this, Handler);
18123 }
18124}
18125
18127 StringLiteral *DeletedMessage) {
18128 switch (BodyKind) {
18129 case FnBodyKind::Delete:
18130 SetDeclDeleted(D, Loc, DeletedMessage);
18131 break;
18134 break;
18135 case FnBodyKind::Other:
18136 llvm_unreachable(
18137 "Parsed function body should be '= delete;' or '= default;'");
18138 }
18139}
18140
18142 const CXXMethodDecl *Old) {
18143 const auto *NewFT = New->getType()->castAs<FunctionProtoType>();
18144 const auto *OldFT = Old->getType()->castAs<FunctionProtoType>();
18145
18146 if (OldFT->hasExtParameterInfos()) {
18147 for (unsigned I = 0, E = OldFT->getNumParams(); I != E; ++I)
18148 // A parameter of the overriding method should be annotated with noescape
18149 // if the corresponding parameter of the overridden method is annotated.
18150 if (OldFT->getExtParameterInfo(I).isNoEscape() &&
18151 !NewFT->getExtParameterInfo(I).isNoEscape()) {
18152 Diag(New->getParamDecl(I)->getLocation(),
18153 diag::warn_overriding_method_missing_noescape);
18154 Diag(Old->getParamDecl(I)->getLocation(),
18155 diag::note_overridden_marked_noescape);
18156 }
18157 }
18158
18159 // SME attributes must match when overriding a function declaration.
18160 if (IsInvalidSMECallConversion(Old->getType(), New->getType())) {
18161 Diag(New->getLocation(), diag::err_conflicting_overriding_attributes)
18162 << New << New->getType() << Old->getType();
18163 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
18164 return true;
18165 }
18166
18167 // Virtual overrides must have the same code_seg.
18168 const auto *OldCSA = Old->getAttr<CodeSegAttr>();
18169 const auto *NewCSA = New->getAttr<CodeSegAttr>();
18170 if ((NewCSA || OldCSA) &&
18171 (!OldCSA || !NewCSA || NewCSA->getName() != OldCSA->getName())) {
18172 Diag(New->getLocation(), diag::err_mismatched_code_seg_override);
18173 Diag(Old->getLocation(), diag::note_previous_declaration);
18174 return true;
18175 }
18176
18177 // Virtual overrides: check for matching effects.
18179 const auto OldFX = Old->getFunctionEffects();
18180 const auto NewFXOrig = New->getFunctionEffects();
18181
18182 if (OldFX != NewFXOrig) {
18183 FunctionEffectSet NewFX(NewFXOrig);
18184 const auto Diffs = FunctionEffectDiffVector(OldFX, NewFX);
18186 for (const auto &Diff : Diffs) {
18187 switch (Diff.shouldDiagnoseMethodOverride(*Old, OldFX, *New, NewFX)) {
18189 break;
18191 Diag(New->getLocation(), diag::warn_mismatched_func_effect_override)
18192 << Diff.effectName();
18193 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18194 << Old->getReturnTypeSourceRange();
18195 break;
18197 NewFX.insert(Diff.Old.value(), Errs);
18198 const auto *NewFT = New->getType()->castAs<FunctionProtoType>();
18199 FunctionProtoType::ExtProtoInfo EPI = NewFT->getExtProtoInfo();
18201 QualType ModQT = Context.getFunctionType(NewFT->getReturnType(),
18202 NewFT->getParamTypes(), EPI);
18203 New->setType(ModQT);
18204 break;
18205 }
18206 }
18207 }
18208 if (!Errs.empty())
18210 Old->getLocation());
18211 }
18212 }
18213
18214 CallingConv NewCC = NewFT->getCallConv(), OldCC = OldFT->getCallConv();
18215
18216 // If the calling conventions match, everything is fine
18217 if (NewCC == OldCC)
18218 return false;
18219
18220 // If the calling conventions mismatch because the new function is static,
18221 // suppress the calling convention mismatch error; the error about static
18222 // function override (err_static_overrides_virtual from
18223 // Sema::CheckFunctionDeclaration) is more clear.
18224 if (New->getStorageClass() == SC_Static)
18225 return false;
18226
18227 Diag(New->getLocation(),
18228 diag::err_conflicting_overriding_cc_attributes)
18229 << New->getDeclName() << New->getType() << Old->getType();
18230 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
18231 return true;
18232}
18233
18235 const CXXMethodDecl *Old) {
18236 // CWG2553
18237 // A virtual function shall not be an explicit object member function.
18239 return true;
18240 Diag(New->getParamDecl(0)->getBeginLoc(),
18241 diag::err_explicit_object_parameter_nonmember)
18242 << New->getSourceRange() << /*virtual*/ 1 << /*IsLambda*/ false;
18243 Diag(Old->getLocation(), diag::note_overridden_virtual_function);
18244 New->setInvalidDecl();
18245 return false;
18246}
18247
18249 const CXXMethodDecl *Old) {
18250 QualType NewTy = New->getType()->castAs<FunctionType>()->getReturnType();
18251 QualType OldTy = Old->getType()->castAs<FunctionType>()->getReturnType();
18252
18253 if (Context.hasSameType(NewTy, OldTy) ||
18254 NewTy->isDependentType() || OldTy->isDependentType())
18255 return false;
18256
18257 // Check if the return types are covariant
18258 QualType NewClassTy, OldClassTy;
18259
18260 /// Both types must be pointers or references to classes.
18261 if (const PointerType *NewPT = NewTy->getAs<PointerType>()) {
18262 if (const PointerType *OldPT = OldTy->getAs<PointerType>()) {
18263 NewClassTy = NewPT->getPointeeType();
18264 OldClassTy = OldPT->getPointeeType();
18265 }
18266 } else if (const ReferenceType *NewRT = NewTy->getAs<ReferenceType>()) {
18267 if (const ReferenceType *OldRT = OldTy->getAs<ReferenceType>()) {
18268 if (NewRT->getTypeClass() == OldRT->getTypeClass()) {
18269 NewClassTy = NewRT->getPointeeType();
18270 OldClassTy = OldRT->getPointeeType();
18271 }
18272 }
18273 }
18274
18275 // The return types aren't either both pointers or references to a class type.
18276 if (NewClassTy.isNull() || !NewClassTy->isStructureOrClassType()) {
18277 Diag(New->getLocation(),
18278 diag::err_different_return_type_for_overriding_virtual_function)
18279 << New->getDeclName() << NewTy << OldTy
18280 << New->getReturnTypeSourceRange();
18281 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18282 << Old->getReturnTypeSourceRange();
18283
18284 return true;
18285 }
18286
18287 if (!Context.hasSameUnqualifiedType(NewClassTy, OldClassTy)) {
18288 // C++14 [class.virtual]p8:
18289 // If the class type in the covariant return type of D::f differs from
18290 // that of B::f, the class type in the return type of D::f shall be
18291 // complete at the point of declaration of D::f or shall be the class
18292 // type D.
18293 if (const RecordType *RT = NewClassTy->getAs<RecordType>()) {
18294 if (!RT->isBeingDefined() &&
18295 RequireCompleteType(New->getLocation(), NewClassTy,
18296 diag::err_covariant_return_incomplete,
18297 New->getDeclName()))
18298 return true;
18299 }
18300
18301 // Check if the new class derives from the old class.
18302 if (!IsDerivedFrom(New->getLocation(), NewClassTy, OldClassTy)) {
18303 Diag(New->getLocation(), diag::err_covariant_return_not_derived)
18304 << New->getDeclName() << NewTy << OldTy
18305 << New->getReturnTypeSourceRange();
18306 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18307 << Old->getReturnTypeSourceRange();
18308 return true;
18309 }
18310
18311 // Check if we the conversion from derived to base is valid.
18313 NewClassTy, OldClassTy,
18314 diag::err_covariant_return_inaccessible_base,
18315 diag::err_covariant_return_ambiguous_derived_to_base_conv,
18317 New->getDeclName(), nullptr)) {
18318 // FIXME: this note won't trigger for delayed access control
18319 // diagnostics, and it's impossible to get an undelayed error
18320 // here from access control during the original parse because
18321 // the ParsingDeclSpec/ParsingDeclarator are still in scope.
18322 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18323 << Old->getReturnTypeSourceRange();
18324 return true;
18325 }
18326 }
18327
18328 // The qualifiers of the return types must be the same.
18329 if (NewTy.getLocalCVRQualifiers() != OldTy.getLocalCVRQualifiers()) {
18330 Diag(New->getLocation(),
18331 diag::err_covariant_return_type_different_qualifications)
18332 << New->getDeclName() << NewTy << OldTy
18333 << New->getReturnTypeSourceRange();
18334 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18335 << Old->getReturnTypeSourceRange();
18336 return true;
18337 }
18338
18339
18340 // The new class type must have the same or less qualifiers as the old type.
18341 if (!OldClassTy.isAtLeastAsQualifiedAs(NewClassTy, getASTContext())) {
18342 Diag(New->getLocation(),
18343 diag::err_covariant_return_type_class_type_not_same_or_less_qualified)
18344 << New->getDeclName() << NewTy << OldTy
18345 << New->getReturnTypeSourceRange();
18346 Diag(Old->getLocation(), diag::note_overridden_virtual_function)
18347 << Old->getReturnTypeSourceRange();
18348 return true;
18349 }
18350
18351 return false;
18352}
18353
18355 SourceLocation EndLoc = InitRange.getEnd();
18356 if (EndLoc.isValid())
18357 Method->setRangeEnd(EndLoc);
18358
18359 if (Method->isVirtual() || Method->getParent()->isDependentContext()) {
18360 Method->setIsPureVirtual();
18361 return false;
18362 }
18363
18364 if (!Method->isInvalidDecl())
18365 Diag(Method->getLocation(), diag::err_non_virtual_pure)
18366 << Method->getDeclName() << InitRange;
18367 return true;
18368}
18369
18371 if (D->getFriendObjectKind())
18372 Diag(D->getLocation(), diag::err_pure_friend);
18373 else if (auto *M = dyn_cast<CXXMethodDecl>(D))
18374 CheckPureMethod(M, ZeroLoc);
18375 else
18376 Diag(D->getLocation(), diag::err_illegal_initializer);
18377}
18378
18379/// Invoked when we are about to parse an initializer for the declaration
18380/// 'Dcl'.
18381///
18382/// After this method is called, according to [C++ 3.4.1p13], if 'Dcl' is a
18383/// static data member of class X, names should be looked up in the scope of
18384/// class X. If the declaration had a scope specifier, a scope will have
18385/// been created and passed in for this purpose. Otherwise, S will be null.
18387 assert(D && !D->isInvalidDecl());
18388
18389 // We will always have a nested name specifier here, but this declaration
18390 // might not be out of line if the specifier names the current namespace:
18391 // extern int n;
18392 // int ::n = 0;
18393 if (S && D->isOutOfLine())
18395
18398}
18399
18401 assert(D);
18402
18403 if (S && D->isOutOfLine())
18405
18406 if (getLangOpts().CPlusPlus23) {
18407 // An expression or conversion is 'manifestly constant-evaluated' if it is:
18408 // [...]
18409 // - the initializer of a variable that is usable in constant expressions or
18410 // has constant initialization.
18411 if (auto *VD = dyn_cast<VarDecl>(D);
18414 // An expression or conversion is in an 'immediate function context' if it
18415 // is potentially evaluated and either:
18416 // [...]
18417 // - it is a subexpression of a manifestly constant-evaluated expression
18418 // or conversion.
18419 ExprEvalContexts.back().InImmediateFunctionContext = true;
18420 }
18421 }
18422
18423 // Unless the initializer is in an immediate function context (as determined
18424 // above), this will evaluate all contained immediate function calls as
18425 // constant expressions. If the initializer IS an immediate function context,
18426 // the initializer has been determined to be a constant expression, and all
18427 // such evaluations will be elided (i.e., as if we "knew the whole time" that
18428 // it was a constant expression).
18430}
18431
18433 // C++ 6.4p2:
18434 // The declarator shall not specify a function or an array.
18435 // The type-specifier-seq shall not contain typedef and shall not declare a
18436 // new class or enumeration.
18437 assert(D.getDeclSpec().getStorageClassSpec() != DeclSpec::SCS_typedef &&
18438 "Parser allowed 'typedef' as storage class of condition decl.");
18439
18440 Decl *Dcl = ActOnDeclarator(S, D);
18441 if (!Dcl)
18442 return true;
18443
18444 if (isa<FunctionDecl>(Dcl)) { // The declarator shall not specify a function.
18445 Diag(Dcl->getLocation(), diag::err_invalid_use_of_function_type)
18446 << D.getSourceRange();
18447 return true;
18448 }
18449
18450 if (auto *VD = dyn_cast<VarDecl>(Dcl))
18451 VD->setCXXCondDecl();
18452
18453 return Dcl;
18454}
18455
18457 if (!ExternalSource)
18458 return;
18459
18461 ExternalSource->ReadUsedVTables(VTables);
18463 for (unsigned I = 0, N = VTables.size(); I != N; ++I) {
18464 llvm::DenseMap<CXXRecordDecl *, bool>::iterator Pos
18465 = VTablesUsed.find(VTables[I].Record);
18466 // Even if a definition wasn't required before, it may be required now.
18467 if (Pos != VTablesUsed.end()) {
18468 if (!Pos->second && VTables[I].DefinitionRequired)
18469 Pos->second = true;
18470 continue;
18471 }
18472
18473 VTablesUsed[VTables[I].Record] = VTables[I].DefinitionRequired;
18474 NewUses.push_back(VTableUse(VTables[I].Record, VTables[I].Location));
18475 }
18476
18477 VTableUses.insert(VTableUses.begin(), NewUses.begin(), NewUses.end());
18478}
18479
18481 bool DefinitionRequired) {
18482 // Ignore any vtable uses in unevaluated operands or for classes that do
18483 // not have a vtable.
18484 if (!Class->isDynamicClass() || Class->isDependentContext() ||
18486 return;
18487 // Do not mark as used if compiling for the device outside of the target
18488 // region.
18489 if (TUKind != TU_Prefix && LangOpts.OpenMP && LangOpts.OpenMPIsTargetDevice &&
18490 !OpenMP().isInOpenMPDeclareTargetContext() &&
18491 !OpenMP().isInOpenMPTargetExecutionDirective()) {
18492 if (!DefinitionRequired)
18494 return;
18495 }
18496
18497 // Try to insert this class into the map.
18499 Class = Class->getCanonicalDecl();
18500 std::pair<llvm::DenseMap<CXXRecordDecl *, bool>::iterator, bool>
18501 Pos = VTablesUsed.insert(std::make_pair(Class, DefinitionRequired));
18502 if (!Pos.second) {
18503 // If we already had an entry, check to see if we are promoting this vtable
18504 // to require a definition. If so, we need to reappend to the VTableUses
18505 // list, since we may have already processed the first entry.
18506 if (DefinitionRequired && !Pos.first->second) {
18507 Pos.first->second = true;
18508 } else {
18509 // Otherwise, we can early exit.
18510 return;
18511 }
18512 } else {
18513 // The Microsoft ABI requires that we perform the destructor body
18514 // checks (i.e. operator delete() lookup) when the vtable is marked used, as
18515 // the deleting destructor is emitted with the vtable, not with the
18516 // destructor definition as in the Itanium ABI.
18518 CXXDestructorDecl *DD = Class->getDestructor();
18519 if (DD && DD->isVirtual() && !DD->isDeleted()) {
18520 if (Class->hasUserDeclaredDestructor() && !DD->isDefined()) {
18521 // If this is an out-of-line declaration, marking it referenced will
18522 // not do anything. Manually call CheckDestructor to look up operator
18523 // delete().
18524 ContextRAII SavedContext(*this, DD);
18525 CheckDestructor(DD);
18526 } else {
18527 MarkFunctionReferenced(Loc, Class->getDestructor());
18528 }
18529 }
18530 }
18531 }
18532
18533 // Local classes need to have their virtual members marked
18534 // immediately. For all other classes, we mark their virtual members
18535 // at the end of the translation unit.
18536 if (Class->isLocalClass())
18537 MarkVirtualMembersReferenced(Loc, Class->getDefinition());
18538 else
18539 VTableUses.push_back(std::make_pair(Class, Loc));
18540}
18541
18544 if (VTableUses.empty())
18545 return false;
18546
18547 // Note: The VTableUses vector could grow as a result of marking
18548 // the members of a class as "used", so we check the size each
18549 // time through the loop and prefer indices (which are stable) to
18550 // iterators (which are not).
18551 bool DefinedAnything = false;
18552 for (unsigned I = 0; I != VTableUses.size(); ++I) {
18553 CXXRecordDecl *Class = VTableUses[I].first->getDefinition();
18554 if (!Class)
18555 continue;
18557 Class->getTemplateSpecializationKind();
18558
18559 SourceLocation Loc = VTableUses[I].second;
18560
18561 bool DefineVTable = true;
18562
18563 const CXXMethodDecl *KeyFunction = Context.getCurrentKeyFunction(Class);
18564 // V-tables for non-template classes with an owning module are always
18565 // uniquely emitted in that module.
18566 if (Class->isInCurrentModuleUnit()) {
18567 DefineVTable = true;
18568 } else if (KeyFunction && !KeyFunction->hasBody()) {
18569 // If this class has a key function, but that key function is
18570 // defined in another translation unit, we don't need to emit the
18571 // vtable even though we're using it.
18572 // The key function is in another translation unit.
18573 DefineVTable = false;
18575 KeyFunction->getTemplateSpecializationKind();
18578 "Instantiations don't have key functions");
18579 (void)TSK;
18580 } else if (!KeyFunction) {
18581 // If we have a class with no key function that is the subject
18582 // of an explicit instantiation declaration, suppress the
18583 // vtable; it will live with the explicit instantiation
18584 // definition.
18585 bool IsExplicitInstantiationDeclaration =
18587 for (auto *R : Class->redecls()) {
18589 = cast<CXXRecordDecl>(R)->getTemplateSpecializationKind();
18591 IsExplicitInstantiationDeclaration = true;
18592 else if (TSK == TSK_ExplicitInstantiationDefinition) {
18593 IsExplicitInstantiationDeclaration = false;
18594 break;
18595 }
18596 }
18597
18598 if (IsExplicitInstantiationDeclaration)
18599 DefineVTable = false;
18600 }
18601
18602 // The exception specifications for all virtual members may be needed even
18603 // if we are not providing an authoritative form of the vtable in this TU.
18604 // We may choose to emit it available_externally anyway.
18605 if (!DefineVTable) {
18607 continue;
18608 }
18609
18610 // Mark all of the virtual members of this class as referenced, so
18611 // that we can build a vtable. Then, tell the AST consumer that a
18612 // vtable for this class is required.
18613 DefinedAnything = true;
18615 CXXRecordDecl *Canonical = Class->getCanonicalDecl();
18616 if (VTablesUsed[Canonical] && !Class->shouldEmitInExternalSource())
18618
18619 // Warn if we're emitting a weak vtable. The vtable will be weak if there is
18620 // no key function or the key function is inlined. Don't warn in C++ ABIs
18621 // that lack key functions, since the user won't be able to make one.
18623 Class->isExternallyVisible() && ClassTSK != TSK_ImplicitInstantiation &&
18625 const FunctionDecl *KeyFunctionDef = nullptr;
18626 if (!KeyFunction || (KeyFunction->hasBody(KeyFunctionDef) &&
18627 KeyFunctionDef->isInlined()))
18628 Diag(Class->getLocation(), diag::warn_weak_vtable) << Class;
18629 }
18630 }
18631 VTableUses.clear();
18632
18633 return DefinedAnything;
18634}
18635
18637 const CXXRecordDecl *RD) {
18638 for (const auto *I : RD->methods())
18639 if (I->isVirtual() && !I->isPureVirtual())
18640 ResolveExceptionSpec(Loc, I->getType()->castAs<FunctionProtoType>());
18641}
18642
18644 const CXXRecordDecl *RD,
18645 bool ConstexprOnly) {
18646 // Mark all functions which will appear in RD's vtable as used.
18647 CXXFinalOverriderMap FinalOverriders;
18648 RD->getFinalOverriders(FinalOverriders);
18649 for (CXXFinalOverriderMap::const_iterator I = FinalOverriders.begin(),
18650 E = FinalOverriders.end();
18651 I != E; ++I) {
18652 for (OverridingMethods::const_iterator OI = I->second.begin(),
18653 OE = I->second.end();
18654 OI != OE; ++OI) {
18655 assert(OI->second.size() > 0 && "no final overrider");
18656 CXXMethodDecl *Overrider = OI->second.front().Method;
18657
18658 // C++ [basic.def.odr]p2:
18659 // [...] A virtual member function is used if it is not pure. [...]
18660 if (!Overrider->isPureVirtual() &&
18661 (!ConstexprOnly || Overrider->isConstexpr()))
18662 MarkFunctionReferenced(Loc, Overrider);
18663 }
18664 }
18665
18666 // Only classes that have virtual bases need a VTT.
18667 if (RD->getNumVBases() == 0)
18668 return;
18669
18670 for (const auto &I : RD->bases()) {
18671 const auto *Base =
18672 cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
18673 if (Base->getNumVBases() == 0)
18674 continue;
18676 }
18677}
18678
18679static
18684 Sema &S) {
18685 if (Ctor->isInvalidDecl())
18686 return;
18687
18689
18690 // Target may not be determinable yet, for instance if this is a dependent
18691 // call in an uninstantiated template.
18692 if (Target) {
18693 const FunctionDecl *FNTarget = nullptr;
18694 (void)Target->hasBody(FNTarget);
18695 Target = const_cast<CXXConstructorDecl*>(
18696 cast_or_null<CXXConstructorDecl>(FNTarget));
18697 }
18698
18699 CXXConstructorDecl *Canonical = Ctor->getCanonicalDecl(),
18700 // Avoid dereferencing a null pointer here.
18701 *TCanonical = Target? Target->getCanonicalDecl() : nullptr;
18702
18703 if (!Current.insert(Canonical).second)
18704 return;
18705
18706 // We know that beyond here, we aren't chaining into a cycle.
18707 if (!Target || !Target->isDelegatingConstructor() ||
18708 Target->isInvalidDecl() || Valid.count(TCanonical)) {
18709 Valid.insert(Current.begin(), Current.end());
18710 Current.clear();
18711 // We've hit a cycle.
18712 } else if (TCanonical == Canonical || Invalid.count(TCanonical) ||
18713 Current.count(TCanonical)) {
18714 // If we haven't diagnosed this cycle yet, do so now.
18715 if (!Invalid.count(TCanonical)) {
18716 S.Diag((*Ctor->init_begin())->getSourceLocation(),
18717 diag::warn_delegating_ctor_cycle)
18718 << Ctor;
18719
18720 // Don't add a note for a function delegating directly to itself.
18721 if (TCanonical != Canonical)
18722 S.Diag(Target->getLocation(), diag::note_it_delegates_to);
18723
18725 while (C->getCanonicalDecl() != Canonical) {
18726 const FunctionDecl *FNTarget = nullptr;
18727 (void)C->getTargetConstructor()->hasBody(FNTarget);
18728 assert(FNTarget && "Ctor cycle through bodiless function");
18729
18730 C = const_cast<CXXConstructorDecl*>(
18731 cast<CXXConstructorDecl>(FNTarget));
18732 S.Diag(C->getLocation(), diag::note_which_delegates_to);
18733 }
18734 }
18735
18736 Invalid.insert(Current.begin(), Current.end());
18737 Current.clear();
18738 } else {
18739 DelegatingCycleHelper(Target, Valid, Invalid, Current, S);
18740 }
18741}
18742
18743
18746
18747 for (DelegatingCtorDeclsType::iterator
18750 I != E; ++I)
18751 DelegatingCycleHelper(*I, Valid, Invalid, Current, *this);
18752
18753 for (auto CI = Invalid.begin(), CE = Invalid.end(); CI != CE; ++CI)
18754 (*CI)->setInvalidDecl();
18755}
18756
18757namespace {
18758 /// AST visitor that finds references to the 'this' expression.
18759class FindCXXThisExpr : public DynamicRecursiveASTVisitor {
18760 Sema &S;
18761
18762public:
18763 explicit FindCXXThisExpr(Sema &S) : S(S) {}
18764
18765 bool VisitCXXThisExpr(CXXThisExpr *E) override {
18766 S.Diag(E->getLocation(), diag::err_this_static_member_func)
18767 << E->isImplicit();
18768 return false;
18769 }
18770};
18771}
18772
18774 TypeSourceInfo *TSInfo = Method->getTypeSourceInfo();
18775 if (!TSInfo)
18776 return false;
18777
18778 TypeLoc TL = TSInfo->getTypeLoc();
18780 if (!ProtoTL)
18781 return false;
18782
18783 // C++11 [expr.prim.general]p3:
18784 // [The expression this] shall not appear before the optional
18785 // cv-qualifier-seq and it shall not appear within the declaration of a
18786 // static member function (although its type and value category are defined
18787 // within a static member function as they are within a non-static member
18788 // function). [ Note: this is because declaration matching does not occur
18789 // until the complete declarator is known. - end note ]
18790 const FunctionProtoType *Proto = ProtoTL.getTypePtr();
18791 FindCXXThisExpr Finder(*this);
18792
18793 // If the return type came after the cv-qualifier-seq, check it now.
18794 if (Proto->hasTrailingReturn() &&
18795 !Finder.TraverseTypeLoc(ProtoTL.getReturnLoc()))
18796 return true;
18797
18798 // Check the exception specification.
18800 return true;
18801
18802 // Check the trailing requires clause
18803 if (Expr *E = Method->getTrailingRequiresClause())
18804 if (!Finder.TraverseStmt(E))
18805 return true;
18806
18808}
18809
18811 TypeSourceInfo *TSInfo = Method->getTypeSourceInfo();
18812 if (!TSInfo)
18813 return false;
18814
18815 TypeLoc TL = TSInfo->getTypeLoc();
18817 if (!ProtoTL)
18818 return false;
18819
18820 const FunctionProtoType *Proto = ProtoTL.getTypePtr();
18821 FindCXXThisExpr Finder(*this);
18822
18823 switch (Proto->getExceptionSpecType()) {
18824 case EST_Unparsed:
18825 case EST_Uninstantiated:
18826 case EST_Unevaluated:
18827 case EST_BasicNoexcept:
18828 case EST_NoThrow:
18829 case EST_DynamicNone:
18830 case EST_MSAny:
18831 case EST_None:
18832 break;
18833
18835 case EST_NoexceptFalse:
18836 case EST_NoexceptTrue:
18837 if (!Finder.TraverseStmt(Proto->getNoexceptExpr()))
18838 return true;
18839 [[fallthrough]];
18840
18841 case EST_Dynamic:
18842 for (const auto &E : Proto->exceptions()) {
18843 if (!Finder.TraverseType(E))
18844 return true;
18845 }
18846 break;
18847 }
18848
18849 return false;
18850}
18851
18853 FindCXXThisExpr Finder(*this);
18854
18855 // Check attributes.
18856 for (const auto *A : Method->attrs()) {
18857 // FIXME: This should be emitted by tblgen.
18858 Expr *Arg = nullptr;
18859 ArrayRef<Expr *> Args;
18860 if (const auto *G = dyn_cast<GuardedByAttr>(A))
18861 Arg = G->getArg();
18862 else if (const auto *G = dyn_cast<PtGuardedByAttr>(A))
18863 Arg = G->getArg();
18864 else if (const auto *AA = dyn_cast<AcquiredAfterAttr>(A))
18865 Args = llvm::ArrayRef(AA->args_begin(), AA->args_size());
18866 else if (const auto *AB = dyn_cast<AcquiredBeforeAttr>(A))
18867 Args = llvm::ArrayRef(AB->args_begin(), AB->args_size());
18868 else if (const auto *ETLF = dyn_cast<ExclusiveTrylockFunctionAttr>(A)) {
18869 Arg = ETLF->getSuccessValue();
18870 Args = llvm::ArrayRef(ETLF->args_begin(), ETLF->args_size());
18871 } else if (const auto *STLF = dyn_cast<SharedTrylockFunctionAttr>(A)) {
18872 Arg = STLF->getSuccessValue();
18873 Args = llvm::ArrayRef(STLF->args_begin(), STLF->args_size());
18874 } else if (const auto *LR = dyn_cast<LockReturnedAttr>(A))
18875 Arg = LR->getArg();
18876 else if (const auto *LE = dyn_cast<LocksExcludedAttr>(A))
18877 Args = llvm::ArrayRef(LE->args_begin(), LE->args_size());
18878 else if (const auto *RC = dyn_cast<RequiresCapabilityAttr>(A))
18879 Args = llvm::ArrayRef(RC->args_begin(), RC->args_size());
18880 else if (const auto *AC = dyn_cast<AcquireCapabilityAttr>(A))
18881 Args = llvm::ArrayRef(AC->args_begin(), AC->args_size());
18882 else if (const auto *AC = dyn_cast<TryAcquireCapabilityAttr>(A))
18883 Args = llvm::ArrayRef(AC->args_begin(), AC->args_size());
18884 else if (const auto *RC = dyn_cast<ReleaseCapabilityAttr>(A))
18885 Args = llvm::ArrayRef(RC->args_begin(), RC->args_size());
18886
18887 if (Arg && !Finder.TraverseStmt(Arg))
18888 return true;
18889
18890 for (unsigned I = 0, N = Args.size(); I != N; ++I) {
18891 if (!Finder.TraverseStmt(Args[I]))
18892 return true;
18893 }
18894 }
18895
18896 return false;
18897}
18898
18900 bool IsTopLevel, ExceptionSpecificationType EST,
18901 ArrayRef<ParsedType> DynamicExceptions,
18902 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr,
18903 SmallVectorImpl<QualType> &Exceptions,
18905 Exceptions.clear();
18906 ESI.Type = EST;
18907 if (EST == EST_Dynamic) {
18908 Exceptions.reserve(DynamicExceptions.size());
18909 for (unsigned ei = 0, ee = DynamicExceptions.size(); ei != ee; ++ei) {
18910 // FIXME: Preserve type source info.
18911 QualType ET = GetTypeFromParser(DynamicExceptions[ei]);
18912
18913 if (IsTopLevel) {
18915 collectUnexpandedParameterPacks(ET, Unexpanded);
18916 if (!Unexpanded.empty()) {
18918 DynamicExceptionRanges[ei].getBegin(), UPPC_ExceptionType,
18919 Unexpanded);
18920 continue;
18921 }
18922 }
18923
18924 // Check that the type is valid for an exception spec, and
18925 // drop it if not.
18926 if (!CheckSpecifiedExceptionType(ET, DynamicExceptionRanges[ei]))
18927 Exceptions.push_back(ET);
18928 }
18929 ESI.Exceptions = Exceptions;
18930 return;
18931 }
18932
18933 if (isComputedNoexcept(EST)) {
18934 assert((NoexceptExpr->isTypeDependent() ||
18935 NoexceptExpr->getType()->getCanonicalTypeUnqualified() ==
18936 Context.BoolTy) &&
18937 "Parser should have made sure that the expression is boolean");
18938 if (IsTopLevel && DiagnoseUnexpandedParameterPack(NoexceptExpr)) {
18939 ESI.Type = EST_BasicNoexcept;
18940 return;
18941 }
18942
18943 ESI.NoexceptExpr = NoexceptExpr;
18944 return;
18945 }
18946}
18947
18949 Decl *D, ExceptionSpecificationType EST, SourceRange SpecificationRange,
18950 ArrayRef<ParsedType> DynamicExceptions,
18951 ArrayRef<SourceRange> DynamicExceptionRanges, Expr *NoexceptExpr) {
18952 if (!D)
18953 return;
18954
18955 // Dig out the function we're referring to.
18956 if (FunctionTemplateDecl *FTD = dyn_cast<FunctionTemplateDecl>(D))
18957 D = FTD->getTemplatedDecl();
18958
18959 FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
18960 if (!FD)
18961 return;
18962
18963 // Check the exception specification.
18966 checkExceptionSpecification(/*IsTopLevel=*/true, EST, DynamicExceptions,
18967 DynamicExceptionRanges, NoexceptExpr, Exceptions,
18968 ESI);
18969
18970 // Update the exception specification on the function type.
18971 Context.adjustExceptionSpec(FD, ESI, /*AsWritten=*/true);
18972
18973 if (CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(D)) {
18974 if (MD->isStatic())
18976
18977 if (MD->isVirtual()) {
18978 // Check overrides, which we previously had to delay.
18979 for (const CXXMethodDecl *O : MD->overridden_methods())
18981 }
18982 }
18983}
18984
18985/// HandleMSProperty - Analyze a __delcspec(property) field of a C++ class.
18986///
18988 SourceLocation DeclStart, Declarator &D,
18989 Expr *BitWidth,
18990 InClassInitStyle InitStyle,
18991 AccessSpecifier AS,
18992 const ParsedAttr &MSPropertyAttr) {
18993 const IdentifierInfo *II = D.getIdentifier();
18994 if (!II) {
18995 Diag(DeclStart, diag::err_anonymous_property);
18996 return nullptr;
18997 }
18998 SourceLocation Loc = D.getIdentifierLoc();
18999
19001 QualType T = TInfo->getType();
19002 if (getLangOpts().CPlusPlus) {
19004
19005 if (DiagnoseUnexpandedParameterPack(D.getIdentifierLoc(), TInfo,
19007 D.setInvalidType();
19008 T = Context.IntTy;
19010 }
19011 }
19012
19013 DiagnoseFunctionSpecifiers(D.getDeclSpec());
19014
19015 if (D.getDeclSpec().isInlineSpecified())
19016 Diag(D.getDeclSpec().getInlineSpecLoc(), diag::err_inline_non_function)
19017 << getLangOpts().CPlusPlus17;
19018 if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec())
19019 Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
19020 diag::err_invalid_thread)
19022
19023 // Check to see if this name was declared as a member previously
19024 NamedDecl *PrevDecl = nullptr;
19026 RedeclarationKind::ForVisibleRedeclaration);
19027 LookupName(Previous, S);
19028 switch (Previous.getResultKind()) {
19031 PrevDecl = Previous.getAsSingle<NamedDecl>();
19032 break;
19033
19035 PrevDecl = Previous.getRepresentativeDecl();
19036 break;
19037
19041 break;
19042 }
19043
19044 if (PrevDecl && PrevDecl->isTemplateParameter()) {
19045 // Maybe we will complain about the shadowed template parameter.
19046 DiagnoseTemplateParameterShadow(D.getIdentifierLoc(), PrevDecl);
19047 // Just pretend that we didn't see the previous declaration.
19048 PrevDecl = nullptr;
19049 }
19050
19051 if (PrevDecl && !isDeclInScope(PrevDecl, Record, S))
19052 PrevDecl = nullptr;
19053
19054 SourceLocation TSSL = D.getBeginLoc();
19055 MSPropertyDecl *NewPD =
19056 MSPropertyDecl::Create(Context, Record, Loc, II, T, TInfo, TSSL,
19057 MSPropertyAttr.getPropertyDataGetter(),
19058 MSPropertyAttr.getPropertyDataSetter());
19060 NewPD->setAccess(AS);
19061
19062 if (NewPD->isInvalidDecl())
19063 Record->setInvalidDecl();
19064
19065 if (D.getDeclSpec().isModulePrivateSpecified())
19066 NewPD->setModulePrivate();
19067
19068 if (NewPD->isInvalidDecl() && PrevDecl) {
19069 // Don't introduce NewFD into scope; there's already something
19070 // with the same name in the same scope.
19071 } else if (II) {
19072 PushOnScopeChains(NewPD, S);
19073 } else
19074 Record->addDecl(NewPD);
19075
19076 return NewPD;
19077}
19078
19080 Declarator &Declarator, unsigned TemplateParameterDepth) {
19081 auto &Info = InventedParameterInfos.emplace_back();
19082 TemplateParameterList *ExplicitParams = nullptr;
19083 ArrayRef<TemplateParameterList *> ExplicitLists =
19085 if (!ExplicitLists.empty()) {
19086 bool IsMemberSpecialization, IsInvalid;
19089 Declarator.getCXXScopeSpec(), /*TemplateId=*/nullptr,
19090 ExplicitLists, /*IsFriend=*/false, IsMemberSpecialization, IsInvalid,
19091 /*SuppressDiagnostic=*/true);
19092 }
19093 // C++23 [dcl.fct]p23:
19094 // An abbreviated function template can have a template-head. The invented
19095 // template-parameters are appended to the template-parameter-list after
19096 // the explicitly declared template-parameters.
19097 //
19098 // A template-head must have one or more template-parameters (read:
19099 // 'template<>' is *not* a template-head). Only append the invented
19100 // template parameters if we matched the nested-name-specifier to a non-empty
19101 // TemplateParameterList.
19102 if (ExplicitParams && !ExplicitParams->empty()) {
19103 Info.AutoTemplateParameterDepth = ExplicitParams->getDepth();
19104 llvm::append_range(Info.TemplateParams, *ExplicitParams);
19105 Info.NumExplicitTemplateParams = ExplicitParams->size();
19106 } else {
19107 Info.AutoTemplateParameterDepth = TemplateParameterDepth;
19108 Info.NumExplicitTemplateParams = 0;
19109 }
19110}
19111
19113 auto &FSI = InventedParameterInfos.back();
19114 if (FSI.TemplateParams.size() > FSI.NumExplicitTemplateParams) {
19115 if (FSI.NumExplicitTemplateParams != 0) {
19116 TemplateParameterList *ExplicitParams =
19120 Context, ExplicitParams->getTemplateLoc(),
19121 ExplicitParams->getLAngleLoc(), FSI.TemplateParams,
19122 ExplicitParams->getRAngleLoc(),
19123 ExplicitParams->getRequiresClause()));
19124 } else {
19127 Context, SourceLocation(), SourceLocation(), FSI.TemplateParams,
19128 SourceLocation(), /*RequiresClause=*/nullptr));
19129 }
19130 }
19131 InventedParameterInfos.pop_back();
19132}
Defines the clang::ASTContext interface.
#define V(N, I)
Definition: ASTContext.h:3453
NodeId Parent
Definition: ASTDiff.cpp:191
DynTypedNode Node
StringRef P
const Decl * D
enum clang::sema::@1724::IndirectLocalPathEntry::EntryKind Kind
IndirectLocalPath & Path
Expr * E
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
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...
int Category
Definition: Format.cpp:3054
LangStandard::Kind Std
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.
llvm::SmallVector< std::pair< const MemRegion *, SVal >, 4 > Bindings
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
This file declares semantic analysis for CUDA constructs.
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 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 RefersToRValueRef(Expr *MemRef)
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.
static IsTupleLike isTupleLike(Sema &S, SourceLocation Loc, QualType T, llvm::APSInt &Size)
#define CheckPolymorphic(Type)
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 bool checkTrivialSubobjectCall(Sema &S, SourceLocation SubobjLoc, QualType SubType, bool ConstRHS, CXXSpecialMemberKind CSM, TrivialSubobjectKind Kind, Sema::TrivialABIHandling TAH, bool Diagnose)
Check whether the special member selected for a given type would be trivial.
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 Expr * CastForMoving(Sema &SemaRef, Expr *E)
static void extendLeft(SourceRange &R, SourceRange Before)
static bool checkTrivialClassMembers(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, bool ConstArg, Sema::TrivialABIHandling TAH, bool Diagnose)
Check whether the members of a class type allow a special member to be trivial.
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 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 findTrivialSpecialMember(Sema &S, CXXRecordDecl *RD, CXXSpecialMemberKind CSM, unsigned Quals, bool ConstRHS, Sema::TrivialABIHandling TAH, CXXMethodDecl **Selected)
Perform lookup for a special member of the specified kind, and determine whether it is trivial.
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 bool CheckOperatorNewDeleteTypes(Sema &SemaRef, const FunctionDecl *FnDecl, CanQualType ExpectedResultType, CanQualType ExpectedFirstParamType, unsigned DependentParamTypeDiag, unsigned InvalidParamTypeDiag)
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 Sema::ImplicitExceptionSpecification ComputeDefaultedComparisonExceptionSpec(Sema &S, SourceLocation Loc, FunctionDecl *FD, Sema::DefaultedComparisonKind DCK)
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 checkTupleLikeDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, VarDecl *Src, QualType DecompType, const llvm::APSInt &TupleSize)
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 CXXConstructorDecl * findUserDeclaredCtor(CXXRecordDecl *RD)
static bool checkMemberDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const CXXRecordDecl *OrigRD)
static void checkForMultipleExportedDefaultConstructors(Sema &S, CXXRecordDecl *Class)
static bool checkSimpleDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const llvm::APSInt &NumElems, QualType ElemType, llvm::function_ref< ExprResult(SourceLocation, Expr *, unsigned)> GetInit)
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 NamespaceDecl * getNamespaceDecl(NamedDecl *D)
getNamespaceDecl - Returns the namespace a decl represents.
static bool checkArrayDecomposition(Sema &S, ArrayRef< BindingDecl * > Bindings, ValueDecl *Src, QualType DecompType, const ConstantArrayType *CAT)
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 ClassTemplateDecl * LookupStdInitializerList(Sema &S, SourceLocation Loc)
static bool CheckOperatorNewDeclaration(Sema &SemaRef, const FunctionDecl *FnDecl)
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 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.
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 void DefineDefaultedFunction(Sema &S, FunctionDecl *FD, SourceLocation DefaultLoc)
static bool BuildImplicitMemberInitializer(Sema &SemaRef, CXXConstructorDecl *Constructor, ImplicitInitializerKind ImplicitInitKind, FieldDecl *Field, IndirectFieldDecl *Indirect, CXXCtorInitializer *&CXXMemberInit)
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 lookupStdTypeTraitMember(Sema &S, LookupResult &TraitMemberLookup, SourceLocation Loc, StringRef Trait, TemplateArgumentListInfo &Args, unsigned DiagID)
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 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 CheckConstexprCtorInitializer(Sema &SemaRef, const FunctionDecl *Dcl, FieldDecl *Field, llvm::SmallSet< Decl *, 16 > &Inits, bool &Diagnosed, Sema::CheckConstexprKind Kind)
Check that the given field is initialized within a constexpr constructor.
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.
SourceRange Range
Definition: SemaObjC.cpp:758
SourceLocation Loc
Definition: SemaObjC.cpp:759
bool Indirect
Definition: SemaObjC.cpp:760
This file declares semantic analysis for Objective-C.
This file declares semantic analysis for OpenMP constructs and clauses.
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.
const NestedNameSpecifier * Specifier
StateNode * Previous
__DEVICE__ void * memcpy(void *__a, const void *__b, size_t __c)
__device__ int
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)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
Definition: APValue.h:122
virtual void HandleVTable(CXXRecordDecl *RD)
Callback involved at the end of a translation unit to notify the consumer that a vtable for the given...
Definition: ASTConsumer.h:124
virtual bool HandleTopLevelDecl(DeclGroupRef D)
HandleTopLevelDecl - Handle the specified top-level declaration.
Definition: ASTConsumer.cpp:18
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:188
TranslationUnitDecl * getTranslationUnitDecl() const
Definition: ASTContext.h:1141
const ConstantArrayType * getAsConstantArrayType(QualType T) const
Definition: ASTContext.h:2915
QualType getRValueReferenceType(QualType T) const
Return the uniqued reference to the type for an rvalue reference to the specified type.
unsigned getIntWidth(QualType T) const
QualType getTagDeclType(const TagDecl *Decl) const
Return the unique reference to the type for the specified TagDecl (struct/union/class/enum) decl.
DeclarationNameTable DeclarationNames
Definition: ASTContext.h:684
QualType getRecordType(const RecordDecl *Decl) const
unsigned NumImplicitCopyAssignmentOperatorsDeclared
The number of implicitly-declared copy assignment operators for which declarations were built.
Definition: ASTContext.h:3403
CanQualType getCanonicalType(QualType T) const
Return the canonical (structural) type corresponding to the specified potentially non-canonical type ...
Definition: ASTContext.h:2716
unsigned NumImplicitDestructorsDeclared
The number of implicitly-declared destructors for which declarations were built.
Definition: ASTContext.h:3417
bool hasSameType(QualType T1, QualType T2) const
Determine whether the given types T1 and T2 are equivalent.
Definition: ASTContext.h:2732
CanQualType LongDoubleTy
Definition: ASTContext.h:1172
CanQualType Char16Ty
Definition: ASTContext.h:1167
CallingConv getDefaultCallingConvention(bool IsVariadic, bool IsCXXMethod, bool IsBuiltin=false) const
Retrieves the default calling convention for the current target.
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
const CXXMethodDecl * getCurrentKeyFunction(const CXXRecordDecl *RD)
Get our current best idea for the key function of the given record decl, or nullptr if there isn't on...
CanQualType VoidPtrTy
Definition: ASTContext.h:1187
void Deallocate(void *Ptr) const
Definition: ASTContext.h:760
QualType getLValueReferenceType(QualType T, bool SpelledAsLValue=true) const
Return the uniqued reference to the type for an lvalue reference to the specified type.
CanQualType DependentTy
Definition: ASTContext.h:1188
QualType getTypeDeclType(const TypeDecl *Decl, const TypeDecl *PrevDecl=nullptr) const
Return the unique reference to the type for the specified type declaration.
Definition: ASTContext.h:1703
CanQualType WideCharTy
Definition: ASTContext.h:1164
IdentifierTable & Idents
Definition: ASTContext.h:680
const LangOptions & getLangOpts() const
Definition: ASTContext.h:834
QualType getConstType(QualType T) const
Return the uniqued reference to the type for a const qualified type.
Definition: ASTContext.h:1392
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<=>,...
Definition: ASTContext.h:2413
QualType AutoDeductTy
Definition: ASTContext.h:1223
CanQualType BoolTy
Definition: ASTContext.h:1161
unsigned NumImplicitDefaultConstructorsDeclared
The number of implicitly-declared default constructors for which declarations were built.
Definition: ASTContext.h:3382
TypeSourceInfo * getTrivialTypeSourceInfo(QualType T, SourceLocation Loc=SourceLocation()) const
Allocate a TypeSourceInfo where all locations have been initialized to a given location,...
bool hasAnyFunctionEffects() const
Definition: ASTContext.h:3014
CanQualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
CanQualType CharTy
Definition: ASTContext.h:1162
unsigned NumImplicitMoveConstructorsDeclared
The number of implicitly-declared move constructors for which declarations were built.
Definition: ASTContext.h:3396
unsigned NumImplicitCopyConstructorsDeclared
The number of implicitly-declared copy constructors for which declarations were built.
Definition: ASTContext.h:3389
CanQualType IntTy
Definition: ASTContext.h:1169
unsigned NumImplicitDestructors
The number of implicitly-declared destructors.
Definition: ASTContext.h:3413
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
Definition: ASTContext.h:2289
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, QualType NamedType, TagDecl *OwnedTagDecl=nullptr) const
void adjustExceptionSpec(FunctionDecl *FD, const FunctionProtoType::ExceptionSpecInfo &ESI, bool AsWritten=false)
Change the exception specification on a function once it is delay-parsed, instantiated,...
const clang::PrintingPolicy & getPrintingPolicy() const
Definition: ASTContext.h:733
bool hasSameUnqualifiedType(QualType T1, QualType T2) const
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
Definition: ASTContext.h:2763
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
uint64_t getTypeSize(QualType T) const
Return the size of the specified (complete) type T, in bits.
Definition: ASTContext.h:2482
CanQualType BuiltinFnTy
Definition: ASTContext.h:1190
unsigned NumImplicitDefaultConstructors
The number of implicitly-declared default constructors.
Definition: ASTContext.h:3378
CharUnits getTypeSizeInChars(QualType T) const
Return the size of the specified (complete) type T, in characters.
unsigned NumImplicitMoveAssignmentOperatorsDeclared
The number of implicitly-declared move assignment operators for which declarations were built.
Definition: ASTContext.h:3410
CanQualType VoidTy
Definition: ASTContext.h:1160
unsigned NumImplicitMoveConstructors
The number of implicitly-declared move constructors.
Definition: ASTContext.h:3392
TypeSourceInfo * CreateTypeSourceInfo(QualType T, unsigned Size=0) const
Allocate an uninitialized TypeSourceInfo.
QualType getExceptionObjectType(QualType T) const
CanQualType UnsignedLongLongTy
Definition: ASTContext.h:1171
QualType getArrayDecayedType(QualType T) const
Return the properly qualified result of decaying the specified array type to a pointer.
QualType getFunctionType(QualType ResultTy, ArrayRef< QualType > Args, const FunctionProtoType::ExtProtoInfo &EPI) const
Return a normal function type with a typed argument list.
Definition: ASTContext.h:1681
QualType getDependentNameType(ElaboratedTypeKeyword Keyword, NestedNameSpecifier *NNS, const IdentifierInfo *Name, QualType Canon=QualType()) const
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.
Definition: ASTContext.h:3175
CanQualType Char32Ty
Definition: ASTContext.h:1168
bool hasSameTemplateName(const TemplateName &X, const TemplateName &Y, bool IgnoreDeduced=false) const
Determine whether the given template names refer to the same template.
const TargetInfo & getTargetInfo() const
Definition: ASTContext.h:799
QualType getAutoDeductType() const
C++11 deduction pattern for 'auto' type.
unsigned NumImplicitCopyConstructors
The number of implicitly-declared copy constructors.
Definition: ASTContext.h:3385
QualType getAddrSpaceQualType(QualType T, LangAS AddressSpace) const
Return the uniqued reference to the type for an address space qualified type with the specified type ...
ExternalASTSource * getExternalSource() const
Retrieve a pointer to the external AST source associated with this AST context, if any.
Definition: ASTContext.h:1274
unsigned NumImplicitCopyAssignmentOperators
The number of implicitly-declared copy assignment operators.
Definition: ASTContext.h:3399
void adjustDeducedFunctionResultType(FunctionDecl *FD, QualType ResultType)
Change the result type of a function type once it is deduced.
NestedNameSpecifier * getCanonicalNestedNameSpecifier(NestedNameSpecifier *NNS) const
Retrieves the "canonical" nested name specifier for a given nested name specifier.
CanQualType Char8Ty
Definition: ASTContext.h:1166
unsigned NumImplicitMoveAssignmentOperators
The number of implicitly-declared move assignment operators.
Definition: ASTContext.h:3406
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:167
PtrTy get() const
Definition: Ownership.h:170
bool isInvalid() const
Definition: Ownership.h:166
bool isUsable() const
Definition: Ownership.h:168
Wrapper for source info for arrays.
Definition: TypeLoc.h:1592
TypeLoc getElementLoc() const
Definition: TypeLoc.h:1622
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition: Type.h:3577
QualType getElementType() const
Definition: Type.h:3589
Attr - This represents one attribute.
Definition: Attr.h:43
attr::Kind getKind() const
Definition: Attr.h:89
bool isInherited() const
Definition: Attr.h:98
Attr * clone(ASTContext &C) const
SourceLocation getLocation() const
Definition: Attr.h:96
Represents a C++11 auto or C++14 decltype(auto) type, possibly constrained by a type-constraint.
Definition: Type.h:6561
AutoTypeKeyword getKeyword() const
Definition: Type.h:6592
Represents a C++ declaration that introduces decls from somewhere else.
Definition: DeclCXX.h:3440
unsigned shadow_size() const
Return the number of shadowed declarations associated with this using declaration.
Definition: DeclCXX.h:3518
void addShadowDecl(UsingShadowDecl *S)
Definition: DeclCXX.cpp:3272
shadow_iterator shadow_begin() const
Definition: DeclCXX.h:3510
void removeShadowDecl(UsingShadowDecl *S)
Definition: DeclCXX.cpp:3281
BinaryConditionalOperator - The GNU extension to the conditional operator which allows the middle ope...
Definition: Expr.h:4324
A builtin binary operation expression such as "x + y" or "x <= y".
Definition: Expr.h:3909
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:4902
static Opcode getOverloadedOpcode(OverloadedOperatorKind OO)
Retrieve the binary opcode that corresponds to the given overloaded operator.
Definition: Expr.cpp:2158
A binding in a decomposition declaration.
Definition: DeclCXX.h:4130
static BindingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation IdLoc, IdentifierInfo *Id)
Definition: DeclCXX.cpp:3465
BlockExpr - Adaptor class for mixing a BlockDecl with expressions.
Definition: Expr.h:6414
Wrapper for source info for block pointers.
Definition: TypeLoc.h:1345
This class is used for builtin types like 'int'.
Definition: Type.h:3034
Kind getKind() const
Definition: Type.h:3082
Represents a path from a specific derived class (which is not represented as part of the path) to a p...
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...
std::list< CXXBasePath >::iterator paths_iterator
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:720
CXXCatchStmt - This represents a C++ catch block.
Definition: StmtCXX.h:28
Represents a call to a C++ constructor.
Definition: ExprCXX.h:1546
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:1159
CXXConstructorDecl * getConstructor() const
Get the constructor that this expression will (ultimately) call.
Definition: ExprCXX.h:1609
Represents a C++ constructor within a class.
Definition: DeclCXX.h:2553
CXXConstructorDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclCXX.h:2795
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:2898
ExplicitSpecifier getExplicitSpecifier()
Definition: DeclCXX.h:2624
init_iterator init_begin()
Retrieve an iterator to the first initializer.
Definition: DeclCXX.h:2649
CXXConstructorDecl * getTargetConstructor() const
When this constructor delegates to another, retrieve the target.
Definition: DeclCXX.cpp:2875
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:2893
bool isDefaultConstructor() const
Whether this constructor is a default constructor (C++ [class.ctor]p5), which can be used to default-...
Definition: DeclCXX.cpp:2884
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
Definition: DeclCXX.h:2790
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(), Expr *TrailingRequiresClause=nullptr)
Definition: DeclCXX.cpp:2854
Represents a C++ conversion function within a class.
Definition: DeclCXX.h:2885
QualType getConversionType() const
Returns the type that this conversion function is converting to.
Definition: DeclCXX.h:2925
Represents a C++ base or member initializer.
Definition: DeclCXX.h:2318
bool isWritten() const
Determine whether this initializer is explicitly written in the source code.
Definition: DeclCXX.h:2490
SourceRange getSourceRange() const LLVM_READONLY
Determine the source range covering the entire initializer.
Definition: DeclCXX.cpp:2803
SourceLocation getSourceLocation() const
Determine the source location of the initializer.
Definition: DeclCXX.cpp:2790
FieldDecl * getAnyMember() const
Definition: DeclCXX.h:2464
A use of a default initializer in a constructor or in aggregate initialization.
Definition: ExprCXX.h:1375
Represents a C++ destructor within a class.
Definition: DeclCXX.h:2817
static CXXDestructorDecl * Create(ASTContext &C, CXXRecordDecl *RD, SourceLocation StartLoc, const DeclarationNameInfo &NameInfo, QualType T, TypeSourceInfo *TInfo, bool UsesFPIntrin, bool isInline, bool isImplicitlyDeclared, ConstexprSpecKind ConstexprKind, Expr *TrailingRequiresClause=nullptr)
Definition: DeclCXX.cpp:2988
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:1737
Represents a call to a member function that may be written either with member call syntax (e....
Definition: ExprCXX.h:176
CXXMethodDecl * getMethodDecl() const
Retrieve the declaration of the called method.
Definition: ExprCXX.cpp:722
Represents a static or instance method of a struct/union/class.
Definition: DeclCXX.h:2078
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:2588
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
Definition: DeclCXX.cpp:2595
bool isVirtual() const
Definition: DeclCXX.h:2133
unsigned getNumExplicitParams() const
Definition: DeclCXX.h:2232
bool isVolatile() const
Definition: DeclCXX.h:2131
CXXMethodDecl * getMostRecentDecl()
Definition: DeclCXX.h:2181
overridden_method_range overridden_methods() const
Definition: DeclCXX.cpp:2665
unsigned size_overridden_methods() const
Definition: DeclCXX.cpp:2659
QualType getFunctionObjectParameterReferenceType() const
Return the type of the object pointed by this.
Definition: DeclCXX.cpp:2707
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this method.
Definition: DeclCXX.h:2254
method_iterator begin_overridden_methods() const
Definition: DeclCXX.cpp:2649
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition: DeclCXX.h:2204
bool isInstance() const
Definition: DeclCXX.h:2105
bool isMoveAssignmentOperator() const
Determine whether this is a move assignment operator.
Definition: DeclCXX.cpp:2621
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, Expr *TrailingRequiresClause=nullptr)
Definition: DeclCXX.cpp:2407
QualType getFunctionObjectParameterType() const
Definition: DeclCXX.h:2228
bool isStatic() const
Definition: DeclCXX.cpp:2319
bool isCopyAssignmentOperator() const
Determine whether this is a copy-assignment operator, regardless of whether it was declared implicitl...
Definition: DeclCXX.cpp:2599
CXXMethodDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclCXX.h:2174
The null pointer literal (C++11 [lex.nullptr])
Definition: ExprCXX.h:765
A call to an overloaded operator written using operator syntax.
Definition: ExprCXX.h:81
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:1282
friend_range friends() const
Definition: DeclFriend.h:261
bool hasTrivialMoveAssignment() const
Determine whether this class has a trivial move assignment operator (C++11 [class....
Definition: DeclCXX.h:1353
bool isTriviallyCopyable() const
Determine whether this class is considered trivially copyable per (C++11 [class]p6).
Definition: DeclCXX.cpp:619
bool hasTrivialDefaultConstructor() const
Determine whether this class has a trivial default constructor (C++11 [class.ctor]p5).
Definition: DeclCXX.h:1252
bool isGenericLambda() const
Determine whether this class describes a generic lambda function object (i.e.
Definition: DeclCXX.cpp:1641
bool hasTrivialDestructor() const
Determine whether this class has a trivial destructor (C++ [class.dtor]p3)
Definition: DeclCXX.h:1378
bool hasUserDeclaredDestructor() const
Determine whether this class has a user-declared destructor.
Definition: DeclCXX.h:1013
bool implicitCopyConstructorHasConstParam() const
Determine whether an implicit copy constructor for this type would have a parameter with a const-qual...
Definition: DeclCXX.h:832
bool hasInheritedAssignment() const
Determine whether this class has a using-declaration that names a base class assignment operator.
Definition: DeclCXX.h:1432
bool allowConstDefaultInit() const
Determine whether declaring a const variable with this type is ok per core issue 253.
Definition: DeclCXX.h:1403
bool hasTrivialDestructorForCall() const
Definition: DeclCXX.h:1382
bool defaultedMoveConstructorIsDeleted() const
true if a defaulted move constructor for this class would be deleted.
Definition: DeclCXX.h:718
bool isLiteral() const
Determine whether this class is a literal type.
Definition: DeclCXX.cpp:1467
bool hasUserDeclaredMoveAssignment() const
Determine whether this class has had a move assignment declared by the user.
Definition: DeclCXX.h:973
bool defaultedDestructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
Definition: DeclCXX.h:1368
base_class_range bases()
Definition: DeclCXX.h:620
bool hasAnyDependentBases() const
Determine whether this class has any dependent base classes which are not the current instantiation.
Definition: DeclCXX.cpp:612
bool isLambda() const
Determine whether this class describes a lambda function object.
Definition: DeclCXX.h:1030
bool hasTrivialMoveConstructor() const
Determine whether this class has a trivial move constructor (C++11 [class.copy]p12)
Definition: DeclCXX.h:1313
bool needsImplicitDefaultConstructor() const
Determine if we need to declare a default constructor for this class.
Definition: DeclCXX.h:778
bool needsImplicitMoveConstructor() const
Determine whether this class should get an implicit move constructor or if any existing special membe...
Definition: DeclCXX.h:904
bool hasUserDeclaredCopyAssignment() const
Determine whether this class has a user-declared copy assignment operator.
Definition: DeclCXX.h:922
method_range methods() const
Definition: DeclCXX.h:662
CXXRecordDecl * getDefinition() const
Definition: DeclCXX.h:565
bool needsOverloadResolutionForCopyAssignment() const
Determine whether we need to eagerly declare a defaulted copy assignment operator for this class.
Definition: DeclCXX.h:943
static AccessSpecifier MergeAccess(AccessSpecifier PathAccess, AccessSpecifier DeclAccess)
Calculates the access of a decl that is reached along a path.
Definition: DeclCXX.h:1738
bool defaultedDefaultConstructorIsConstexpr() const
Determine whether a defaulted default constructor for this class would be constexpr.
Definition: DeclCXX.h:1275
bool hasTrivialCopyConstructor() const
Determine whether this class has a trivial copy constructor (C++ [class.copy]p6, C++11 [class....
Definition: DeclCXX.h:1290
void setImplicitMoveAssignmentIsDeleted()
Set that we attempted to declare an implicit move assignment operator, but overload resolution failed...
Definition: DeclCXX.h:985
bool hasConstexprDestructor() const
Determine whether this class has a constexpr destructor.
Definition: DeclCXX.cpp:607
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
Definition: DeclCXX.h:1226
unsigned getNumBases() const
Retrieves the number of base classes of this class.
Definition: DeclCXX.h:614
bool defaultedCopyConstructorIsDeleted() const
true if a defaulted copy constructor for this class would be deleted.
Definition: DeclCXX.h:709
bool hasTrivialCopyConstructorForCall() const
Definition: DeclCXX.h:1294
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:738
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine whether this particular class is a specialization or instantiation of a class template or m...
Definition: DeclCXX.cpp:2011
bool hasTrivialCopyAssignment() const
Determine whether this class has a trivial copy assignment operator (C++ [class.copy]p11,...
Definition: DeclCXX.h:1340
base_class_range vbases()
Definition: DeclCXX.h:637
base_class_iterator vbases_begin()
Definition: DeclCXX.h:644
ctor_range ctors() const
Definition: DeclCXX.h:682
void setImplicitMoveConstructorIsDeleted()
Set that we attempted to declare an implicit move constructor, but overload resolution failed so we d...
Definition: DeclCXX.h:879
bool isAbstract() const
Determine whether this class has a pure virtual function.
Definition: DeclCXX.h:1233
bool hasVariantMembers() const
Determine whether this class has any variant members.
Definition: DeclCXX.h:1248
void setImplicitCopyConstructorIsDeleted()
Set that we attempted to declare an implicit copy constructor, but overload resolution failed so we d...
Definition: DeclCXX.h:870
bool isDynamicClass() const
Definition: DeclCXX.h:586
bool hasInClassInitializer() const
Whether this class has any in-class initializers for non-static data members (including those in anon...
Definition: DeclCXX.h:1160
bool needsImplicitCopyConstructor() const
Determine whether this class needs an implicit copy constructor to be lazily declared.
Definition: DeclCXX.h:811
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
Definition: DeclCXX.h:1414
bool hasDirectFields() const
Determine whether this class has direct non-static data members.
Definition: DeclCXX.h:1212
bool hasUserDeclaredCopyConstructor() const
Determine whether this class has a user-declared copy constructor.
Definition: DeclCXX.h:805
bool hasDefinition() const
Definition: DeclCXX.h:572
void setImplicitCopyAssignmentIsDeleted()
Set that we attempted to declare an implicit copy assignment operator, but overload resolution failed...
Definition: DeclCXX.h:928
bool needsImplicitDestructor() const
Determine whether this class needs an implicit destructor to be lazily declared.
Definition: DeclCXX.h:1019
ClassTemplateDecl * getDescribedClassTemplate() const
Retrieves the class template that is described by this class declaration.
Definition: DeclCXX.cpp:2003
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:914
bool needsOverloadResolutionForMoveAssignment() const
Determine whether we need to eagerly declare a move assignment operator for this class.
Definition: DeclCXX.h:1006
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
Definition: DeclCXX.cpp:2081
bool needsOverloadResolutionForDestructor() const
Determine whether we need to eagerly declare a destructor for this class.
Definition: DeclCXX.h:1025
bool hasInheritedConstructor() const
Determine whether this class has a using-declaration that names a user-declared base class constructo...
Definition: DeclCXX.h:1426
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
Definition: DeclCXX.cpp:1712
bool needsOverloadResolutionForCopyConstructor() const
Determine whether we need to eagerly declare a defaulted copy constructor for this class.
Definition: DeclCXX.h:817
bool hasUserDeclaredMoveConstructor() const
Determine whether this class has had a move constructor declared by the user.
Definition: DeclCXX.h:858
bool needsImplicitMoveAssignment() const
Determine whether this class should get an implicit move assignment operator or if any existing speci...
Definition: DeclCXX.h:995
bool isInterfaceLike() const
Definition: DeclCXX.cpp:2110
bool needsImplicitCopyAssignment() const
Determine whether this class needs an implicit copy assignment operator to be lazily declared.
Definition: DeclCXX.h:937
bool hasTrivialMoveConstructorForCall() const
Definition: DeclCXX.h:1318
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Definition: DeclCXX.cpp:1700
CXXRecordDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclCXX.h:524
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.
Definition: DeclCXX.h:635
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:958
Represents a C++ nested-name-specifier or a global scope specifier.
Definition: DeclSpec.h:74
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
Definition: DeclSpec.h:210
bool isValid() const
A scope specifier is present, and it refers to a real scope.
Definition: DeclSpec.h:215
void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier, SourceRange R)
Make a new nested-name-specifier from incomplete source-location information.
Definition: DeclSpec.cpp:123
SourceRange getRange() const
Definition: DeclSpec.h:80
SourceLocation getBeginLoc() const
Definition: DeclSpec.h:84
bool isSet() const
Deprecated.
Definition: DeclSpec.h:228
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
Definition: DeclSpec.cpp:149
NestedNameSpecifier * getScopeRep() const
Retrieve the representation of the nested-name-specifier.
Definition: DeclSpec.h:95
bool isInvalid() const
An error occurred during parsing of the scope specifier.
Definition: DeclSpec.h:213
bool isEmpty() const
No scope specifier.
Definition: DeclSpec.h:208
Represents the this expression in C++.
Definition: ExprCXX.h:1152
SourceLocation getBeginLoc() const
Definition: ExprCXX.h:1172
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:2874
CanQual< T > getUnqualifiedType() const
Retrieve the unqualified form of this type.
CanProxy< U > getAs() const
Retrieve a canonical type pointer with a different static type, upcasting or downcasting as needed.
const T * getTypePtr() const
Retrieve the underlying type pointer, which refers to a canonical type.
Definition: CanonicalType.h:84
static CharSourceRange getTokenRange(SourceRange R)
SourceLocation getBegin() const
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.
ClassTemplateDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this 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
const ComparisonCategoryInfo & getInfoForType(QualType Ty) const
Return the comparison category information as specified by getCategoryForType(Ty).
const ComparisonCategoryInfo * lookupInfo(ComparisonCategoryType Kind) const
Return the cached comparison category information for the specified 'Kind'.
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.
const ValueInfo * getValueInfo(ComparisonCategoryResult ValueKind) const
ComparisonCategoryType Kind
The Kind of the comparison category type.
Complex values, per C99 6.2.5p11.
Definition: Type.h:3145
QualType getElementType() const
Definition: Type.h:3155
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition: Stmt.h:1628
body_range body()
Definition: Stmt.h:1691
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
Definition: Stmt.cpp:390
ConditionalOperator - The ?: ternary operator.
Definition: Expr.h:4262
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
Definition: StmtVisitor.h:195
Represents the canonical version of C arrays with a specified constant size.
Definition: Type.h:3615
llvm::APInt getSize() const
Return the constant array size as an APInt.
Definition: Type.h:3671
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition: ASTConcept.h:35
Represents a shadow constructor declaration introduced into a class by a C++11 using-declaration that...
Definition: DeclCXX.h:3621
const CXXRecordDecl * getParent() const
Returns the parent of this using shadow declaration, which is the class in which this is declared.
Definition: DeclCXX.h:3685
static ConstructorUsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, UsingDecl *Using, NamedDecl *Target, bool IsVirtual)
Definition: DeclCXX.cpp:3254
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:1368
specific_decl_iterator - Iterates over a subrange of declarations stored in a DeclContext,...
Definition: DeclBase.h:2380
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition: DeclBase.h:1435
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition: DeclBase.h:2100
bool Equals(const DeclContext *DC) const
Determine whether this declaration context is equivalent to the declaration context DC.
Definition: DeclBase.h:2229
bool isFileContext() const
Definition: DeclBase.h:2171
void makeDeclVisibleInContext(NamedDecl *D)
Makes a declaration visible within this context.
Definition: DeclBase.cpp:2045
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
Definition: DeclBase.cpp:1334
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
Definition: DeclBase.cpp:1854
bool isTranslationUnit() const
Definition: DeclBase.h:2176
bool isRecord() const
Definition: DeclBase.h:2180
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
Definition: DeclBase.cpp:1990
void removeDecl(Decl *D)
Removes a declaration from this context.
Definition: DeclBase.cpp:1687
void addDecl(Decl *D)
Add the declaration D into this context.
Definition: DeclBase.cpp:1768
decl_iterator decls_end() const
Definition: DeclBase.h:2362
bool isStdNamespace() const
Definition: DeclBase.cpp:1318
decl_range decls() const
decls_begin/decls_end - Iterate over the declarations stored in this context.
Definition: DeclBase.h:2360
bool isFunctionOrMethod() const
Definition: DeclBase.h:2152
const LinkageSpecDecl * getExternCContext() const
Retrieve the nearest enclosing C linkage specification context.
Definition: DeclBase.cpp:1389
bool Encloses(const DeclContext *DC) const
Determine whether this declaration context encloses the declaration context DC.
Definition: DeclBase.cpp:1404
void addHiddenDecl(Decl *D)
Add the declaration D to this context without modifying any lookup tables.
Definition: DeclBase.cpp:1742
Decl::Kind getDeclKind() const
Definition: DeclBase.h:2093
DeclContext * getNonTransparentContext()
Definition: DeclBase.cpp:1415
decl_iterator decls_begin() const
Definition: DeclBase.cpp:1624
A reference to a declared variable, function, enum, etc.
Definition: Expr.h:1265
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Expr.cpp:550
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:1333
NonOdrUseReason isNonOdrUse() const
Is this expression a non-odr-use reference, and if so, why?
Definition: Expr.h:1457
Captures information about "declaration specifiers".
Definition: DeclSpec.h:247
bool hasTypeSpecifier() const
Return true if any type-specifier has been found.
Definition: DeclSpec.h:691
Expr * getPackIndexingExpr() const
Definition: DeclSpec.h:560
TST getTypeSpecType() const
Definition: DeclSpec.h:537
SourceLocation getStorageClassSpecLoc() const
Definition: DeclSpec.h:510
SCS getStorageClassSpec() const
Definition: DeclSpec.h:501
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: DeclSpec.h:575
SourceRange getSourceRange() const LLVM_READONLY
Definition: DeclSpec.h:574
unsigned getTypeQualifiers() const
getTypeQualifiers - Return a set of TQs.
Definition: DeclSpec.h:616
SourceLocation getExplicitSpecLoc() const
Definition: DeclSpec.h:654
SourceLocation getFriendSpecLoc() const
Definition: DeclSpec.h:827
ParsedType getRepAsType() const
Definition: DeclSpec.h:547
bool isFriendSpecifiedFirst() const
Definition: DeclSpec.h:825
SourceLocation getEllipsisLoc() const
Definition: DeclSpec.h:623
SourceLocation getConstSpecLoc() const
Definition: DeclSpec.h:617
SourceRange getExplicitSpecRange() const
Definition: DeclSpec.h:655
Expr * getRepAsExpr() const
Definition: DeclSpec.h:555
SourceLocation getRestrictSpecLoc() const
Definition: DeclSpec.h:618
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:558
SourceLocation getAtomicSpecLoc() const
Definition: DeclSpec.h:620
SourceLocation getConstexprSpecLoc() const
Definition: DeclSpec.h:836
SourceLocation getTypeSpecTypeLoc() const
Definition: DeclSpec.h:582
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:453
SourceLocation getUnalignedSpecLoc() const
Definition: DeclSpec.h:621
SourceLocation getVolatileSpecLoc() const
Definition: DeclSpec.h:619
FriendSpecified isFriendSpecified() const
Definition: DeclSpec.h:821
bool hasExplicitSpecifier() const
Definition: DeclSpec.h:651
bool hasConstexprSpecifier() const
Definition: DeclSpec.h:837
static const TST TST_auto
Definition: DeclSpec.h:318
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition: Stmt.h:1519
decl_range decls()
Definition: Stmt.h:1567
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Stmt.h:1545
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:1050
SourceLocation getEndLoc() const LLVM_READONLY
Definition: DeclBase.h:438
FriendObjectKind getFriendObjectKind() const
Determines whether this declaration is the object of a friend declaration and, if so,...
Definition: DeclBase.h:1215
T * getAttr() const
Definition: DeclBase.h:576
ASTContext & getASTContext() const LLVM_READONLY
Definition: DeclBase.cpp:520
void addAttr(Attr *A)
Definition: DeclBase.cpp:1010
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition: DeclBase.h:596
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:151
Kind
Lists the kind of concrete classes of Decl.
Definition: DeclBase.h:89
void clearIdentifierNamespace()
Clears the namespace of this declaration.
Definition: DeclBase.h:1203
void markUsed(ASTContext &C)
Mark the declaration used, in the sense of odr-use.
Definition: DeclBase.cpp:564
@ FOK_Undeclared
A friend of a previously-undeclared entity.
Definition: DeclBase.h:1208
@ FOK_None
Not a friend object.
Definition: DeclBase.h:1206
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition: DeclBase.cpp:246
bool isTemplateParameter() const
isTemplateParameter - Determines whether this declaration is a template parameter.
Definition: DeclBase.h:2777
DeclContext * getNonTransparentDeclContext()
Return the non transparent context.
Definition: DeclBase.cpp:1217
bool isInvalidDecl() const
Definition: DeclBase.h:591
unsigned getIdentifierNamespace() const
Definition: DeclBase.h:878
bool isLocalExternDecl() const
Determine whether this is a block-scope declaration with linkage.
Definition: DeclBase.h:1158
void setAccess(AccessSpecifier AS)
Definition: DeclBase.h:505
SourceLocation getLocation() const
Definition: DeclBase.h:442
@ IDNS_Ordinary
Ordinary names.
Definition: DeclBase.h:144
bool isTemplateParameterPack() const
isTemplateParameter - Determines whether this declaration is a template parameter pack.
Definition: DeclBase.cpp:229
void setLocalOwningModule(Module *M)
Definition: DeclBase.h:822
void setImplicit(bool I=true)
Definition: DeclBase.h:597
void setReferenced(bool R=true)
Definition: DeclBase.h:626
bool isUsed(bool CheckUsedAttr=true) const
Whether any (re-)declaration of the entity was used, meaning that a definition is required.
Definition: DeclBase.cpp:549
DeclContext * getDeclContext()
Definition: DeclBase.h:451
attr_range attrs() const
Definition: DeclBase.h:538
AccessSpecifier getAccess() const
Definition: DeclBase.h:510
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: DeclBase.h:434
void dropAttr()
Definition: DeclBase.h:559
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
Definition: DeclBase.h:907
bool hasAttr() const
Definition: DeclBase.h:580
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
Definition: DeclBase.h:967
@ VisibleWhenImported
This declaration has an owning module, and is visible when that module is imported.
Kind getKind() const
Definition: DeclBase.h:445
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition: DeclBase.h:870
virtual SourceRange getSourceRange() const LLVM_READONLY
Source range that this declaration covers.
Definition: DeclBase.h:430
DeclarationName getCXXDestructorName(CanQualType Ty)
Returns the name of a C++ destructor for the given Type.
DeclarationName getCXXOperatorName(OverloadedOperatorKind Op)
Get the name of the overloadable C++ operator corresponding to Op.
DeclarationName getCXXConstructorName(CanQualType Ty)
Returns the name of a C++ constructor for the given Type.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
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:735
SourceLocation getTypeSpecStartLoc() const
Definition: Decl.cpp:1977
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Decl.h:786
unsigned getNumTemplateParameterLists() const
Definition: Decl.h:822
void setTypeSourceInfo(TypeSourceInfo *TI)
Definition: Decl.h:769
Expr * getTrailingRequiresClause()
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
Definition: Decl.h:810
TypeSourceInfo * getTypeSourceInfo() const
Definition: Decl.h:764
Information about one declarator, including the parsed type information and the identifier.
Definition: DeclSpec.h:1903
SourceLocation getIdentifierLoc() const
Definition: DeclSpec.h:2339
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: DeclSpec.h:2086
const CXXScopeSpec & getCXXScopeSpec() const
getCXXScopeSpec - Return the C++ scope specifier (global scope or nested-name-specifier) that is part...
Definition: DeclSpec.h:2065
ArrayRef< TemplateParameterList * > getTemplateParameterLists() const
The template parameter lists that preceded the declarator.
Definition: DeclSpec.h:2652
void setInventedTemplateParameterList(TemplateParameterList *Invented)
Sets the template parameter list generated from the explicit template parameters along with any inven...
Definition: DeclSpec.h:2659
bool isInvalidType() const
Definition: DeclSpec.h:2717
A decomposition declaration.
Definition: DeclCXX.h:4189
ArrayRef< BindingDecl * > bindings() const
Definition: DeclCXX.h:4221
A parsed C++17 decomposition declarator of the form '[' identifier-list ']'.
Definition: DeclSpec.h:1792
SourceRange getSourceRange() const
Definition: DeclSpec.h:1839
SourceLocation getLSquareLoc() const
Definition: DeclSpec.h:1837
Represents a C++17 deduced template specialization type.
Definition: Type.h:6609
void setNameLoc(SourceLocation Loc)
Definition: TypeLoc.h:2454
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition: TypeLoc.h:2434
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition: TypeLoc.h:2443
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
Definition: Diagnostic.h:1512
bool isLastDiagnosticIgnored() const
Determine whether the previous diagnostic was ignored.
Definition: Diagnostic.h:793
bool isIgnored(unsigned DiagID, SourceLocation Loc) const
Determine whether the diagnostic is known to be ignored.
Definition: Diagnostic.h:939
Recursive AST visitor that supports extension via dynamic dispatch.
virtual bool TraverseConstructorInitializer(CXXCtorInitializer *Init)
Recursively visit a constructor initializer.
void setElaboratedKeywordLoc(SourceLocation Loc)
Definition: TypeLoc.h:2354
TypeLoc getNamedTypeLoc() const
Definition: TypeLoc.h:2392
void setQualifierLoc(NestedNameSpecifierLoc QualifierLoc)
Definition: TypeLoc.h:2368
static EmptyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L)
Definition: Decl.cpp:5655
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:3291
Represents an enum.
Definition: Decl.h:3861
enumerator_range enumerators() const
Definition: Decl.h:3994
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of enums.
Definition: Type.h:6103
EvaluatedExprVisitor - This class visits 'Expr *'s.
Store information needed for an explicit specifier.
Definition: DeclCXX.h:1912
const Expr * getExpr() const
Definition: DeclCXX.h:1921
void setExpr(Expr *E)
Definition: DeclCXX.h:1946
void setKind(ExplicitSpecKind Kind)
Definition: DeclCXX.h:1945
This represents one expression.
Definition: Expr.h:110
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:175
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition: Expr.h:192
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Definition: Expr.cpp:3097
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3085
bool containsErrors() const
Whether this expression contains subexpressions which had errors, e.g.
Definition: Expr.h:245
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition: Expr.cpp:3093
bool isPRValue() const
Definition: Expr.h:278
bool isLValue() const
isLValue - True if this expression is an "l-value" according to the rules of the current language.
Definition: Expr.h:277
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:3231
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:142
Represents difference between two FPOptions values.
Definition: LangOptions.h:978
Represents a member of a struct/union/class.
Definition: Decl.h:3033
Expr * getInClassInitializer() const
Get the C++11 default member initializer for this member, or null if one has not been set.
Definition: Decl.cpp:4580
bool hasInClassInitializer() const
Determine whether this member has a C++11 default member initializer.
Definition: Decl.h:3208
bool isAnonymousStructOrUnion() const
Determines whether this field is a representative for an anonymous struct or union.
Definition: Decl.cpp:4570
InClassInitStyle getInClassInitStyle() const
Get the kind of (C++11) default member initializer that this field has.
Definition: Decl.h:3202
void setInClassInitializer(Expr *NewInit)
Set the C++11 in-class initializer for this member.
Definition: Decl.cpp:4590
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
Definition: Decl.h:3118
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
Definition: Decl.h:3264
FieldDecl * getCanonicalDecl() override
Retrieves the canonical declaration of this field.
Definition: Decl.h:3275
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
Definition: Diagnostic.h:75
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:114
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:138
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
Definition: Diagnostic.h:127
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:101
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={})
Definition: DeclFriend.cpp:34
void setUnsupportedFriend(bool Unsupported)
Definition: DeclFriend.h:189
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:3103
Represents a function declaration or definition.
Definition: Decl.h:1935
const ParmVarDecl * getParamDecl(unsigned i) const
Definition: Decl.h:2672
Stmt * getBody(const FunctionDecl *&Definition) const
Retrieve the body (definition) of the function.
Definition: Decl.cpp:3243
ExceptionSpecificationType getExceptionSpecType() const
Gets the ExceptionSpecificationType as declared.
Definition: Decl.h:2744
bool isTrivialForCall() const
Definition: Decl.h:2308
ConstexprSpecKind getConstexprKind() const
Definition: Decl.h:2404
unsigned getMinRequiredArguments() const
Returns the minimum number of arguments needed to call this function.
Definition: Decl.cpp:3723
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition: Decl.cpp:4064
FunctionTemplateDecl * getDescribedFunctionTemplate() const
Retrieves the function template that is described by this function declaration.
Definition: Decl.cpp:4052
void setIsPureVirtual(bool P=true)
Definition: Decl.cpp:3262
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
Definition: Decl.h:2249
bool isImmediateFunction() const
Definition: Decl.cpp:3295
void setDefaultedOrDeletedInfo(DefaultedOrDeletedFunctionInfo *Info)
Definition: Decl.cpp:3124
SourceRange getReturnTypeSourceRange() const
Attempt to compute an informative source range covering the function return type.
Definition: Decl.cpp:3883
bool isDestroyingOperatorDelete() const
Determine whether this is a destroying operator delete.
Definition: Decl.cpp:3480
bool hasCXXExplicitFunctionObjectParameter() const
Definition: Decl.cpp:3741
bool isInlined() const
Determine whether this function should be inlined, because it is either marked "inline" or "constexpr...
Definition: Decl.h:2796
SourceLocation getDefaultLoc() const
Definition: Decl.h:2326
QualType getReturnType() const
Definition: Decl.h:2720
ArrayRef< ParmVarDecl * > parameters() const
Definition: Decl.h:2649
bool isExplicitlyDefaulted() const
Whether this function is explicitly defaulted.
Definition: Decl.h:2317
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition: Decl.h:2305
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
Definition: Decl.cpp:4172
MutableArrayRef< ParmVarDecl * >::iterator param_iterator
Definition: Decl.h:2657
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:3623
FunctionTypeLoc getFunctionTypeLoc() const
Find the source location information for how the type of this function was written.
Definition: Decl.cpp:3877
param_iterator param_begin()
Definition: Decl.h:2661
const ParmVarDecl * getNonObjectParameter(unsigned I) const
Definition: Decl.h:2698
bool isVariadic() const
Whether this function is variadic.
Definition: Decl.cpp:3096
bool doesThisDeclarationHaveABody() const
Returns whether this specific declaration of the function has a body.
Definition: Decl.h:2261
bool isDeleted() const
Whether this function has been deleted.
Definition: Decl.h:2468
void setBodyContainsImmediateEscalatingExpressions(bool Set)
Definition: Decl.h:2414
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
Definition: Decl.cpp:4188
FunctionEffectsRef getFunctionEffects() const
Definition: Decl.h:3009
bool isTemplateInstantiation() const
Determines if the given function was instantiated from a function template.
Definition: Decl.cpp:4116
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition: Decl.h:2763
bool isStatic() const
Definition: Decl.h:2804
void setTrivial(bool IT)
Definition: Decl.h:2306
TemplatedKind getTemplatedKind() const
What kind of templated function this is.
Definition: Decl.cpp:4003
bool isConstexpr() const
Whether this is a (C++11) constexpr function or constexpr constructor.
Definition: Decl.h:2398
bool isPureVirtual() const
Whether this virtual function is pure, i.e.
Definition: Decl.h:2288
bool isExternC() const
Determines whether this function is a function with external, C linkage.
Definition: Decl.cpp:3498
bool isImmediateEscalating() const
Definition: Decl.cpp:3275
bool isThisDeclarationInstantiatedFromAFriendDefinition() const
Determine whether this specific declaration of the function is a friend declaration that was instanti...
Definition: Decl.cpp:3187
void setRangeEnd(SourceLocation E)
Definition: Decl.h:2153
bool isDefaulted() const
Whether this function is defaulted.
Definition: Decl.h:2313
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4405
bool isOverloadedOperator() const
Whether this function declaration represents an C++ overloaded operator, e.g., "operator+".
Definition: Decl.h:2808
OverloadedOperatorKind getOverloadedOperator() const
getOverloadedOperator - Which C++ overloaded operator this function represents, if any.
Definition: Decl.cpp:3989
void setConstexprKind(ConstexprSpecKind CSK)
Definition: Decl.h:2401
TemplateSpecializationKind getTemplateSpecializationKind() const
Determine what kind of template instantiation this function represents.
Definition: Decl.cpp:4276
void setDefaulted(bool D=true)
Definition: Decl.h:2314
bool isConsteval() const
Definition: Decl.h:2410
bool isUserProvided() const
True if this method is user-declared and was not deleted or defaulted on its first declaration.
Definition: Decl.h:2338
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:2737
void setBody(Stmt *B)
Definition: Decl.cpp:3255
bool isVirtualAsWritten() const
Whether this function is marked as virtual explicitly.
Definition: Decl.h:2279
bool hasOneParamOrDefaultArgs() const
Determine whether this function has a single parameter, or multiple parameters where all but the firs...
Definition: Decl.cpp:3755
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition: Decl.cpp:3702
size_t param_size() const
Definition: Decl.h:2665
DeclarationNameInfo getNameInfo() const
Definition: Decl.h:2146
bool hasBody(const FunctionDecl *&Definition) const
Returns true if the function has a body.
Definition: Decl.cpp:3163
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:3210
bool isInlineSpecified() const
Determine whether the "inline" keyword was specified for this function.
Definition: Decl.h:2774
DefaultedOrDeletedFunctionInfo * getDefalutedOrDeletedInfo() const
Definition: Decl.cpp:3158
void setParams(ArrayRef< ParmVarDecl * > NewParamInfo)
Definition: Decl.h:2680
bool willHaveBody() const
True if this function will eventually have a body, once it's fully parsed.
Definition: Decl.h:2561
A mutable set of FunctionEffects and possibly conditions attached to them.
Definition: Type.h:5044
bool insert(const FunctionEffectWithCondition &NewEC, Conflicts &Errs)
Definition: Type.cpp:5286
An immutable set of FunctionEffects and possibly conditions attached to them.
Definition: Type.h:4908
Represents a prototype with parameter type info, e.g.
Definition: Type.h:5107
ExtParameterInfo getExtParameterInfo(unsigned I) const
Definition: Type.h:5573
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
Definition: Type.h:5387
unsigned getNumParams() const
Definition: Type.h:5360
bool hasTrailingReturn() const
Whether this function prototype has a trailing return type.
Definition: Type.h:5500
QualType getParamType(unsigned i) const
Definition: Type.h:5362
ExtProtoInfo getExtProtoInfo() const
Definition: Type.h:5371
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
Definition: Type.h:5445
ArrayRef< QualType > getParamTypes() const
Definition: Type.h:5367
ArrayRef< QualType > exceptions() const
Definition: Type.h:5530
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
Definition: Type.h:5545
Declaration of a template function.
Definition: DeclTemplate.h:959
Wrapper for source info for functions.
Definition: TypeLoc.h:1459
unsigned getNumParams() const
Definition: TypeLoc.h:1531
ParmVarDecl * getParam(unsigned i) const
Definition: TypeLoc.h:1537
void setParam(unsigned i, ParmVarDecl *VD)
Definition: TypeLoc.h:1538
TypeLoc getReturnLoc() const
Definition: TypeLoc.h:1540
ExtInfo withCallingConv(CallingConv cc) const
Definition: Type.h:4547
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition: Type.h:4321
CallingConv getCallConv() const
Definition: Type.h:4659
QualType getReturnType() const
Definition: Type.h:4648
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...
bool isPlaceholder() const
StringRef getName() const
Return the actual identifier string.
void RemoveDecl(NamedDecl *D)
RemoveDecl - Unlink the decl from its shadowed decl chain.
void AddDecl(NamedDecl *D)
AddDecl - Link the decl to its shadowed decl chain.
IdentifierInfo & get(StringRef Name)
Return the identifier token info for the specified named identifier.
IfStmt - This represents an if/then/else.
Definition: Stmt.h:2165
ImaginaryLiteral - We support imaginary integer and floating point literals, like "1....
Definition: Expr.h:1717
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition: Expr.h:3724
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition: Expr.cpp:2089
Represents an implicitly-generated value initialization of an object of a given type.
Definition: Expr.h:5841
Represents a field injected from an anonymous union/struct into the parent scope.
Definition: Decl.h:3335
void setInherited(bool I)
Definition: Attr.h:155
Description of a constructor that was inherited from a base class.
Definition: DeclCXX.h:2524
ConstructorUsingShadowDecl * getShadowDecl() const
Definition: DeclCXX.h:2536
const TypeClass * getTypePtr() const
Definition: TypeLoc.h:514
Describes an C or C++ initializer list.
Definition: Expr.h:5088
unsigned getNumInits() const
Definition: Expr.h:5118
const Expr * getInit(unsigned Init) const
Definition: Expr.h:5134
child_range children()
Definition: Expr.h:5280
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.
Definition: SemaInit.cpp:7637
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.
Definition: SemaInit.cpp:3605
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.
The injected class name of a C++ class template or class template partial specialization.
Definition: Type.h:6798
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:980
An lvalue reference type, per C++11 [dcl.ref].
Definition: Type.h:3483
Describes the capture of a variable or of this, or of a C++1y init-capture.
Definition: LambdaCapture.h:25
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Definition: ExprCXX.h:1954
bool isInitCapture(const LambdaCapture *Capture) const
Determine whether one of this lambda's captures is an init-capture.
Definition: ExprCXX.cpp:1339
capture_range captures() const
Retrieve this lambda's captures.
Definition: ExprCXX.cpp:1352
@ Ver4
Attempt to be ABI-compatible with code generated by Clang 4.0.x (SVN r291814).
@ Ver14
Attempt to be ABI-compatible with code generated by Clang 14.0.x.
bool isCompatibleWithMSVC(MSVCMajorVersion MajorVersion) const
Definition: LangOptions.h:672
void push_back(const T &LocalValue)
iterator begin(Source *source, bool LocalOnly=false)
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:1023
Represents a linkage specification.
Definition: DeclCXX.h:2957
static LinkageSpecDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation ExternLoc, SourceLocation LangLoc, LinkageSpecLanguageIDs Lang, bool HasBraces)
Definition: DeclCXX.cpp:3073
void setRBraceLoc(SourceLocation L)
Definition: DeclCXX.h:2999
bool isLocalPackExpansion(const Decl *D)
Determine whether D is a pack expansion created in this scope.
A class for iterating through a result set and possibly filtering out results.
Definition: Lookup.h:675
void erase()
Erase the last element returned from this iterator.
Definition: Lookup.h:721
bool hasNext() const
Definition: Lookup.h:706
NamedDecl * next()
Definition: Lookup.h:710
Represents the results of name lookup.
Definition: Lookup.h:46
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
Definition: Lookup.h:63
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
Definition: Lookup.h:68
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
Definition: Lookup.h:73
@ NotFound
No entity found met the criteria.
Definition: Lookup.h:50
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
Definition: Lookup.h:55
@ Found
Name lookup found a single declaration that met the criteria.
Definition: Lookup.h:59
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
Definition: Lookup.h:605
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.
Definition: SemaLookup.cpp:484
SourceLocation getNameLoc() const
Gets the location of the identifier.
Definition: Lookup.h:664
Filter makeFilter()
Create a filter for this result set.
Definition: Lookup.h:749
NamedDecl * getFoundDecl() const
Fetch the unique decl found by this lookup.
Definition: Lookup.h:568
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
NamedDecl * getRepresentativeDecl() const
Fetches a representative decl. Useful for lazy diagnostics.
Definition: Lookup.h:575
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
Definition: Lookup.h:634
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:4258
static MSPropertyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation L, DeclarationName N, QualType T, TypeSourceInfo *TInfo, SourceLocation StartL, IdentifierInfo *Getter, IdentifierInfo *Setter)
Definition: DeclCXX.cpp:3530
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition: Expr.h:3236
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition: Expr.h:3319
Expr * getBase() const
Definition: Expr.h:3313
SourceLocation getExprLoc() const LLVM_READONLY
Definition: Expr.h:3431
Wrapper for source info for member pointers.
Definition: TypeLoc.h:1363
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition: Type.h:3519
Describes a module or submodule.
Definition: Module.h:115
StringRef getTopLevelModuleName() const
Retrieve the name of the top-level module.
Definition: Module.h:703
bool isExplicitGlobalModule() const
Definition: Module.h:213
This represents a decl that may have a name.
Definition: Decl.h:253
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Definition: Decl.h:466
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition: Decl.h:274
bool isPlaceholderVar(const LangOptions &LangOpts) const
Definition: Decl.cpp:1089
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition: Decl.h:319
void setModulePrivate()
Specify that this declaration was marked as being private to the module in which it was defined.
Definition: DeclBase.h:699
bool isCXXClassMember() const
Determine whether this declaration is a C++ class member.
Definition: Decl.h:376
Represents a C++ namespace alias.
Definition: DeclCXX.h:3143
static NamespaceAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation NamespaceLoc, SourceLocation AliasLoc, IdentifierInfo *Alias, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Namespace)
Definition: DeclCXX.cpp:3168
Represent a C++ namespace.
Definition: Decl.h:551
bool isInline() const
Returns true if this is an inline namespace declaration.
Definition: Decl.h:607
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
Definition: DeclCXX.cpp:3128
NamespaceDecl * getAnonymousNamespace() const
Retrieve the anonymous namespace that inhabits this namespace, if any.
Definition: Decl.h:634
void setRBraceLoc(SourceLocation L)
Definition: Decl.h:653
Class that aids in the construction of nested-name-specifiers along with 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>::".
bool isDependent() const
Whether this nested name specifier refers to a dependent type or not.
static NestedNameSpecifier * Create(const ASTContext &Context, NestedNameSpecifier *Prefix, const IdentifierInfo *II)
Builds a specifier combining a prefix and an identifier.
@ Global
The global specifier '::'. There is no stored value.
bool containsUnexpandedParameterPack() const
Whether this nested-name-specifier contains an unexpanded parameter pack (for C++11 variadic template...
const Type * getAsType() const
Retrieve the type stored in this nested name specifier.
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:80
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition: Expr.h:1173
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition: Overload.h:1008
@ CSK_Normal
Normal lookup.
Definition: Overload.h:1012
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
Definition: Overload.h:1019
SmallVectorImpl< OverloadCandidate >::iterator iterator
Definition: Overload.h:1185
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:255
static ParenListExpr * Create(const ASTContext &Ctx, SourceLocation LParenLoc, ArrayRef< Expr * > Exprs, SourceLocation RParenLoc)
Create a paren list.
Definition: Expr.cpp:4774
Represents a parameter to a function.
Definition: Decl.h:1725
void setDefaultArg(Expr *defarg)
Definition: Decl.cpp:2987
SourceLocation getExplicitObjectParamThisLoc() const
Definition: Decl.h:1821
void setUnparsedDefaultArg()
Specify that this parameter has an unparsed default argument.
Definition: Decl.h:1866
bool hasUnparsedDefaultArg() const
Determines whether this parameter has a default argument that has not yet been parsed.
Definition: Decl.h:1854
SourceRange getDefaultArgRange() const
Retrieve the source range that covers the entire default argument.
Definition: Decl.cpp:2992
void setUninstantiatedDefaultArg(Expr *arg)
Definition: Decl.cpp:3012
void setScopeInfo(unsigned scopeDepth, unsigned parameterIndex)
Definition: Decl.h:1758
bool hasUninstantiatedDefaultArg() const
Definition: Decl.h:1858
bool hasInheritedDefaultArg() const
Definition: Decl.h:1870
bool isExplicitObjectParameter() const
Definition: Decl.h:1813
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:2922
Expr * getDefaultArg()
Definition: Decl.cpp:2975
Expr * getUninstantiatedDefaultArg()
Definition: Decl.cpp:3017
bool hasDefaultArg() const
Determines whether this parameter has a default argument, either parsed or not.
Definition: Decl.cpp:3023
void setHasInheritedDefaultArg(bool I=true)
Definition: Decl.h:1874
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:2945
ParsedAttr - Represents a syntactic attribute.
Definition: ParsedAttr.h:129
IdentifierInfo * getPropertyDataSetter() const
Definition: ParsedAttr.h:485
IdentifierInfo * getPropertyDataGetter() const
Definition: ParsedAttr.h:479
static const ParsedAttributesView & none()
Definition: ParsedAttr.h:836
bool hasAttribute(ParsedAttr::Kind K) const
Definition: ParsedAttr.h:916
Wrapper for source info for pointers.
Definition: TypeLoc.h:1332
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition: Type.h:3198
QualType getPointeeType() const
Definition: Type.h:3208
IdentifierInfo * getIdentifierInfo(StringRef Name) const
Return information about the specified preprocessor identifier token.
IdentifierTable & getIdentifierTable()
PseudoObjectExpr - An expression which accesses a pseudo-object l-value.
Definition: Expr.h:6546
ArrayRef< Expr * > semantics()
Definition: Expr.h:6625
A (possibly-)qualified type.
Definition: Type.h:929
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition: Type.h:8020
bool hasQualifiers() const
Determine whether this type has any qualifiers.
Definition: Type.h:8025
QualType withConst() const
Definition: Type.h:1154
QualType getLocalUnqualifiedType() const
Return this type with all of the instance-specific qualifiers removed, but without removing any quali...
Definition: Type.h:1220
void addConst()
Add the const type qualifier to this QualType.
Definition: Type.h:1151
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition: Type.h:996
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition: Type.h:7976
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition: Type.h:1433
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition: Type.h:8139
QualType getCanonicalType() const
Definition: Type.h:7988
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition: Type.h:8030
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
Definition: Type.cpp:2885
unsigned getLocalCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers local to this particular QualType instan...
Definition: Type.h:1081
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition: Type.h:8009
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
Definition: Type.h:7982
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Definition: Type.h:1327
bool hasNonTrivialObjCLifetime() const
Definition: Type.h:1437
bool isPODType(const ASTContext &Context) const
Determine whether this is a Plain Old Data (POD) type (C++ 3.9p10).
Definition: Type.cpp:2641
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: Type.h:8119
Represents a template name as written in source code.
Definition: TemplateName.h:491
The collection of all-type qualifiers we support.
Definition: Type.h:324
void addAddressSpace(LangAS space)
Definition: Type.h:590
@ OCL_Weak
Reading or writing from this object requires a barrier call.
Definition: Type.h:357
void removeConst()
Definition: Type.h:452
void removeAddressSpace()
Definition: Type.h:589
void addConst()
Definition: Type.h:453
void removeVolatile()
Definition: Type.h:462
LangAS getAddressSpace() const
Definition: Type.h:564
An rvalue reference type, per C++11 [dcl.ref].
Definition: Type.h:3501
Represents a struct/union/class.
Definition: Decl.h:4162
bool hasFlexibleArrayMember() const
Definition: Decl.h:4195
field_iterator field_end() const
Definition: Decl.h:4379
field_range fields() const
Definition: Decl.h:4376
bool isInjectedClassName() const
Determines whether this declaration represents the injected class name.
Definition: Decl.cpp:5061
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
Definition: Decl.h:4214
bool field_empty() const
Definition: Decl.h:4384
field_iterator field_begin() const
Definition: Decl.cpp:5095
A helper class that allows the use of isa/cast/dyncast to detect TagType objects of structs/unions/cl...
Definition: Type.h:6077
RecordDecl * getDecl() const
Definition: Type.h:6087
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
Definition: Redeclarable.h:215
decl_type * getPreviousDecl()
Return the previous declaration of this declaration or NULL if this is the first declaration.
Definition: Redeclarable.h:203
decl_type * getMostRecentDecl()
Returns the most recent (re)declaration of this declaration.
Definition: Redeclarable.h:225
void setPreviousDecl(decl_type *PrevDecl)
Set the previous declaration.
Definition: Decl.h:5003
redecl_range redecls() const
Returns an iterator range for all the redeclarations of the same decl.
Definition: Redeclarable.h:295
Base for LValueReferenceType and RValueReferenceType.
Definition: Type.h:3439
QualType getPointeeType() const
Definition: Type.h:3457
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition: Stmt.h:3046
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:393
void AddDecl(Decl *D)
Definition: Scope.h:346
const Scope * getParent() const
getParent - Return the scope that this is nested in.
Definition: Scope.h:271
@ DeclScope
This is a scope that can contain a declaration.
Definition: Scope.h:63
A generic diagnostic builder for errors which may or may not be deferred.
Definition: SemaBase.h:110
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID, bool DeferHint=false)
Emit a diagnostic.
Definition: SemaBase.cpp:60
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition: SemaBase.cpp:32
Sema & SemaRef
Definition: SemaBase.h:40
bool inferTargetForImplicitSpecialMember(CXXRecordDecl *ClassDecl, CXXSpecialMemberKind CSM, CXXMethodDecl *MemberDecl, bool ConstRHS, bool Diagnose)
Given a implicit special member, infer its CUDA target from the calls it needs to make to underlying ...
Definition: SemaCUDA.cpp:370
void checkDeclIsAllowedInOpenMPTarget(Expr *E, Decl *D, SourceLocation IdLoc=SourceLocation())
Check declaration inside target region.
A RAII object to enter scope of a compound statement.
Definition: Sema.h:916
bool isInvalid() const
Definition: Sema.h:7331
A RAII object to temporarily push a declaration context.
Definition: Sema.h:3010
For a defaulted function, the kind of defaulted function that it is.
Definition: Sema.h:5891
DefaultedComparisonKind asComparison() const
Definition: Sema.h:5923
CXXSpecialMemberKind asSpecialMember() const
Definition: Sema.h:5920
Helper class that collects exception specifications for implicitly-declared special member functions.
Definition: Sema.h:4995
void CalledStmt(Stmt *S)
Integrate an invoked statement into the collected data.
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:8942
CXXMethodDecl * getMethod() const
Definition: Sema.h:8954
RAII object to handle the state changes required to synthesize a function body.
Definition: Sema.h:13078
Abstract base class used for diagnosing integer constant expression violations.
Definition: Sema.h:7229
Sema - This implements semantic analysis and AST building for C.
Definition: Sema.h:464
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.
Definition: SemaDecl.cpp:11046
MemInitResult BuildDelegatingInitializer(TypeSourceInfo *TInfo, Expr *Init, CXXRecordDecl *ClassDecl)
void CheckTypedefForVariablyModifiedType(Scope *S, TypedefNameDecl *D)
Definition: SemaDecl.cpp:6716
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
bool EvaluateStaticAssertMessageAsString(Expr *Message, std::string &Result, ASTContext &Ctx, bool ErrorOnInvalidMessage)
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:12643
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)
Definition: SemaDecl.cpp:9816
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:6074
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',...
Definition: SemaDecl.cpp:1561
bool IsOverload(FunctionDecl *New, FunctionDecl *Old, bool UseMemberUsingDeclRules, bool ConsiderCudaAttrs=true)
ExprResult CreateBuiltinUnaryOp(SourceLocation OpLoc, UnaryOperatorKind Opc, Expr *InputExpr, bool IsAfterAmp=false)
Definition: SemaExpr.cpp:15498
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:5835
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition: Sema.h:8990
@ LookupUsingDeclName
Look up all declarations in a scope with the given name, including resolved using declarations.
Definition: Sema.h:9017
@ LookupLocalFriendName
Look up a friend of a local class.
Definition: Sema.h:9025
@ LookupNamespaceName
Look up a namespace name within a C++ using directive or namespace alias definition,...
Definition: Sema.h:9013
@ LookupMemberName
Member name lookup, which finds the names of class/struct/union members.
Definition: Sema.h:8998
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:412
void DiagnoseFunctionSpecifiers(const DeclSpec &DS)
Diagnose function specifiers on a declaration of an identifier that does not identify a function.
Definition: SemaDecl.cpp:6652
Decl * ActOnUsingEnumDeclaration(Scope *CurScope, AccessSpecifier AS, SourceLocation UsingLoc, SourceLocation EnumLoc, SourceRange TyLoc, const IdentifierInfo &II, ParsedType Ty, CXXScopeSpec *SS=nullptr)
VariadicCallType
Definition: Sema.h:2315
@ VariadicDoesNotApply
Definition: Sema.h:2320
@ VariadicConstructor
Definition: Sema.h:2319
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.
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)
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.
Definition: SemaDecl.cpp:6129
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)
void PrintContextStack()
Definition: Sema.h:13220
NamedDecl * ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC, TypeSourceInfo *TInfo, LookupResult &Previous, MultiTemplateParamsArg TemplateParamLists, bool &AddToScope, ArrayRef< BindingDecl * > Bindings={})
Definition: SemaDecl.cpp:7470
SemaOpenMP & OpenMP()
Definition: Sema.h:1126
void CheckDelegatingCtorCycles()
SmallVector< CXXMethodDecl *, 4 > DelayedDllExportMemberFunctions
Definition: Sema.h:5810
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,...
Definition: SemaDecl.cpp:6114
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:867
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:6051
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:6032
void AddPragmaAttributes(Scope *S, Decl *D)
Adds the attributes that have been specified using the '#pragma clang attribute push' directives to t...
Definition: SemaAttr.cpp:1190
SemaCUDA & CUDA()
Definition: Sema.h:1071
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)
Definition: SemaExpr.cpp:17394
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'.
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 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:1270
@ AR_accessible
Definition: Sema.h:1268
@ AR_inaccessible
Definition: Sema.h:1269
@ AR_delayed
Definition: Sema.h:1271
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:2292
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:2161
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)
Definition: SemaDecl.cpp:6257
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=NoFold)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
Definition: SemaExpr.cpp:17152
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)
Definition: SemaDecl.cpp:4844
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...
@ Other
C++26 [dcl.fct.def.general]p1 function-body: ctor-initializer[opt] compound-statement function-try-bl...
@ Delete
deleted-function-body
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:49
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.
Definition: SemaDecl.cpp:18402
FPOptionsOverride CurFPFeatureOverrides()
Definition: Sema.h:1665
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.
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:909
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.
Definition: SemaDecl.cpp:5821
DiagnosticsEngine & getDiagnostics() const
Definition: Sema.h:529
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
SemaObjC & ObjC()
Definition: Sema.h:1111
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...
NamedDecl * ActOnFriendFunctionDecl(Scope *S, Declarator &D, MultiTemplateParamsArg TemplateParams)
void setTagNameForLinkagePurposes(TagDecl *TagFromDeclSpec, TypedefNameDecl *NewTD)
Definition: SemaDecl.cpp:4954
void CheckDelayedMemberExceptionSpecs()
void ActOnReenterCXXMethodParameter(Scope *S, ParmVarDecl *Param)
This is used to implement the constant expression evaluation part of the attribute enable_if extensio...
AllowFoldKind
Definition: Sema.h:7243
@ AllowFold
Definition: Sema.h:7245
@ NoFold
Definition: Sema.h:7244
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
Definition: SemaDecl.cpp:1499
ASTContext & getASTContext() const
Definition: Sema.h:532
ClassTemplateDecl * StdInitializerList
The C++ "std::initializer_list" template, which is defined in <initializer_list>.
Definition: Sema.h:6058
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,...
Definition: SemaExpr.cpp:19915
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:6136
bool checkThisInStaticMemberFunctionType(CXXMethodDecl *Method)
Check whether 'this' shows up in the type of a static member function after the (naturally empty) cv-...
void PopExpressionEvaluationContext()
Definition: SemaExpr.cpp:17827
NamespaceDecl * getOrCreateStdNamespace()
Retrieve the special "std" namespace, which may require us to implicitly define the namespace.
ExprResult CreateOverloadedBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, const UnresolvedSetImpl &Fns, Expr *LHS, Expr *RHS, bool RequiresADL=true, bool AllowRewrittenCandidates=true, FunctionDecl *DefaultedFn=nullptr)
Create a binary operation that may resolve to an overloaded operator.
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:692
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:5606
@ Relational
This is an <, <=, >, or >= that should be implemented as a rewrite in terms of a <=> comparison.
@ NotEqual
This is an operator!= that should be implemented as a rewrite in terms of a == comparison.
@ ThreeWay
This is an operator<=> that should be implemented as a series of subobject comparisons.
@ None
This is not a defaultable comparison operator.
@ Equal
This is an operator== that should be implemented as a series of subobject comparisons.
bool RequireLiteralType(SourceLocation Loc, QualType T, TypeDiagnoser &Diagnoser)
Ensure that the type T is a literal type.
Definition: SemaType.cpp:9486
llvm::PointerIntPair< CXXRecordDecl *, 3, CXXSpecialMemberKind > SpecialMemberDecl
Definition: Sema.h:6069
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:817
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
Definition: SemaExpr.cpp:2204
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
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:11789
EnumDecl * getStdAlignValT() const
void ActOnFinishDelayedMemberDeclarations(Scope *S, Decl *Record)
LangAS getDefaultCXXMethodAddrSpace() const
Returns default addr space for method qualifiers.
Definition: Sema.cpp:1589
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
Definition: Sema.h:7962
QualType BuildQualifiedType(QualType T, SourceLocation Loc, Qualifiers Qs, const DeclSpec *DS=nullptr)
Definition: SemaType.cpp:1581
void PushFunctionScope()
Enter a new function scope.
Definition: Sema.cpp:2180
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:527
ConditionResult ActOnCondition(Scope *S, SourceLocation Loc, Expr *SubExpr, ConditionKind CK, bool MissingOK=false)
Definition: SemaExpr.cpp:20418
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition: Sema.cpp:82
@ UPPC_RequiresClause
Definition: Sema.h:13966
@ UPPC_UsingDeclaration
A using declaration.
Definition: Sema.h:13921
@ UPPC_ExceptionType
The type of an exception.
Definition: Sema.h:13939
@ UPPC_Initializer
An initializer.
Definition: Sema.h:13930
@ UPPC_BaseType
The base type of a class type.
Definition: Sema.h:13900
@ UPPC_FriendDeclaration
A friend declaration.
Definition: Sema.h:13924
@ UPPC_DefaultArgument
A default argument.
Definition: Sema.h:13933
@ UPPC_DeclarationType
The type of an arbitrary declaration.
Definition: Sema.h:13903
@ UPPC_DataMemberType
The type of a data member.
Definition: Sema.h:13906
@ UPPC_StaticAssertExpression
The expression in a static assertion.
Definition: Sema.h:13912
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:525
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:5396
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.
Definition: SemaDecl.cpp:1390
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:908
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.
Definition: SemaExpr.cpp:6475
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.
void collectUnexpandedParameterPacks(TemplateArgument Arg, SmallVectorImpl< UnexpandedParameterPack > &Unexpanded)
Collect the set of unexpanded parameter packs within the given template argument.
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 ...
Definition: SemaDecl.cpp:8279
void AddBuiltinOperatorCandidates(OverloadedOperatorKind Op, SourceLocation OpLoc, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet)
AddBuiltinOperatorCandidates - Add the appropriate built-in operator overloads to the candidate set (...
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
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.
bool CheckConstraintSatisfaction(const NamedDecl *Template, ArrayRef< const Expr * > ConstraintExprs, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
Definition: Sema.h:14375
const LangOptions & LangOpts
Definition: Sema.h:907
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.
Definition: SemaExpr.cpp:17511
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
Definition: SemaInit.cpp:7600
NamedDeclSetType UnusedPrivateFields
Set containing all declared private fields that are not used.
Definition: Sema.h:6036
SemaHLSL & HLSL()
Definition: Sema.h:1076
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.
Definition: SemaDecl.cpp:11953
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:5402
void CheckCXXDefaultArguments(FunctionDecl *FD)
Helpers for dealing with blocks and functions.
ComparisonCategoryUsage
Definition: Sema.h:4792
@ DefaultedOperator
A defaulted 'operator<=>' needed the comparison category.
SmallVector< InventedTemplateParameterInfo, 4 > InventedParameterInfos
Stack containing information needed when in C++2a an 'auto' is encountered in a function declaration ...
Definition: Sema.h:6029
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
Definition: SemaExpr.cpp:20066
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
Definition: SemaStmt.cpp:3710
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:6128
llvm::DenseMap< ParmVarDecl *, SourceLocation > UnparsedDefaultArgLocs
Definition: Sema.h:6062
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)
QualType getElaboratedType(ElaboratedTypeKeyword Keyword, const CXXScopeSpec &SS, QualType T, TagDecl *OwnedTagDecl=nullptr)
Retrieve a version of the type 'T' that is elaborated by Keyword, qualified by the nested-name-specif...
Definition: SemaType.cpp:9582
bool RequireCompleteEnumDecl(EnumDecl *D, SourceLocation L, CXXScopeSpec *SS=nullptr)
Require that the EnumDecl is completed with its enumerators defined or instantiated.
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 CheckOverloadedOperatorDeclaration(FunctionDecl *FnDecl)
CheckOverloadedOperatorDeclaration - Check whether the declaration of this overloaded operator is wel...
void ExitDeclaratorContext(Scope *S)
Definition: SemaDecl.cpp:1377
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.
CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)
Get the class that is directly named by the current context.
void pushCodeSynthesisContext(CodeSynthesisContext Ctx)
QualType BuildReferenceType(QualType T, bool LValueRef, SourceLocation Loc, DeclarationName Entity)
Build a reference type.
Definition: SemaType.cpp:1857
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:12655
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:5392
ExprResult DefaultLvalueConversion(Expr *E)
Definition: SemaExpr.cpp:640
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)
Definition: SemaExpr.cpp:3189
bool isVisible(const NamedDecl *D)
Determine whether a declaration is visible to name lookup.
Definition: Sema.h:14990
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:9588
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)
Definition: SemaDecl.cpp:15449
bool DiagnoseUseOfOverloadedDecl(NamedDecl *D, SourceLocation Loc)
Definition: Sema.h:6492
std::unique_ptr< RecordDeclSetTy > PureVirtualClassDiagSet
PureVirtualClassDiagSet - a set of class declarations which we have emitted a list of pure virtual fu...
Definition: Sema.h:6043
void ActOnFinishInlineFunctionDef(FunctionDecl *D)
Definition: SemaDecl.cpp:15373
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition: Sema.h:1044
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, bool Diagnose=true, bool WantSize=false, bool WantAligned=false)
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.
Definition: SemaDecl.cpp:14940
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
Definition: SemaDecl.cpp:5826
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)
TrivialABIHandling
Definition: Sema.h:5875
@ TAH_IgnoreTrivialABI
The triviality of a method unaffected by "trivial_abi".
Definition: Sema.h:5877
@ TAH_ConsiderTrivialABI
The triviality of a method affected by "trivial_abi".
Definition: Sema.h:5880
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition: Sema.h:7777
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 MarkVirtualBaseDestructorsReferenced(SourceLocation Location, CXXRecordDecl *ClassDecl, llvm::SmallPtrSetImpl< const RecordType * > *DirectVirtualBases=nullptr)
Mark destructors of virtual bases of this class referenced.
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.
Definition: SemaExpr.cpp:20015
StmtResult ActOnForStmt(SourceLocation ForLoc, SourceLocation LParenLoc, Stmt *First, ConditionResult Second, FullExprArg Third, SourceLocation RParenLoc, Stmt *Body)
Definition: SemaStmt.cpp:2255
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:13490
SourceManager & getSourceManager() const
Definition: Sema.h:530
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 ...
Definition: SemaDecl.cpp:1342
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:8970
QualType BuildPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc, SourceLocation EllipsisLoc, bool FullySubstituted=false, ArrayRef< QualType > Expansions={})
Definition: SemaType.cpp:9736
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.
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
QualType CheckTemplateIdType(TemplateName Template, SourceLocation TemplateLoc, TemplateArgumentListInfo &TemplateArgs)
void PushNamespaceVisibilityAttr(const VisibilityAttr *Attr, SourceLocation Loc)
PushNamespaceVisibilityAttr - Note that we've entered a namespace with a visibility attribute.
Definition: SemaAttr.cpp:1471
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 ...
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:216
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.
Definition: SemaDecl.cpp:8302
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)
StmtResult BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp, bool AllowRecovery=false)
Definition: SemaStmt.cpp:3883
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition: Sema.h:14945
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...
@ CTK_ErrorRecovery
Definition: Sema.h:9384
void CheckCompleteVariableDeclaration(VarDecl *VD)
Definition: SemaDecl.cpp:14304
ExprResult ActOnRequiresClause(ExprResult ConstraintExpr)
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:6054
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.
@ CCEK_StaticAssertMessageSize
Call to size() in a static assert message.
Definition: Sema.h:10005
@ CCEK_ExplicitBool
Condition in an explicit(bool) specifier.
Definition: Sema.h:10003
@ CCEK_StaticAssertMessageData
Call to data() in a static assert message.
Definition: Sema.h:10007
void mergeDeclAttributes(NamedDecl *New, Decl *Old, AvailabilityMergeKind AMK=AMK_Redeclaration)
mergeDeclAttributes - Copy attributes from the Old decl to the New one.
Definition: SemaDecl.cpp:3095
ASTConsumer & Consumer
Definition: Sema.h:910
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:4227
@ Ovl_NonFunction
This is not an overload because the lookup results contain a non-function.
Definition: Sema.h:9787
@ Ovl_Overload
This is a legitimate overload: the existing declarations are functions or function templates with dif...
Definition: Sema.h:9779
@ Ovl_Match
This is not an overload because the signature exactly matches an existing declaration.
Definition: Sema.h:9783
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition: SemaExpr.cpp:121
ExprResult CreateBuiltinArraySubscriptExpr(Expr *Base, SourceLocation LLoc, Expr *Idx, SourceLocation RLoc)
Definition: SemaExpr.cpp:5120
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...
@ PotentiallyEvaluated
The current expression is potentially evaluated at run time, which means that code may be generated t...
@ Unevaluated
The current expression and its subexpressions occur within an unevaluated operand (C++11 [expr]p7),...
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...
Definition: SemaType.cpp:9704
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
Definition: SemaType.cpp:5704
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 {'.
Definition: SemaDecl.cpp:17145
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.
Definition: SemaType.cpp:9119
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:872
void ActOnFields(Scope *S, SourceLocation RecLoc, Decl *TagDecl, ArrayRef< Decl * > Fields, SourceLocation LBrac, SourceLocation RBrac, const ParsedAttributesView &AttrList)
Definition: SemaDecl.cpp:19003
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' ...
Definition: SemaAttr.cpp:1480
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...
Definition: SemaInit.cpp:7456
void CheckCompletedCXXClass(Scope *S, CXXRecordDecl *Record)
Perform semantic checks on a class definition that has been completing, introducing implicitly-declar...
void DiscardCleanupsInEvaluationContext()
Definition: SemaExpr.cpp:17904
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition: Sema.h:7917
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
Definition: SemaDecl.cpp:1310
bool CheckEquivalentExceptionSpec(FunctionDecl *Old, FunctionDecl *New)
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
SourceManager & SourceMgr
Definition: Sema.h:912
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:911
FullExprArg MakeFullDiscardedValueExpr(Expr *Arg)
Definition: Sema.h:7301
CXXConstructorDecl * DeclareImplicitCopyConstructor(CXXRecordDecl *ClassDecl)
Declare the implicit copy constructor for the given class.
NamespaceDecl * getStdNamespace() const
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...
Definition: SemaDecl.cpp:7293
@ TPC_TypeAliasTemplate
Definition: Sema.h:11285
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,...
Definition: SemaDecl.cpp:6753
ExprResult ActOnIntegerConstant(SourceLocation Loc, int64_t Val)
Definition: SemaExpr.cpp:3598
ExprResult BuildCXXDefaultInitExpr(SourceLocation Loc, FieldDecl *Field)
Definition: SemaExpr.cpp:5581
Decl * ActOnEmptyDeclaration(Scope *S, const ParsedAttributesView &AttrList, SourceLocation SemiLoc)
Handle a C++11 empty-declaration and attribute-declaration.
void PopDeclContext()
Definition: SemaDecl.cpp:1317
void diagnoseIgnoredQualifiers(unsigned DiagID, unsigned Quals, SourceLocation FallbackLoc, SourceLocation ConstQualLoc=SourceLocation(), SourceLocation VolatileQualLoc=SourceLocation(), SourceLocation RestrictQualLoc=SourceLocation(), SourceLocation AtomicQualLoc=SourceLocation(), SourceLocation UnalignedQualLoc=SourceLocation())
Definition: SemaType.cpp:2871
llvm::MapVector< NamedDecl *, SourceLocation > UndefinedButUsed
UndefinedInternals - all the used, undefined objects which require a definition in this translation u...
Definition: Sema.h:6066
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.
Definition: SemaDecl.cpp:1581
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD)
ExprResult ConvertMemberDefaultInitExpression(FieldDecl *FD, Expr *InitExpr, SourceLocation InitLoc)
bool IsInvalidSMECallConversion(QualType FromType, QualType ToType)
Definition: SemaExpr.cpp:8879
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.
Definition: SemaDecl.cpp:1566
@ OOK_Outside
Definition: Sema.h:3868
void AddInitializerToDecl(Decl *dcl, Expr *init, bool DirectInit)
AddInitializerToDecl - Adds the initializer Init to the declaration dcl.
Definition: SemaDecl.cpp:13377
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:296
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:5809
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,...
Definition: SemaExpr.cpp:18085
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,...
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicDoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
Definition: SemaExpr.cpp:5953
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
Definition: SemaExpr.cpp:21168
Decl * ActOnDeclarator(Scope *S, Declarator &D)
Definition: SemaDecl.cpp:6088
AbstractDiagSelID
Definition: Sema.h:5755
@ AbstractVariableType
Definition: Sema.h:5759
@ AbstractReturnType
Definition: Sema.h:5757
@ AbstractNone
Definition: Sema.h:5756
@ AbstractFieldType
Definition: Sema.h:5760
@ AbstractArrayType
Definition: Sema.h:5763
@ AbstractParamType
Definition: Sema.h:5758
StmtResult ActOnIfStmt(SourceLocation IfLoc, IfStatementKind StatementKind, SourceLocation LParenLoc, Stmt *InitStmt, ConditionResult Cond, SourceLocation RParenLoc, Stmt *ThenVal, SourceLocation ElseLoc, Stmt *ElseVal)
Definition: SemaStmt.cpp:962
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)
void ProcessAPINotes(Decl *D)
Map any API notes provided for this declaration to attributes on the declaration.
bool CheckRedeclarationInModule(NamedDecl *New, NamedDecl *Old)
A wrapper function for checking the semantic restrictions of a redeclaration within a module.
Definition: SemaDecl.cpp:1705
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
Definition: Sema.h:7966
ExprResult CreateBuiltinBinOp(SourceLocation OpLoc, BinaryOperatorKind Opc, Expr *LHSExpr, Expr *RHSExpr)
CreateBuiltinBinOp - Creates a new built-in binary operation with operator Opc at location TokLoc.
Definition: SemaExpr.cpp:14768
void DiagnoseUnsatisfiedConstraint(const ConstraintSatisfaction &Satisfaction, bool First=true)
Emit diagnostics explaining why a constraint expression was deemed unsatisfied.
void ActOnPureSpecifier(Decl *D, SourceLocation PureSpecLoc)
bool IsDerivedFrom(SourceLocation Loc, QualType Derived, QualType Base)
Determine whether the type Derived is a C++ class that is derived from the type Base.
CheckConstexprKind
Definition: Sema.h:5951
@ CheckValid
Identify whether this function satisfies the formal rules for constexpr functions in the current lanu...
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
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)
Definition: SemaType.cpp:2751
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:451
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:3003
DeclContextLookupResult LookupConstructors(CXXRecordDecl *Class)
Look up the constructors for the given class.
void ActOnStartDelayedMemberDeclarations(Scope *S, Decl *Record)
bool SpecialMemberIsTrivial(CXXMethodDecl *MD, CXXSpecialMemberKind CSM, TrivialABIHandling TAH=TAH_IgnoreTrivialABI, bool Diagnose=false)
Determine whether a defaulted or deleted special member function is trivial, as specified in C++11 [c...
ExprResult ActOnCXXThis(SourceLocation Loc)
bool DiagnoseUnexpandedParameterPacks(SourceLocation Loc, UnexpandedParameterPackContext UPPC, ArrayRef< UnexpandedParameterPack > Unexpanded)
Diagnose unexpanded parameter packs.
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)
Definition: SemaDecl.cpp:6075
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.
Definition: SemaExpr.cpp:5332
ValueDecl * tryLookupUnambiguousFieldDecl(RecordDecl *ClassDecl, const IdentifierInfo *MemberOrBase)
ASTMutationListener * getASTMutationListener() const
Definition: Sema.cpp:590
ExprResult CorrectDelayedTyposInExpr(Expr *E, VarDecl *InitDecl=nullptr, bool RecoverUncorrectedTypos=false, llvm::function_ref< ExprResult(Expr *)> Filter=[](Expr *E) -> ExprResult { return E;})
Process any TypoExprs in the given Expr and its children, generating diagnostics as appropriate and r...
bool SetCtorInitializers(CXXConstructorDecl *Constructor, bool AnyErrors, ArrayRef< CXXCtorInitializer * > Initializers={})
void DiagnoseImmediateEscalatingReason(FunctionDecl *FD)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition: Sema.h:8268
void FinalizeVarWithDestructor(VarDecl *VD, const RecordType *DeclInitType)
FinalizeVarWithDestructor - Prepare for calling destructor on the constructed variable.
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 isInMainFile(SourceLocation Loc) const
Returns whether the PresumedLoc for a given SourceLocation is in the main file.
SourceLocation getSpellingLoc(SourceLocation Loc) const
Given a SourceLocation object, return the spelling location referenced by the ID.
CharSourceRange getImmediateExpansionRange(SourceLocation Loc) const
Return the start/end of the expansion information for an expansion location.
bool isInSystemHeader(SourceLocation Loc) const
Returns if a SourceLocation is in a system header.
SourceLocation getExpansionLoc(SourceLocation Loc) const
Given a SourceLocation object Loc, return the expansion location referenced by the ID.
A trivial tuple used to represent a source range.
void setBegin(SourceLocation b)
bool isInvalid() const
SourceLocation getEnd() const
SourceLocation getBegin() const
bool isValid() 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:3438
Stmt - This represents one statement.
Definition: Stmt.h:84
SourceLocation getEndLoc() const LLVM_READONLY
Definition: Stmt.cpp:357
child_range children()
Definition: Stmt.cpp:294
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition: Stmt.cpp:333
SourceLocation getBeginLoc() const LLVM_READONLY
Definition: Stmt.cpp:345
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:1778
bool isUnevaluated() const
Definition: Expr.h:1907
StringRef getString() const
Definition: Expr.h:1855
Represents the declaration of a struct/union/class/enum.
Definition: Decl.h:3578
bool isBeingDefined() const
Return true if this decl is currently being defined.
Definition: Decl.h:3701
StringRef getKindName() const
Definition: Decl.h:3769
bool isCompleteDefinition() const
Return true if this decl has its body fully specified.
Definition: Decl.h:3681
TagDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition: Decl.cpp:4751
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:4745
bool isUnion() const
Definition: Decl.h:3784
TagKind getTagKind() const
Definition: Decl.h:3773
bool isDependentType() const
Whether this declaration declares a type that is dependent, i.e., a type that somehow depends on temp...
Definition: Decl.h:3732
bool areArgsDestroyedLeftToRightInCallee() const
Are arguments to a call destroyed left to right in the callee? This is a fundamental language change,...
Definition: TargetCXXABI.h:188
bool isMicrosoft() const
Is this ABI an MSVC-compatible ABI?
Definition: TargetCXXABI.h:136
bool hasKeyFunctions() const
Does this ABI use key functions? If so, class data such as the vtable is emitted with strong linkage ...
Definition: TargetCXXABI.h:206
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
Definition: TargetInfo.h:1262
virtual CallingConvKind getCallingConvKind(bool ClangABICompat4) const
Definition: TargetInfo.cpp:611
TargetCXXABI getCXXABI() const
Get the C++ ABI currently in use.
Definition: TargetInfo.h:1333
virtual bool shouldDLLImportComdatSymbols() const
Does this target aim for semantic compatibility with Microsoft C++ code using dllimport/export attrib...
Definition: TargetInfo.h:1300
A convenient class for passing around template argument information.
Definition: TemplateBase.h:632
void addArgument(const TemplateArgumentLoc &Loc)
Definition: TemplateBase.h:667
llvm::ArrayRef< TemplateArgumentLoc > arguments() const
Definition: TemplateBase.h:659
Location wrapper for a TemplateArgument.
Definition: TemplateBase.h:524
const TemplateArgument & getArgument() const
Definition: TemplateBase.h:574
TypeSourceInfo * getTypeSourceInfo() const
Definition: TemplateBase.h:578
Represents a template argument.
Definition: TemplateBase.h:61
@ Type
The template argument is a type.
Definition: TemplateBase.h:70
ArgKind getKind() const
Return the kind of stored template argument.
Definition: TemplateBase.h:295
The base class of all kinds of template declarations (e.g., class, function, etc.).
Definition: DeclTemplate.h:399
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Definition: DeclTemplate.h:418
Represents a C++ template name within the type system.
Definition: TemplateName.h:220
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.
Definition: DeclTemplate.h:73
NamedDecl * getParam(unsigned Idx)
Definition: DeclTemplate.h:147
SourceRange getSourceRange() const LLVM_READONLY
Definition: DeclTemplate.h:209
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.
Definition: DeclTemplate.h:183
SourceLocation getRAngleLoc() const
Definition: DeclTemplate.h:207
SourceLocation getLAngleLoc() const
Definition: DeclTemplate.h:206
static bool shouldIncludeTypeForArgument(const PrintingPolicy &Policy, const TemplateParameterList *TPL, unsigned Idx)
SourceLocation getTemplateLoc() const
Definition: DeclTemplate.h:205
TemplateArgumentLoc getArgLoc(unsigned i) const
Definition: TypeLoc.h:1726
Represents a type template specialization; the template must be a class template, a type alias templa...
Definition: Type.h:6666
ArrayRef< TemplateArgument > template_arguments() const
Definition: Type.h:6734
TemplateName getTemplateName() const
Retrieve the name of the template that we are specializing.
Definition: Type.h:6732
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.
unsigned getIndex() const
Definition: Type.h:6348
unsigned getDepth() const
Definition: Type.h:6347
The top declaration context.
Definition: Decl.h:84
Represents the declaration of a typedef-name via a C++11 alias-declaration.
Definition: Decl.h:3549
static TypeAliasDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, TypeSourceInfo *TInfo)
Definition: Decl.cpp:5580
void setDescribedAliasTemplate(TypeAliasTemplateDecl *TAT)
Definition: Decl.h:3568
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:3384
const Type * getTypeForDecl() const
Definition: Decl.h:3409
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:170
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:1256
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:153
SourceRange getLocalSourceRange() const
Get the local source range.
Definition: TypeLoc.h:159
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:235
T getAsAdjusted() const
Convert to the specified TypeLoc type, returning a null TypeLoc if this TypeLoc is not of the desired...
Definition: TypeLoc.h:2715
SourceLocation getBeginLoc() const
Get the begin source location.
Definition: TypeLoc.cpp:192
A container of type source information.
Definition: Type.h:7907
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition: TypeLoc.h:256
QualType getType() const
Return the type wrapped by this type source info.
Definition: Type.h:7918
A reasonable base class for TypeLocs that correspond to types that are written as a type-specifier.
Definition: TypeLoc.h:528
static ElaboratedTypeKeyword getKeywordForTagTypeKind(TagTypeKind Tag)
Converts a TagTypeKind into an elaborated type keyword.
Definition: Type.cpp:3196
static StringRef getTagTypeKindName(TagTypeKind Kind)
Definition: Type.h:6929
static TagTypeKind getTagTypeKindForTypeSpec(unsigned TypeSpec)
Converts a type specifier (DeclSpec::TST) into a tag type kind.
Definition: Type.cpp:3178
The base class of the type hierarchy.
Definition: Type.h:1828
bool isSizelessType() const
As an extension, we classify types as one of "sized" or "sizeless"; every type is one or the other.
Definition: Type.cpp:2511
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition: Type.cpp:1916
bool isVoidType() const
Definition: Type.h:8515
bool isBooleanType() const
Definition: Type.h:8643
bool isLiteralType(const ASTContext &Ctx) const
Return true if this is a literal type (C++11 [basic.types]p10)
Definition: Type.cpp:2937
bool isIncompleteArrayType() const
Definition: Type.h:8271
bool isUndeducedAutoType() const
Definition: Type.h:8350
bool isRValueReferenceType() const
Definition: Type.h:8217
bool isArrayType() const
Definition: Type.h:8263
bool isPointerType() const
Definition: Type.h:8191
CanQualType getCanonicalTypeUnqualified() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition: Type.h:8555
const T * castAs() const
Member-template castAs<specific type>.
Definition: Type.h:8805
bool isReferenceType() const
Definition: Type.h:8209
bool isEnumeralType() const
Definition: Type.h:8295
bool isElaboratedTypeSpecifier() const
Determine wither this type is a C++ elaborated-type-specifier.
Definition: Type.cpp:3303
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition: Type.cpp:738
bool isLValueReferenceType() const
Definition: Type.h:8213
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
Definition: Type.h:8484
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition: Type.h:2706
bool containsUnexpandedParameterPack() const
Whether this type is or contains an unexpanded parameter pack, used to support C++0x variadic templat...
Definition: Type.h:2361
QualType getCanonicalTypeInternal() const
Definition: Type.h:2989
bool containsErrors() const
Whether this type is an error type.
Definition: Type.h:2700
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
Definition: Type.h:8686
bool isFunctionProtoType() const
Definition: Type.h:2535
bool isOverloadableType() const
Determines whether this is a type for which one can define an overloaded operator.
Definition: Type.h:8656
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition: Type.h:2724
bool isObjCObjectType() const
Definition: Type.h:8337
bool isUndeducedType() const
Determine whether this type is an undeduced type, meaning that it somehow involves a C++11 'auto' typ...
Definition: Type.h:8649
bool isFunctionType() const
Definition: Type.h:8187
bool isObjCObjectPointerType() const
Definition: Type.h:8333
bool isStructureOrClassType() const
Definition: Type.cpp:690
bool isRealFloatingType() const
Floating point categories.
Definition: Type.cpp:2300
const T * getAs() const
Member-template getAs<specific type>'.
Definition: Type.h:8736
bool isRecordType() const
Definition: Type.h:8291
bool isUnionType() const
Definition: Type.cpp:704
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
Definition: Type.cpp:1924
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
Definition: Type.cpp:1920
Base class for declarations which introduce a typedef-name.
Definition: Decl.h:3427
QualType getUnderlyingType() const
Definition: Decl.h:3482
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...
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition: Expr.h:2232
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:4959
Represents a C++ unqualified-id that has been parsed.
Definition: DeclSpec.h:1028
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:419
A set of unresolved declarations.
Definition: UnresolvedSet.h:62
ArrayRef< DeclAccessPair > pairs() const
Definition: UnresolvedSet.h:90
The iterator over UnresolvedSets.
Definition: UnresolvedSet.h:35
A set of unresolved declarations.
This node is generated when a using-declaration that was annotated with attribute((using_if_exists)) ...
Definition: DeclCXX.h:4063
static UnresolvedUsingIfExistsDecl * Create(ASTContext &Ctx, DeclContext *DC, SourceLocation Loc, DeclarationName Name)
Definition: DeclCXX.cpp:3417
Represents a dependent using declaration which was marked with typename.
Definition: DeclCXX.h:3982
static UnresolvedUsingTypenameDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation TypenameLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation TargetNameLoc, DeclarationName TargetName, SourceLocation EllipsisLoc)
Definition: DeclCXX.cpp:3396
Represents a dependent using declaration which was not marked with typename.
Definition: DeclCXX.h:3885
static UnresolvedUsingValueDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, SourceLocation EllipsisLoc)
Definition: DeclCXX.cpp:3368
Represents a C++ using-declaration.
Definition: DeclCXX.h:3535
bool hasTypename() const
Return true if the using declaration has 'typename'.
Definition: DeclCXX.h:3584
DeclarationNameInfo getNameInfo() const
Definition: DeclCXX.h:3576
static UsingDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, NestedNameSpecifierLoc QualifierLoc, const DeclarationNameInfo &NameInfo, bool HasTypenameKeyword)
Definition: DeclCXX.cpp:3303
NestedNameSpecifier * getQualifier() const
Retrieve the nested-name-specifier that qualifies the name.
Definition: DeclCXX.h:3572
SourceLocation getUsingLoc() const
Return the source location of the 'using' keyword.
Definition: DeclCXX.h:3562
Represents C++ using-directive.
Definition: DeclCXX.h:3038
static UsingDirectiveDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingLoc, SourceLocation NamespaceLoc, NestedNameSpecifierLoc QualifierLoc, SourceLocation IdentLoc, NamedDecl *Nominated, DeclContext *CommonAncestor)
Definition: DeclCXX.cpp:3090
Represents a C++ using-enum-declaration.
Definition: DeclCXX.h:3736
static UsingEnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation UsingL, SourceLocation EnumL, SourceLocation NameL, TypeSourceInfo *EnumType)
Definition: DeclCXX.cpp:3324
static UsingPackDecl * Create(ASTContext &C, DeclContext *DC, NamedDecl *InstantiatedFrom, ArrayRef< NamedDecl * > UsingDecls)
Definition: DeclCXX.cpp:3347
Represents a shadow declaration implicitly introduced into a scope by a (resolved) using-declaration ...
Definition: DeclCXX.h:3343
static UsingShadowDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation Loc, DeclarationName Name, BaseUsingDecl *Introducer, NamedDecl *Target)
Definition: DeclCXX.h:3379
NamedDecl * getTargetDecl() const
Gets the underlying declaration which has been brought into the local scope.
Definition: DeclCXX.h:3407
BaseUsingDecl * getIntroducer() const
Gets the (written or instantiated) using declaration that introduced this declaration.
Definition: DeclCXX.cpp:3243
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition: Decl.h:671
void setType(QualType newType)
Definition: Decl.h:683
QualType getType() const
Definition: Decl.h:682
Represents a variable declaration or definition.
Definition: Decl.h:882
VarTemplateDecl * getDescribedVarTemplate() const
Retrieves the variable template that is described by this variable declaration.
Definition: Decl.cpp:2786
static VarDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, const IdentifierInfo *Id, QualType T, TypeSourceInfo *TInfo, StorageClass S)
Definition: Decl.cpp:2140
bool isConstexpr() const
Whether this variable is (C++11) constexpr.
Definition: Decl.h:1513
DefinitionKind isThisDeclarationADefinition(ASTContext &) const
Check whether this declaration is a definition.
Definition: Decl.cpp:2249
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition: Decl.cpp:2179
bool isNoDestroy(const ASTContext &) const
Is destruction of this variable entirely suppressed? If so, the variable need not have a usable destr...
Definition: Decl.cpp:2812
void setCXXCondDecl()
Definition: Decl.h:1563
bool isInlineSpecified() const
Definition: Decl.h:1498
APValue * evaluateValue() const
Attempt to evaluate the value of the initializer attached to this declaration, and produce notes expl...
Definition: Decl.cpp:2547
bool isStaticDataMember() const
Determines whether this is a static data member.
Definition: Decl.h:1234
bool hasGlobalStorage() const
Returns true for all variables that do not have local storage.
Definition: Decl.h:1177
bool hasConstantInitialization() const
Determine whether this variable has constant initialization.
Definition: Decl.cpp:2620
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:1159
QualType::DestructionKind needsDestruction(const ASTContext &Ctx) const
Would the destruction of this variable have any effect, and if so, what kind?
Definition: Decl.cpp:2827
ThreadStorageClassSpecifier getTSCSpec() const
Definition: Decl.h:1128
const Expr * getInit() const
Definition: Decl.h:1319
@ TLS_Dynamic
TLS with a dynamic initializer.
Definition: Decl.h:908
void setInit(Expr *I)
Definition: Decl.cpp:2449
StorageClass getStorageClass() const
Returns the storage class as written in the source.
Definition: Decl.h:1119
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:2500
void setExceptionVariable(bool EV)
Definition: Decl.h:1441
bool isParameterPack() const
Determine whether this variable is actually a function parameter pack or init-capture pack.
Definition: Decl.cpp:2662
Declaration of a variable template.
Represents a GCC generic vector type.
Definition: Type.h:4034
unsigned getNumElements() const
Definition: Type.h:4049
QualType getElementType() const
Definition: Type.h:4048
Represents a C++11 virt-specifier-seq.
Definition: DeclSpec.h:2783
SourceLocation getOverrideLoc() const
Definition: DeclSpec.h:2803
SourceLocation getLastLocation() const
Definition: DeclSpec.h:2815
bool isOverrideSpecified() const
Definition: DeclSpec.h:2802
SourceLocation getFinalLoc() const
Definition: DeclSpec.h:2807
bool isFinalSpecified() const
Definition: DeclSpec.h:2805
bool isFinalSpelledSealed() const
Definition: DeclSpec.h:2806
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
Defines the clang::TargetInfo interface.
#define UINT_MAX
Definition: limits.h:64
const AstTypeMatcher< RecordType > recordType
Matches record types (e.g.
bool Inc(InterpState &S, CodePtr OpPC)
1) Pops a pointer from the stack 2) Load the value from the pointer 3) Writes the value increased by ...
Definition: Interp.h:824
bool Zero(InterpState &S, CodePtr OpPC)
Definition: Interp.h:2353
bool Comp(InterpState &S, CodePtr OpPC)
1) Pops the value from the stack.
Definition: Interp.h:925
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)
Definition: SemaInternal.h:32
TypeSpecifierType
Specifies the kind of type.
Definition: Specifiers.h:55
@ 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.
Definition: OperatorKinds.h:21
@ OO_None
Not an overloaded operator.
Definition: OperatorKinds.h:22
@ NUM_OVERLOADED_OPERATORS
Definition: OperatorKinds.h:26
bool isa(CodeGen::Address addr)
Definition: Address.h:328
bool isTemplateInstantiation(TemplateSpecializationKind Kind)
Determine whether this template specialization kind refers to an instantiation of an entity (as oppos...
Definition: Specifiers.h:212
@ CPlusPlus23
Definition: LangStandard.h:60
@ CPlusPlus20
Definition: LangStandard.h:59
@ CPlusPlus
Definition: LangStandard.h:55
@ CPlusPlus11
Definition: LangStandard.h:56
@ CPlusPlus14
Definition: LangStandard.h:57
@ CPlusPlus26
Definition: LangStandard.h:61
@ CPlusPlus17
Definition: LangStandard.h:58
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
@ Specialization
We are substituting template parameters for template arguments in order to form a template specializa...
LinkageSpecLanguageIDs
Represents the language in a linkage specification.
Definition: DeclCXX.h:2949
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: Type.h:1768
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition: Type.h:1774
@ 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:1538
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition: Specifiers.h:151
BinaryOperatorKind
@ 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.
@ IK_DeductionGuideName
A deduction-guide name (a template-name)
@ IK_ImplicitSelfParam
An implicit 'self' parameter.
@ IK_TemplateId
A template-id, e.g., f<int>.
@ IK_ConstructorTemplateId
A constructor named via a template-id.
@ IK_ConstructorName
A constructor name.
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
@ IK_Identifier
An identifier.
@ IK_DestructorName
A destructor name.
@ IK_OperatorFunctionId
An overloaded operator name, e.g., operator+.
@ IK_ConversionFunctionId
A conversion function name, e.g., operator int.
std::optional< ComparisonCategoryType > getComparisonCategoryForBuiltinCmp(QualType T)
Get the comparison category that should be used when comparing values of type T.
StorageClass
Storage classes.
Definition: Specifiers.h:248
@ SC_Static
Definition: Specifiers.h:252
@ SC_None
Definition: Specifiers.h:250
ThreadStorageClassSpecifier
Thread storage-class-specifier.
Definition: Specifiers.h:235
ComparisonCategoryType commonComparisonType(ComparisonCategoryType A, ComparisonCategoryType B)
Determine the common comparison type, as defined in C++2a [class.spaceship]p4.
ComparisonCategoryResult
An enumeration representing the possible results of a three-way comparison.
Language
The language for the input, used to select and validate the language standard and possible actions.
Definition: LangStandard.h:23
StmtResult StmtError()
Definition: Ownership.h:265
@ Result
The result type of a method or function.
std::pair< unsigned, unsigned > getDepthAndIndex(const NamedDecl *ND)
Retrieve the depth and index of a template parameter.
Definition: SemaInternal.h:61
InheritableAttr * getDLLAttr(Decl *D)
Return a DLL attribute from the declaration.
Definition: SemaInternal.h:50
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
void EscapeStringForDiagnostic(StringRef Str, SmallVectorImpl< char > &OutStr)
EscapeStringForDiagnostic - Append Str to the diagnostic buffer, escaping non-printable characters an...
Definition: Diagnostic.cpp:985
ReservedLiteralSuffixIdStatus
ActionResult< Expr * > ExprResult
Definition: Ownership.h:248
TagTypeKind
The kind of a tag type.
Definition: Type.h:6876
@ Interface
The "__interface" keyword.
@ Struct
The "struct" keyword.
@ Class
The "class" keyword.
MutableArrayRef< TemplateParameterList * > MultiTemplateParamsArg
Definition: Ownership.h:262
ExprResult ExprError()
Definition: Ownership.h:264
LangAS
Defines the address space values used by the address space qualifier of QualType.
Definition: AddressSpaces.h:25
@ CanPassInRegs
The argument of this type can be passed directly in registers.
@ CanNeverPassInRegs
The argument of this type cannot be passed directly in registers.
@ CannotPassInRegs
The argument of this type cannot be passed directly in registers.
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
Definition: LangOptions.h:1102
ComparisonCategoryType
An enumeration representing the different comparison categories types.
ActionResult< Stmt * > StmtResult
Definition: Ownership.h:249
CXXSpecialMemberKind
Kinds of C++ special members.
Definition: Sema.h:423
OverloadedOperatorKind getRewrittenOverloadedOperator(OverloadedOperatorKind Kind)
Get the other overloaded operator that the given operator can be rewritten into, if any such operator...
Definition: OperatorKinds.h:36
@ TNK_Concept_template
The name refers to a concept.
Definition: TemplateKinds.h:52
ActionResult< ParsedType > TypeResult
Definition: Ownership.h:250
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
const FunctionProtoType * T
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition: DeclBase.h:1274
std::pair< llvm::PointerUnion< const TemplateTypeParmType *, NamedDecl * >, SourceLocation > UnexpandedParameterPack
Definition: Sema.h:236
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
@ Incomplete
Template argument deduction did not deduce a value for every template parameter.
@ Inconsistent
Template argument deduction produced inconsistent deduced values for the given template parameter.
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
ElaboratedTypeKeyword
The elaboration keyword that precedes a qualified type name or introduces an elaborated-type-specifie...
Definition: Type.h:6851
@ None
No keyword precedes the qualified type name.
@ Class
The "class" keyword introduces the elaborated-type-specifier.
@ Enum
The "enum" keyword introduces the elaborated-type-specifier.
bool isExternallyVisible(Linkage L)
Definition: Linkage.h:90
ExceptionSpecificationType
The various types of exception specifications that exist in C++11.
@ EST_DependentNoexcept
noexcept(expression), value-dependent
@ EST_DynamicNone
throw()
@ 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)
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
MutableArrayRef< Expr * > MultiExprArg
Definition: Ownership.h:258
@ NOUR_Unevaluated
This name appears in an unevaluated operand.
Definition: Specifiers.h:177
#define true
Definition: stdbool.h:25
#define false
Definition: stdbool.h:26
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:1368
ParamInfo * Params
Params - This is a pointer to a new[]'d array of ParamInfo objects that describe the parameters speci...
Definition: DeclSpec.h:1428
unsigned RefQualifierIsLValueRef
Whether the ref-qualifier (if any) is an lvalue reference.
Definition: DeclSpec.h:1377
DeclSpec * MethodQualifiers
DeclSpec for the function with the qualifier related info.
Definition: DeclSpec.h:1431
SourceLocation getRefQualifierLoc() const
Retrieve the location of the ref-qualifier, if any.
Definition: DeclSpec.h:1529
unsigned NumParams
NumParams - This is the number of formal parameters specified by the declarator.
Definition: DeclSpec.h:1403
bool hasMutableQualifier() const
Determine whether this lambda-declarator contains a 'mutable' qualifier.
Definition: DeclSpec.h:1558
bool hasMethodTypeQualifiers() const
Determine whether this method has qualifiers.
Definition: DeclSpec.h:1561
void freeParams()
Reset the parameter list to having zero parameters.
Definition: DeclSpec.h:1467
bool hasRefQualifier() const
Determine whether this function declaration contains a ref-qualifier.
Definition: DeclSpec.h:1554
std::unique_ptr< CachedTokens > DefaultArgTokens
DefaultArgTokens - When the parameter's default argument cannot be parsed immediately (because it occ...
Definition: DeclSpec.h:1343
One instance of this struct is used for each type in a declarator that is parsed.
Definition: DeclSpec.h:1251
enum clang::DeclaratorChunk::@225 Kind
FunctionTypeInfo Fun
Definition: DeclSpec.h:1642
EvalResult is a struct with detailed info about an evaluated expression.
Definition: Expr.h:642
Holds information about the various types of exception specification.
Definition: Type.h:5164
FunctionDecl * SourceDecl
The function whose exception specification this is, for EST_Unevaluated and EST_Uninstantiated.
Definition: Type.h:5176
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition: Type.h:5166
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition: Type.h:5169
Expr * NoexceptExpr
Noexcept expression, if this is a computed noexcept specification.
Definition: Type.h:5172
Extra information about a function prototype.
Definition: Type.h:5192
ExceptionSpecInfo ExceptionSpec
Definition: Type.h:5199
FunctionEffectsRef FunctionEffects
Definition: Type.h:5202
FunctionType::ExtInfo ExtInfo
Definition: Type.h:5193
T * get(ExternalASTSource *Source) const
Retrieve the pointer to the AST node that this lazy pointer points to.
Information about operator rewrites to consider when adding operator functions to a candidate set.
Definition: Overload.h:1038
Describes how types, statements, expressions, and declarations should be printed.
Definition: PrettyPrinter.h:57
A context in which code is being synthesized (where a source location alone is not sufficient to iden...
Definition: Sema.h:12660
enum clang::Sema::CodeSynthesisContext::SynthesisKind Kind
SourceLocation PointOfInstantiation
The point of instantiation or synthesis within the source code.
Definition: Sema.h:12777
@ MarkingClassDllexported
We are marking a class as __dllexport.
Definition: Sema.h:12754
@ InitializingStructuredBinding
We are initializing a structured binding.
Definition: Sema.h:12751
@ ExceptionSpecEvaluation
We are computing the exception specification for a defaulted special member function.
Definition: Sema.h:12704
@ DeclaringSpecialMember
We are declaring an implicit special member function.
Definition: Sema.h:12718
@ DeclaringImplicitEqualityComparison
We are declaring an implicit 'operator==' for a defaulted 'operator<=>'.
Definition: Sema.h:12722
Decl * Entity
The entity that is being synthesized.
Definition: Sema.h:12780
CXXSpecialMemberKind SpecialMember
The special member being declared or defined.
Definition: Sema.h:12806
Abstract class used to diagnose incomplete types.
Definition: Sema.h:7858
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.