clang 24.0.0git
SemaExprCXX.cpp
Go to the documentation of this file.
1//===--- SemaExprCXX.cpp - Semantic Analysis for Expressions --------------===//
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/// \file
10/// Implements semantic analysis for C++ expressions.
11///
12//===----------------------------------------------------------------------===//
13
14#include "TreeTransform.h"
15#include "TypeLocBuilder.h"
17#include "clang/AST/ASTLambda.h"
19#include "clang/AST/CharUnits.h"
20#include "clang/AST/DeclCXX.h"
21#include "clang/AST/DeclObjC.h"
23#include "clang/AST/ExprCXX.h"
25#include "clang/AST/ExprObjC.h"
26#include "clang/AST/Type.h"
27#include "clang/AST/TypeLoc.h"
34#include "clang/Sema/DeclSpec.h"
38#include "clang/Sema/Lookup.h"
40#include "clang/Sema/Scope.h"
42#include "clang/Sema/SemaCUDA.h"
43#include "clang/Sema/SemaHLSL.h"
45#include "clang/Sema/SemaObjC.h"
46#include "clang/Sema/SemaPPC.h"
47#include "clang/Sema/Template.h"
49#include "llvm/ADT/APInt.h"
50#include "llvm/ADT/STLExtras.h"
51#include "llvm/ADT/StringExtras.h"
52#include "llvm/Support/ErrorHandling.h"
53#include "llvm/Support/TypeSize.h"
54#include <optional>
55using namespace clang;
56using namespace sema;
57
59 SourceLocation NameLoc,
60 const IdentifierInfo &Name) {
62 QualType Type(NNS.getAsType(), 0);
63 if ([[maybe_unused]] const auto *DNT = dyn_cast<DependentNameType>(Type))
64 assert(DNT->getIdentifier() == &Name && "not a constructor name");
65
66 // This reference to the type is located entirely at the location of the
67 // final identifier in the qualified-id.
69 Context.getTrivialTypeSourceInfo(Type, NameLoc));
70}
71
73 SourceLocation NameLoc, Scope *S,
74 CXXScopeSpec &SS, bool EnteringContext) {
75 CXXRecordDecl *CurClass = getCurrentClass(S, &SS);
76 assert(CurClass && &II == CurClass->getIdentifier() &&
77 "not a constructor name");
78
79 // When naming a constructor as a member of a dependent context (eg, in a
80 // friend declaration or an inherited constructor declaration), form an
81 // unresolved "typename" type.
82 if (CurClass->isDependentContext() && !EnteringContext && SS.getScopeRep()) {
83 QualType T = Context.getDependentNameType(ElaboratedTypeKeyword::None,
84 SS.getScopeRep(), &II);
85 return ParsedType::make(T);
86 }
87
88 if (SS.isNotEmpty() && RequireCompleteDeclContext(SS, CurClass))
89 return ParsedType();
90
91 // Find the injected-class-name declaration. Note that we make no attempt to
92 // diagnose cases where the injected-class-name is shadowed: the only
93 // declaration that can validly shadow the injected-class-name is a
94 // non-static data member, and if the class contains both a non-static data
95 // member and a constructor then it is ill-formed (we check that in
96 // CheckCompletedCXXClass).
97 CXXRecordDecl *InjectedClassName = nullptr;
98 for (NamedDecl *ND : CurClass->lookup(&II)) {
99 auto *RD = dyn_cast<CXXRecordDecl>(ND);
100 if (RD && RD->isInjectedClassName()) {
101 InjectedClassName = RD;
102 break;
103 }
104 }
105 if (!InjectedClassName) {
106 if (!CurClass->isInvalidDecl()) {
107 // FIXME: RequireCompleteDeclContext doesn't check dependent contexts
108 // properly. Work around it here for now.
110 diag::err_incomplete_nested_name_spec) << CurClass << SS.getRange();
111 }
112 return ParsedType();
113 }
114
116 InjectedClassName, /*OwnsTag=*/false);
117 return ParsedType::make(T);
118}
119
121 SourceLocation NameLoc, Scope *S,
122 CXXScopeSpec &SS, ParsedType ObjectTypePtr,
123 bool EnteringContext) {
124 // Determine where to perform name lookup.
125
126 // FIXME: This area of the standard is very messy, and the current
127 // wording is rather unclear about which scopes we search for the
128 // destructor name; see core issues 399 and 555. Issue 399 in
129 // particular shows where the current description of destructor name
130 // lookup is completely out of line with existing practice, e.g.,
131 // this appears to be ill-formed:
132 //
133 // namespace N {
134 // template <typename T> struct S {
135 // ~S();
136 // };
137 // }
138 //
139 // void f(N::S<int>* s) {
140 // s->N::S<int>::~S();
141 // }
142 //
143 // See also PR6358 and PR6359.
144 //
145 // For now, we accept all the cases in which the name given could plausibly
146 // be interpreted as a correct destructor name, issuing off-by-default
147 // extension diagnostics on the cases that don't strictly conform to the
148 // C++20 rules. This basically means we always consider looking in the
149 // nested-name-specifier prefix, the complete nested-name-specifier, and
150 // the scope, and accept if we find the expected type in any of the three
151 // places.
152
153 if (SS.isInvalid())
154 return nullptr;
155
156 // Whether we've failed with a diagnostic already.
157 bool Failed = false;
158
161
162 // If we have an object type, it's because we are in a
163 // pseudo-destructor-expression or a member access expression, and
164 // we know what type we're looking for.
165 QualType SearchType =
166 ObjectTypePtr ? GetTypeFromParser(ObjectTypePtr) : QualType();
167
168 auto CheckLookupResult = [&](LookupResult &Found) -> ParsedType {
169 auto IsAcceptableResult = [&](NamedDecl *D) -> bool {
170 auto *Type = dyn_cast<TypeDecl>(D->getUnderlyingDecl());
171 if (!Type)
172 return false;
173
174 if (SearchType.isNull() || SearchType->isDependentType())
175 return true;
176
177 CanQualType T = Context.getCanonicalTypeDeclType(Type);
178 return Context.hasSameUnqualifiedType(T, SearchType);
179 };
180
181 unsigned NumAcceptableResults = 0;
182 for (NamedDecl *D : Found) {
183 if (IsAcceptableResult(D))
184 ++NumAcceptableResults;
185
186 // Don't list a class twice in the lookup failure diagnostic if it's
187 // found by both its injected-class-name and by the name in the enclosing
188 // scope.
189 if (auto *RD = dyn_cast<CXXRecordDecl>(D))
190 if (RD->isInjectedClassName())
191 D = cast<NamedDecl>(RD->getParent());
192
193 if (FoundDeclSet.insert(D).second)
194 FoundDecls.push_back(D);
195 }
196
197 // As an extension, attempt to "fix" an ambiguity by erasing all non-type
198 // results, and all non-matching results if we have a search type. It's not
199 // clear what the right behavior is if destructor lookup hits an ambiguity,
200 // but other compilers do generally accept at least some kinds of
201 // ambiguity.
202 if (Found.isAmbiguous() && NumAcceptableResults == 1) {
203 Diag(NameLoc, diag::ext_dtor_name_ambiguous);
204 LookupResult::Filter F = Found.makeFilter();
205 while (F.hasNext()) {
206 NamedDecl *D = F.next();
207 if (auto *TD = dyn_cast<TypeDecl>(D->getUnderlyingDecl()))
208 Diag(D->getLocation(), diag::note_destructor_type_here)
209 << Context.getTypeDeclType(ElaboratedTypeKeyword::None,
210 /*Qualifier=*/std::nullopt, TD);
211 else
212 Diag(D->getLocation(), diag::note_destructor_nontype_here);
213
214 if (!IsAcceptableResult(D))
215 F.erase();
216 }
217 F.done();
218 }
219
220 if (Found.isAmbiguous())
221 Failed = true;
222
223 if (TypeDecl *Type = Found.getAsSingle<TypeDecl>()) {
224 if (IsAcceptableResult(Type)) {
226 /*Qualifier=*/std::nullopt, Type);
227 MarkAnyDeclReferenced(Type->getLocation(), Type, /*OdrUse=*/false);
228 return CreateParsedType(T,
229 Context.getTrivialTypeSourceInfo(T, NameLoc));
230 }
231 }
232
233 return nullptr;
234 };
235
236 bool IsDependent = false;
237
238 auto LookupInObjectType = [&]() -> ParsedType {
239 if (Failed || SearchType.isNull())
240 return nullptr;
241
242 IsDependent |= SearchType->isDependentType();
243
244 LookupResult Found(*this, &II, NameLoc, LookupDestructorName);
245 DeclContext *LookupCtx = computeDeclContext(SearchType);
246 if (!LookupCtx)
247 return nullptr;
248 LookupQualifiedName(Found, LookupCtx);
249 return CheckLookupResult(Found);
250 };
251
252 auto LookupInNestedNameSpec = [&](CXXScopeSpec &LookupSS) -> ParsedType {
253 if (Failed)
254 return nullptr;
255
256 IsDependent |= isDependentScopeSpecifier(LookupSS);
257 DeclContext *LookupCtx = computeDeclContext(LookupSS, EnteringContext);
258 if (!LookupCtx)
259 return nullptr;
260
261 LookupResult Found(*this, &II, NameLoc, LookupDestructorName);
262 if (RequireCompleteDeclContext(LookupSS, LookupCtx)) {
263 Failed = true;
264 return nullptr;
265 }
266 LookupQualifiedName(Found, LookupCtx);
267 return CheckLookupResult(Found);
268 };
269
270 auto LookupInScope = [&]() -> ParsedType {
271 if (Failed || !S)
272 return nullptr;
273
274 LookupResult Found(*this, &II, NameLoc, LookupDestructorName);
275 LookupName(Found, S);
276 return CheckLookupResult(Found);
277 };
278
279 // C++2a [basic.lookup.qual]p6:
280 // In a qualified-id of the form
281 //
282 // nested-name-specifier[opt] type-name :: ~ type-name
283 //
284 // the second type-name is looked up in the same scope as the first.
285 //
286 // We interpret this as meaning that if you do a dual-scope lookup for the
287 // first name, you also do a dual-scope lookup for the second name, per
288 // C++ [basic.lookup.classref]p4:
289 //
290 // If the id-expression in a class member access is a qualified-id of the
291 // form
292 //
293 // class-name-or-namespace-name :: ...
294 //
295 // the class-name-or-namespace-name following the . or -> is first looked
296 // up in the class of the object expression and the name, if found, is used.
297 // Otherwise, it is looked up in the context of the entire
298 // postfix-expression.
299 //
300 // This looks in the same scopes as for an unqualified destructor name:
301 //
302 // C++ [basic.lookup.classref]p3:
303 // If the unqualified-id is ~ type-name, the type-name is looked up
304 // in the context of the entire postfix-expression. If the type T
305 // of the object expression is of a class type C, the type-name is
306 // also looked up in the scope of class C. At least one of the
307 // lookups shall find a name that refers to cv T.
308 //
309 // FIXME: The intent is unclear here. Should type-name::~type-name look in
310 // the scope anyway if it finds a non-matching name declared in the class?
311 // If both lookups succeed and find a dependent result, which result should
312 // we retain? (Same question for p->~type-name().)
313
314 auto Prefix = [&]() -> NestedNameSpecifierLoc {
316 if (!NNS)
317 return NestedNameSpecifierLoc();
318 if (auto TL = NNS.getAsTypeLoc())
319 return TL.getPrefix();
320 return NNS.getAsNamespaceAndPrefix().Prefix;
321 }();
322
323 if (Prefix) {
324 // This is
325 //
326 // nested-name-specifier type-name :: ~ type-name
327 //
328 // Look for the second type-name in the nested-name-specifier.
329 CXXScopeSpec PrefixSS;
330 PrefixSS.Adopt(Prefix);
331 if (ParsedType T = LookupInNestedNameSpec(PrefixSS))
332 return T;
333 } else {
334 // This is one of
335 //
336 // type-name :: ~ type-name
337 // ~ type-name
338 //
339 // Look in the scope and (if any) the object type.
340 if (ParsedType T = LookupInScope())
341 return T;
342 if (ParsedType T = LookupInObjectType())
343 return T;
344 }
345
346 if (Failed)
347 return nullptr;
348
349 if (IsDependent) {
350 // We didn't find our type, but that's OK: it's dependent anyway.
351
352 // FIXME: What if we have no nested-name-specifier?
353 TypeSourceInfo *TSI = nullptr;
354 QualType T =
356 SS.getWithLocInContext(Context), II, NameLoc, &TSI,
357 /*DeducedTSTContext=*/true);
358 if (T.isNull())
359 return ParsedType();
360 return CreateParsedType(T, TSI);
361 }
362
363 // The remaining cases are all non-standard extensions imitating the behavior
364 // of various other compilers.
365 unsigned NumNonExtensionDecls = FoundDecls.size();
366
367 if (SS.isSet()) {
368 // For compatibility with older broken C++ rules and existing code,
369 //
370 // nested-name-specifier :: ~ type-name
371 //
372 // also looks for type-name within the nested-name-specifier.
373 if (ParsedType T = LookupInNestedNameSpec(SS)) {
374 Diag(SS.getEndLoc(), diag::ext_dtor_named_in_wrong_scope)
375 << SS.getRange()
377 ("::" + II.getName()).str());
378 return T;
379 }
380
381 // For compatibility with other compilers and older versions of Clang,
382 //
383 // nested-name-specifier type-name :: ~ type-name
384 //
385 // also looks for type-name in the scope. Unfortunately, we can't
386 // reasonably apply this fallback for dependent nested-name-specifiers.
387 if (Prefix) {
388 if (ParsedType T = LookupInScope()) {
389 Diag(SS.getEndLoc(), diag::ext_qualified_dtor_named_in_lexical_scope)
391 Diag(FoundDecls.back()->getLocation(), diag::note_destructor_type_here)
393 return T;
394 }
395 }
396 }
397
398 // We didn't find anything matching; tell the user what we did find (if
399 // anything).
400
401 // Don't tell the user about declarations we shouldn't have found.
402 FoundDecls.resize(NumNonExtensionDecls);
403
404 // List types before non-types.
405 llvm::stable_sort(FoundDecls, [](NamedDecl *A, NamedDecl *B) {
406 return isa<TypeDecl>(A->getUnderlyingDecl()) >
408 });
409
410 // Suggest a fixit to properly name the destroyed type.
411 auto MakeFixItHint = [&]{
412 const CXXRecordDecl *Destroyed = nullptr;
413 // FIXME: If we have a scope specifier, suggest its last component?
414 if (!SearchType.isNull())
415 Destroyed = SearchType->getAsCXXRecordDecl();
416 else if (S)
417 Destroyed = dyn_cast_or_null<CXXRecordDecl>(S->getEntity());
418 if (Destroyed)
420 Destroyed->getNameAsString());
421 return FixItHint();
422 };
423
424 if (FoundDecls.empty()) {
425 // FIXME: Attempt typo-correction?
426 Diag(NameLoc, diag::err_undeclared_destructor_name)
427 << &II << MakeFixItHint();
428 } else if (!SearchType.isNull() && FoundDecls.size() == 1) {
429 if (auto *TD = dyn_cast<TypeDecl>(FoundDecls[0]->getUnderlyingDecl())) {
430 assert(!SearchType.isNull() &&
431 "should only reject a type result if we have a search type");
432 Diag(NameLoc, diag::err_destructor_expr_type_mismatch)
433 << Context.getTypeDeclType(ElaboratedTypeKeyword::None,
434 /*Qualifier=*/std::nullopt, TD)
435 << SearchType << MakeFixItHint();
436 } else {
437 Diag(NameLoc, diag::err_destructor_expr_nontype)
438 << &II << MakeFixItHint();
439 }
440 } else {
441 Diag(NameLoc, SearchType.isNull() ? diag::err_destructor_name_nontype
442 : diag::err_destructor_expr_mismatch)
443 << &II << SearchType << MakeFixItHint();
444 }
445
446 for (NamedDecl *FoundD : FoundDecls) {
447 if (auto *TD = dyn_cast<TypeDecl>(FoundD->getUnderlyingDecl()))
448 Diag(FoundD->getLocation(), diag::note_destructor_type_here)
449 << Context.getTypeDeclType(ElaboratedTypeKeyword::None,
450 /*Qualifier=*/std::nullopt, TD);
451 else
452 Diag(FoundD->getLocation(), diag::note_destructor_nontype_here)
453 << FoundD;
454 }
455
456 return nullptr;
457}
458
460 ParsedType ObjectType) {
462 return nullptr;
463
465 Diag(DS.getTypeSpecTypeLoc(), diag::err_decltype_auto_invalid);
466 return nullptr;
467 }
468
470 "unexpected type in getDestructorType");
472
473 // If we know the type of the object, check that the correct destructor
474 // type was named now; we can give better diagnostics this way.
475 QualType SearchType = GetTypeFromParser(ObjectType);
476 if (!SearchType.isNull() && !SearchType->isDependentType() &&
477 !Context.hasSameUnqualifiedType(T, SearchType)) {
478 Diag(DS.getTypeSpecTypeLoc(), diag::err_destructor_expr_type_mismatch)
479 << T << SearchType;
480 return nullptr;
481 }
482
483 TypeLocBuilder TLB;
484 DecltypeTypeLoc DecltypeTL = TLB.push<DecltypeTypeLoc>(T);
485 DecltypeTL.setDecltypeLoc(DS.getTypeSpecTypeLoc());
486 DecltypeTL.setRParenLoc(DS.getTypeofParensRange().getEnd());
488}
489
491 const UnqualifiedId &Name, bool IsUDSuffix) {
493 if (!IsUDSuffix) {
494 // [over.literal] p8
495 //
496 // double operator""_Bq(long double); // OK: not a reserved identifier
497 // double operator"" _Bq(long double); // ill-formed, no diagnostic required
498 const IdentifierInfo *II = Name.Identifier;
499 ReservedIdentifierStatus Status = II->isReserved(PP.getLangOpts());
500 SourceLocation Loc = Name.getEndLoc();
501
503 Name.getSourceRange(),
504 (StringRef("operator\"\"") + II->getName()).str());
505
506 // Only emit this diagnostic if we start with an underscore, else the
507 // diagnostic for C++11 requiring a space between the quotes and the
508 // identifier conflicts with this and gets confusing. The diagnostic stating
509 // this is a reserved name should force the underscore, which gets this
510 // back.
511 if (II->isReservedLiteralSuffixId() !=
513 Diag(Loc, diag::warn_deprecated_literal_operator_id) << II << Hint;
514
515 if (isReservedInAllContexts(Status))
516 Diag(Loc, diag::warn_reserved_extern_symbol)
517 << II << static_cast<int>(Status) << Hint;
518 }
519
520 switch (SS.getScopeRep().getKind()) {
522 // Per C++11 [over.literal]p2, literal operators can only be declared at
523 // namespace scope. Therefore, this unqualified-id cannot name anything.
524 // Reject it early, because we have no AST representation for this in the
525 // case where the scope is dependent.
526 Diag(Name.getBeginLoc(), diag::err_literal_operator_id_outside_namespace)
527 << SS.getScopeRep();
528 return true;
529
534 return false;
535 }
536
537 llvm_unreachable("unknown nested name specifier kind");
538}
539
541 SourceLocation TypeidLoc,
542 TypeSourceInfo *Operand,
543 SourceLocation RParenLoc) {
544 // C++ [expr.typeid]p4:
545 // The top-level cv-qualifiers of the lvalue expression or the type-id
546 // that is the operand of typeid are always ignored.
547 // If the type of the type-id is a class type or a reference to a class
548 // type, the class shall be completely-defined.
549 Qualifiers Quals;
550 QualType T
551 = Context.getUnqualifiedArrayType(Operand->getType().getNonReferenceType(),
552 Quals);
553 if (T->isRecordType() &&
554 RequireCompleteType(TypeidLoc, T, diag::err_incomplete_typeid))
555 return ExprError();
556
557 if (T->isVariablyModifiedType())
558 return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid) << T);
559
560 if (CheckQualifiedFunctionForTypeId(T, TypeidLoc))
561 return ExprError();
562
563 return new (Context) CXXTypeidExpr(TypeInfoType.withConst(), Operand,
564 SourceRange(TypeidLoc, RParenLoc));
565}
566
568 SourceLocation TypeidLoc,
569 Expr *E,
570 SourceLocation RParenLoc) {
571 bool WasEvaluated = false;
572 if (E && !E->isTypeDependent()) {
573 if (E->hasPlaceholderType()) {
575 if (result.isInvalid()) return ExprError();
576 E = result.get();
577 }
578
579 QualType T = E->getType();
580 if (auto *RecordD = T->getAsCXXRecordDecl()) {
581 // C++ [expr.typeid]p3:
582 // [...] If the type of the expression is a class type, the class
583 // shall be completely-defined.
584 if (RequireCompleteType(TypeidLoc, T, diag::err_incomplete_typeid))
585 return ExprError();
586
587 // C++ [expr.typeid]p3:
588 // When typeid is applied to an expression other than an glvalue of a
589 // polymorphic class type [...] [the] expression is an unevaluated
590 // operand. [...]
591 if (RecordD->isPolymorphic() && E->isGLValue()) {
592 if (isUnevaluatedContext()) {
593 // The operand was processed in unevaluated context, switch the
594 // context and recheck the subexpression.
596 if (Result.isInvalid())
597 return ExprError();
598 E = Result.get();
599 }
600
601 // We require a vtable to query the type at run time.
602 MarkVTableUsed(TypeidLoc, RecordD);
603 WasEvaluated = true;
604 }
605 }
606
608 if (Result.isInvalid())
609 return ExprError();
610 E = Result.get();
611
612 // C++ [expr.typeid]p4:
613 // [...] If the type of the type-id is a reference to a possibly
614 // cv-qualified type, the result of the typeid expression refers to a
615 // std::type_info object representing the cv-unqualified referenced
616 // type.
617 Qualifiers Quals;
618 QualType UnqualT = Context.getUnqualifiedArrayType(T, Quals);
619 if (!Context.hasSameType(T, UnqualT)) {
620 T = UnqualT;
621 E = ImpCastExprToType(E, UnqualT, CK_NoOp, E->getValueKind()).get();
622 }
623 }
624
626 return ExprError(Diag(TypeidLoc, diag::err_variably_modified_typeid)
627 << E->getType());
628 else if (!inTemplateInstantiation() &&
629 E->HasSideEffects(Context, WasEvaluated)) {
630 // The expression operand for typeid is in an unevaluated expression
631 // context, so side effects could result in unintended consequences.
632 Diag(E->getExprLoc(), WasEvaluated
633 ? diag::warn_side_effects_typeid
634 : diag::warn_side_effects_unevaluated_context);
635 }
636
637 return new (Context) CXXTypeidExpr(TypeInfoType.withConst(), E,
638 SourceRange(TypeidLoc, RParenLoc));
639}
640
641/// ActOnCXXTypeidOfType - Parse typeid( type-id ) or typeid (expression);
644 bool isType, void *TyOrExpr, SourceLocation RParenLoc) {
645 // typeid is not supported in OpenCL.
646 if (getLangOpts().OpenCLCPlusPlus) {
647 return ExprError(Diag(OpLoc, diag::err_openclcxx_not_supported)
648 << "typeid");
649 }
650
651 // Find the std::type_info type.
652 if (!getStdNamespace()) {
653 return ExprError(Diag(OpLoc, diag::err_need_header_before_typeid)
654 << (getLangOpts().CPlusPlus20 ? 1 : 0));
655 }
656
657 if (!CXXTypeInfoDecl) {
658 IdentifierInfo *TypeInfoII = &PP.getIdentifierTable().get("type_info");
659 LookupResult R(*this, TypeInfoII, SourceLocation(), LookupTagName);
661 CXXTypeInfoDecl = R.getAsSingle<RecordDecl>();
662 // Microsoft's typeinfo doesn't have type_info in std but in the global
663 // namespace if _HAS_EXCEPTIONS is defined to 0. See PR13153.
664 if (!CXXTypeInfoDecl && LangOpts.MSVCCompat) {
665 LookupQualifiedName(R, Context.getTranslationUnitDecl());
666 CXXTypeInfoDecl = R.getAsSingle<RecordDecl>();
667 }
668 if (!CXXTypeInfoDecl)
669 return ExprError(Diag(OpLoc, diag::err_need_header_before_typeid)
670 << (getLangOpts().CPlusPlus20 ? 1 : 0));
671 }
672
673 if (!getLangOpts().RTTI) {
674 return ExprError(Diag(OpLoc, diag::err_no_typeid_with_fno_rtti));
675 }
676
677 CanQualType TypeInfoType = Context.getCanonicalTagType(CXXTypeInfoDecl);
678
679 if (isType) {
680 // The operand is a type; handle it as such.
681 TypeSourceInfo *TInfo = nullptr;
683 &TInfo);
684 if (T.isNull())
685 return ExprError();
686
687 if (!TInfo)
688 TInfo = Context.getTrivialTypeSourceInfo(T, OpLoc);
689
690 return BuildCXXTypeId(TypeInfoType, OpLoc, TInfo, RParenLoc);
691 }
692
693 // The operand is an expression.
695 BuildCXXTypeId(TypeInfoType, OpLoc, (Expr *)TyOrExpr, RParenLoc);
696
697 if (!getLangOpts().RTTIData && !Result.isInvalid())
698 if (auto *CTE = dyn_cast<CXXTypeidExpr>(Result.get()))
699 if (CTE->isPotentiallyEvaluated() && !CTE->isMostDerived(Context))
700 Diag(OpLoc, diag::warn_no_typeid_with_rtti_disabled)
701 << (getDiagnostics().getDiagnosticOptions().getFormat() ==
703 return Result;
704}
705
706/// Grabs __declspec(uuid()) off a type, or returns 0 if we cannot resolve to
707/// a single GUID.
708static void
711 // Optionally remove one level of pointer, reference or array indirection.
712 const Type *Ty = QT.getTypePtr();
713 if (QT->isPointerOrReferenceType())
714 Ty = QT->getPointeeType().getTypePtr();
715 else if (QT->isArrayType())
716 Ty = Ty->getBaseElementTypeUnsafe();
717
718 const auto *TD = Ty->getAsTagDecl();
719 if (!TD)
720 return;
721
722 if (const auto *Uuid = TD->getMostRecentDecl()->getAttr<UuidAttr>()) {
723 UuidAttrs.insert(Uuid);
724 return;
725 }
726
727 // __uuidof can grab UUIDs from template arguments.
728 if (const auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(TD)) {
729 const TemplateArgumentList &TAL = CTSD->getTemplateArgs();
730 for (const TemplateArgument &TA : TAL.asArray()) {
731 const UuidAttr *UuidForTA = nullptr;
732 if (TA.getKind() == TemplateArgument::Type)
733 getUuidAttrOfType(SemaRef, TA.getAsType(), UuidAttrs);
734 else if (TA.getKind() == TemplateArgument::Declaration)
735 getUuidAttrOfType(SemaRef, TA.getAsDecl()->getType(), UuidAttrs);
736
737 if (UuidForTA)
738 UuidAttrs.insert(UuidForTA);
739 }
740 }
741}
742
744 SourceLocation TypeidLoc,
745 TypeSourceInfo *Operand,
746 SourceLocation RParenLoc) {
747 MSGuidDecl *Guid = nullptr;
748 if (!Operand->getType()->isDependentType()) {
750 getUuidAttrOfType(*this, Operand->getType(), UuidAttrs);
751 if (UuidAttrs.empty())
752 return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid));
753 if (UuidAttrs.size() > 1)
754 return ExprError(Diag(TypeidLoc, diag::err_uuidof_with_multiple_guids));
755 Guid = UuidAttrs.back()->getGuidDecl();
756 }
757
758 return new (Context)
759 CXXUuidofExpr(Type, Operand, Guid, SourceRange(TypeidLoc, RParenLoc));
760}
761
763 Expr *E, SourceLocation RParenLoc) {
764 MSGuidDecl *Guid = nullptr;
765 if (!E->getType()->isDependentType()) {
767 // A null pointer results in {00000000-0000-0000-0000-000000000000}.
768 Guid = Context.getMSGuidDecl(MSGuidDecl::Parts{});
769 } else {
771 getUuidAttrOfType(*this, E->getType(), UuidAttrs);
772 if (UuidAttrs.empty())
773 return ExprError(Diag(TypeidLoc, diag::err_uuidof_without_guid));
774 if (UuidAttrs.size() > 1)
775 return ExprError(Diag(TypeidLoc, diag::err_uuidof_with_multiple_guids));
776 Guid = UuidAttrs.back()->getGuidDecl();
777 }
778 }
779
780 return new (Context)
781 CXXUuidofExpr(Type, E, Guid, SourceRange(TypeidLoc, RParenLoc));
782}
783
784/// ActOnCXXUuidof - Parse __uuidof( type-id ) or __uuidof (expression);
787 bool isType, void *TyOrExpr, SourceLocation RParenLoc) {
788 QualType GuidType = Context.getMSGuidType();
789 GuidType.addConst();
790
791 if (isType) {
792 // The operand is a type; handle it as such.
793 TypeSourceInfo *TInfo = nullptr;
795 &TInfo);
796 if (T.isNull())
797 return ExprError();
798
799 if (!TInfo)
800 TInfo = Context.getTrivialTypeSourceInfo(T, OpLoc);
801
802 return BuildCXXUuidof(GuidType, OpLoc, TInfo, RParenLoc);
803 }
804
805 // The operand is an expression.
806 return BuildCXXUuidof(GuidType, OpLoc, (Expr*)TyOrExpr, RParenLoc);
807}
808
811 assert((Kind == tok::kw_true || Kind == tok::kw_false) &&
812 "Unknown C++ Boolean value!");
813 return new (Context)
814 CXXBoolLiteralExpr(Kind == tok::kw_true, Context.BoolTy, OpLoc);
815}
816
821
824 bool IsThrownVarInScope = false;
825 if (Ex) {
826 // C++0x [class.copymove]p31:
827 // When certain criteria are met, an implementation is allowed to omit the
828 // copy/move construction of a class object [...]
829 //
830 // - in a throw-expression, when the operand is the name of a
831 // non-volatile automatic object (other than a function or catch-
832 // clause parameter) whose scope does not extend beyond the end of the
833 // innermost enclosing try-block (if there is one), the copy/move
834 // operation from the operand to the exception object (15.1) can be
835 // omitted by constructing the automatic object directly into the
836 // exception object
837 if (const auto *DRE = dyn_cast<DeclRefExpr>(Ex->IgnoreParens()))
838 if (const auto *Var = dyn_cast<VarDecl>(DRE->getDecl());
839 Var && Var->hasLocalStorage() &&
840 !Var->getType().isVolatileQualified()) {
841 for (; S; S = S->getParent()) {
842 if (S->isDeclScope(Var)) {
843 IsThrownVarInScope = true;
844 break;
845 }
846
847 // FIXME: Many of the scope checks here seem incorrect.
848 if (S->getFlags() &
851 break;
852 }
853 }
854 }
855
856 return BuildCXXThrow(OpLoc, Ex, IsThrownVarInScope);
857}
858
860 bool IsThrownVarInScope) {
861 const llvm::Triple &T = Context.getTargetInfo().getTriple();
862 const bool IsOpenMPGPUTarget =
863 getLangOpts().OpenMPIsTargetDevice && T.isGPU();
864
865 DiagnoseExceptionUse(OpLoc, /* IsTry= */ false);
866
867 // In OpenMP target regions, we replace 'throw' with a trap on GPU targets.
868 if (IsOpenMPGPUTarget)
869 targetDiag(OpLoc, diag::warn_throw_not_valid_on_target) << T.str();
870
871 // Exceptions aren't allowed in CUDA device code.
872 if (getLangOpts().CUDA)
873 CUDA().DiagIfDeviceCode(OpLoc, diag::err_cuda_device_exceptions)
874 << "throw" << CUDA().CurrentTarget();
875
876 if (getCurScope() && getCurScope()->isOpenMPSimdDirectiveScope())
877 Diag(OpLoc, diag::err_omp_simd_region_cannot_use_stmt) << "throw";
878
879 // Exceptions that escape a compute construct are ill-formed.
880 if (getLangOpts().OpenACC && getCurScope() &&
881 getCurScope()->isInOpenACCComputeConstructScope(Scope::TryScope))
882 Diag(OpLoc, diag::err_acc_branch_in_out_compute_construct)
883 << /*throw*/ 2 << /*out of*/ 0;
884
885 if (Ex && !Ex->isTypeDependent()) {
886 // Initialize the exception result. This implicitly weeds out
887 // abstract types or types with inaccessible copy constructors.
888
889 // C++0x [class.copymove]p31:
890 // When certain criteria are met, an implementation is allowed to omit the
891 // copy/move construction of a class object [...]
892 //
893 // - in a throw-expression, when the operand is the name of a
894 // non-volatile automatic object (other than a function or
895 // catch-clause
896 // parameter) whose scope does not extend beyond the end of the
897 // innermost enclosing try-block (if there is one), the copy/move
898 // operation from the operand to the exception object (15.1) can be
899 // omitted by constructing the automatic object directly into the
900 // exception object
901 NamedReturnInfo NRInfo =
902 IsThrownVarInScope ? getNamedReturnInfo(Ex) : NamedReturnInfo();
903
904 QualType ExceptionObjectTy = Context.getExceptionObjectType(Ex->getType());
905 if (CheckCXXThrowOperand(OpLoc, ExceptionObjectTy, Ex))
906 return ExprError();
907
908 InitializedEntity Entity =
909 InitializedEntity::InitializeException(OpLoc, ExceptionObjectTy);
910 ExprResult Res = PerformMoveOrCopyInitialization(Entity, NRInfo, Ex);
911 if (Res.isInvalid())
912 return ExprError();
913 Ex = Res.get();
914 }
915
916 // PPC MMA non-pointer types are not allowed as throw expr types.
917 if (Ex && Context.getTargetInfo().getTriple().isPPC64())
918 PPC().CheckPPCMMAType(Ex->getType(), Ex->getBeginLoc());
919
920 return new (Context)
921 CXXThrowExpr(Ex, Context.VoidTy, OpLoc, IsThrownVarInScope);
922}
923
924static void
926 llvm::DenseMap<CXXRecordDecl *, unsigned> &SubobjectsSeen,
927 llvm::SmallPtrSetImpl<CXXRecordDecl *> &VBases,
928 llvm::SetVector<CXXRecordDecl *> &PublicSubobjectsSeen,
929 bool ParentIsPublic) {
930 for (const CXXBaseSpecifier &BS : RD->bases()) {
931 CXXRecordDecl *BaseDecl = BS.getType()->getAsCXXRecordDecl();
932 bool NewSubobject;
933 // Virtual bases constitute the same subobject. Non-virtual bases are
934 // always distinct subobjects.
935 if (BS.isVirtual())
936 NewSubobject = VBases.insert(BaseDecl).second;
937 else
938 NewSubobject = true;
939
940 if (NewSubobject)
941 ++SubobjectsSeen[BaseDecl];
942
943 // Only add subobjects which have public access throughout the entire chain.
944 bool PublicPath = ParentIsPublic && BS.getAccessSpecifier() == AS_public;
945 if (PublicPath)
946 PublicSubobjectsSeen.insert(BaseDecl);
947
948 // Recurse on to each base subobject.
949 collectPublicBases(BaseDecl, SubobjectsSeen, VBases, PublicSubobjectsSeen,
950 PublicPath);
951 }
952}
953
956 llvm::DenseMap<CXXRecordDecl *, unsigned> SubobjectsSeen;
958 llvm::SetVector<CXXRecordDecl *> PublicSubobjectsSeen;
959 SubobjectsSeen[RD] = 1;
960 PublicSubobjectsSeen.insert(RD);
961 collectPublicBases(RD, SubobjectsSeen, VBases, PublicSubobjectsSeen,
962 /*ParentIsPublic=*/true);
963
964 for (CXXRecordDecl *PublicSubobject : PublicSubobjectsSeen) {
965 // Skip ambiguous objects.
966 if (SubobjectsSeen[PublicSubobject] > 1)
967 continue;
968
969 Objects.push_back(PublicSubobject);
970 }
971}
972
974 QualType ExceptionObjectTy, Expr *E) {
975 // If the type of the exception would be an incomplete type or a pointer
976 // to an incomplete type other than (cv) void the program is ill-formed.
977 QualType Ty = ExceptionObjectTy;
978 bool isPointer = false;
979 if (const PointerType* Ptr = Ty->getAs<PointerType>()) {
980 Ty = Ptr->getPointeeType();
981 isPointer = true;
982 }
983
984 // Cannot throw WebAssembly reference type.
986 Diag(ThrowLoc, diag::err_wasm_reftype_tc) << 0 << E->getSourceRange();
987 return true;
988 }
989
990 // Cannot throw WebAssembly table.
991 if (isPointer && Ty.isWebAssemblyReferenceType()) {
992 Diag(ThrowLoc, diag::err_wasm_table_art) << 2 << E->getSourceRange();
993 return true;
994 }
995
996 // Reject throwing of ptr's involving non-default address spaces runtimes
997 // cannot perform cross-address-space conversions yet.
998 if (isPointer && Ty.getAddressSpace() != LangAS::Default) {
999 Diag(ThrowLoc, diag::err_throw_or_catch_address_space_qualified_ptr)
1000 << /*IsCatch=*/0 << /*IsRef=*/0 << E->getType() << E->getSourceRange();
1001 return true;
1002 }
1003
1004 if (!isPointer || !Ty->isVoidType()) {
1005 if (RequireCompleteType(ThrowLoc, Ty,
1006 isPointer ? diag::err_throw_incomplete_ptr
1007 : diag::err_throw_incomplete,
1008 E->getSourceRange()))
1009 return true;
1010
1011 if (!isPointer && Ty->isSizelessType()) {
1012 Diag(ThrowLoc, diag::err_throw_sizeless) << Ty << E->getSourceRange();
1013 return true;
1014 }
1015
1016 if (RequireNonAbstractType(ThrowLoc, ExceptionObjectTy,
1017 diag::err_throw_abstract_type, E))
1018 return true;
1019 }
1020
1021 // If the exception has class type, we need additional handling.
1023 if (!RD)
1024 return false;
1025
1026 // If we are throwing a polymorphic class type or pointer thereof,
1027 // exception handling will make use of the vtable.
1028 MarkVTableUsed(ThrowLoc, RD);
1029
1030 // If a pointer is thrown, the referenced object will not be destroyed.
1031 if (isPointer)
1032 return false;
1033
1034 // If the class has a destructor, we must be able to call it.
1035 if (!RD->hasIrrelevantDestructor()) {
1039 PDiag(diag::err_access_dtor_exception) << Ty);
1041 return true;
1042 }
1043 }
1044
1045 // The MSVC ABI creates a list of all types which can catch the exception
1046 // object. This list also references the appropriate copy constructor to call
1047 // if the object is caught by value and has a non-trivial copy constructor.
1048 if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
1049 // We are only interested in the public, unambiguous bases contained within
1050 // the exception object. Bases which are ambiguous or otherwise
1051 // inaccessible are not catchable types.
1052 llvm::SmallVector<CXXRecordDecl *, 2> UnambiguousPublicSubobjects;
1053 getUnambiguousPublicSubobjects(RD, UnambiguousPublicSubobjects);
1054
1055 for (CXXRecordDecl *Subobject : UnambiguousPublicSubobjects) {
1056 // Attempt to lookup the copy constructor. Various pieces of machinery
1057 // will spring into action, like template instantiation, which means this
1058 // cannot be a simple walk of the class's decls. Instead, we must perform
1059 // lookup and overload resolution.
1060 CXXConstructorDecl *CD = LookupCopyingConstructor(Subobject, 0);
1061 if (!CD || CD->isDeleted())
1062 continue;
1063
1064 // Mark the constructor referenced as it is used by this throw expression.
1066
1067 // Skip this copy constructor if it is trivial, we don't need to record it
1068 // in the catchable type data.
1069 if (CD->isTrivial())
1070 continue;
1071
1072 // The copy constructor is non-trivial, create a mapping from this class
1073 // type to this constructor.
1074 // N.B. The selection of copy constructor is not sensitive to this
1075 // particular throw-site. Lookup will be performed at the catch-site to
1076 // ensure that the copy constructor is, in fact, accessible (via
1077 // friendship or any other means).
1078 Context.addCopyConstructorForExceptionObject(Subobject, CD);
1079
1080 // We don't keep the instantiated default argument expressions around so
1081 // we must rebuild them here.
1082 if (BuildCtorClosureDefaultArgs(ThrowLoc, CD, /*IsCopy=*/true))
1083 return true;
1084 }
1085 }
1086
1087 // Under the Itanium C++ ABI, memory for the exception object is allocated by
1088 // the runtime with no ability for the compiler to request additional
1089 // alignment. Warn if the exception type requires alignment beyond the minimum
1090 // guaranteed by the target C++ runtime.
1091 if (Context.getTargetInfo().getCXXABI().isItaniumFamily()) {
1092 CharUnits TypeAlign = Context.getTypeAlignInChars(Ty);
1093 CharUnits ExnObjAlign = Context.getExnObjectAlignment();
1094 if (ExnObjAlign < TypeAlign) {
1095 Diag(ThrowLoc, diag::warn_throw_underaligned_obj);
1096 Diag(ThrowLoc, diag::note_throw_underaligned_obj)
1097 << Ty << (unsigned)TypeAlign.getQuantity()
1098 << (unsigned)ExnObjAlign.getQuantity();
1099 }
1100 }
1101 if (!isPointer && getLangOpts().AssumeNothrowExceptionDtor) {
1102 if (CXXDestructorDecl *Dtor = RD->getDestructor()) {
1103 auto Ty = Dtor->getType();
1104 if (auto *FT = Ty.getTypePtr()->getAs<FunctionProtoType>()) {
1105 if (!isUnresolvedExceptionSpec(FT->getExceptionSpecType()) &&
1106 !FT->isNothrow())
1107 Diag(ThrowLoc, diag::err_throw_object_throwing_dtor) << RD;
1108 }
1109 }
1110 }
1111
1112 return false;
1113}
1114
1116 ArrayRef<FunctionScopeInfo *> FunctionScopes, QualType ThisTy,
1117 DeclContext *CurSemaContext, ASTContext &ASTCtx) {
1118
1119 QualType ClassType = ThisTy->getPointeeType();
1120 LambdaScopeInfo *CurLSI = nullptr;
1121 DeclContext *CurDC = CurSemaContext;
1122
1123 // Iterate through the stack of lambdas starting from the innermost lambda to
1124 // the outermost lambda, checking if '*this' is ever captured by copy - since
1125 // that could change the cv-qualifiers of the '*this' object.
1126 // The object referred to by '*this' starts out with the cv-qualifiers of its
1127 // member function. We then start with the innermost lambda and iterate
1128 // outward checking to see if any lambda performs a by-copy capture of '*this'
1129 // - and if so, any nested lambda must respect the 'constness' of that
1130 // capturing lamdbda's call operator.
1131 //
1132
1133 // Since the FunctionScopeInfo stack is representative of the lexical
1134 // nesting of the lambda expressions during initial parsing (and is the best
1135 // place for querying information about captures about lambdas that are
1136 // partially processed) and perhaps during instantiation of function templates
1137 // that contain lambda expressions that need to be transformed BUT not
1138 // necessarily during instantiation of a nested generic lambda's function call
1139 // operator (which might even be instantiated at the end of the TU) - at which
1140 // time the DeclContext tree is mature enough to query capture information
1141 // reliably - we use a two pronged approach to walk through all the lexically
1142 // enclosing lambda expressions:
1143 //
1144 // 1) Climb down the FunctionScopeInfo stack as long as each item represents
1145 // a Lambda (i.e. LambdaScopeInfo) AND each LSI's 'closure-type' is lexically
1146 // enclosed by the call-operator of the LSI below it on the stack (while
1147 // tracking the enclosing DC for step 2 if needed). Note the topmost LSI on
1148 // the stack represents the innermost lambda.
1149 //
1150 // 2) If we run out of enclosing LSI's, check if the enclosing DeclContext
1151 // represents a lambda's call operator. If it does, we must be instantiating
1152 // a generic lambda's call operator (represented by the Current LSI, and
1153 // should be the only scenario where an inconsistency between the LSI and the
1154 // DeclContext should occur), so climb out the DeclContexts if they
1155 // represent lambdas, while querying the corresponding closure types
1156 // regarding capture information.
1157
1158 // 1) Climb down the function scope info stack.
1159 for (int I = FunctionScopes.size();
1160 I-- && isa<LambdaScopeInfo>(FunctionScopes[I]) &&
1161 (!CurLSI || !CurLSI->Lambda || CurLSI->Lambda->getDeclContext() ==
1162 cast<LambdaScopeInfo>(FunctionScopes[I])->CallOperator);
1163 CurDC = getLambdaAwareParentOfDeclContext(CurDC)) {
1164 CurLSI = cast<LambdaScopeInfo>(FunctionScopes[I]);
1165
1166 if (!CurLSI->isCXXThisCaptured())
1167 continue;
1168
1169 auto C = CurLSI->getCXXThisCapture();
1170
1171 if (C.isCopyCapture()) {
1172 if (CurLSI->lambdaCaptureShouldBeConst())
1173 ClassType.addConst();
1174 return ASTCtx.getPointerType(ClassType);
1175 }
1176 }
1177
1178 // 2) We've run out of ScopeInfos but check 1. if CurDC is a lambda (which
1179 // can happen during instantiation of its nested generic lambda call
1180 // operator); 2. if we're in a lambda scope (lambda body).
1181 if (CurLSI && isLambdaCallOperator(CurDC)) {
1183 "While computing 'this' capture-type for a generic lambda, when we "
1184 "run out of enclosing LSI's, yet the enclosing DC is a "
1185 "lambda-call-operator we must be (i.e. Current LSI) in a generic "
1186 "lambda call oeprator");
1187 assert(CurDC == getLambdaAwareParentOfDeclContext(CurLSI->CallOperator));
1188
1189 auto IsThisCaptured =
1190 [](CXXRecordDecl *Closure, bool &IsByCopy, bool &IsConst) {
1191 IsConst = false;
1192 IsByCopy = false;
1193 for (auto &&C : Closure->captures()) {
1194 if (C.capturesThis()) {
1195 if (C.getCaptureKind() == LCK_StarThis)
1196 IsByCopy = true;
1197 if (Closure->getLambdaCallOperator()->isConst())
1198 IsConst = true;
1199 return true;
1200 }
1201 }
1202 return false;
1203 };
1204
1205 bool IsByCopyCapture = false;
1206 bool IsConstCapture = false;
1207 CXXRecordDecl *Closure = cast<CXXRecordDecl>(CurDC->getParent());
1208 while (Closure &&
1209 IsThisCaptured(Closure, IsByCopyCapture, IsConstCapture)) {
1210 if (IsByCopyCapture) {
1211 if (IsConstCapture)
1212 ClassType.addConst();
1213 return ASTCtx.getPointerType(ClassType);
1214 }
1215 Closure = isLambdaCallOperator(Closure->getParent())
1216 ? cast<CXXRecordDecl>(Closure->getParent()->getParent())
1217 : nullptr;
1218 }
1219 }
1220 return ThisTy;
1221}
1222
1226
1227 if (CXXMethodDecl *method = dyn_cast<CXXMethodDecl>(DC)) {
1228 if (method && method->isImplicitObjectMemberFunction())
1229 ThisTy = method->getThisType().getNonReferenceType();
1230 }
1231
1234
1235 // This is a lambda call operator that is being instantiated as a default
1236 // initializer. DC must point to the enclosing class type, so we can recover
1237 // the 'this' type from it.
1238 CanQualType ClassTy = Context.getCanonicalTagType(cast<CXXRecordDecl>(DC));
1239 // There are no cv-qualifiers for 'this' within default initializers,
1240 // per [expr.prim.general]p4.
1241 ThisTy = Context.getPointerType(ClassTy);
1242 }
1243
1244 // If we are within a lambda's call operator, the cv-qualifiers of 'this'
1245 // might need to be adjusted if the lambda or any of its enclosing lambda's
1246 // captures '*this' by copy.
1247 if (!ThisTy.isNull() && isLambdaCallOperator(CurContext))
1250 return ThisTy;
1251}
1252
1254 Decl *ContextDecl,
1255 Qualifiers CXXThisTypeQuals,
1256 bool Enabled)
1257 : S(S), OldCXXThisTypeOverride(S.CXXThisTypeOverride), Enabled(false)
1258{
1259 if (!Enabled || !ContextDecl)
1260 return;
1261
1262 CXXRecordDecl *Record = nullptr;
1263 if (ClassTemplateDecl *Template = dyn_cast<ClassTemplateDecl>(ContextDecl))
1264 Record = Template->getTemplatedDecl();
1265 else
1266 Record = cast<CXXRecordDecl>(ContextDecl);
1267
1268 // 'this' never refers to the lambda class itself.
1269 if (Record->isLambda())
1270 return;
1271
1272 QualType T = S.Context.getCanonicalTagType(Record);
1273 T = S.getASTContext().getQualifiedType(T, CXXThisTypeQuals);
1274
1275 S.CXXThisTypeOverride =
1276 S.Context.getLangOpts().HLSL ? T : S.Context.getPointerType(T);
1277
1278 this->Enabled = true;
1279}
1280
1281
1283 if (Enabled) {
1284 S.CXXThisTypeOverride = OldCXXThisTypeOverride;
1285 }
1286}
1287
1289 SourceLocation DiagLoc = LSI->IntroducerRange.getEnd();
1290 assert(!LSI->isCXXThisCaptured());
1291 // [=, this] {}; // until C++20: Error: this when = is the default
1293 !Sema.getLangOpts().CPlusPlus20)
1294 return;
1295 Sema.Diag(DiagLoc, diag::note_lambda_this_capture_fixit)
1297 DiagLoc, LSI->NumExplicitCaptures > 0 ? ", this" : "this");
1298}
1299
1301 bool BuildAndDiagnose, const unsigned *const FunctionScopeIndexToStopAt,
1302 const bool ByCopy) {
1303 // We don't need to capture this in an unevaluated context.
1305 return true;
1306
1307 assert((!ByCopy || Explicit) && "cannot implicitly capture *this by value");
1308
1309 const int MaxFunctionScopesIndex = FunctionScopeIndexToStopAt
1310 ? *FunctionScopeIndexToStopAt
1311 : FunctionScopes.size() - 1;
1312
1313 // Check that we can capture the *enclosing object* (referred to by '*this')
1314 // by the capturing-entity/closure (lambda/block/etc) at
1315 // MaxFunctionScopesIndex-deep on the FunctionScopes stack.
1316
1317 // Note: The *enclosing object* can only be captured by-value by a
1318 // closure that is a lambda, using the explicit notation:
1319 // [*this] { ... }.
1320 // Every other capture of the *enclosing object* results in its by-reference
1321 // capture.
1322
1323 // For a closure 'L' (at MaxFunctionScopesIndex in the FunctionScopes
1324 // stack), we can capture the *enclosing object* only if:
1325 // - 'L' has an explicit byref or byval capture of the *enclosing object*
1326 // - or, 'L' has an implicit capture.
1327 // AND
1328 // -- there is no enclosing closure
1329 // -- or, there is some enclosing closure 'E' that has already captured the
1330 // *enclosing object*, and every intervening closure (if any) between 'E'
1331 // and 'L' can implicitly capture the *enclosing object*.
1332 // -- or, every enclosing closure can implicitly capture the
1333 // *enclosing object*
1334
1335
1336 unsigned NumCapturingClosures = 0;
1337 for (int idx = MaxFunctionScopesIndex; idx >= 0; idx--) {
1338 if (CapturingScopeInfo *CSI =
1339 dyn_cast<CapturingScopeInfo>(FunctionScopes[idx])) {
1340 if (CSI->CXXThisCaptureIndex != 0) {
1341 // 'this' is already being captured; there isn't anything more to do.
1342 CSI->Captures[CSI->CXXThisCaptureIndex - 1].markUsed(BuildAndDiagnose);
1343 break;
1344 }
1345 LambdaScopeInfo *LSI = dyn_cast<LambdaScopeInfo>(CSI);
1347 // This context can't implicitly capture 'this'; fail out.
1348 if (BuildAndDiagnose) {
1350 Diag(Loc, diag::err_this_capture)
1351 << (Explicit && idx == MaxFunctionScopesIndex);
1352 if (!Explicit)
1353 buildLambdaThisCaptureFixit(*this, LSI);
1354 }
1355 return true;
1356 }
1357 if (CSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_LambdaByref ||
1358 CSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_LambdaByval ||
1359 CSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_Block ||
1360 CSI->ImpCaptureStyle == CapturingScopeInfo::ImpCap_CapturedRegion ||
1361 (Explicit && idx == MaxFunctionScopesIndex)) {
1362 // Regarding (Explicit && idx == MaxFunctionScopesIndex): only the first
1363 // iteration through can be an explicit capture, all enclosing closures,
1364 // if any, must perform implicit captures.
1365
1366 // This closure can capture 'this'; continue looking upwards.
1367 NumCapturingClosures++;
1368 continue;
1369 }
1370 // This context can't implicitly capture 'this'; fail out.
1371 if (BuildAndDiagnose) {
1373 Diag(Loc, diag::err_this_capture)
1374 << (Explicit && idx == MaxFunctionScopesIndex);
1375 }
1376 if (!Explicit)
1377 buildLambdaThisCaptureFixit(*this, LSI);
1378 return true;
1379 }
1380 break;
1381 }
1382 if (!BuildAndDiagnose) return false;
1383
1384 // If we got here, then the closure at MaxFunctionScopesIndex on the
1385 // FunctionScopes stack, can capture the *enclosing object*, so capture it
1386 // (including implicit by-reference captures in any enclosing closures).
1387
1388 // In the loop below, respect the ByCopy flag only for the closure requesting
1389 // the capture (i.e. first iteration through the loop below). Ignore it for
1390 // all enclosing closure's up to NumCapturingClosures (since they must be
1391 // implicitly capturing the *enclosing object* by reference (see loop
1392 // above)).
1393 assert((!ByCopy ||
1394 isa<LambdaScopeInfo>(FunctionScopes[MaxFunctionScopesIndex])) &&
1395 "Only a lambda can capture the enclosing object (referred to by "
1396 "*this) by copy");
1397 QualType ThisTy = getCurrentThisType();
1398 for (int idx = MaxFunctionScopesIndex; NumCapturingClosures;
1399 --idx, --NumCapturingClosures) {
1401
1402 // The type of the corresponding data member (not a 'this' pointer if 'by
1403 // copy').
1404 QualType CaptureType = ByCopy ? ThisTy->getPointeeType() : ThisTy;
1405
1406 bool isNested = NumCapturingClosures > 1;
1407 CSI->addThisCapture(isNested, Loc, CaptureType, ByCopy);
1408 }
1409 return false;
1410}
1411
1413 // C++20 [expr.prim.this]p1:
1414 // The keyword this names a pointer to the object for which an
1415 // implicit object member function is invoked or a non-static
1416 // data member's initializer is evaluated.
1417 QualType ThisTy = getCurrentThisType();
1418
1419 if (CheckCXXThisType(Loc, ThisTy))
1420 return ExprError();
1421
1422 return BuildCXXThisExpr(Loc, ThisTy, /*IsImplicit=*/false);
1423}
1424
1426 if (!Type.isNull())
1427 return false;
1428
1429 // C++20 [expr.prim.this]p3:
1430 // If a declaration declares a member function or member function template
1431 // of a class X, the expression this is a prvalue of type
1432 // "pointer to cv-qualifier-seq X" wherever X is the current class between
1433 // the optional cv-qualifier-seq and the end of the function-definition,
1434 // member-declarator, or declarator. It shall not appear within the
1435 // declaration of either a static member function or an explicit object
1436 // member function of the current class (although its type and value
1437 // category are defined within such member functions as they are within
1438 // an implicit object member function).
1440 const auto *Method = dyn_cast<CXXMethodDecl>(DC);
1441 if (Method && Method->isExplicitObjectMemberFunction()) {
1442 Diag(Loc, diag::err_invalid_this_use) << 1;
1444 Diag(Loc, diag::err_invalid_this_use) << 1;
1445 } else {
1446 Diag(Loc, diag::err_invalid_this_use) << 0;
1447 }
1448 return true;
1449}
1450
1452 bool IsImplicit) {
1453 auto *This = CXXThisExpr::Create(Context, Loc, Type, IsImplicit);
1455 return This;
1456}
1457
1459 CheckCXXThisCapture(This->getExprLoc());
1460 if (This->isTypeDependent())
1461 return;
1462
1463 // Check if 'this' is captured by value in a lambda with a dependent explicit
1464 // object parameter, and mark it as type-dependent as well if so.
1465 auto IsDependent = [&]() {
1466 for (auto *Scope : llvm::reverse(FunctionScopes)) {
1467 auto *LSI = dyn_cast<sema::LambdaScopeInfo>(Scope);
1468 if (!LSI)
1469 continue;
1470
1471 if (LSI->Lambda && !LSI->Lambda->Encloses(CurContext) &&
1472 LSI->AfterParameterList)
1473 return false;
1474
1475 // If this lambda captures 'this' by value, then 'this' is dependent iff
1476 // this lambda has a dependent explicit object parameter. If we can't
1477 // determine whether it does (e.g. because the CXXMethodDecl's type is
1478 // null), assume it doesn't.
1479 if (LSI->isCXXThisCaptured()) {
1480 if (!LSI->getCXXThisCapture().isCopyCapture())
1481 continue;
1482
1483 const auto *MD = LSI->CallOperator;
1484 if (MD->getType().isNull())
1485 return false;
1486
1487 const auto *Ty = MD->getType()->getAs<FunctionProtoType>();
1488 return Ty && MD->isExplicitObjectMemberFunction() &&
1489 Ty->getParamType(0)->isDependentType();
1490 }
1491 }
1492 return false;
1493 }();
1494
1495 This->setCapturedByCopyInLambdaWithExplicitObjectParameter(IsDependent);
1496}
1497
1499 // If we're outside the body of a member function, then we'll have a specified
1500 // type for 'this'. Constraint substitution is the exception: a concept is
1501 // evaluated in its own declaration context (see GH#197215), so it loses the
1502 // enclosing '*this' even though it may legitimately name a member of the
1503 // class currently being instantiated.
1505 return false;
1506
1507 // Determine whether we're looking into a class that's currently being
1508 // defined.
1509 CXXRecordDecl *Class = BaseType->getAsCXXRecordDecl();
1510 return Class && Class->isBeingDefined();
1511}
1512
1515 SourceLocation LParenOrBraceLoc,
1516 MultiExprArg exprs,
1517 SourceLocation RParenOrBraceLoc,
1518 bool ListInitialization) {
1519 if (!TypeRep)
1520 return ExprError();
1521
1522 TypeSourceInfo *TInfo;
1523 QualType Ty = GetTypeFromParser(TypeRep, &TInfo);
1524 if (!TInfo)
1525 TInfo = Context.getTrivialTypeSourceInfo(Ty, SourceLocation());
1526
1527 auto Result = BuildCXXTypeConstructExpr(TInfo, LParenOrBraceLoc, exprs,
1528 RParenOrBraceLoc, ListInitialization);
1529 if (Result.isInvalid())
1531 RParenOrBraceLoc, exprs, Ty);
1532 return Result;
1533}
1534
1537 SourceLocation LParenOrBraceLoc,
1538 MultiExprArg Exprs,
1539 SourceLocation RParenOrBraceLoc,
1540 bool ListInitialization) {
1541 QualType Ty = TInfo->getType();
1542 SourceLocation TyBeginLoc = TInfo->getTypeLoc().getBeginLoc();
1543 SourceRange FullRange = SourceRange(TyBeginLoc, RParenOrBraceLoc);
1544
1545 InitializedEntity Entity =
1547 InitializationKind Kind =
1548 Exprs.size()
1549 ? ListInitialization
1551 TyBeginLoc, LParenOrBraceLoc, RParenOrBraceLoc)
1552 : InitializationKind::CreateDirect(TyBeginLoc, LParenOrBraceLoc,
1553 RParenOrBraceLoc)
1554 : InitializationKind::CreateValue(TyBeginLoc, LParenOrBraceLoc,
1555 RParenOrBraceLoc);
1556
1557 // C++17 [expr.type.conv]p1:
1558 // If the type is a placeholder for a deduced class type, [...perform class
1559 // template argument deduction...]
1560 // C++23:
1561 // Otherwise, if the type contains a placeholder type, it is replaced by the
1562 // type determined by placeholder type deduction.
1563 DeducedType *Deduced = Ty->getContainedDeducedType();
1564 if (Deduced && !Deduced->isDeduced() &&
1567 Kind, Exprs);
1568 if (Ty.isNull())
1569 return ExprError();
1570 Entity = InitializedEntity::InitializeTemporary(TInfo, Ty);
1571 } else if (Deduced && !Deduced->isDeduced()) {
1572 MultiExprArg Inits = Exprs;
1573 if (ListInitialization) {
1574 auto *ILE = cast<InitListExpr>(Exprs[0]);
1575 Inits = MultiExprArg(ILE->getInits(), ILE->getNumInits());
1576 }
1577
1578 if (Ty->getAs<AutoType>())
1579 DiagCompat(TyBeginLoc, diag_compat::auto_expr) << FullRange;
1580
1581 if (Inits.empty())
1582 return ExprError(Diag(TyBeginLoc, diag::err_auto_expr_init_no_expression)
1583 << Ty << FullRange);
1584 if (Inits.size() > 1) {
1585 Expr *FirstBad = Inits[1];
1586 return ExprError(Diag(FirstBad->getBeginLoc(),
1587 diag::err_auto_expr_init_multiple_expressions)
1588 << Ty << FullRange);
1589 }
1590 Expr *Deduce = Inits[0];
1591 if (isa<InitListExpr>(Deduce))
1592 return ExprError(
1593 Diag(Deduce->getBeginLoc(), diag::err_auto_expr_init_paren_braces)
1594 << ListInitialization << Ty << FullRange);
1595 QualType DeducedType;
1596 TemplateDeductionInfo Info(Deduce->getExprLoc());
1598 DeduceAutoType(TInfo->getTypeLoc(), Deduce, DeducedType, Info);
1601 return ExprError(Diag(TyBeginLoc, diag::err_auto_expr_deduction_failure)
1602 << Ty << Deduce->getType() << FullRange
1603 << Deduce->getSourceRange());
1604 if (DeducedType.isNull()) {
1606 return ExprError();
1607 }
1608
1609 Ty = DeducedType;
1610 Entity = InitializedEntity::InitializeTemporary(TInfo, Ty);
1611 }
1612
1615 Context, Ty.getNonReferenceType(), TInfo, LParenOrBraceLoc, Exprs,
1616 RParenOrBraceLoc, ListInitialization);
1617
1618 // C++ [expr.type.conv]p1:
1619 // If the expression list is a parenthesized single expression, the type
1620 // conversion expression is equivalent (in definedness, and if defined in
1621 // meaning) to the corresponding cast expression.
1622 if (Exprs.size() == 1 && !ListInitialization &&
1623 !isa<InitListExpr>(Exprs[0])) {
1624 Expr *Arg = Exprs[0];
1625 return BuildCXXFunctionalCastExpr(TInfo, Ty, LParenOrBraceLoc, Arg,
1626 RParenOrBraceLoc);
1627 }
1628
1629 // For an expression of the form T(), T shall not be an array type.
1630 QualType ElemTy = Ty;
1631 if (Ty->isArrayType()) {
1632 if (!ListInitialization)
1633 return ExprError(Diag(TyBeginLoc, diag::err_value_init_for_array_type)
1634 << FullRange);
1635 ElemTy = Context.getBaseElementType(Ty);
1636 }
1637
1638 // Only construct objects with object types.
1639 // The standard doesn't explicitly forbid function types here, but that's an
1640 // obvious oversight, as there's no way to dynamically construct a function
1641 // in general.
1642 if (Ty->isFunctionType())
1643 return ExprError(Diag(TyBeginLoc, diag::err_init_for_function_type)
1644 << Ty << FullRange);
1645
1646 // C++17 [expr.type.conv]p2, per DR2351:
1647 // If the type is cv void and the initializer is () or {}, the expression is
1648 // a prvalue of the specified type that performs no initialization.
1649 if (Ty->isVoidType()) {
1650 if (Exprs.empty())
1651 return new (Context) CXXScalarValueInitExpr(
1652 Ty.getUnqualifiedType(), TInfo, Kind.getRange().getEnd());
1653 if (ListInitialization &&
1654 cast<InitListExpr>(Exprs[0])->getNumInits() == 0) {
1656 Context, Ty.getUnqualifiedType(), VK_PRValue, TInfo, CK_ToVoid,
1657 Exprs[0], /*Path=*/nullptr, CurFPFeatureOverrides(),
1658 Exprs[0]->getBeginLoc(), Exprs[0]->getEndLoc());
1659 }
1660 } else if (RequireCompleteType(TyBeginLoc, ElemTy,
1661 diag::err_invalid_incomplete_type_use,
1662 FullRange))
1663 return ExprError();
1664
1665 // Otherwise, the expression is a prvalue of the specified type whose
1666 // result object is direct-initialized (11.6) with the initializer.
1667 InitializationSequence InitSeq(*this, Entity, Kind, Exprs);
1668 ExprResult Result = InitSeq.Perform(*this, Entity, Kind, Exprs);
1669
1670 if (Result.isInvalid())
1671 return Result;
1672
1673 Expr *Inner = Result.get();
1674 if (CXXBindTemporaryExpr *BTE = dyn_cast_or_null<CXXBindTemporaryExpr>(Inner))
1675 Inner = BTE->getSubExpr();
1676 if (auto *CE = dyn_cast<ConstantExpr>(Inner);
1677 CE && CE->isImmediateInvocation())
1678 Inner = CE->getSubExpr();
1679 if (!isa<CXXTemporaryObjectExpr>(Inner) &&
1681 // If we created a CXXTemporaryObjectExpr, that node also represents the
1682 // functional cast. Otherwise, create an explicit cast to represent
1683 // the syntactic form of a functional-style cast that was used here.
1684 //
1685 // FIXME: Creating a CXXFunctionalCastExpr around a CXXConstructExpr
1686 // would give a more consistent AST representation than using a
1687 // CXXTemporaryObjectExpr. It's also weird that the functional cast
1688 // is sometimes handled by initialization and sometimes not.
1689 QualType ResultType = Result.get()->getType();
1690 // In HLSL, vector/matrix constructors have their arguments wrapped into an
1691 // InitListExpr during initialization sequencing. Mark the resulting
1692 // CXXFunctionalCastExpr as list-initialization so that during template
1693 // re-instantiation, TreeTransform correctly passes the InitListExpr back
1694 // through BuildCXXTypeConstructExpr with ListInitialization=true as opposed
1695 // to false.
1696 bool IsListInit = ListInitialization ||
1697 (getLangOpts().HLSL && isa<InitListExpr>(Result.get()));
1698 SourceRange Locs = IsListInit
1699 ? SourceRange()
1700 : SourceRange(LParenOrBraceLoc, RParenOrBraceLoc);
1702 Context, ResultType, Expr::getValueKindForType(Ty), TInfo, CK_NoOp,
1703 Result.get(), /*Path=*/nullptr, CurFPFeatureOverrides(),
1704 Locs.getBegin(), Locs.getEnd());
1705 }
1706
1707 return Result;
1708}
1709
1711 // [CUDA] Ignore this function, if we can't call it.
1712 const FunctionDecl *Caller = getCurFunctionDecl(/*AllowLambda=*/true);
1713 if (getLangOpts().CUDA) {
1714 auto CallPreference = CUDA().IdentifyPreference(Caller, Method);
1715 // If it's not callable at all, it's not the right function.
1716 if (CallPreference < SemaCUDA::CFP_WrongSide)
1717 return false;
1718 if (CallPreference == SemaCUDA::CFP_WrongSide) {
1719 // Maybe. We have to check if there are better alternatives.
1721 Method->getDeclContext()->lookup(Method->getDeclName());
1722 for (const auto *D : R) {
1723 if (const auto *FD = dyn_cast<FunctionDecl>(D)) {
1724 if (CUDA().IdentifyPreference(Caller, FD) > SemaCUDA::CFP_WrongSide)
1725 return false;
1726 }
1727 }
1728 // We've found no better variants.
1729 }
1730 }
1731
1733 bool Result = Method->isUsualDeallocationFunction(PreventedBy);
1734
1735 if (Result || !getLangOpts().CUDA || PreventedBy.empty())
1736 return Result;
1737
1738 // In case of CUDA, return true if none of the 1-argument deallocator
1739 // functions are actually callable.
1740 return llvm::none_of(PreventedBy, [&](const FunctionDecl *FD) {
1741 assert(FD->getNumParams() == 1 &&
1742 "Only single-operand functions should be in PreventedBy");
1743 return CUDA().IdentifyPreference(Caller, FD) >= SemaCUDA::CFP_HostDevice;
1744 });
1745}
1746
1747/// Determine whether the given function is a non-placement
1748/// deallocation function.
1750 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(FD))
1751 return S.isUsualDeallocationFunction(Method);
1752
1753 if (!FD->getDeclName().isAnyOperatorDelete())
1754 return false;
1755
1758 FD->getNumParams();
1759
1760 unsigned UsualParams = 1;
1761 if (S.getLangOpts().SizedDeallocation && UsualParams < FD->getNumParams() &&
1763 FD->getParamDecl(UsualParams)->getType(),
1764 S.Context.getSizeType()))
1765 ++UsualParams;
1766
1767 if (S.getLangOpts().AlignedAllocation && UsualParams < FD->getNumParams() &&
1769 FD->getParamDecl(UsualParams)->getType(),
1771 ++UsualParams;
1772
1773 return UsualParams == FD->getNumParams();
1774}
1775
1776namespace {
1777 struct UsualDeallocFnInfo {
1778 UsualDeallocFnInfo()
1779 : Found(), FD(nullptr),
1781 UsualDeallocFnInfo(Sema &S, DeclAccessPair Found, QualType AllocType,
1782 SourceLocation Loc)
1783 : Found(Found), FD(dyn_cast<FunctionDecl>(Found->getUnderlyingDecl())),
1784 Destroying(false),
1785 IDP({AllocType, TypeAwareAllocationMode::No,
1786 AlignedAllocationMode::No, SizedDeallocationMode::No}),
1787 CUDAPref(SemaCUDA::CFP_Native) {
1788 // A function template declaration is only a usual deallocation function
1789 // if it is a typed delete.
1790 if (!FD) {
1791 if (AllocType.isNull())
1792 return;
1793 auto *FTD = dyn_cast<FunctionTemplateDecl>(Found->getUnderlyingDecl());
1794 if (!FTD)
1795 return;
1796 FunctionDecl *InstantiatedDecl =
1797 S.BuildTypeAwareUsualDelete(FTD, AllocType, Loc);
1798 if (!InstantiatedDecl)
1799 return;
1800 FD = InstantiatedDecl;
1801 }
1802 unsigned NumBaseParams = 1;
1803 if (FD->isTypeAwareOperatorNewOrDelete()) {
1804 // If this is a type aware operator delete we instantiate an appropriate
1805 // specialization of std::type_identity<>. If we do not know the
1806 // type being deallocated, or if the type-identity parameter of the
1807 // deallocation function does not match the constructed type_identity
1808 // specialization we reject the declaration.
1809 if (AllocType.isNull()) {
1810 FD = nullptr;
1811 return;
1812 }
1813 QualType TypeIdentityTag = FD->getParamDecl(0)->getType();
1814 QualType ExpectedTypeIdentityTag =
1815 S.tryBuildStdTypeIdentity(AllocType, Loc);
1816 if (ExpectedTypeIdentityTag.isNull()) {
1817 FD = nullptr;
1818 return;
1819 }
1820 if (!S.Context.hasSameType(TypeIdentityTag, ExpectedTypeIdentityTag)) {
1821 FD = nullptr;
1822 return;
1823 }
1824 IDP.PassTypeIdentity = TypeAwareAllocationMode::Yes;
1825 ++NumBaseParams;
1826 }
1827
1828 if (FD->isDestroyingOperatorDelete()) {
1829 Destroying = true;
1830 ++NumBaseParams;
1831 }
1832
1833 if (NumBaseParams < FD->getNumParams() &&
1834 S.Context.hasSameUnqualifiedType(
1835 FD->getParamDecl(NumBaseParams)->getType(),
1836 S.Context.getSizeType())) {
1837 ++NumBaseParams;
1838 IDP.PassSize = SizedDeallocationMode::Yes;
1839 }
1840
1841 if (NumBaseParams < FD->getNumParams() &&
1842 FD->getParamDecl(NumBaseParams)->getType()->isAlignValT()) {
1843 ++NumBaseParams;
1844 IDP.PassAlignment = AlignedAllocationMode::Yes;
1845 }
1846
1847 // In CUDA, determine how much we'd like / dislike to call this.
1848 if (S.getLangOpts().CUDA)
1849 CUDAPref = S.CUDA().IdentifyPreference(
1850 S.getCurFunctionDecl(/*AllowLambda=*/true), FD);
1851 }
1852
1853 explicit operator bool() const { return FD; }
1854
1855 int Compare(Sema &S, const UsualDeallocFnInfo &Other,
1856 ImplicitDeallocationParameters TargetIDP) const {
1857 assert(!TargetIDP.Type.isNull() ||
1858 !isTypeAwareAllocation(Other.IDP.PassTypeIdentity));
1859
1860 // C++ P0722:
1861 // A destroying operator delete is preferred over a non-destroying
1862 // operator delete.
1863 if (Destroying != Other.Destroying)
1864 return Destroying ? 1 : -1;
1865
1866 const ImplicitDeallocationParameters &OtherIDP = Other.IDP;
1867 // Selection for type awareness has priority over alignment and size
1868 if (IDP.PassTypeIdentity != OtherIDP.PassTypeIdentity)
1869 return IDP.PassTypeIdentity == TargetIDP.PassTypeIdentity ? 1 : -1;
1870
1871 // C++17 [expr.delete]p10:
1872 // If the type has new-extended alignment, a function with a parameter
1873 // of type std::align_val_t is preferred; otherwise a function without
1874 // such a parameter is preferred
1875 if (IDP.PassAlignment != OtherIDP.PassAlignment)
1876 return IDP.PassAlignment == TargetIDP.PassAlignment ? 1 : -1;
1877
1878 if (IDP.PassSize != OtherIDP.PassSize)
1879 return IDP.PassSize == TargetIDP.PassSize ? 1 : -1;
1880
1881 if (isTypeAwareAllocation(IDP.PassTypeIdentity)) {
1882 // Type aware allocation involves templates so we need to choose
1883 // the best type
1884 FunctionTemplateDecl *PrimaryTemplate = FD->getPrimaryTemplate();
1885 FunctionTemplateDecl *OtherPrimaryTemplate =
1886 Other.FD->getPrimaryTemplate();
1887 if ((!PrimaryTemplate) != (!OtherPrimaryTemplate))
1888 return OtherPrimaryTemplate ? 1 : -1;
1889
1890 if (PrimaryTemplate && OtherPrimaryTemplate) {
1891 const auto *DC = dyn_cast<CXXRecordDecl>(Found->getDeclContext());
1892 const auto *OtherDC =
1893 dyn_cast<CXXRecordDecl>(Other.Found->getDeclContext());
1894 unsigned ImplicitArgCount = Destroying + IDP.getNumImplicitArgs();
1895 if (FunctionTemplateDecl *Best = S.getMoreSpecializedTemplate(
1896 PrimaryTemplate, OtherPrimaryTemplate, SourceLocation(),
1897 TPOC_Call, ImplicitArgCount,
1898 DC ? S.Context.getCanonicalTagType(DC) : QualType{},
1899 OtherDC ? S.Context.getCanonicalTagType(OtherDC) : QualType{},
1900 false)) {
1901 return Best == PrimaryTemplate ? 1 : -1;
1902 }
1903 }
1904 }
1905
1906 // Use CUDA call preference as a tiebreaker.
1907 if (CUDAPref > Other.CUDAPref)
1908 return 1;
1909 if (CUDAPref == Other.CUDAPref)
1910 return 0;
1911 return -1;
1912 }
1913
1914 DeclAccessPair Found;
1915 FunctionDecl *FD;
1916 bool Destroying;
1917 ImplicitDeallocationParameters IDP;
1919 };
1920}
1921
1922/// Determine whether a type has new-extended alignment. This may be called when
1923/// the type is incomplete (for a delete-expression with an incomplete pointee
1924/// type), in which case it will conservatively return false if the alignment is
1925/// not known.
1926static bool hasNewExtendedAlignment(Sema &S, QualType AllocType) {
1927 return S.getLangOpts().AlignedAllocation &&
1928 S.getASTContext().getTypeAlignIfKnown(AllocType) >
1930}
1931
1932static bool CheckDeleteOperator(Sema &S, SourceLocation StartLoc,
1933 SourceRange Range, bool Diagnose,
1934 CXXRecordDecl *NamingClass, DeclAccessPair Decl,
1935 FunctionDecl *Operator) {
1936 if (Operator->isTypeAwareOperatorNewOrDelete()) {
1937 QualType SelectedTypeIdentityParameter =
1938 Operator->getParamDecl(0)->getType();
1939 if (S.RequireCompleteType(StartLoc, SelectedTypeIdentityParameter,
1940 diag::err_incomplete_type))
1941 return true;
1942 }
1943
1944 // FIXME: DiagnoseUseOfDecl?
1945 if (Operator->isDeleted()) {
1946 if (Diagnose) {
1947 StringLiteral *Msg = Operator->getDeletedMessage();
1948 S.Diag(StartLoc, diag::err_deleted_function_use)
1949 << (Msg != nullptr) << (Msg ? Msg->getString() : StringRef());
1950 S.NoteDeletedFunction(Operator);
1951 }
1952 return true;
1953 }
1954 Sema::AccessResult Accessible =
1955 S.CheckAllocationAccess(StartLoc, Range, NamingClass, Decl, Diagnose);
1956 return Accessible == Sema::AR_inaccessible;
1957}
1958
1959/// Select the correct "usual" deallocation function to use from a selection of
1960/// deallocation functions (either global or class-scope).
1961static UsualDeallocFnInfo resolveDeallocationOverload(
1963 SourceLocation Loc,
1964 llvm::SmallVectorImpl<UsualDeallocFnInfo> *BestFns = nullptr) {
1965
1966 UsualDeallocFnInfo Best;
1967 for (auto I = R.begin(), E = R.end(); I != E; ++I) {
1968 UsualDeallocFnInfo Info(S, I.getPair(), IDP.Type, Loc);
1969 if (!Info || !isNonPlacementDeallocationFunction(S, Info.FD) ||
1970 Info.CUDAPref == SemaCUDA::CFP_Never)
1971 continue;
1972
1975 continue;
1976 if (!Best) {
1977 Best = Info;
1978 if (BestFns)
1979 BestFns->push_back(Info);
1980 continue;
1981 }
1982 int ComparisonResult = Best.Compare(S, Info, IDP);
1983 if (ComparisonResult > 0)
1984 continue;
1985
1986 // If more than one preferred function is found, all non-preferred
1987 // functions are eliminated from further consideration.
1988 if (BestFns && ComparisonResult < 0)
1989 BestFns->clear();
1990
1991 Best = Info;
1992 if (BestFns)
1993 BestFns->push_back(Info);
1994 }
1995
1996 return Best;
1997}
1998
1999/// Determine whether a given type is a class for which 'delete[]' would call
2000/// a member 'operator delete[]' with a 'size_t' parameter. This implies that
2001/// we need to store the array size (even if the type is
2002/// trivially-destructible).
2004 TypeAwareAllocationMode PassType,
2005 QualType allocType) {
2006 const auto *record =
2007 allocType->getBaseElementTypeUnsafe()->getAsCanonical<RecordType>();
2008 if (!record) return false;
2009
2010 // Try to find an operator delete[] in class scope.
2011
2012 DeclarationName deleteName =
2013 S.Context.DeclarationNames.getCXXOperatorName(OO_Array_Delete);
2014 LookupResult ops(S, deleteName, loc, Sema::LookupOrdinaryName);
2015 S.LookupQualifiedName(ops, record->getDecl()->getDefinitionOrSelf());
2016
2017 // We're just doing this for information.
2018 ops.suppressDiagnostics();
2019
2020 // Very likely: there's no operator delete[].
2021 if (ops.empty()) return false;
2022
2023 // If it's ambiguous, it should be illegal to call operator delete[]
2024 // on this thing, so it doesn't matter if we allocate extra space or not.
2025 if (ops.isAmbiguous()) return false;
2026
2027 // C++17 [expr.delete]p10:
2028 // If the deallocation functions have class scope, the one without a
2029 // parameter of type std::size_t is selected.
2031 allocType, PassType,
2034 auto Best = resolveDeallocationOverload(S, ops, IDP, loc);
2035 return Best && isSizedDeallocation(Best.IDP.PassSize);
2036}
2037
2039Sema::ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal,
2040 SourceLocation PlacementLParen, MultiExprArg PlacementArgs,
2041 SourceLocation PlacementRParen, SourceRange TypeIdParens,
2043 std::optional<Expr *> ArraySize;
2044 // If the specified type is an array, unwrap it and save the expression.
2045 if (D.getNumTypeObjects() > 0 &&
2047 DeclaratorChunk &Chunk = D.getTypeObject(0);
2048 if (D.getDeclSpec().hasAutoTypeSpec())
2049 return ExprError(Diag(Chunk.Loc, diag::err_new_array_of_auto)
2050 << D.getSourceRange());
2051 if (Chunk.Arr.hasStatic)
2052 return ExprError(Diag(Chunk.Loc, diag::err_static_illegal_in_new)
2053 << D.getSourceRange());
2054 if (!Chunk.Arr.NumElts && !Initializer)
2055 return ExprError(Diag(Chunk.Loc, diag::err_array_new_needs_size)
2056 << D.getSourceRange());
2057
2058 ArraySize = Chunk.Arr.NumElts;
2060 }
2061
2062 // Every dimension shall be of constant size.
2063 if (ArraySize) {
2064 for (unsigned I = 0, N = D.getNumTypeObjects(); I < N; ++I) {
2066 break;
2067
2069 if (Expr *NumElts = Array.NumElts) {
2070 if (!NumElts->isTypeDependent() && !NumElts->isValueDependent()) {
2071 // FIXME: GCC permits constant folding here. We should either do so consistently
2072 // or not do so at all, rather than changing behavior in C++14 onwards.
2073 if (getLangOpts().CPlusPlus14) {
2074 // C++1y [expr.new]p6: Every constant-expression in a noptr-new-declarator
2075 // shall be a converted constant expression (5.19) of type std::size_t
2076 // and shall evaluate to a strictly positive value.
2077 llvm::APSInt Value(Context.getIntWidth(Context.getSizeType()));
2078 Array.NumElts =
2079 CheckConvertedConstantExpression(NumElts, Context.getSizeType(),
2081 .get();
2082 } else {
2083 Array.NumElts = VerifyIntegerConstantExpression(
2084 NumElts, nullptr, diag::err_new_array_nonconst,
2086 .get();
2087 }
2088 if (!Array.NumElts)
2089 return ExprError();
2090 }
2091 }
2092 }
2093 }
2094
2096 QualType AllocType = TInfo->getType();
2097 if (D.isInvalidType())
2098 return ExprError();
2099
2100 SourceRange DirectInitRange;
2101 if (ParenListExpr *List = dyn_cast_or_null<ParenListExpr>(Initializer))
2102 DirectInitRange = List->getSourceRange();
2103
2104 return BuildCXXNew(SourceRange(StartLoc, D.getEndLoc()), UseGlobal,
2105 PlacementLParen, PlacementArgs, PlacementRParen,
2106 TypeIdParens, AllocType, TInfo, ArraySize, DirectInitRange,
2107 Initializer);
2108}
2109
2111 Expr *Init, bool IsCPlusPlus20) {
2112 if (!Init)
2113 return true;
2114 if (ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init))
2115 return IsCPlusPlus20 || PLE->getNumExprs() == 0;
2117 return true;
2118 else if (CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init))
2119 return !CCE->isListInitialization() &&
2120 CCE->getConstructor()->isDefaultConstructor();
2121 else if (Style == CXXNewInitializationStyle::Braces) {
2122 assert(isa<InitListExpr>(Init) &&
2123 "Shouldn't create list CXXConstructExprs for arrays.");
2124 return true;
2125 }
2126 return false;
2127}
2128
2129bool
2131 if (!getLangOpts().AlignedAllocationUnavailable)
2132 return false;
2133 if (FD.isDefined())
2134 return false;
2135 UnsignedOrNone AlignmentParam = std::nullopt;
2136 if (FD.isReplaceableGlobalAllocationFunction(&AlignmentParam) &&
2137 AlignmentParam)
2138 return true;
2139 return false;
2140}
2141
2142// Emit a diagnostic if an aligned allocation/deallocation function that is not
2143// implemented in the standard library is selected.
2145 SourceLocation Loc) {
2147 const llvm::Triple &T = getASTContext().getTargetInfo().getTriple();
2148 StringRef OSName = AvailabilityAttr::getPlatformNameSourceSpelling(
2149 getASTContext().getTargetInfo().getPlatformName());
2150 VersionTuple OSVersion = alignedAllocMinVersion(T.getOS());
2151
2152 bool IsDelete = FD.getDeclName().isAnyOperatorDelete();
2153 Diag(Loc, diag::err_aligned_allocation_unavailable)
2154 << IsDelete << FD.getType().getAsString() << OSName
2155 << OSVersion.getAsString() << OSVersion.empty();
2156 Diag(Loc, diag::note_silence_aligned_allocation_unavailable);
2157 }
2158}
2159
2161 SourceLocation PlacementLParen,
2162 MultiExprArg PlacementArgs,
2163 SourceLocation PlacementRParen,
2164 SourceRange TypeIdParens, QualType AllocType,
2165 TypeSourceInfo *AllocTypeInfo,
2166 std::optional<Expr *> ArraySize,
2167 SourceRange DirectInitRange, Expr *Initializer) {
2168 SourceRange TypeRange = AllocTypeInfo->getTypeLoc().getSourceRange();
2169 SourceLocation StartLoc = Range.getBegin();
2170
2171 CXXNewInitializationStyle InitStyle;
2172 if (DirectInitRange.isValid()) {
2173 assert(Initializer && "Have parens but no initializer.");
2175 } else if (isa_and_nonnull<InitListExpr>(Initializer))
2177 else {
2180 "Initializer expression that cannot have been implicitly created.");
2182 }
2183
2184 MultiExprArg Exprs(&Initializer, Initializer ? 1 : 0);
2185 if (ParenListExpr *List = dyn_cast_or_null<ParenListExpr>(Initializer)) {
2186 assert(InitStyle == CXXNewInitializationStyle::Parens &&
2187 "paren init for non-call init");
2188 Exprs = MultiExprArg(List->getExprs(), List->getNumExprs());
2189 } else if (auto *List = dyn_cast_or_null<CXXParenListInitExpr>(Initializer)) {
2190 assert(InitStyle == CXXNewInitializationStyle::Parens &&
2191 "paren init for non-call init");
2192 Exprs = List->getInitExprs();
2193 }
2194
2195 // C++11 [expr.new]p15:
2196 // A new-expression that creates an object of type T initializes that
2197 // object as follows:
2198 InitializationKind Kind = [&] {
2199 switch (InitStyle) {
2200 // - If the new-initializer is omitted, the object is default-
2201 // initialized (8.5); if no initialization is performed,
2202 // the object has indeterminate value
2204 return InitializationKind::CreateDefault(TypeRange.getBegin());
2205 // - Otherwise, the new-initializer is interpreted according to the
2206 // initialization rules of 8.5 for direct-initialization.
2208 return InitializationKind::CreateDirect(TypeRange.getBegin(),
2209 DirectInitRange.getBegin(),
2210 DirectInitRange.getEnd());
2213 Initializer->getBeginLoc(),
2214 Initializer->getEndLoc());
2215 }
2216 llvm_unreachable("Unknown initialization kind");
2217 }();
2218
2219 // C++11 [dcl.spec.auto]p6. Deduce the type which 'auto' stands in for.
2220 auto *Deduced = AllocType->getContainedDeducedType();
2221 if (Deduced && !Deduced->isDeduced() &&
2223 if (ArraySize)
2224 return ExprError(
2225 Diag(*ArraySize ? (*ArraySize)->getExprLoc() : TypeRange.getBegin(),
2226 diag::err_deduced_class_template_compound_type)
2227 << /*array*/ 2
2228 << (*ArraySize ? (*ArraySize)->getSourceRange() : TypeRange));
2229
2233 AllocTypeInfo, Entity, Kind, Exprs);
2234 if (AllocType.isNull())
2235 return ExprError();
2236 } else if (Deduced && !Deduced->isDeduced()) {
2237 MultiExprArg Inits = Exprs;
2238 bool Braced = (InitStyle == CXXNewInitializationStyle::Braces);
2239 if (Braced) {
2240 auto *ILE = cast<InitListExpr>(Exprs[0]);
2241 Inits = MultiExprArg(ILE->getInits(), ILE->getNumInits());
2242 }
2243
2244 if (InitStyle == CXXNewInitializationStyle::None || Inits.empty())
2245 return ExprError(Diag(StartLoc, diag::err_auto_new_requires_ctor_arg)
2246 << AllocType << TypeRange);
2247 if (Inits.size() > 1) {
2248 Expr *FirstBad = Inits[1];
2249 return ExprError(Diag(FirstBad->getBeginLoc(),
2250 diag::err_auto_new_ctor_multiple_expressions)
2251 << AllocType << TypeRange);
2252 }
2253 if (Braced && !getLangOpts().CPlusPlus17)
2254 Diag(Initializer->getBeginLoc(), diag::ext_auto_new_list_init)
2255 << AllocType << TypeRange;
2256 Expr *Deduce = Inits[0];
2257 if (isa<InitListExpr>(Deduce))
2258 return ExprError(
2259 Diag(Deduce->getBeginLoc(), diag::err_auto_expr_init_paren_braces)
2260 << Braced << AllocType << TypeRange);
2261 QualType DeducedType;
2262 TemplateDeductionInfo Info(Deduce->getExprLoc());
2264 DeduceAutoType(AllocTypeInfo->getTypeLoc(), Deduce, DeducedType, Info);
2267 return ExprError(Diag(StartLoc, diag::err_auto_new_deduction_failure)
2268 << AllocType << Deduce->getType() << TypeRange
2269 << Deduce->getSourceRange());
2270 if (DeducedType.isNull()) {
2272 return ExprError();
2273 }
2274 AllocType = DeducedType;
2275 }
2276
2277 // Per C++0x [expr.new]p5, the type being constructed may be a
2278 // typedef of an array type.
2279 // Dependent case will be handled separately.
2280 if (!ArraySize && !AllocType->isDependentType()) {
2281 if (const ConstantArrayType *Array
2282 = Context.getAsConstantArrayType(AllocType)) {
2283 ArraySize = IntegerLiteral::Create(Context, Array->getSize(),
2284 Context.getSizeType(),
2285 TypeRange.getEnd());
2286 AllocType = Array->getElementType();
2287 }
2288 }
2289
2290 if (CheckAllocatedType(AllocType, TypeRange.getBegin(), TypeRange))
2291 return ExprError();
2292
2293 if (ArraySize && !checkArrayElementAlignment(AllocType, TypeRange.getBegin()))
2294 return ExprError();
2295
2296 // In ARC, infer 'retaining' for the allocated
2297 if (getLangOpts().ObjCAutoRefCount &&
2298 AllocType.getObjCLifetime() == Qualifiers::OCL_None &&
2299 AllocType->isObjCLifetimeType()) {
2300 AllocType = Context.getLifetimeQualifiedType(AllocType,
2301 AllocType->getObjCARCImplicitLifetime());
2302 }
2303
2304 QualType ResultType = Context.getPointerType(AllocType);
2305
2306 if (ArraySize && *ArraySize &&
2307 (*ArraySize)->getType()->isNonOverloadPlaceholderType()) {
2308 ExprResult result = CheckPlaceholderExpr(*ArraySize);
2309 if (result.isInvalid()) return ExprError();
2310 ArraySize = result.get();
2311 }
2312 // C++98 5.3.4p6: "The expression in a direct-new-declarator shall have
2313 // integral or enumeration type with a non-negative value."
2314 // C++11 [expr.new]p6: The expression [...] shall be of integral or unscoped
2315 // enumeration type, or a class type for which a single non-explicit
2316 // conversion function to integral or unscoped enumeration type exists.
2317 // C++1y [expr.new]p6: The expression [...] is implicitly converted to
2318 // std::size_t.
2319 std::optional<uint64_t> KnownArraySize;
2320 if (ArraySize && *ArraySize && !(*ArraySize)->isTypeDependent()) {
2321 ExprResult ConvertedSize;
2322 if (getLangOpts().CPlusPlus14) {
2323 assert(Context.getTargetInfo().getIntWidth() && "Builtin type of size 0?");
2324
2325 ConvertedSize = PerformImplicitConversion(
2326 *ArraySize, Context.getSizeType(), AssignmentAction::Converting);
2327
2328 if (!ConvertedSize.isInvalid() && (*ArraySize)->getType()->isRecordType())
2329 // Diagnose the compatibility of this conversion.
2330 Diag(StartLoc, diag::compat_cxx11_array_size_conversion)
2331 << (*ArraySize)->getType() << 0 << "'size_t'";
2332 } else {
2333 class SizeConvertDiagnoser : public ICEConvertDiagnoser {
2334 protected:
2335 Expr *ArraySize;
2336
2337 public:
2338 SizeConvertDiagnoser(Expr *ArraySize)
2339 : ICEConvertDiagnoser(/*AllowScopedEnumerations*/false, false, false),
2340 ArraySize(ArraySize) {}
2341
2342 SemaDiagnosticBuilder diagnoseNotInt(Sema &S, SourceLocation Loc,
2343 QualType T) override {
2344 return S.Diag(Loc, diag::err_array_size_not_integral)
2345 << S.getLangOpts().CPlusPlus11 << T;
2346 }
2347
2348 SemaDiagnosticBuilder diagnoseIncomplete(
2349 Sema &S, SourceLocation Loc, QualType T) override {
2350 return S.Diag(Loc, diag::err_array_size_incomplete_type)
2351 << T << ArraySize->getSourceRange();
2352 }
2353
2354 SemaDiagnosticBuilder diagnoseExplicitConv(
2355 Sema &S, SourceLocation Loc, QualType T, QualType ConvTy) override {
2356 return S.Diag(Loc, diag::err_array_size_explicit_conversion) << T << ConvTy;
2357 }
2358
2359 SemaDiagnosticBuilder noteExplicitConv(
2360 Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override {
2361 return S.Diag(Conv->getLocation(), diag::note_array_size_conversion)
2362 << ConvTy->isEnumeralType() << ConvTy;
2363 }
2364
2365 SemaDiagnosticBuilder diagnoseAmbiguous(
2366 Sema &S, SourceLocation Loc, QualType T) override {
2367 return S.Diag(Loc, diag::err_array_size_ambiguous_conversion) << T;
2368 }
2369
2370 SemaDiagnosticBuilder noteAmbiguous(
2371 Sema &S, CXXConversionDecl *Conv, QualType ConvTy) override {
2372 return S.Diag(Conv->getLocation(), diag::note_array_size_conversion)
2373 << ConvTy->isEnumeralType() << ConvTy;
2374 }
2375
2376 SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc,
2377 QualType T,
2378 QualType ConvTy) override {
2379 return S.DiagCompat(Loc, diag_compat::array_size_conversion)
2380 << T << ConvTy->isEnumeralType() << ConvTy;
2381 }
2382 } SizeDiagnoser(*ArraySize);
2383
2384 ConvertedSize = PerformContextualImplicitConversion(StartLoc, *ArraySize,
2385 SizeDiagnoser);
2386 }
2387 if (ConvertedSize.isInvalid())
2388 return ExprError();
2389
2390 ArraySize = ConvertedSize.get();
2391 QualType SizeType = (*ArraySize)->getType();
2392
2393 if (!SizeType->isIntegralOrUnscopedEnumerationType())
2394 return ExprError();
2395
2396 // C++98 [expr.new]p7:
2397 // The expression in a direct-new-declarator shall have integral type
2398 // with a non-negative value.
2399 //
2400 // Let's see if this is a constant < 0. If so, we reject it out of hand,
2401 // per CWG1464. Otherwise, if it's not a constant, we must have an
2402 // unparenthesized array type.
2403
2404 // We've already performed any required implicit conversion to integer or
2405 // unscoped enumeration type.
2406 // FIXME: Per CWG1464, we are required to check the value prior to
2407 // converting to size_t. This will never find a negative array size in
2408 // C++14 onwards, because Value is always unsigned here!
2409 if (std::optional<llvm::APSInt> Value =
2410 (*ArraySize)->getIntegerConstantExpr(Context)) {
2411 if (Value->isSigned() && Value->isNegative()) {
2412 return ExprError(Diag((*ArraySize)->getBeginLoc(),
2413 diag::err_typecheck_negative_array_size)
2414 << (*ArraySize)->getSourceRange());
2415 }
2416
2417 if (checkArrayTooLarge(AllocType, *Value, (*ArraySize)->getBeginLoc(),
2418 (*ArraySize)->getSourceRange()))
2419 return ExprError();
2420
2421 KnownArraySize = Value->getZExtValue();
2422 } else if (TypeIdParens.isValid()) {
2423 // Can't have dynamic array size when the type-id is in parentheses.
2424 Diag((*ArraySize)->getBeginLoc(), diag::ext_new_paren_array_nonconst)
2425 << (*ArraySize)->getSourceRange()
2426 << FixItHint::CreateRemoval(TypeIdParens.getBegin())
2427 << FixItHint::CreateRemoval(TypeIdParens.getEnd());
2428
2429 TypeIdParens = SourceRange();
2430 }
2431
2432 // Note that we do *not* convert the argument in any way. It can
2433 // be signed, larger than size_t, whatever.
2434 }
2435
2436 FunctionDecl *OperatorNew = nullptr;
2437 FunctionDecl *OperatorDelete = nullptr;
2438 SmallVector<Expr *, 4> SelectedAllocationArgs;
2439 unsigned Alignment =
2440 AllocType->isDependentType() ? 0 : Context.getTypeAlign(AllocType);
2441 unsigned NewAlignment = Context.getTargetInfo().getNewAlign();
2444 alignedAllocationModeFromBool(getLangOpts().AlignedAllocation &&
2445 Alignment > NewAlignment)};
2446
2447 if (CheckArgsForPlaceholders(PlacementArgs))
2448 return ExprError();
2449
2452 SourceRange AllocationParameterRange = Range;
2453 if (PlacementLParen.isValid() && PlacementRParen.isValid())
2454 AllocationParameterRange = SourceRange(PlacementLParen, PlacementRParen);
2455
2456 if (!AllocType->isDependentType() &&
2457 !Expr::hasAnyTypeDependentArguments(PlacementArgs)) {
2458 auto FoundAllocation = FindAllocationFunctions(
2459 StartLoc, AllocationParameterRange, Scope, Scope, AllocType,
2460 /*IsArray=*/ArraySize.has_value(), IAP, PlacementArgs);
2461 if (!FoundAllocation)
2462 return ExprError();
2463 IAP = FoundAllocation->IAP;
2464 OperatorNew = FoundAllocation->OperatorNew;
2465 OperatorDelete = FoundAllocation->OperatorDelete;
2466 SelectedAllocationArgs = std::move(FoundAllocation->Arguments);
2467 }
2468 // If this is an array allocation, compute whether the usual array
2469 // deallocation function for the type has a size_t parameter.
2470 bool UsualArrayDeleteWantsSize = false;
2471 if (ArraySize && !AllocType->isDependentType())
2472 UsualArrayDeleteWantsSize = doesUsualArrayDeleteWantSize(
2473 *this, StartLoc, IAP.PassTypeIdentity, AllocType);
2474
2475 SmallVector<Expr *, 8> AllPlaceArgs;
2476 if (OperatorNew) {
2477 auto *Proto = OperatorNew->getType()->castAs<FunctionProtoType>();
2478 VariadicCallType CallType = Proto->isVariadic()
2481
2482 // We've already converted the placement args, just fill in any default
2483 // arguments. Skip the first parameter because we don't have a corresponding
2484 // argument. Skip the second parameter too if we're passing in the
2485 // alignment; we've already filled it in.
2486 unsigned NumImplicitArgs =
2487 SelectedAllocationArgs.size() - PlacementArgs.size();
2488 if (GatherArgumentsForCall(AllocationParameterRange.getBegin(), OperatorNew,
2489 Proto, NumImplicitArgs, PlacementArgs,
2490 AllPlaceArgs, CallType))
2491 return ExprError();
2492
2493 if (!AllPlaceArgs.empty())
2494 PlacementArgs = AllPlaceArgs;
2495
2496 // We would like to perform some checking on the given `operator new` call,
2497 // but the PlacementArgs does not contain the implicit arguments,
2498 // namely allocation size and maybe allocation alignment,
2499 // so we need to conjure them.
2500
2501 QualType SizeTy = Context.getSizeType();
2502 unsigned SizeTyWidth = Context.getTypeSize(SizeTy);
2503
2504 llvm::APInt SingleEltSize(
2505 SizeTyWidth, Context.getTypeSizeInChars(AllocType).getQuantity());
2506
2507 // How many bytes do we want to allocate here?
2508 std::optional<llvm::APInt> AllocationSize;
2509 if (!ArraySize && !AllocType->isDependentType()) {
2510 // For non-array operator new, we only want to allocate one element.
2511 AllocationSize = SingleEltSize;
2512 } else if (KnownArraySize && !AllocType->isDependentType()) {
2513 // For array operator new, only deal with static array size case.
2514 bool Overflow;
2515 AllocationSize = llvm::APInt(SizeTyWidth, *KnownArraySize)
2516 .umul_ov(SingleEltSize, Overflow);
2517 (void)Overflow;
2518 assert(
2519 !Overflow &&
2520 "Expected that all the overflows would have been handled already.");
2521 }
2522
2523 IntegerLiteral AllocationSizeLiteral(
2524 Context, AllocationSize.value_or(llvm::APInt::getZero(SizeTyWidth)),
2525 SizeTy, StartLoc);
2526 // Otherwise, if we failed to constant-fold the allocation size, we'll
2527 // just give up and pass-in something opaque, that isn't a null pointer.
2528 OpaqueValueExpr OpaqueAllocationSize(StartLoc, SizeTy, VK_PRValue,
2529 OK_Ordinary, /*SourceExpr=*/nullptr);
2530
2531 // Let's synthesize the alignment argument in case we will need it.
2532 // Since we *really* want to allocate these on stack, this is slightly ugly
2533 // because there might not be a `std::align_val_t` type.
2535 QualType AlignValT =
2536 StdAlignValT ? Context.getCanonicalTagType(StdAlignValT) : SizeTy;
2537 IntegerLiteral AlignmentLiteral(
2538 Context,
2539 llvm::APInt(Context.getTypeSize(SizeTy),
2540 Alignment / Context.getCharWidth()),
2541 SizeTy, StartLoc);
2542 ImplicitCastExpr DesiredAlignment(ImplicitCastExpr::OnStack, AlignValT,
2543 CK_IntegralCast, &AlignmentLiteral,
2545
2546 // Adjust placement args by prepending conjured size and alignment exprs.
2548 CallArgs.reserve(NumImplicitArgs + PlacementArgs.size());
2549 CallArgs.emplace_back(AllocationSize
2550 ? static_cast<Expr *>(&AllocationSizeLiteral)
2551 : &OpaqueAllocationSize);
2553 CallArgs.emplace_back(&DesiredAlignment);
2554 llvm::append_range(CallArgs, PlacementArgs);
2555
2556 DiagnoseSentinelCalls(OperatorNew, PlacementLParen, CallArgs);
2557
2558 checkCall(OperatorNew, Proto, /*ThisArg=*/nullptr, CallArgs,
2559 /*IsMemberFunction=*/false, StartLoc, Range, CallType);
2560
2561 // Warn if the type is over-aligned and is being allocated by (unaligned)
2562 // global operator new.
2563 if (PlacementArgs.empty() && !isAlignedAllocation(IAP.PassAlignment) &&
2564 (OperatorNew->isImplicit() ||
2565 (OperatorNew->getBeginLoc().isValid() &&
2566 getSourceManager().isInSystemHeader(OperatorNew->getBeginLoc())))) {
2567 if (Alignment > NewAlignment)
2568 Diag(StartLoc, diag::warn_overaligned_type)
2569 << AllocType
2570 << unsigned(Alignment / Context.getCharWidth())
2571 << unsigned(NewAlignment / Context.getCharWidth());
2572 }
2573 }
2574
2575 // Array 'new' can't have any initializers except empty parentheses.
2576 // Initializer lists are also allowed, in C++11. Rely on the parser for the
2577 // dialect distinction.
2578 if (ArraySize && !isLegalArrayNewInitializer(InitStyle, Initializer,
2580 SourceRange InitRange(Exprs.front()->getBeginLoc(),
2581 Exprs.back()->getEndLoc());
2582 Diag(StartLoc, diag::err_new_array_init_args) << InitRange;
2583 return ExprError();
2584 }
2585
2586 // If we can perform the initialization, and we've not already done so,
2587 // do it now.
2588 if (!AllocType->isDependentType() &&
2590 // The type we initialize is the complete type, including the array bound.
2591 QualType InitType;
2592 if (KnownArraySize)
2593 InitType = Context.getConstantArrayType(
2594 AllocType,
2595 llvm::APInt(Context.getTypeSize(Context.getSizeType()),
2596 *KnownArraySize),
2597 *ArraySize, ArraySizeModifier::Normal, 0);
2598 else if (ArraySize)
2599 InitType = Context.getIncompleteArrayType(AllocType,
2601 else
2602 InitType = AllocType;
2603
2604 bool VariableLengthArrayNew = ArraySize && *ArraySize && !KnownArraySize;
2606 StartLoc, InitType,
2607 VariableLengthArrayNew ? InitializedEntity::NewArrayKind::UnknownLength
2609 InitializationSequence InitSeq(*this, Entity, Kind, Exprs);
2610 ExprResult FullInit = InitSeq.Perform(*this, Entity, Kind, Exprs);
2611 if (FullInit.isInvalid())
2612 return ExprError();
2613
2614 // FullInit is our initializer; strip off CXXBindTemporaryExprs, because
2615 // we don't want the initialized object to be destructed.
2616 // FIXME: We should not create these in the first place.
2617 if (CXXBindTemporaryExpr *Binder =
2618 dyn_cast_or_null<CXXBindTemporaryExpr>(FullInit.get()))
2619 FullInit = Binder->getSubExpr();
2620
2621 Initializer = FullInit.get();
2622
2623 // FIXME: If we have a KnownArraySize, check that the array bound of the
2624 // initializer is no greater than that constant value.
2625
2626 if (ArraySize && !*ArraySize) {
2627 auto *CAT = Context.getAsConstantArrayType(Initializer->getType());
2628 if (CAT) {
2629 // FIXME: Track that the array size was inferred rather than explicitly
2630 // specified.
2631 ArraySize = IntegerLiteral::Create(
2632 Context, CAT->getSize(), Context.getSizeType(), TypeRange.getEnd());
2633 } else {
2634 Diag(TypeRange.getEnd(), diag::err_new_array_size_unknown_from_init)
2635 << Initializer->getSourceRange();
2636 return ExprError();
2637 }
2638 }
2639 }
2640
2641 // Mark the new and delete operators as referenced.
2642 if (OperatorNew) {
2643 if (DiagnoseUseOfDecl(OperatorNew, StartLoc))
2644 return ExprError();
2645 MarkFunctionReferenced(StartLoc, OperatorNew);
2646 }
2647 if (OperatorDelete) {
2648 if (DiagnoseUseOfDecl(OperatorDelete, StartLoc))
2649 return ExprError();
2650 MarkFunctionReferenced(StartLoc, OperatorDelete);
2651 }
2652
2653 // new[] will trigger vector deleting destructor emission if the class has
2654 // virtual destructor for MSVC compatibility. Perform necessary checks.
2655 if (Context.getTargetInfo().emitVectorDeletingDtors(Context.getLangOpts())) {
2656 if (const CXXConstructExpr *CCE =
2657 dyn_cast_or_null<CXXConstructExpr>(Initializer);
2658 CCE && ArraySize) {
2659 CXXRecordDecl *ClassDecl = CCE->getConstructor()->getParent();
2660 // We probably already did this for another new[] with this class so don't
2661 // do it twice.
2662 if (!Context.classMaybeNeedsVectorDeletingDestructor(ClassDecl)) {
2663 auto *Dtor = ClassDecl->getDestructor();
2664 if (Dtor && Dtor->isVirtual() && !Dtor->isDeleted()) {
2665 Context.setClassMaybeNeedsVectorDeletingDestructor(ClassDecl);
2666 if (!Dtor->isDefined() && !Dtor->isInvalidDecl()) {
2667 // Call CheckDestructor if destructor is not defined. This is
2668 // needed to find operators delete and delete[] for vector deleting
2669 // destructor body because new[] will trigger emission of vector
2670 // deleting destructor body even if destructor is defined in another
2671 // translation unit.
2672 ContextRAII SavedContext(*this, Dtor);
2673 CheckDestructor(Dtor);
2674 }
2675 }
2676 }
2677 }
2678 }
2679
2680 return CXXNewExpr::Create(Context, UseGlobal, OperatorNew, OperatorDelete,
2681 IAP, UsualArrayDeleteWantsSize, PlacementArgs,
2682 TypeIdParens, ArraySize, InitStyle, Initializer,
2683 ResultType, AllocTypeInfo, Range, DirectInitRange);
2684}
2685
2687 SourceRange R) {
2688 // C++ 5.3.4p1: "[The] type shall be a complete object type, but not an
2689 // abstract class type or array thereof.
2690 if (AllocType->isFunctionType())
2691 return Diag(Loc, diag::err_bad_new_type)
2692 << AllocType << 0 << R;
2693 else if (AllocType->isReferenceType())
2694 return Diag(Loc, diag::err_bad_new_type)
2695 << AllocType << 1 << R;
2696 else if (!AllocType->isDependentType() &&
2698 Loc, AllocType, diag::err_new_incomplete_or_sizeless_type, R))
2699 return true;
2700 else if (RequireNonAbstractType(Loc, AllocType,
2701 diag::err_allocation_of_abstract_type))
2702 return true;
2703 else if (AllocType->isVariablyModifiedType())
2704 return Diag(Loc, diag::err_variably_modified_new_type)
2705 << AllocType;
2706 else if (AllocType.getAddressSpace() != LangAS::Default &&
2707 !getLangOpts().OpenCLCPlusPlus)
2708 return Diag(Loc, diag::err_address_space_qualified_new)
2709 << AllocType.getUnqualifiedType()
2711
2712 else if (getLangOpts().ObjCAutoRefCount) {
2713 if (const ArrayType *AT = Context.getAsArrayType(AllocType)) {
2714 QualType BaseAllocType = Context.getBaseElementType(AT);
2715 if (BaseAllocType.getObjCLifetime() == Qualifiers::OCL_None &&
2716 BaseAllocType->isObjCLifetimeType())
2717 return Diag(Loc, diag::err_arc_new_array_without_ownership)
2718 << BaseAllocType;
2719 }
2720 }
2721
2722 return false;
2723}
2724
2726 Sema &S, const LookupResult &R, SourceRange Range, ArrayRef<Expr *> Args,
2727 OverloadCandidateSet &Candidates, OverloadCandidateSet *AlignedCandidates,
2728 Expr *AlignArg, bool IncludedMSVCFallback, bool AlignedBeforeUnaligned) {
2729 // If this is an allocation of the form 'new (p) X' for some object
2730 // pointer p (or an expression that will decay to such a pointer),
2731 // diagnose the reason for the error.
2732 if (!R.isClassLookup() && Args.size() == 2 &&
2733 (Args[1]->getType()->isObjectPointerType() ||
2734 Args[1]->getType()->isArrayType())) {
2735 const QualType Arg1Type = Args[1]->getType();
2736 QualType UnderlyingType = S.Context.getBaseElementType(Arg1Type);
2737 if (UnderlyingType->isPointerType())
2738 UnderlyingType = UnderlyingType->getPointeeType();
2739 if (UnderlyingType.isConstQualified()) {
2740 S.Diag(Args[1]->getExprLoc(),
2741 diag::err_placement_new_into_const_qualified_storage)
2742 << Arg1Type << Args[1]->getSourceRange();
2743 return;
2744 }
2745 S.Diag(R.getNameLoc(), diag::err_need_header_before_placement_new)
2746 << R.getLookupName() << Range;
2747 // Listing the candidates is unlikely to be useful; skip it.
2748 return;
2749 }
2750
2751 // Finish checking all candidates before we note any. This checking can
2752 // produce additional diagnostics so can't be interleaved with our
2753 // emission of notes.
2754 //
2755 // For an aligned allocation, separately check the aligned and unaligned
2756 // candidates with their respective argument lists.
2759 llvm::SmallVector<Expr *, 4> AlignedArgs;
2760 if (AlignedCandidates) {
2761 auto IsAligned = [](OverloadCandidate &C) {
2762 const unsigned AlignArgOffset = 1;
2763 return C.Function->getNumParams() > AlignArgOffset &&
2764 C.Function->getParamDecl(AlignArgOffset)->getType()->isAlignValT();
2765 };
2766 auto IsUnaligned = [&](OverloadCandidate &C) { return !IsAligned(C); };
2767
2768 AlignedArgs.reserve(Args.size() + 1);
2769 AlignedArgs.push_back(Args[0]);
2770 AlignedArgs.push_back(AlignArg);
2771 AlignedArgs.append(Args.begin() + 1, Args.end());
2772 AlignedCands = AlignedCandidates->CompleteCandidates(
2773 S, OCD_AllCandidates, AlignedArgs, R.getNameLoc(), IsAligned);
2774
2775 Cands = Candidates.CompleteCandidates(S, OCD_AllCandidates, Args,
2776 R.getNameLoc(), IsUnaligned);
2777 } else {
2778 Cands = Candidates.CompleteCandidates(S, OCD_AllCandidates, Args,
2779 R.getNameLoc());
2780 }
2781
2782 S.Diag(R.getNameLoc(), diag::err_ovl_no_viable_function_in_call)
2783 << R.getLookupName() << Range;
2784 if (AlignedCandidates && AlignedBeforeUnaligned)
2785 AlignedCandidates->NoteCandidates(S, AlignedArgs, AlignedCands, "",
2786 R.getNameLoc());
2787 Candidates.NoteCandidates(S, Args, Cands, "", R.getNameLoc());
2788 if (AlignedCandidates && !AlignedBeforeUnaligned)
2789 AlignedCandidates->NoteCandidates(S, AlignedArgs, AlignedCands, "",
2790 R.getNameLoc());
2791 if (IncludedMSVCFallback)
2792 S.Diag(R.getNameLoc(), diag::note_ovl_ms_allocation_fallback_failed)
2793 << Range;
2794}
2795
2798 Sema &S, const LookupResult &BaseLookup, SourceRange Range,
2799 ImplicitAllocationArguments &AllocationArgs, MultiExprArg TrialArguments,
2800 FunctionDecl *&Operator, OverloadCandidateSet &Candidates, bool Diagnose) {
2801 std::optional<LookupResult> MSVCFallback;
2802 const LookupResult &LocalLookup =
2803 AllocationArgs.updateLookupForMSVCCompatibility(S, BaseLookup,
2804 MSVCFallback);
2805
2806 bool ArgumentListIsTypeAware =
2808
2809 for (LookupResult::iterator Alloc = LocalLookup.begin(),
2810 AllocEnd = LocalLookup.end();
2811 Alloc != AllocEnd; ++Alloc) {
2812 // Even member operator new/delete are implicitly treated as
2813 // static, so don't use AddMemberCandidate.
2814 NamedDecl *D = (*Alloc)->getUnderlyingDecl();
2815 bool CandidateIsTypeAware =
2817 if (CandidateIsTypeAware != ArgumentListIsTypeAware)
2818 continue;
2819
2820 if (FunctionTemplateDecl *FnTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
2821 S.AddTemplateOverloadCandidate(FnTemplate, Alloc.getPair(),
2822 /*ExplicitTemplateArgs=*/nullptr,
2823 TrialArguments, Candidates,
2824 /*SuppressUserConversions=*/false);
2825 continue;
2826 }
2827
2829 S.AddOverloadCandidate(Fn, Alloc.getPair(), TrialArguments, Candidates,
2830 /*SuppressUserConversions=*/false);
2831 }
2832
2833 // Do the resolution.
2835 switch (Candidates.BestViableFunction(S, LocalLookup.getNameLoc(), Best)) {
2836 case OR_Success: {
2837 FunctionDecl *FnDecl = Best->Function;
2838 if (S.CheckAllocationAccess(LocalLookup.getNameLoc(), Range,
2839 LocalLookup.getNamingClass(),
2840 Best->FoundDecl) == Sema::AR_inaccessible)
2842
2843 Operator = FnDecl;
2845 }
2846
2849
2850 case OR_Ambiguous:
2851 if (Diagnose) {
2852 Candidates.NoteCandidates(
2853 PartialDiagnosticAt(LocalLookup.getNameLoc(),
2854 S.PDiag(diag::err_ovl_ambiguous_call)
2855 << LocalLookup.getLookupName() << Range),
2856 S, OCD_AmbiguousCandidates, TrialArguments);
2857 }
2859
2860 case OR_Deleted: {
2861 if (Diagnose)
2862 S.DiagnoseUseOfDeletedFunction(LocalLookup.getNameLoc(), Range,
2863 LocalLookup.getLookupName(), Candidates,
2864 Best->Function, TrialArguments);
2866 }
2867 }
2868 llvm_unreachable("Unreachable, bad result from BestViableFunction");
2869}
2870
2872
2874 LookupResult &FoundDelete,
2875 DeallocLookupMode Mode,
2876 DeclarationName Name) {
2879 // We're going to remove either the typed or the non-typed
2880 bool RemoveTypedDecl = Mode == DeallocLookupMode::Untyped;
2881 LookupResult::Filter Filter = FoundDelete.makeFilter();
2882 while (Filter.hasNext()) {
2883 FunctionDecl *FD = Filter.next()->getUnderlyingDecl()->getAsFunction();
2884 if (FD->isTypeAwareOperatorNewOrDelete() == RemoveTypedDecl)
2885 Filter.erase();
2886 }
2887 Filter.done();
2888 }
2889}
2890
2891static void
2893 SourceRange Range,
2894 AllocationArgumentSet &ArgumentCandidates,
2895 ArrayRef<Expr *> PlacementArguments) {
2896 ImplicitAllocationArguments *UnalignedArgumentList = nullptr;
2897 ImplicitAllocationArguments *AlignedArgumentList = nullptr;
2898 bool IncludedMSVCFallback = false;
2899 bool AlignedBeforeUnaligned = true;
2900 for (ImplicitAllocationArguments &AllocationArguments : ArgumentCandidates) {
2901 if (AllocationArguments.IsMSVCCompatibilityFallback) {
2902 IncludedMSVCFallback = true;
2903 continue;
2904 }
2905 if (AllocationArguments.PassTypeIdentity == TypeAwareAllocationMode::Yes)
2906 continue;
2907 if (AllocationArguments.PassAlignment == AlignedAllocationMode::Yes) {
2908 AlignedArgumentList = &AllocationArguments;
2909 AlignedBeforeUnaligned = !UnalignedArgumentList;
2910 } else {
2911 UnalignedArgumentList = &AllocationArguments;
2912 }
2913 }
2914 if (!UnalignedArgumentList)
2915 return;
2916
2917 // We re-resolve the rejected candidates for diagnostics rather than requiring
2918 // them to be tracked during the initial resolution path. This both simplifies
2919 // the resolution logic, and helps with performance.
2920 auto Rerun = [&](ImplicitAllocationArguments &ArgumentList,
2921 OverloadCandidateSet &Candidates,
2923 assert(!ArgumentList.IsMSVCCompatibilityFallback);
2924 llvm::append_range(Args, ArgumentList.getImplicitArguments());
2925 llvm::append_range(Args, PlacementArguments);
2926 FunctionDecl *Unused = nullptr;
2927 resolveAllocationOverload(SemaRef, R, Range, ArgumentList, Args, Unused,
2928 Candidates, /*Diagnose=*/false);
2929 };
2930 std::optional<OverloadCandidateSet> AlignedCandidates;
2931 Expr *AlignArg = nullptr;
2932 if (AlignedArgumentList) {
2933 AlignedCandidates.emplace(R.getNameLoc(), OverloadCandidateSet::CSK_Normal);
2934 SmallVector<Expr *, 4> AlignedArgs;
2935 Rerun(*AlignedArgumentList, *AlignedCandidates, AlignedArgs);
2936 AlignArg = AlignedArgumentList->getAlignmentArgument();
2937 }
2938 OverloadCandidateSet UnalignedCandidates(R.getNameLoc(),
2940 SmallVector<Expr *, 4> UnalignedArgs;
2941 Rerun(*UnalignedArgumentList, UnalignedCandidates, UnalignedArgs);
2943 SemaRef, R, Range, UnalignedArgs, UnalignedCandidates,
2944 AlignedCandidates ? &*AlignedCandidates : nullptr, AlignArg,
2945 IncludedMSVCFallback, AlignedBeforeUnaligned);
2946}
2947
2948Expr *Sema::tryGetTypeIdentityArgument(QualType Type, SourceLocation Loc) {
2949 if (auto Found = AllocationTypeIdentityArguments.find(Type);
2950 Found != AllocationTypeIdentityArguments.end())
2951 return Found->second;
2952
2953 QualType TypeIdentity = tryBuildStdTypeIdentity(Type, Loc);
2954 if (TypeIdentity.isNull() ||
2955 RequireCompleteType(Loc, TypeIdentity, diag::err_incomplete_type))
2956 return nullptr;
2957
2958 Expr *TypeIdentityArgument =
2959 new (Context) CXXScalarValueInitExpr(TypeIdentity, nullptr, Loc);
2960 AllocationTypeIdentityArguments.insert({Type, TypeIdentityArgument});
2961 return TypeIdentityArgument;
2962}
2963
2964ImplicitAllocationArguments::ImplicitAllocationArguments(
2965 Sema &SemaRef, Expr *TypeIdentityArg, Expr *SizeArg, Expr *AlignArg,
2966 bool IsMSVCCompatibilityFallback)
2967 : PassTypeIdentity(typeAwareAllocationModeFromBool(TypeIdentityArg)),
2968 PassAlignment(alignedAllocationModeFromBool(AlignArg)),
2969 IsMSVCCompatibilityFallback(IsMSVCCompatibilityFallback),
2970 ArgumentCount(0) {
2971 if (TypeIdentityArg) {
2972 assert(SemaRef.isStdTypeIdentity(TypeIdentityArg->getType(), nullptr));
2973 ImplicitArguments[ArgumentCount++] = TypeIdentityArg;
2974 }
2975 assert(SizeArg);
2976 [[maybe_unused]] ASTContext &Ctx = SemaRef.getASTContext();
2977 assert(Ctx.hasSameType(SizeArg->getType(), Ctx.getSizeType()));
2978 ImplicitArguments[ArgumentCount++] = SizeArg;
2979 if (AlignArg) {
2980 assert(AlignArg->getType()->isAlignValT());
2981 ImplicitArguments[ArgumentCount++] = AlignArg;
2982 }
2983}
2984
2985const LookupResult &
2987 Sema &S, const LookupResult &BaseLookup,
2988 std::optional<LookupResult> &Buffer) const {
2990 return BaseLookup;
2991 // MSVC will fall back on trying to find a matching global operator new
2992 // if operator new[] cannot be found. Also, MSVC will leak by not
2993 // generating a call to operator delete or operator delete[], but we
2994 // will not replicate that bug.
2995 // FIXME: Find out how this interacts with the std::align_val_t fallback
2996 // once MSVC implements it.
2997 LookupResult &Fallback = Buffer.emplace(LookupResult::Temporary, BaseLookup);
2999 // FIXME: This will give bad diagnostics pointing at the wrong functions.
3001 return Fallback;
3002}
3003
3004std::optional<AllocationArgumentSet>
3005Sema::resolveAllocationArguments(LookupResult &R,
3007 ArrayRef<Expr *> PlacementArguments) {
3008 // FIXME: Should Sema create per-callsite versions expressions so they can be
3009 // reused during codegen? This would likely create yet another case where we
3010 // need to serialize information, however it would ensure identical arguments
3011 // between Sema and CodeGen.
3012 if (!AllocationSizeExpr) {
3014 QualType SizeTy = Context.getSizeType();
3015 unsigned SizeTyWidth = Context.getTypeSize(SizeTy);
3016 AllocationSizeExpr = IntegerLiteral::Create(
3017 Context, llvm::APInt::getZero(SizeTyWidth), SizeTy, SourceLocation());
3018 }
3019 if (!AllocationAlignmentExpr) {
3022 QualType AlignValT = Context.getCanonicalTagType(StdAlignValT);
3023 AllocationAlignmentExpr = new (Context)
3024 CXXScalarValueInitExpr(AlignValT, nullptr, SourceLocation());
3025 }
3026 }
3027
3028 AllocationArgumentSet FoundArguments;
3030 Expr *TypeIdentityArgument =
3031 tryGetTypeIdentityArgument(IAP.Type, R.getNameLoc());
3032 if (!TypeIdentityArgument)
3033 return std::nullopt;
3034
3035 Expr *AlignmentExpr = AllocationAlignmentExpr;
3036 if (!PlacementArguments.empty() &&
3037 PlacementArguments.front()->getType()->isAlignValT())
3038 AlignmentExpr = nullptr;
3039 FoundArguments.push_back(ImplicitAllocationArguments(
3040 *this, TypeIdentityArgument, AllocationSizeExpr, AlignmentExpr,
3041 /*IsMSVCCompatibilityFallback=*/false));
3042 }
3043
3044 ImplicitAllocationArguments UnalignedArguments(
3045 *this, /*TypeIdentityArg=*/nullptr, AllocationSizeExpr,
3046 /*AlignArg=*/nullptr, /*IsMSVCCompatibilityFallback=*/false);
3047 ImplicitAllocationArguments AlignedArguments(
3048 *this, /*TypeIdentityArg=*/nullptr, AllocationSizeExpr,
3049 AllocationAlignmentExpr, /*IsMSVCCompatibilityFallback=*/false);
3050
3051 // C++20 [expr.new]p18:
3052 // If no matching function is found then
3053 // — if the allocated object type has new-extended alignment, the
3054 // alignment argument is removed from the argument list;
3055 // — otherwise, an argument that is the type’s alignment and has type
3056 // std::align_val_t is added into the argument list immediately after
3057 // the first argument;
3058 // and then overload resolution is performed again.
3060 FoundArguments.push_back(AlignedArguments);
3061 FoundArguments.push_back(UnalignedArguments);
3063 AllocationAlignmentExpr && getLangOpts().AlignedAllocation)
3064 FoundArguments.push_back(AlignedArguments);
3065
3066 // The MSVC global fallback path
3067 if (getLangOpts().MSVCCompat &&
3068 R.getLookupName().getCXXOverloadedOperator() == OO_Array_New)
3069 FoundArguments.push_back(ImplicitAllocationArguments(
3070 *this, /*TypeIdentityArg=*/nullptr, AllocationSizeExpr,
3071 /*AlignArg=*/nullptr, /*IsMSVCCompatibilityFallback=*/true));
3072 return FoundArguments;
3073}
3074
3075std::optional<ResolvedAllocation>
3077 AllocationFunctionScope NewScope,
3078 AllocationFunctionScope DeleteScope,
3079 QualType AllocType, bool IsArray,
3080 const ImplicitAllocationParameters &RequestedIAP,
3081 MultiExprArg PlaceArgs, bool Diagnose) {
3082 // --- Choosing an allocation function ---
3083 // C++ 5.3.4p8 - 14 & 18
3084 // 1) If looking in AllocationFunctionScope::Global scope for allocation
3085 // functions, only look in
3086 // the global scope. Else, if AllocationFunctionScope::Class, only look in
3087 // the scope of the allocated class. If AllocationFunctionScope::Both, look
3088 // in both.
3089 // 2) If an array size is given, look for operator new[], else look for
3090 // operator new.
3091 // 3) The first argument is always size_t. Append the arguments from the
3092 // placement form.
3093
3094 // C++ [expr.new]p8:
3095 // If the allocated type is a non-array type, the allocation
3096 // function's name is operator new and the deallocation function's
3097 // name is operator delete. If the allocated type is an array
3098 // type, the allocation function's name is operator new[] and the
3099 // deallocation function's name is operator delete[].
3100 DeclarationName NewName = Context.DeclarationNames.getCXXOperatorName(
3101 IsArray ? OO_Array_New : OO_New);
3102
3103 QualType AllocElemType = Context.getBaseElementType(AllocType);
3104
3105 ResolvedAllocation Result = {/*OperatorNew=*/nullptr,
3106 /*OperatorDelete=*/nullptr,
3107 RequestedIAP,
3108 {}};
3109
3110 // Find the allocation function.
3111 {
3112 LookupResult R(*this, NewName, StartLoc, LookupOrdinaryName);
3113
3114 // C++1z [expr.new]p9:
3115 // If the new-expression begins with a unary :: operator, the allocation
3116 // function's name is looked up in the global scope. Otherwise, if the
3117 // allocated type is a class type T or array thereof, the allocation
3118 // function's name is looked up in the scope of T.
3119 if (AllocElemType->isRecordType() &&
3121 LookupQualifiedName(R, AllocElemType->getAsCXXRecordDecl());
3122
3123 // We can see ambiguity here if the allocation function is found in
3124 // multiple base classes.
3125 if (R.isAmbiguous())
3126 return std::nullopt;
3127
3128 // If this lookup fails to find the name, or if the allocated type is not
3129 // a class type, the allocation function's name is looked up in the
3130 // global scope.
3131 if (R.empty()) {
3132 if (NewScope == AllocationFunctionScope::Class)
3133 return std::nullopt;
3134
3135 LookupQualifiedName(R, Context.getTranslationUnitDecl());
3136 }
3137
3138 if (getLangOpts().OpenCLCPlusPlus && R.empty()) {
3139 if (PlaceArgs.empty()) {
3140 Diag(StartLoc, diag::err_openclcxx_not_supported) << "default new";
3141 } else {
3142 Diag(StartLoc, diag::err_openclcxx_placement_new);
3143 }
3144 return std::nullopt;
3145 }
3146
3147 assert(!R.empty() && "implicitly declared allocation functions not found");
3148 assert(!R.isAmbiguous() && "global allocation functions are ambiguous");
3149
3150 // We do our own custom access checks below.
3151 R.suppressDiagnostics();
3152
3153 std::optional<AllocationArgumentSet> ArgumentListCandidates =
3154 resolveAllocationArguments(R, RequestedIAP, PlaceArgs);
3155 if (!ArgumentListCandidates)
3156 return std::nullopt;
3157
3158 for (ImplicitAllocationArguments &ArgumentList : *ArgumentListCandidates) {
3159 SmallVector<Expr *, 4> TrialArguments(
3160 ArgumentList.getImplicitArguments());
3161 llvm::append_range(TrialArguments, PlaceArgs);
3162 OverloadCandidateSet OverloadCandidates(R.getNameLoc(),
3164 FunctionDecl *Operator = nullptr;
3165 switch (resolveAllocationOverload(*this, R, Range, ArgumentList,
3166 TrialArguments, Operator,
3167 OverloadCandidates, Diagnose)) {
3169 return std::nullopt;
3171 continue;
3173 Result.OperatorNew = Operator;
3174 Result.IAP.PassTypeIdentity = ArgumentList.PassTypeIdentity;
3175 Result.IAP.PassAlignment = ArgumentList.PassAlignment;
3176 Result.Arguments = std::move(TrialArguments);
3177 goto foundCandidate;
3178 }
3179 }
3180 if (Diagnose)
3181 DiagnoseAllocationLookupFailure(*this, R, Range, *ArgumentListCandidates,
3182 PlaceArgs);
3183 return std::nullopt;
3184 }
3185foundCandidate:
3186 FunctionDecl *OperatorNew = Result.OperatorNew;
3187
3188 // We don't need an operator delete if we're running under -fno-exceptions.
3189 if (!getLangOpts().Exceptions)
3190 return Result;
3191
3192 // Note, the name of OperatorNew might have been changed from array to
3193 // non-array by resolveAllocationOverload.
3194 DeclarationName DeleteName = Context.DeclarationNames.getCXXOperatorName(
3195 OperatorNew->getDeclName().getCXXOverloadedOperator() == OO_Array_New
3196 ? OO_Array_Delete
3197 : OO_Delete);
3198
3199 // C++ [expr.new]p19:
3200 //
3201 // If the new-expression begins with a unary :: operator, the
3202 // deallocation function's name is looked up in the global
3203 // scope. Otherwise, if the allocated type is a class type T or an
3204 // array thereof, the deallocation function's name is looked up in
3205 // the scope of T. If this lookup fails to find the name, or if
3206 // the allocated type is not a class type or array thereof, the
3207 // deallocation function's name is looked up in the global scope.
3208 LookupResult FoundDelete(*this, DeleteName, StartLoc, LookupOrdinaryName);
3209 if (AllocElemType->isRecordType() &&
3210 DeleteScope != AllocationFunctionScope::Global) {
3211 auto *RD = AllocElemType->castAsCXXRecordDecl();
3212 LookupQualifiedName(FoundDelete, RD);
3213 }
3214 if (FoundDelete.isAmbiguous())
3215 return std::nullopt; // FIXME: clean up expressions?
3216
3217 // Filter out any destroying operator deletes. We can't possibly call such a
3218 // function in this context, because we're handling the case where the object
3219 // was not successfully constructed.
3220 // FIXME: This is not covered by the language rules yet.
3221 {
3222 LookupResult::Filter Filter = FoundDelete.makeFilter();
3223 while (Filter.hasNext()) {
3224 auto *FD = dyn_cast<FunctionDecl>(Filter.next()->getUnderlyingDecl());
3225 if (FD && FD->isDestroyingOperatorDelete())
3226 Filter.erase();
3227 }
3228 Filter.done();
3229 }
3230
3231 auto GetRedeclContext = [](Decl *D) {
3232 return D->getDeclContext()->getRedeclContext();
3233 };
3234
3235 DeclContext *OperatorNewContext = GetRedeclContext(OperatorNew);
3236
3237 bool FoundGlobalDelete = FoundDelete.empty();
3238 bool IsClassScopedTypeAwareNew =
3239 isTypeAwareAllocation(Result.IAP.PassTypeIdentity) &&
3240 OperatorNewContext->isRecord();
3241 auto DiagnoseMissingTypeAwareCleanupOperator = [&](bool IsPlacementOperator) {
3242 assert(isTypeAwareAllocation(Result.IAP.PassTypeIdentity));
3243 if (Diagnose) {
3244 Diag(StartLoc, diag::err_mismatching_type_aware_cleanup_deallocator)
3245 << OperatorNew->getDeclName() << IsPlacementOperator << DeleteName;
3246 Diag(OperatorNew->getLocation(), diag::note_type_aware_operator_declared)
3247 << OperatorNew->isTypeAwareOperatorNewOrDelete()
3248 << OperatorNew->getDeclName() << OperatorNewContext;
3249 }
3250 };
3251 if (IsClassScopedTypeAwareNew && FoundDelete.empty()) {
3252 DiagnoseMissingTypeAwareCleanupOperator(/*isPlacementNew=*/false);
3253 return std::nullopt;
3254 }
3255 if (FoundDelete.empty()) {
3256 FoundDelete.clear(LookupOrdinaryName);
3257
3258 if (DeleteScope == AllocationFunctionScope::Class)
3259 return std::nullopt;
3260
3262 DeallocLookupMode LookupMode =
3266 LookupGlobalDeallocationFunctions(*this, StartLoc, FoundDelete, LookupMode,
3267 DeleteName);
3268 }
3269
3270 FoundDelete.suppressDiagnostics();
3271
3273
3274 // Whether we're looking for a placement operator delete is dictated
3275 // by whether we selected a placement operator new, not by whether
3276 // we had explicit placement arguments. This matters for things like
3277 // struct A { void *operator new(size_t, int = 0); ... };
3278 // A *a = new A()
3279 //
3280 // We don't have any definition for what a "placement allocation function"
3281 // is, but we assume it's any allocation function whose
3282 // parameter-declaration-clause is anything other than (size_t).
3283 //
3284 // FIXME: Should (size_t, std::align_val_t) also be considered non-placement?
3285 // This affects whether an exception from the constructor of an overaligned
3286 // type uses the sized or non-sized form of aligned operator delete.
3287
3288 unsigned NonPlacementNewArgCount = 1; // size parameter
3289 if (isTypeAwareAllocation(Result.IAP.PassTypeIdentity))
3290 NonPlacementNewArgCount =
3291 /* type-identity */ 1 + /* size */ 1 + /* alignment */ 1;
3292 bool isPlacementNew = !PlaceArgs.empty() ||
3293 OperatorNew->param_size() != NonPlacementNewArgCount ||
3294 OperatorNew->isVariadic();
3295
3296 if (isPlacementNew) {
3297 // C++ [expr.new]p20:
3298 // A declaration of a placement deallocation function matches the
3299 // declaration of a placement allocation function if it has the
3300 // same number of parameters and, after parameter transformations
3301 // (8.3.5), all parameter types except the first are
3302 // identical. [...]
3303 //
3304 // To perform this comparison, we compute the function type that
3305 // the deallocation function should have, and use that type both
3306 // for template argument deduction and for comparison purposes.
3307 QualType ExpectedFunctionType;
3308 {
3309 auto *Proto = OperatorNew->getType()->castAs<FunctionProtoType>();
3310
3311 SmallVector<QualType, 6> ArgTypes;
3312 int InitialParamOffset = 0;
3313 if (isTypeAwareAllocation(Result.IAP.PassTypeIdentity)) {
3314 ArgTypes.push_back(Result.Arguments.front()->getType());
3315 InitialParamOffset = 1;
3316 }
3317 ArgTypes.push_back(Context.VoidPtrTy);
3318 for (unsigned I = ArgTypes.size() - InitialParamOffset,
3319 N = Proto->getNumParams();
3320 I < N; ++I)
3321 ArgTypes.push_back(Proto->getParamType(I));
3322
3324 // FIXME: This is not part of the standard's rule.
3325 EPI.Variadic = Proto->isVariadic();
3326
3327 ExpectedFunctionType
3328 = Context.getFunctionType(Context.VoidTy, ArgTypes, EPI);
3329 }
3330
3331 for (LookupResult::iterator D = FoundDelete.begin(),
3332 DEnd = FoundDelete.end();
3333 D != DEnd; ++D) {
3334 FunctionDecl *Fn = nullptr;
3335 if (FunctionTemplateDecl *FnTmpl =
3336 dyn_cast<FunctionTemplateDecl>((*D)->getUnderlyingDecl())) {
3337 // Perform template argument deduction to try to match the
3338 // expected function type.
3339 TemplateDeductionInfo Info(StartLoc);
3340 if (DeduceTemplateArguments(FnTmpl, nullptr, ExpectedFunctionType, Fn,
3342 continue;
3343 } else
3344 Fn = cast<FunctionDecl>((*D)->getUnderlyingDecl());
3345
3346 if (Context.hasSameType(adjustCCAndNoReturn(Fn->getType(),
3347 ExpectedFunctionType,
3348 /*AdjustExcpetionSpec*/true),
3349 ExpectedFunctionType))
3350 Matches.push_back(std::make_pair(D.getPair(), Fn));
3351 }
3352
3353 if (getLangOpts().CUDA)
3354 CUDA().EraseUnwantedMatches(getCurFunctionDecl(/*AllowLambda=*/true),
3355 Matches);
3356 if (Matches.empty() && isTypeAwareAllocation(Result.IAP.PassTypeIdentity)) {
3357 DiagnoseMissingTypeAwareCleanupOperator(isPlacementNew);
3358 return std::nullopt;
3359 }
3360 } else {
3361 // C++1y [expr.new]p22:
3362 // For a non-placement allocation function, the normal deallocation
3363 // function lookup is used
3364 //
3365 // Per [expr.delete]p10, this lookup prefers a member operator delete
3366 // without a size_t argument, but prefers a non-member operator delete
3367 // with a size_t where possible (which it always is in this case).
3370 AllocElemType, RequestedIAP.PassTypeIdentity,
3372 hasNewExtendedAlignment(*this, AllocElemType)),
3373 sizedDeallocationModeFromBool(FoundGlobalDelete)};
3374 UsualDeallocFnInfo Selected = resolveDeallocationOverload(
3375 *this, FoundDelete, IDP, StartLoc, &BestDeallocFns);
3376 if (Selected && BestDeallocFns.empty())
3377 Matches.push_back(std::make_pair(Selected.Found, Selected.FD));
3378 else {
3379 // If we failed to select an operator, all remaining functions are viable
3380 // but ambiguous.
3381 for (auto Fn : BestDeallocFns)
3382 Matches.push_back(std::make_pair(Fn.Found, Fn.FD));
3383 }
3384 }
3385
3386 // C++ [expr.new]p20:
3387 // [...] If the lookup finds a single matching deallocation
3388 // function, that function will be called; otherwise, no
3389 // deallocation function will be called.
3390 if (Matches.size() == 1) {
3391 Result.OperatorDelete = Matches[0].second;
3392 FunctionDecl *OperatorDelete = Result.OperatorDelete;
3393 DeclContext *OperatorDeleteContext = GetRedeclContext(OperatorDelete);
3394 bool FoundTypeAwareOperator =
3395 OperatorDelete->isTypeAwareOperatorNewOrDelete() ||
3396 OperatorNew->isTypeAwareOperatorNewOrDelete();
3397 if (Diagnose && FoundTypeAwareOperator) {
3398 bool MismatchedTypeAwareness =
3399 OperatorDelete->isTypeAwareOperatorNewOrDelete() !=
3400 OperatorNew->isTypeAwareOperatorNewOrDelete();
3401 bool MismatchedContext = OperatorDeleteContext != OperatorNewContext;
3402 if (MismatchedTypeAwareness || MismatchedContext) {
3403 FunctionDecl *Operators[] = {OperatorDelete, OperatorNew};
3404 bool TypeAwareOperatorIndex =
3405 OperatorNew->isTypeAwareOperatorNewOrDelete();
3406 Diag(StartLoc, diag::err_mismatching_type_aware_cleanup_deallocator)
3407 << Operators[TypeAwareOperatorIndex]->getDeclName()
3408 << isPlacementNew
3409 << Operators[!TypeAwareOperatorIndex]->getDeclName()
3410 << GetRedeclContext(Operators[TypeAwareOperatorIndex]);
3411 Diag(OperatorNew->getLocation(),
3412 diag::note_type_aware_operator_declared)
3413 << OperatorNew->isTypeAwareOperatorNewOrDelete()
3414 << OperatorNew->getDeclName() << OperatorNewContext;
3415 Diag(OperatorDelete->getLocation(),
3416 diag::note_type_aware_operator_declared)
3417 << OperatorDelete->isTypeAwareOperatorNewOrDelete()
3418 << OperatorDelete->getDeclName() << OperatorDeleteContext;
3419 }
3420 }
3421
3422 // C++1z [expr.new]p23:
3423 // If the lookup finds a usual deallocation function (3.7.4.2)
3424 // with a parameter of type std::size_t and that function, considered
3425 // as a placement deallocation function, would have been
3426 // selected as a match for the allocation function, the program
3427 // is ill-formed.
3428 if (getLangOpts().CPlusPlus11 && isPlacementNew &&
3429 isNonPlacementDeallocationFunction(*this, OperatorDelete)) {
3430 UsualDeallocFnInfo Info(*this,
3431 DeclAccessPair::make(OperatorDelete, AS_public),
3432 AllocElemType, StartLoc);
3433 // Core issue, per mail to core reflector, 2016-10-09:
3434 // If this is a member operator delete, and there is a corresponding
3435 // non-sized member operator delete, this isn't /really/ a sized
3436 // deallocation function, it just happens to have a size_t parameter.
3437 bool IsSizedDelete = isSizedDeallocation(Info.IDP.PassSize);
3438 if (IsSizedDelete && !FoundGlobalDelete) {
3439 ImplicitDeallocationParameters SizeTestingIDP = {
3440 AllocElemType, Info.IDP.PassTypeIdentity, Info.IDP.PassAlignment,
3442 auto NonSizedDelete = resolveDeallocationOverload(
3443 *this, FoundDelete, SizeTestingIDP, StartLoc);
3444 if (NonSizedDelete &&
3445 !isSizedDeallocation(NonSizedDelete.IDP.PassSize) &&
3446 NonSizedDelete.IDP.PassAlignment == Info.IDP.PassAlignment)
3447 IsSizedDelete = false;
3448 }
3449
3450 if (IsSizedDelete &&
3451 !isTypeAwareAllocation(Result.IAP.PassTypeIdentity)) {
3452 SourceRange R = PlaceArgs.empty()
3453 ? SourceRange()
3454 : SourceRange(PlaceArgs.front()->getBeginLoc(),
3455 PlaceArgs.back()->getEndLoc());
3456 Diag(StartLoc, diag::err_placement_new_non_placement_delete) << R;
3457 if (!OperatorDelete->isImplicit())
3458 Diag(OperatorDelete->getLocation(), diag::note_previous_decl)
3459 << DeleteName;
3460 }
3461 }
3462 if (CheckDeleteOperator(*this, StartLoc, Range, Diagnose,
3463 FoundDelete.getNamingClass(), Matches[0].first,
3464 Matches[0].second))
3465 return std::nullopt;
3466
3467 } else if (!Matches.empty()) {
3468 // We found multiple suitable operators. Per [expr.new]p20, that means we
3469 // call no 'operator delete' function, but we should at least warn the user.
3470 // FIXME: Suppress this warning if the construction cannot throw.
3471 Diag(StartLoc, diag::warn_ambiguous_suitable_delete_function_found)
3472 << DeleteName << AllocElemType;
3473
3474 for (auto &Match : Matches)
3475 Diag(Match.second->getLocation(),
3476 diag::note_member_declared_here) << DeleteName;
3477 }
3478
3479 return Result;
3480}
3481
3484 return;
3485
3486 // The implicitly declared new and delete operators
3487 // are not supported in OpenCL.
3488 if (getLangOpts().OpenCLCPlusPlus)
3489 return;
3490
3491 // C++ [basic.stc.dynamic.general]p2:
3492 // The library provides default definitions for the global allocation
3493 // and deallocation functions. Some global allocation and deallocation
3494 // functions are replaceable ([new.delete]); these are attached to the
3495 // global module ([module.unit]).
3496 if (getLangOpts().CPlusPlusModules && getCurrentModule())
3497 PushGlobalModuleFragment(SourceLocation());
3498
3499 // C++ [basic.std.dynamic]p2:
3500 // [...] The following allocation and deallocation functions (18.4) are
3501 // implicitly declared in global scope in each translation unit of a
3502 // program
3503 //
3504 // C++03:
3505 // void* operator new(std::size_t) throw(std::bad_alloc);
3506 // void* operator new[](std::size_t) throw(std::bad_alloc);
3507 // void operator delete(void*) throw();
3508 // void operator delete[](void*) throw();
3509 // C++11:
3510 // void* operator new(std::size_t);
3511 // void* operator new[](std::size_t);
3512 // void operator delete(void*) noexcept;
3513 // void operator delete[](void*) noexcept;
3514 // C++1y:
3515 // void* operator new(std::size_t);
3516 // void* operator new[](std::size_t);
3517 // void operator delete(void*) noexcept;
3518 // void operator delete[](void*) noexcept;
3519 // void operator delete(void*, std::size_t) noexcept;
3520 // void operator delete[](void*, std::size_t) noexcept;
3521 //
3522 // These implicit declarations introduce only the function names operator
3523 // new, operator new[], operator delete, operator delete[].
3524 //
3525 // Here, we need to refer to std::bad_alloc, so we will implicitly declare
3526 // "std" or "bad_alloc" as necessary to form the exception specification.
3527 // However, we do not make these implicit declarations visible to name
3528 // lookup.
3529 if (!StdBadAlloc && !getLangOpts().CPlusPlus11) {
3530 // The "std::bad_alloc" class has not yet been declared, so build it
3531 // implicitly.
3535 &PP.getIdentifierTable().get("bad_alloc"), nullptr);
3536 getStdBadAlloc()->setImplicit(true);
3537
3538 // The implicitly declared "std::bad_alloc" should live in global module
3539 // fragment.
3540 if (TheGlobalModuleFragment) {
3543 getStdBadAlloc()->setLocalOwningModule(TheGlobalModuleFragment);
3544 }
3545 }
3546 if (!StdAlignValT && getLangOpts().AlignedAllocation) {
3547 // The "std::align_val_t" enum class has not yet been declared, so build it
3548 // implicitly.
3549 auto *AlignValT = EnumDecl::Create(
3551 &PP.getIdentifierTable().get("align_val_t"), nullptr, true, true, true);
3552
3553 // The implicitly declared "std::align_val_t" should live in global module
3554 // fragment.
3555 if (TheGlobalModuleFragment) {
3556 AlignValT->setModuleOwnershipKind(
3558 AlignValT->setLocalOwningModule(TheGlobalModuleFragment);
3559 }
3560
3561 AlignValT->setIntegerType(Context.getSizeType());
3562 AlignValT->setPromotionType(Context.getSizeType());
3563 AlignValT->setImplicit(true);
3564
3565 // Add to the std namespace so that the module merger can find it via
3566 // noload_lookup and merge it with the module's explicit definition.
3567 // We want the created EnumDecl to be available for redeclaration lookups,
3568 // but not for regular name lookups (same pattern as
3569 // getOrCreateStdNamespace).
3570 getOrCreateStdNamespace()->addDecl(AlignValT);
3571
3572 StdAlignValT = AlignValT;
3573 }
3574
3576
3577 QualType VoidPtr = Context.getPointerType(Context.VoidTy);
3578 QualType SizeT = Context.getSizeType();
3579
3580 auto DeclareGlobalAllocationFunctions = [&](OverloadedOperatorKind Kind,
3581 QualType Return, QualType Param) {
3583 Params.push_back(Param);
3584
3585 // Create up to four variants of the function (sized/aligned).
3586 bool HasSizedVariant = getLangOpts().SizedDeallocation &&
3587 (Kind == OO_Delete || Kind == OO_Array_Delete);
3588 bool HasAlignedVariant = getLangOpts().AlignedAllocation;
3589
3590 int NumSizeVariants = (HasSizedVariant ? 2 : 1);
3591 int NumAlignVariants = (HasAlignedVariant ? 2 : 1);
3592 for (int Sized = 0; Sized < NumSizeVariants; ++Sized) {
3593 if (Sized)
3594 Params.push_back(SizeT);
3595
3596 for (int Aligned = 0; Aligned < NumAlignVariants; ++Aligned) {
3597 if (Aligned)
3598 Params.push_back(Context.getCanonicalTagType(getStdAlignValT()));
3599
3601 Context.DeclarationNames.getCXXOperatorName(Kind), Return, Params);
3602
3603 if (Aligned)
3604 Params.pop_back();
3605 }
3606 }
3607 };
3608
3609 DeclareGlobalAllocationFunctions(OO_New, VoidPtr, SizeT);
3610 DeclareGlobalAllocationFunctions(OO_Array_New, VoidPtr, SizeT);
3611 DeclareGlobalAllocationFunctions(OO_Delete, Context.VoidTy, VoidPtr);
3612 DeclareGlobalAllocationFunctions(OO_Array_Delete, Context.VoidTy, VoidPtr);
3613
3614 if (getLangOpts().CPlusPlusModules && getCurrentModule())
3615 PopGlobalModuleFragment();
3616}
3617
3618/// DeclareGlobalAllocationFunction - Declares a single implicit global
3619/// allocation function if it doesn't already exist.
3621 QualType Return,
3622 ArrayRef<QualType> Params) {
3623 DeclContext *GlobalCtx = Context.getTranslationUnitDecl();
3624
3625 // Check if this function is already declared.
3626 DeclContext::lookup_result R = GlobalCtx->lookup(Name);
3627 for (DeclContext::lookup_iterator Alloc = R.begin(), AllocEnd = R.end();
3628 Alloc != AllocEnd; ++Alloc) {
3629 // Only look at non-template functions, as it is the predefined,
3630 // non-templated allocation function we are trying to declare here.
3631 if (FunctionDecl *Func = dyn_cast<FunctionDecl>(*Alloc)) {
3632 if (Func->getNumParams() == Params.size()) {
3633 if (std::equal(Func->param_begin(), Func->param_end(), Params.begin(),
3634 Params.end(), [&](ParmVarDecl *D, QualType RT) {
3635 return Context.hasSameUnqualifiedType(D->getType(),
3636 RT);
3637 })) {
3638 // Make the function visible to name lookup, even if we found it in
3639 // an unimported module. It either is an implicitly-declared global
3640 // allocation function, or is suppressing that function.
3641 Func->setVisibleDespiteOwningModule();
3642 return;
3643 }
3644 }
3645 }
3646 }
3647
3649 Context.getTargetInfo().getDefaultCallingConv());
3650
3651 QualType BadAllocType;
3652 bool HasBadAllocExceptionSpec = Name.isAnyOperatorNew();
3653 if (HasBadAllocExceptionSpec) {
3654 if (!getLangOpts().CPlusPlus11) {
3655 BadAllocType = Context.getCanonicalTagType(getStdBadAlloc());
3656 assert(StdBadAlloc && "Must have std::bad_alloc declared");
3658 EPI.ExceptionSpec.Exceptions = llvm::ArrayRef(BadAllocType);
3659 }
3660 if (getLangOpts().NewInfallible) {
3662 }
3663 } else {
3664 EPI.ExceptionSpec =
3666 }
3667
3668 auto CreateAllocationFunctionDecl = [&](Attr *ExtraAttr) {
3669 // The MSVC STL has explicit cdecl on its (host-side) allocation function
3670 // specializations for the allocation, so in order to prevent a CC clash
3671 // we use the host's CC, if available, or CC_C as a fallback, for the
3672 // host-side implicit decls, knowing these do not get emitted when compiling
3673 // for device.
3674 if (getLangOpts().CUDAIsDevice && ExtraAttr &&
3675 isa<CUDAHostAttr>(ExtraAttr) &&
3676 Context.getTargetInfo().getTriple().isSPIRV()) {
3677 if (auto *ATI = Context.getAuxTargetInfo())
3678 EPI.ExtInfo = EPI.ExtInfo.withCallingConv(ATI->getDefaultCallingConv());
3679 else
3681 }
3682 QualType FnType = Context.getFunctionType(Return, Params, EPI);
3684 Context, GlobalCtx, SourceLocation(), SourceLocation(), Name, FnType,
3685 /*TInfo=*/nullptr, SC_None, getCurFPFeatures().isFPConstrained(), false,
3686 true);
3687 Alloc->setImplicit();
3688 // Global allocation functions should always be visible.
3689 Alloc->setVisibleDespiteOwningModule();
3690
3691 if (HasBadAllocExceptionSpec && getLangOpts().NewInfallible &&
3692 !getLangOpts().CheckNew)
3693 Alloc->addAttr(
3694 ReturnsNonNullAttr::CreateImplicit(Context, Alloc->getLocation()));
3695
3696 // C++ [basic.stc.dynamic.general]p2:
3697 // The library provides default definitions for the global allocation
3698 // and deallocation functions. Some global allocation and deallocation
3699 // functions are replaceable ([new.delete]); these are attached to the
3700 // global module ([module.unit]).
3701 //
3702 // In the language wording, these functions are attched to the global
3703 // module all the time. But in the implementation, the global module
3704 // is only meaningful when we're in a module unit. So here we attach
3705 // these allocation functions to global module conditionally.
3706 if (TheGlobalModuleFragment) {
3707 Alloc->setModuleOwnershipKind(
3709 Alloc->setLocalOwningModule(TheGlobalModuleFragment);
3710 }
3711
3712 if (LangOpts.hasGlobalAllocationFunctionVisibility())
3713 Alloc->addAttr(VisibilityAttr::CreateImplicit(
3714 Context, LangOpts.hasHiddenGlobalAllocationFunctionVisibility()
3715 ? VisibilityAttr::Hidden
3716 : LangOpts.hasProtectedGlobalAllocationFunctionVisibility()
3717 ? VisibilityAttr::Protected
3718 : VisibilityAttr::Default));
3719
3721 for (QualType T : Params) {
3722 ParamDecls.push_back(ParmVarDecl::Create(
3723 Context, Alloc, SourceLocation(), SourceLocation(), nullptr, T,
3724 /*TInfo=*/nullptr, SC_None, nullptr));
3725 ParamDecls.back()->setImplicit();
3726 }
3727 Alloc->setParams(ParamDecls);
3728 if (ExtraAttr)
3729 Alloc->addAttr(ExtraAttr);
3731 Context.getTranslationUnitDecl()->addDecl(Alloc);
3732 IdResolver.tryAddTopLevelDecl(Alloc, Name);
3733 };
3734
3735 if (!LangOpts.CUDA)
3736 CreateAllocationFunctionDecl(nullptr);
3737 else {
3738 // Host and device get their own declaration so each can be
3739 // defined or re-declared independently.
3740 CreateAllocationFunctionDecl(CUDAHostAttr::CreateImplicit(Context));
3741 CreateAllocationFunctionDecl(CUDADeviceAttr::CreateImplicit(Context));
3742 }
3743}
3744
3748 DeclarationName Name, bool Diagnose) {
3750
3751 LookupResult FoundDelete(*this, Name, StartLoc, LookupOrdinaryName);
3752 LookupGlobalDeallocationFunctions(*this, StartLoc, FoundDelete,
3754
3755 // FIXME: It's possible for this to result in ambiguity, through a
3756 // user-declared variadic operator delete or the enable_if attribute. We
3757 // should probably not consider those cases to be usual deallocation
3758 // functions. But for now we just make an arbitrary choice in that case.
3759 auto Result = resolveDeallocationOverload(*this, FoundDelete, IDP, StartLoc);
3760 if (!Result)
3761 return nullptr;
3762
3763 if (CheckDeleteOperator(*this, StartLoc, StartLoc, Diagnose,
3764 FoundDelete.getNamingClass(), Result.Found,
3765 Result.FD))
3766 return nullptr;
3767
3768 assert(Result.FD && "operator delete missing from global scope?");
3769 return Result.FD;
3770}
3771
3773 SourceLocation Loc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal,
3774 DeclarationName Name) {
3775
3776 FunctionDecl *OperatorDelete = nullptr;
3777 CanQualType DeallocType = Context.getCanonicalTagType(RD);
3781
3782 if (!LookForGlobal) {
3783 if (FindDeallocationFunction(Loc, RD, Name, OperatorDelete, IDP, Diagnose))
3784 return nullptr;
3785
3786 if (OperatorDelete)
3787 return OperatorDelete;
3788 }
3789
3790 // If there's no class-specific operator delete, look up the global
3791 // non-array delete.
3793 hasNewExtendedAlignment(*this, DeallocType));
3795 return FindUsualDeallocationFunction(Loc, IDP, Name, Diagnose);
3796}
3797
3799 DeclarationName Name,
3800 FunctionDecl *&Operator,
3802 bool Diagnose) {
3803 LookupResult Found(*this, Name, StartLoc, LookupOrdinaryName);
3804 // Try to find operator delete/operator delete[] in class scope.
3806
3807 if (Found.isAmbiguous()) {
3808 if (!Diagnose)
3809 Found.suppressDiagnostics();
3810 return true;
3811 }
3812
3813 Found.suppressDiagnostics();
3814
3816 hasNewExtendedAlignment(*this, Context.getCanonicalTagType(RD)))
3818
3819 // C++17 [expr.delete]p10:
3820 // If the deallocation functions have class scope, the one without a
3821 // parameter of type std::size_t is selected.
3823 resolveDeallocationOverload(*this, Found, IDP, StartLoc, &Matches);
3824
3825 // If we could find an overload, use it.
3826 if (Matches.size() == 1) {
3827 Operator = cast<CXXMethodDecl>(Matches[0].FD);
3828 return CheckDeleteOperator(*this, StartLoc, StartLoc, Diagnose,
3829 Found.getNamingClass(), Matches[0].Found,
3830 Operator);
3831 }
3832
3833 // We found multiple suitable operators; complain about the ambiguity.
3834 // FIXME: The standard doesn't say to do this; it appears that the intent
3835 // is that this should never happen.
3836 if (!Matches.empty()) {
3837 if (Diagnose) {
3838 Diag(StartLoc, diag::err_ambiguous_suitable_delete_member_function_found)
3839 << Name << RD;
3840 for (auto &Match : Matches)
3841 Diag(Match.FD->getLocation(), diag::note_member_declared_here) << Name;
3842 }
3843 return true;
3844 }
3845
3846 // We did find operator delete/operator delete[] declarations, but
3847 // none of them were suitable.
3848 if (!Found.empty()) {
3849 if (Diagnose) {
3850 Diag(StartLoc, diag::err_no_suitable_delete_member_function_found)
3851 << Name << RD;
3852
3853 for (NamedDecl *D : Found)
3854 Diag(D->getUnderlyingDecl()->getLocation(),
3855 diag::note_member_declared_here) << Name;
3856 }
3857 return true;
3858 }
3859
3860 Operator = nullptr;
3861 return false;
3862}
3863
3864namespace {
3865/// Checks whether delete-expression, and new-expression used for
3866/// initializing deletee have the same array form.
3867class MismatchingNewDeleteDetector {
3868public:
3869 enum MismatchResult {
3870 /// Indicates that there is no mismatch or a mismatch cannot be proven.
3871 NoMismatch,
3872 /// Indicates that variable is initialized with mismatching form of \a new.
3873 VarInitMismatches,
3874 /// Indicates that member is initialized with mismatching form of \a new.
3875 MemberInitMismatches,
3876 /// Indicates that 1 or more constructors' definitions could not been
3877 /// analyzed, and they will be checked again at the end of translation unit.
3878 AnalyzeLater
3879 };
3880
3881 /// \param EndOfTU True, if this is the final analysis at the end of
3882 /// translation unit. False, if this is the initial analysis at the point
3883 /// delete-expression was encountered.
3884 explicit MismatchingNewDeleteDetector(bool EndOfTU)
3885 : Field(nullptr), IsArrayForm(false), EndOfTU(EndOfTU),
3886 HasUndefinedConstructors(false) {}
3887
3888 /// Checks whether pointee of a delete-expression is initialized with
3889 /// matching form of new-expression.
3890 ///
3891 /// If return value is \c VarInitMismatches or \c MemberInitMismatches at the
3892 /// point where delete-expression is encountered, then a warning will be
3893 /// issued immediately. If return value is \c AnalyzeLater at the point where
3894 /// delete-expression is seen, then member will be analyzed at the end of
3895 /// translation unit. \c AnalyzeLater is returned iff at least one constructor
3896 /// couldn't be analyzed. If at least one constructor initializes the member
3897 /// with matching type of new, the return value is \c NoMismatch.
3898 MismatchResult analyzeDeleteExpr(const CXXDeleteExpr *DE);
3899 /// Analyzes a class member.
3900 /// \param Field Class member to analyze.
3901 /// \param DeleteWasArrayForm Array form-ness of the delete-expression used
3902 /// for deleting the \p Field.
3903 MismatchResult analyzeField(FieldDecl *Field, bool DeleteWasArrayForm);
3904 FieldDecl *Field;
3905 /// List of mismatching new-expressions used for initialization of the pointee
3906 llvm::SmallVector<const CXXNewExpr *, 4> NewExprs;
3907 /// Indicates whether delete-expression was in array form.
3908 bool IsArrayForm;
3909
3910private:
3911 const bool EndOfTU;
3912 /// Indicates that there is at least one constructor without body.
3913 bool HasUndefinedConstructors;
3914 /// Returns \c CXXNewExpr from given initialization expression.
3915 /// \param E Expression used for initializing pointee in delete-expression.
3916 /// E can be a single-element \c InitListExpr consisting of new-expression.
3917 const CXXNewExpr *getNewExprFromInitListOrExpr(const Expr *E);
3918 /// Returns whether member is initialized with mismatching form of
3919 /// \c new either by the member initializer or in-class initialization.
3920 ///
3921 /// If bodies of all constructors are not visible at the end of translation
3922 /// unit or at least one constructor initializes member with the matching
3923 /// form of \c new, mismatch cannot be proven, and this function will return
3924 /// \c NoMismatch.
3925 MismatchResult analyzeMemberExpr(const MemberExpr *ME);
3926 /// Returns whether variable is initialized with mismatching form of
3927 /// \c new.
3928 ///
3929 /// If variable is initialized with matching form of \c new or variable is not
3930 /// initialized with a \c new expression, this function will return true.
3931 /// If variable is initialized with mismatching form of \c new, returns false.
3932 /// \param D Variable to analyze.
3933 bool hasMatchingVarInit(const DeclRefExpr *D);
3934 /// Checks whether the constructor initializes pointee with mismatching
3935 /// form of \c new.
3936 ///
3937 /// Returns true, if member is initialized with matching form of \c new in
3938 /// member initializer list. Returns false, if member is initialized with the
3939 /// matching form of \c new in this constructor's initializer or given
3940 /// constructor isn't defined at the point where delete-expression is seen, or
3941 /// member isn't initialized by the constructor.
3942 bool hasMatchingNewInCtor(const CXXConstructorDecl *CD);
3943 /// Checks whether member is initialized with matching form of
3944 /// \c new in member initializer list.
3945 bool hasMatchingNewInCtorInit(const CXXCtorInitializer *CI);
3946 /// Checks whether member is initialized with mismatching form of \c new by
3947 /// in-class initializer.
3948 MismatchResult analyzeInClassInitializer();
3949};
3950}
3951
3952MismatchingNewDeleteDetector::MismatchResult
3953MismatchingNewDeleteDetector::analyzeDeleteExpr(const CXXDeleteExpr *DE) {
3954 NewExprs.clear();
3955 assert(DE && "Expected delete-expression");
3956 IsArrayForm = DE->isArrayForm();
3957 const Expr *E = DE->getArgument()->IgnoreParenImpCasts();
3958 if (const MemberExpr *ME = dyn_cast<const MemberExpr>(E)) {
3959 return analyzeMemberExpr(ME);
3960 } else if (const DeclRefExpr *D = dyn_cast<const DeclRefExpr>(E)) {
3961 if (!hasMatchingVarInit(D))
3962 return VarInitMismatches;
3963 }
3964 return NoMismatch;
3965}
3966
3967const CXXNewExpr *
3968MismatchingNewDeleteDetector::getNewExprFromInitListOrExpr(const Expr *E) {
3969 assert(E != nullptr && "Expected a valid initializer expression");
3970 E = E->IgnoreParenImpCasts();
3971 if (const InitListExpr *ILE = dyn_cast<const InitListExpr>(E)) {
3972 if (ILE->getNumInits() == 1)
3973 E = dyn_cast<const CXXNewExpr>(ILE->getInit(0)->IgnoreParenImpCasts());
3974 }
3975
3976 return dyn_cast_or_null<const CXXNewExpr>(E);
3977}
3978
3979bool MismatchingNewDeleteDetector::hasMatchingNewInCtorInit(
3980 const CXXCtorInitializer *CI) {
3981 const CXXNewExpr *NE = nullptr;
3982 if (Field == CI->getMember() &&
3983 (NE = getNewExprFromInitListOrExpr(CI->getInit()))) {
3984 if (NE->isArray() == IsArrayForm)
3985 return true;
3986 else
3987 NewExprs.push_back(NE);
3988 }
3989 return false;
3990}
3991
3992bool MismatchingNewDeleteDetector::hasMatchingNewInCtor(
3993 const CXXConstructorDecl *CD) {
3994 if (CD->isImplicit())
3995 return false;
3996 const FunctionDecl *Definition = CD;
3998 HasUndefinedConstructors = true;
3999 return EndOfTU;
4000 }
4001 for (const auto *CI : cast<const CXXConstructorDecl>(Definition)->inits()) {
4002 if (hasMatchingNewInCtorInit(CI))
4003 return true;
4004 }
4005 return false;
4006}
4007
4008MismatchingNewDeleteDetector::MismatchResult
4009MismatchingNewDeleteDetector::analyzeInClassInitializer() {
4010 assert(Field != nullptr && "This should be called only for members");
4011 const Expr *InitExpr = Field->getInClassInitializer();
4012 if (!InitExpr)
4013 return EndOfTU ? NoMismatch : AnalyzeLater;
4014 if (const CXXNewExpr *NE = getNewExprFromInitListOrExpr(InitExpr)) {
4015 if (NE->isArray() != IsArrayForm) {
4016 NewExprs.push_back(NE);
4017 return MemberInitMismatches;
4018 }
4019 }
4020 return NoMismatch;
4021}
4022
4023MismatchingNewDeleteDetector::MismatchResult
4024MismatchingNewDeleteDetector::analyzeField(FieldDecl *Field,
4025 bool DeleteWasArrayForm) {
4026 assert(Field != nullptr && "Analysis requires a valid class member.");
4027 this->Field = Field;
4028 IsArrayForm = DeleteWasArrayForm;
4029 const CXXRecordDecl *RD = cast<const CXXRecordDecl>(Field->getParent());
4030 for (const auto *CD : RD->ctors()) {
4031 if (hasMatchingNewInCtor(CD))
4032 return NoMismatch;
4033 }
4034 if (HasUndefinedConstructors)
4035 return EndOfTU ? NoMismatch : AnalyzeLater;
4036 if (!NewExprs.empty())
4037 return MemberInitMismatches;
4038 return Field->hasInClassInitializer() ? analyzeInClassInitializer()
4039 : NoMismatch;
4040}
4041
4042MismatchingNewDeleteDetector::MismatchResult
4043MismatchingNewDeleteDetector::analyzeMemberExpr(const MemberExpr *ME) {
4044 assert(ME != nullptr && "Expected a member expression");
4045 if (FieldDecl *F = dyn_cast<FieldDecl>(ME->getMemberDecl()))
4046 return analyzeField(F, IsArrayForm);
4047 return NoMismatch;
4048}
4049
4050bool MismatchingNewDeleteDetector::hasMatchingVarInit(const DeclRefExpr *D) {
4051 const CXXNewExpr *NE = nullptr;
4052 if (const VarDecl *VD = dyn_cast<const VarDecl>(D->getDecl())) {
4053 if (VD->hasInit() && (NE = getNewExprFromInitListOrExpr(VD->getInit())) &&
4054 NE->isArray() != IsArrayForm) {
4055 NewExprs.push_back(NE);
4056 }
4057 }
4058 return NewExprs.empty();
4059}
4060
4061static void
4063 const MismatchingNewDeleteDetector &Detector) {
4064 SourceLocation EndOfDelete = SemaRef.getLocForEndOfToken(DeleteLoc);
4065 FixItHint H;
4066 if (!Detector.IsArrayForm)
4067 H = FixItHint::CreateInsertion(EndOfDelete, "[]");
4068 else {
4070 DeleteLoc, tok::l_square, SemaRef.getSourceManager(),
4071 SemaRef.getLangOpts(), true);
4072 if (RSquare.isValid())
4073 H = FixItHint::CreateRemoval(SourceRange(EndOfDelete, RSquare));
4074 }
4075 SemaRef.Diag(DeleteLoc, diag::warn_mismatched_delete_new)
4076 << Detector.IsArrayForm << H;
4077
4078 for (const auto *NE : Detector.NewExprs)
4079 SemaRef.Diag(NE->getExprLoc(), diag::note_allocated_here)
4080 << Detector.IsArrayForm;
4081}
4082
4083void Sema::AnalyzeDeleteExprMismatch(const CXXDeleteExpr *DE) {
4084 if (Diags.isIgnored(diag::warn_mismatched_delete_new, SourceLocation()))
4085 return;
4086 MismatchingNewDeleteDetector Detector(/*EndOfTU=*/false);
4087 switch (Detector.analyzeDeleteExpr(DE)) {
4088 case MismatchingNewDeleteDetector::VarInitMismatches:
4089 case MismatchingNewDeleteDetector::MemberInitMismatches: {
4090 DiagnoseMismatchedNewDelete(*this, DE->getBeginLoc(), Detector);
4091 break;
4092 }
4093 case MismatchingNewDeleteDetector::AnalyzeLater: {
4094 DeleteExprs[Detector.Field].push_back(
4095 std::make_pair(DE->getBeginLoc(), DE->isArrayForm()));
4096 break;
4097 }
4098 case MismatchingNewDeleteDetector::NoMismatch:
4099 break;
4100 }
4101}
4102
4103void Sema::AnalyzeDeleteExprMismatch(FieldDecl *Field, SourceLocation DeleteLoc,
4104 bool DeleteWasArrayForm) {
4105 MismatchingNewDeleteDetector Detector(/*EndOfTU=*/true);
4106 switch (Detector.analyzeField(Field, DeleteWasArrayForm)) {
4107 case MismatchingNewDeleteDetector::VarInitMismatches:
4108 llvm_unreachable("This analysis should have been done for class members.");
4109 case MismatchingNewDeleteDetector::AnalyzeLater:
4110 llvm_unreachable("Analysis cannot be postponed any point beyond end of "
4111 "translation unit.");
4112 case MismatchingNewDeleteDetector::MemberInitMismatches:
4113 DiagnoseMismatchedNewDelete(*this, DeleteLoc, Detector);
4114 break;
4115 case MismatchingNewDeleteDetector::NoMismatch:
4116 break;
4117 }
4118}
4119
4121Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal,
4122 bool ArrayForm, Expr *ExE) {
4123 // C++ [expr.delete]p1:
4124 // The operand shall have a pointer type, or a class type having a single
4125 // non-explicit conversion function to a pointer type. The result has type
4126 // void.
4127 //
4128 // DR599 amends "pointer type" to "pointer to object type" in both cases.
4129
4130 ExprResult Ex = ExE;
4131 FunctionDecl *OperatorDelete = nullptr;
4132 bool ArrayFormAsWritten = ArrayForm;
4133 bool UsualArrayDeleteWantsSize = false;
4134
4135 if (!Ex.get()->isTypeDependent()) {
4136 // Perform lvalue-to-rvalue cast, if needed.
4137 Ex = DefaultLvalueConversion(Ex.get());
4138 if (Ex.isInvalid())
4139 return ExprError();
4140
4141 QualType Type = Ex.get()->getType();
4142
4143 class DeleteConverter : public ContextualImplicitConverter {
4144 public:
4145 DeleteConverter() : ContextualImplicitConverter(false, true) {}
4146
4147 bool match(QualType ConvType) override {
4148 // FIXME: If we have an operator T* and an operator void*, we must pick
4149 // the operator T*.
4150 if (const PointerType *ConvPtrType = ConvType->getAs<PointerType>())
4151 if (ConvPtrType->getPointeeType()->isIncompleteOrObjectType())
4152 return true;
4153 return false;
4154 }
4155
4156 SemaDiagnosticBuilder diagnoseNoMatch(Sema &S, SourceLocation Loc,
4157 QualType T) override {
4158 return S.Diag(Loc, diag::err_delete_operand) << T;
4159 }
4160
4161 SemaDiagnosticBuilder diagnoseIncomplete(Sema &S, SourceLocation Loc,
4162 QualType T) override {
4163 return S.Diag(Loc, diag::err_delete_incomplete_class_type) << T;
4164 }
4165
4166 SemaDiagnosticBuilder diagnoseExplicitConv(Sema &S, SourceLocation Loc,
4167 QualType T,
4168 QualType ConvTy) override {
4169 return S.Diag(Loc, diag::err_delete_explicit_conversion) << T << ConvTy;
4170 }
4171
4172 SemaDiagnosticBuilder noteExplicitConv(Sema &S, CXXConversionDecl *Conv,
4173 QualType ConvTy) override {
4174 return S.Diag(Conv->getLocation(), diag::note_delete_conversion)
4175 << ConvTy;
4176 }
4177
4178 SemaDiagnosticBuilder diagnoseAmbiguous(Sema &S, SourceLocation Loc,
4179 QualType T) override {
4180 return S.Diag(Loc, diag::err_ambiguous_delete_operand) << T;
4181 }
4182
4183 SemaDiagnosticBuilder noteAmbiguous(Sema &S, CXXConversionDecl *Conv,
4184 QualType ConvTy) override {
4185 return S.Diag(Conv->getLocation(), diag::note_delete_conversion)
4186 << ConvTy;
4187 }
4188
4189 SemaDiagnosticBuilder diagnoseConversion(Sema &S, SourceLocation Loc,
4190 QualType T,
4191 QualType ConvTy) override {
4192 llvm_unreachable("conversion functions are permitted");
4193 }
4194 } Converter;
4195
4196 Ex = PerformContextualImplicitConversion(StartLoc, Ex.get(), Converter);
4197 if (Ex.isInvalid())
4198 return ExprError();
4199 Type = Ex.get()->getType();
4200 if (!Converter.match(Type))
4201 // FIXME: PerformContextualImplicitConversion should return ExprError
4202 // itself in this case.
4203 return ExprError();
4204
4206 QualType PointeeElem = Context.getBaseElementType(Pointee);
4207
4208 if (Pointee.getAddressSpace() != LangAS::Default &&
4209 !getLangOpts().OpenCLCPlusPlus)
4210 return Diag(Ex.get()->getBeginLoc(),
4211 diag::err_address_space_qualified_delete)
4212 << Pointee.getUnqualifiedType()
4214
4215 CXXRecordDecl *PointeeRD = nullptr;
4216 if (Pointee->isVoidType() && !isSFINAEContext()) {
4217 // The C++ standard bans deleting a pointer to a non-object type, which
4218 // effectively bans deletion of "void*". However, most compilers support
4219 // this, so we treat it as a warning unless we're in a SFINAE context.
4220 // But we still prohibit this since C++26.
4221 Diag(StartLoc, LangOpts.CPlusPlus26 ? diag::err_delete_incomplete
4222 : diag::ext_delete_void_ptr_operand)
4223 << (LangOpts.CPlusPlus26 ? Pointee : Type)
4224 << Ex.get()->getSourceRange();
4225 } else if (Pointee->isFunctionType() || Pointee->isVoidType() ||
4226 Pointee->isSizelessType()) {
4227 return ExprError(Diag(StartLoc, diag::err_delete_operand)
4228 << Type << Ex.get()->getSourceRange());
4229 } else if (!Pointee->isDependentType()) {
4230 // FIXME: This can result in errors if the definition was imported from a
4231 // module but is hidden.
4232 if (Pointee->isEnumeralType() ||
4233 !RequireCompleteType(StartLoc, Pointee,
4234 LangOpts.CPlusPlus26
4235 ? diag::err_delete_incomplete
4236 : diag::warn_delete_incomplete,
4237 Ex.get())) {
4238 PointeeRD = PointeeElem->getAsCXXRecordDecl();
4239 }
4240 }
4241
4242 if (Pointee->isArrayType() && !ArrayForm) {
4243 Diag(StartLoc, diag::warn_delete_array_type)
4244 << Type << Ex.get()->getSourceRange()
4246 ArrayForm = true;
4247 }
4248
4249 DeclarationName DeleteName = Context.DeclarationNames.getCXXOperatorName(
4250 ArrayForm ? OO_Array_Delete : OO_Delete);
4251
4252 if (PointeeRD) {
4256 if (!UseGlobal &&
4257 FindDeallocationFunction(StartLoc, PointeeRD, DeleteName,
4258 OperatorDelete, IDP))
4259 return ExprError();
4260
4261 // If we're allocating an array of records, check whether the
4262 // usual operator delete[] has a size_t parameter.
4263 if (ArrayForm) {
4264 // If the user specifically asked to use the global allocator,
4265 // we'll need to do the lookup into the class.
4266 if (UseGlobal)
4267 UsualArrayDeleteWantsSize = doesUsualArrayDeleteWantSize(
4268 *this, StartLoc, IDP.PassTypeIdentity, PointeeElem);
4269
4270 // Otherwise, the usual operator delete[] should be the
4271 // function we just found.
4272 else if (isa_and_nonnull<CXXMethodDecl>(OperatorDelete)) {
4273 UsualDeallocFnInfo UDFI(
4274 *this, DeclAccessPair::make(OperatorDelete, AS_public), Pointee,
4275 StartLoc);
4276 UsualArrayDeleteWantsSize = isSizedDeallocation(UDFI.IDP.PassSize);
4277 }
4278 }
4279
4280 if (!PointeeRD->hasIrrelevantDestructor()) {
4281 if (CXXDestructorDecl *Dtor = LookupDestructor(PointeeRD)) {
4282 if (Dtor->isCalledByDelete(OperatorDelete)) {
4283 MarkFunctionReferenced(StartLoc, Dtor);
4284 if (DiagnoseUseOfDecl(Dtor, StartLoc))
4285 return ExprError();
4286 }
4287 }
4288 }
4289
4290 // C++20 [expr.delete]p3: deleting through a static type whose
4291 // destructor is not virtual is only undefined behavior when the
4292 // selected deallocation function is not a destroying operator delete.
4293 // A destroying operator delete takes over destruction of the object,
4294 // so the delete expression never calls the destructor itself.
4295 if (!OperatorDelete || !OperatorDelete->isDestroyingOperatorDelete())
4296 CheckVirtualDtorCall(PointeeRD->getDestructor(), StartLoc,
4297 /*IsDelete=*/true, /*CallCanBeVirtual=*/true,
4298 /*WarnOnNonAbstractTypes=*/!ArrayForm,
4299 SourceLocation());
4300 }
4301
4302 if (!OperatorDelete) {
4303 if (getLangOpts().OpenCLCPlusPlus) {
4304 Diag(StartLoc, diag::err_openclcxx_not_supported) << "default delete";
4305 return ExprError();
4306 }
4307
4308 bool IsComplete = isCompleteType(StartLoc, Pointee);
4309 bool CanProvideSize =
4310 IsComplete && (!ArrayForm || UsualArrayDeleteWantsSize ||
4311 Pointee.isDestructedType());
4312 bool Overaligned = hasNewExtendedAlignment(*this, Pointee);
4313
4314 // Look for a global declaration.
4317 alignedAllocationModeFromBool(Overaligned),
4318 sizedDeallocationModeFromBool(CanProvideSize)};
4319 OperatorDelete = FindUsualDeallocationFunction(StartLoc, IDP, DeleteName);
4320 if (!OperatorDelete)
4321 return ExprError();
4322 }
4323
4324 if (OperatorDelete->isInvalidDecl())
4325 return ExprError();
4326
4327 MarkFunctionReferenced(StartLoc, OperatorDelete);
4328
4329 // Check access and ambiguity of destructor if we're going to call it.
4330 // Note that this is required even for a virtual delete.
4331 bool IsVirtualDelete = false;
4332 if (PointeeRD) {
4333 if (CXXDestructorDecl *Dtor = LookupDestructor(PointeeRD)) {
4334 if (Dtor->isCalledByDelete(OperatorDelete))
4335 CheckDestructorAccess(Ex.get()->getExprLoc(), Dtor,
4336 PDiag(diag::err_access_dtor) << PointeeElem);
4337 IsVirtualDelete = Dtor->isVirtual();
4338 }
4339 }
4340
4341 DiagnoseUseOfDecl(OperatorDelete, StartLoc);
4342
4343 unsigned AddressParamIdx = 0;
4344 if (OperatorDelete->isTypeAwareOperatorNewOrDelete()) {
4345 QualType TypeIdentity = OperatorDelete->getParamDecl(0)->getType();
4346 if (RequireCompleteType(StartLoc, TypeIdentity,
4347 diag::err_incomplete_type))
4348 return ExprError();
4349 AddressParamIdx = 1;
4350 }
4351
4352 // Convert the operand to the type of the first parameter of operator
4353 // delete. This is only necessary if we selected a destroying operator
4354 // delete that we are going to call (non-virtually); converting to void*
4355 // is trivial and left to AST consumers to handle.
4356 QualType ParamType =
4357 OperatorDelete->getParamDecl(AddressParamIdx)->getType();
4358 if (!IsVirtualDelete && !ParamType->getPointeeType()->isVoidType()) {
4359 Qualifiers Qs = Pointee.getQualifiers();
4360 if (Qs.hasCVRQualifiers()) {
4361 // Qualifiers are irrelevant to this conversion; we're only looking
4362 // for access and ambiguity.
4364 QualType Unqual = Context.getPointerType(
4365 Context.getQualifiedType(Pointee.getUnqualifiedType(), Qs));
4366 Ex = ImpCastExprToType(Ex.get(), Unqual, CK_NoOp);
4367 }
4368 Ex = PerformImplicitConversion(Ex.get(), ParamType,
4370 if (Ex.isInvalid())
4371 return ExprError();
4372 }
4373 }
4374
4376 Context.VoidTy, UseGlobal, ArrayForm, ArrayFormAsWritten,
4377 UsualArrayDeleteWantsSize, OperatorDelete, Ex.get(), StartLoc);
4378 AnalyzeDeleteExprMismatch(Result);
4379 return Result;
4380}
4381
4383 bool IsDelete,
4384 FunctionDecl *&Operator) {
4385
4387 IsDelete ? OO_Delete : OO_New);
4388
4389 LookupResult R(S, NewName, TheCall->getBeginLoc(), Sema::LookupOrdinaryName);
4391 assert(!R.empty() && "implicitly declared allocation functions not found");
4392 assert(!R.isAmbiguous() && "global allocation functions are ambiguous");
4393
4394 // We do our own custom access checks below.
4395 R.suppressDiagnostics();
4396
4397 SmallVector<Expr *, 8> Args(TheCall->arguments());
4398 OverloadCandidateSet Candidates(R.getNameLoc(),
4400 for (LookupResult::iterator FnOvl = R.begin(), FnOvlEnd = R.end();
4401 FnOvl != FnOvlEnd; ++FnOvl) {
4402 // Even member operator new/delete are implicitly treated as
4403 // static, so don't use AddMemberCandidate.
4404 NamedDecl *D = (*FnOvl)->getUnderlyingDecl();
4405
4406 if (FunctionTemplateDecl *FnTemplate = dyn_cast<FunctionTemplateDecl>(D)) {
4407 S.AddTemplateOverloadCandidate(FnTemplate, FnOvl.getPair(),
4408 /*ExplicitTemplateArgs=*/nullptr, Args,
4409 Candidates,
4410 /*SuppressUserConversions=*/false);
4411 continue;
4412 }
4413
4415 S.AddOverloadCandidate(Fn, FnOvl.getPair(), Args, Candidates,
4416 /*SuppressUserConversions=*/false);
4417 }
4418
4419 SourceRange Range = TheCall->getSourceRange();
4420
4421 // Do the resolution.
4423 switch (Candidates.BestViableFunction(S, R.getNameLoc(), Best)) {
4424 case OR_Success: {
4425 // Got one!
4426 FunctionDecl *FnDecl = Best->Function;
4427 assert(R.getNamingClass() == nullptr &&
4428 "class members should not be considered");
4429
4431 S.Diag(R.getNameLoc(), diag::err_builtin_operator_new_delete_not_usual)
4432 << (IsDelete ? 1 : 0) << Range;
4433 S.Diag(FnDecl->getLocation(), diag::note_non_usual_function_declared_here)
4434 << R.getLookupName() << FnDecl->getSourceRange();
4435 return true;
4436 }
4437
4438 Operator = FnDecl;
4439 return false;
4440 }
4441
4443 Candidates.NoteCandidates(
4444 PartialDiagnosticAt(R.getNameLoc(),
4445 S.PDiag(diag::err_ovl_no_viable_function_in_call)
4446 << R.getLookupName() << Range),
4447 S, OCD_AllCandidates, Args);
4448 return true;
4449
4450 case OR_Ambiguous:
4451 Candidates.NoteCandidates(
4452 PartialDiagnosticAt(R.getNameLoc(),
4453 S.PDiag(diag::err_ovl_ambiguous_call)
4454 << R.getLookupName() << Range),
4455 S, OCD_AmbiguousCandidates, Args);
4456 return true;
4457
4458 case OR_Deleted:
4459 S.DiagnoseUseOfDeletedFunction(R.getNameLoc(), Range, R.getLookupName(),
4460 Candidates, Best->Function, Args);
4461 return true;
4462 }
4463 llvm_unreachable("Unreachable, bad result from BestViableFunction");
4464}
4465
4466ExprResult Sema::BuiltinOperatorNewDeleteOverloaded(ExprResult TheCallResult,
4467 bool IsDelete) {
4468 CallExpr *TheCall = cast<CallExpr>(TheCallResult.get());
4469 if (!getLangOpts().CPlusPlus) {
4470 Diag(TheCall->getExprLoc(), diag::err_builtin_requires_language)
4471 << (IsDelete ? "__builtin_operator_delete" : "__builtin_operator_new")
4472 << "C++";
4473 return ExprError();
4474 }
4475 // CodeGen assumes it can find the global new and delete to call,
4476 // so ensure that they are declared.
4478
4479 FunctionDecl *OperatorNewOrDelete = nullptr;
4480 if (resolveBuiltinNewDeleteOverload(*this, TheCall, IsDelete,
4481 OperatorNewOrDelete))
4482 return ExprError();
4483 assert(OperatorNewOrDelete && "should be found");
4484
4485 DiagnoseUseOfDecl(OperatorNewOrDelete, TheCall->getExprLoc());
4486 MarkFunctionReferenced(TheCall->getExprLoc(), OperatorNewOrDelete);
4487
4488 TheCall->setType(OperatorNewOrDelete->getReturnType());
4489 for (unsigned i = 0; i != TheCall->getNumArgs(); ++i) {
4490 QualType ParamTy = OperatorNewOrDelete->getParamDecl(i)->getType();
4491 InitializedEntity Entity =
4494 Entity, TheCall->getArg(i)->getBeginLoc(), TheCall->getArg(i));
4495 if (Arg.isInvalid())
4496 return ExprError();
4497 TheCall->setArg(i, Arg.get());
4498 }
4499 auto Callee = dyn_cast<ImplicitCastExpr>(TheCall->getCallee());
4500 assert(Callee && Callee->getCastKind() == CK_BuiltinFnToFnPtr &&
4501 "Callee expected to be implicit cast to a builtin function pointer");
4502 Callee->setType(OperatorNewOrDelete->getType());
4503
4504 return TheCallResult;
4505}
4506
4508 bool IsDelete, bool CallCanBeVirtual,
4509 bool WarnOnNonAbstractTypes,
4510 SourceLocation DtorLoc) {
4511 if (!dtor || dtor->isVirtual() || !CallCanBeVirtual || isUnevaluatedContext())
4512 return;
4513
4514 // C++ [expr.delete]p3:
4515 // In the first alternative (delete object), if the static type of the
4516 // object to be deleted is different from its dynamic type, the static
4517 // type shall be a base class of the dynamic type of the object to be
4518 // deleted and the static type shall have a virtual destructor or the
4519 // behavior is undefined.
4520 //
4521 const CXXRecordDecl *PointeeRD = dtor->getParent();
4522 // Note: a final class cannot be derived from, no issue there
4523 if (!PointeeRD->isPolymorphic() || PointeeRD->hasAttr<FinalAttr>())
4524 return;
4525
4526 // If the superclass is in a system header, there's nothing that can be done.
4527 // The `delete` (where we emit the warning) can be in a system header,
4528 // what matters for this warning is where the deleted type is defined.
4529 if (getSourceManager().isInSystemHeader(PointeeRD->getLocation()))
4530 return;
4531
4532 QualType ClassType = dtor->getFunctionObjectParameterType();
4533 if (PointeeRD->isAbstract()) {
4534 // If the class is abstract, we warn by default, because we're
4535 // sure the code has undefined behavior.
4536 Diag(Loc, diag::warn_delete_abstract_non_virtual_dtor) << (IsDelete ? 0 : 1)
4537 << ClassType;
4538 } else if (WarnOnNonAbstractTypes) {
4539 // Otherwise, if this is not an array delete, it's a bit suspect,
4540 // but not necessarily wrong.
4541 Diag(Loc, diag::warn_delete_non_virtual_dtor) << (IsDelete ? 0 : 1)
4542 << ClassType;
4543 }
4544 if (!IsDelete) {
4545 std::string TypeStr;
4546 ClassType.getAsStringInternal(TypeStr, getPrintingPolicy());
4547 Diag(DtorLoc, diag::note_delete_non_virtual)
4548 << FixItHint::CreateInsertion(DtorLoc, TypeStr + "::");
4549 }
4550}
4551
4553 SourceLocation StmtLoc,
4554 ConditionKind CK) {
4555 ExprResult E =
4556 CheckConditionVariable(cast<VarDecl>(ConditionVar), StmtLoc, CK);
4557 if (E.isInvalid())
4558 return ConditionError();
4559 E = ActOnFinishFullExpr(E.get(), /*DiscardedValue*/ false);
4560 return ConditionResult(*this, ConditionVar, E,
4562}
4563
4565 SourceLocation StmtLoc,
4566 ConditionKind CK) {
4567 if (ConditionVar->isInvalidDecl())
4568 return ExprError();
4569
4570 QualType T = ConditionVar->getType();
4571
4572 // C++ [stmt.select]p2:
4573 // The declarator shall not specify a function or an array.
4574 if (T->isFunctionType())
4575 return ExprError(Diag(ConditionVar->getLocation(),
4576 diag::err_invalid_use_of_function_type)
4577 << ConditionVar->getSourceRange());
4578 else if (T->isArrayType())
4579 return ExprError(Diag(ConditionVar->getLocation(),
4580 diag::err_invalid_use_of_array_type)
4581 << ConditionVar->getSourceRange());
4582
4584 ConditionVar, ConditionVar->getType().getNonReferenceType(), VK_LValue,
4585 ConditionVar->getLocation());
4586
4587 switch (CK) {
4589 return CheckBooleanCondition(StmtLoc, Condition.get());
4590
4592 return CheckBooleanCondition(StmtLoc, Condition.get(), true);
4593
4595 return CheckSwitchCondition(StmtLoc, Condition.get());
4596 }
4597
4598 llvm_unreachable("unexpected condition kind");
4599}
4600
4601ExprResult Sema::CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr) {
4602 // C++11 6.4p4:
4603 // The value of a condition that is an initialized declaration in a statement
4604 // other than a switch statement is the value of the declared variable
4605 // implicitly converted to type bool. If that conversion is ill-formed, the
4606 // program is ill-formed.
4607 // The value of a condition that is an expression is the value of the
4608 // expression, implicitly converted to bool.
4609 //
4610 // C++23 8.5.2p2
4611 // If the if statement is of the form if constexpr, the value of the condition
4612 // is contextually converted to bool and the converted expression shall be
4613 // a constant expression.
4614 //
4615
4617 if (!IsConstexpr || E.isInvalid() || E.get()->isValueDependent())
4618 return E;
4619
4620 E = ActOnFinishFullExpr(E.get(), E.get()->getExprLoc(),
4621 /*DiscardedValue*/ false,
4622 /*IsConstexpr*/ true);
4623 if (E.isInvalid())
4624 return E;
4625
4626 // FIXME: Return this value to the caller so they don't need to recompute it.
4627 llvm::APSInt Cond;
4629 E.get(), &Cond,
4630 diag::err_constexpr_if_condition_expression_is_not_constant);
4631 return E;
4632}
4633
4634bool
4636 // Look inside the implicit cast, if it exists.
4637 if (ImplicitCastExpr *Cast = dyn_cast<ImplicitCastExpr>(From))
4638 From = Cast->getSubExpr();
4639
4640 // A string literal (2.13.4) that is not a wide string literal can
4641 // be converted to an rvalue of type "pointer to char"; a wide
4642 // string literal can be converted to an rvalue of type "pointer
4643 // to wchar_t" (C++ 4.2p2).
4644 if (StringLiteral *StrLit = dyn_cast<StringLiteral>(From->IgnoreParens()))
4645 if (const PointerType *ToPtrType = ToType->getAs<PointerType>())
4646 if (const BuiltinType *ToPointeeType
4647 = ToPtrType->getPointeeType()->getAs<BuiltinType>()) {
4648 // This conversion is considered only when there is an
4649 // explicit appropriate pointer target type (C++ 4.2p2).
4650 if (!ToPtrType->getPointeeType().hasQualifiers()) {
4651 switch (StrLit->getKind()) {
4655 // We don't allow UTF literals to be implicitly converted
4656 break;
4659 return (ToPointeeType->getKind() == BuiltinType::Char_U ||
4660 ToPointeeType->getKind() == BuiltinType::Char_S);
4662 return Context.typesAreCompatible(Context.getWideCharType(),
4663 QualType(ToPointeeType, 0));
4665 assert(false && "Unevaluated string literal in expression");
4666 break;
4667 }
4668 }
4669 }
4670
4671 return false;
4672}
4673
4675 SourceLocation CastLoc,
4676 QualType Ty,
4677 CastKind Kind,
4678 CXXMethodDecl *Method,
4679 DeclAccessPair FoundDecl,
4680 bool HadMultipleCandidates,
4681 Expr *From) {
4682 switch (Kind) {
4683 default: llvm_unreachable("Unhandled cast kind!");
4684 case CK_ConstructorConversion: {
4686 SmallVector<Expr*, 8> ConstructorArgs;
4687
4688 if (S.RequireNonAbstractType(CastLoc, Ty,
4689 diag::err_allocation_of_abstract_type))
4690 return ExprError();
4691
4692 if (S.CompleteConstructorCall(Constructor, Ty, From, CastLoc,
4693 ConstructorArgs))
4694 return ExprError();
4695
4696 S.CheckConstructorAccess(CastLoc, Constructor, FoundDecl,
4698 if (S.DiagnoseUseOfDecl(Method, CastLoc))
4699 return ExprError();
4700
4702 CastLoc, Ty, FoundDecl, cast<CXXConstructorDecl>(Method),
4703 ConstructorArgs, HadMultipleCandidates,
4704 /*ListInit*/ false, /*StdInitListInit*/ false, /*ZeroInit*/ false,
4706 if (Result.isInvalid())
4707 return ExprError();
4708
4709 return S.MaybeBindToTemporary(Result.getAs<Expr>());
4710 }
4711
4712 case CK_UserDefinedConversion: {
4713 assert(!From->getType()->isPointerType() && "Arg can't have pointer type!");
4714
4715 S.CheckMemberOperatorAccess(CastLoc, From, /*arg*/ nullptr, FoundDecl);
4716 if (S.DiagnoseUseOfDecl(Method, CastLoc))
4717 return ExprError();
4718
4719 // Create an implicit call expr that calls it.
4721 ExprResult Result = S.BuildCXXMemberCallExpr(From, FoundDecl, Conv,
4722 HadMultipleCandidates);
4723 if (Result.isInvalid())
4724 return ExprError();
4725 // Record usage of conversion in an implicit cast.
4726 Result = ImplicitCastExpr::Create(S.Context, Result.get()->getType(),
4727 CK_UserDefinedConversion, Result.get(),
4728 nullptr, Result.get()->getValueKind(),
4730
4731 return S.MaybeBindToTemporary(Result.get());
4732 }
4733 }
4734}
4735
4738 const ImplicitConversionSequence &ICS,
4739 AssignmentAction Action,
4741 // C++ [over.match.oper]p7: [...] operands of class type are converted [...]
4743 !From->getType()->isRecordType())
4744 return From;
4745
4746 switch (ICS.getKind()) {
4748 ExprResult Res = PerformImplicitConversion(From, ToType, ICS.Standard,
4749 Action, CCK);
4750 if (Res.isInvalid())
4751 return ExprError();
4752 From = Res.get();
4753 break;
4754 }
4755
4757
4760 QualType BeforeToType;
4761 assert(FD && "no conversion function for user-defined conversion seq");
4762 if (const CXXConversionDecl *Conv = dyn_cast<CXXConversionDecl>(FD)) {
4763 CastKind = CK_UserDefinedConversion;
4764
4765 // If the user-defined conversion is specified by a conversion function,
4766 // the initial standard conversion sequence converts the source type to
4767 // the implicit object parameter of the conversion function.
4768 BeforeToType = Context.getCanonicalTagType(Conv->getParent());
4769 } else {
4771 CastKind = CK_ConstructorConversion;
4772 // Do no conversion if dealing with ... for the first conversion.
4774 // If the user-defined conversion is specified by a constructor, the
4775 // initial standard conversion sequence converts the source type to
4776 // the type required by the argument of the constructor
4777 BeforeToType = Ctor->getParamDecl(0)->getType().getNonReferenceType();
4778 }
4779 }
4780 // Watch out for ellipsis conversion.
4783 From, BeforeToType, ICS.UserDefined.Before,
4785 if (Res.isInvalid())
4786 return ExprError();
4787 From = Res.get();
4788 }
4789
4791 *this, From->getBeginLoc(), ToType.getNonReferenceType(), CastKind,
4794
4795 if (CastArg.isInvalid())
4796 return ExprError();
4797
4798 From = CastArg.get();
4799
4800 // C++ [over.match.oper]p7:
4801 // [...] the second standard conversion sequence of a user-defined
4802 // conversion sequence is not applied.
4804 return From;
4805
4806 return PerformImplicitConversion(From, ToType, ICS.UserDefined.After,
4808 }
4809
4811 ICS.DiagnoseAmbiguousConversion(*this, From->getExprLoc(),
4812 PDiag(diag::err_typecheck_ambiguous_condition)
4813 << From->getSourceRange());
4814 return ExprError();
4815
4818 llvm_unreachable("bad conversion");
4819
4821 AssignConvertType ConvTy =
4822 CheckAssignmentConstraints(From->getExprLoc(), ToType, From->getType());
4823 bool Diagnosed = DiagnoseAssignmentResult(
4826 : ConvTy,
4827 From->getExprLoc(), ToType, From->getType(), From, Action);
4828 assert(Diagnosed && "failed to diagnose bad conversion"); (void)Diagnosed;
4829 return ExprError();
4830 }
4831
4832 // Everything went well.
4833 return From;
4834}
4835
4836// adjustVectorOrConstantMatrixType - Compute the intermediate cast type casting
4837// elements of the from type to the elements of the to type without resizing the
4838// vector or matrix.
4840 QualType FromTy,
4841 QualType ToType,
4842 QualType *ElTy = nullptr) {
4843 QualType ElType = ToType;
4844 if (auto *ToVec = ToType->getAs<VectorType>())
4845 ElType = ToVec->getElementType();
4846 else if (auto *ToMat = ToType->getAs<ConstantMatrixType>())
4847 ElType = ToMat->getElementType();
4848
4849 if (ElTy)
4850 *ElTy = ElType;
4851 if (FromTy->isVectorType()) {
4852 auto *FromVec = FromTy->castAs<VectorType>();
4853 return Context.getExtVectorType(ElType, FromVec->getNumElements());
4854 }
4855 if (FromTy->isConstantMatrixType()) {
4856 auto *FromMat = FromTy->castAs<ConstantMatrixType>();
4857 return Context.getConstantMatrixType(ElType, FromMat->getNumRows(),
4858 FromMat->getNumColumns());
4859 }
4860 return ElType;
4861}
4862
4863/// Check if an integral conversion involves incompatible overflow behavior
4864/// types. Returns true if the conversion is invalid.
4866 QualType ToType, Expr *From) {
4867 const auto *FromOBT = FromType->getAs<OverflowBehaviorType>();
4868 const auto *ToOBT = ToType->getAs<OverflowBehaviorType>();
4869
4870 if (FromOBT && ToOBT &&
4871 FromOBT->getBehaviorKind() != ToOBT->getBehaviorKind()) {
4872 S.Diag(From->getExprLoc(), diag::err_incompatible_obt_kinds_assignment)
4873 << ToType << FromType
4874 << (ToOBT->getBehaviorKind() ==
4875 OverflowBehaviorType::OverflowBehaviorKind::Trap
4876 ? "__ob_trap"
4877 : "__ob_wrap")
4878 << (FromOBT->getBehaviorKind() ==
4879 OverflowBehaviorType::OverflowBehaviorKind::Trap
4880 ? "__ob_trap"
4881 : "__ob_wrap");
4882 return true;
4883 }
4884 return false;
4885}
4886
4889 const StandardConversionSequence& SCS,
4890 AssignmentAction Action,
4892 bool CStyle = (CCK == CheckedConversionKind::CStyleCast ||
4894
4895 // Overall FIXME: we are recomputing too many types here and doing far too
4896 // much extra work. What this means is that we need to keep track of more
4897 // information that is computed when we try the implicit conversion initially,
4898 // so that we don't need to recompute anything here.
4899 QualType FromType = From->getType();
4900
4901 if (SCS.CopyConstructor) {
4902 // FIXME: When can ToType be a reference type?
4903 assert(!ToType->isReferenceType());
4904 if (SCS.Second == ICK_Derived_To_Base) {
4905 SmallVector<Expr*, 8> ConstructorArgs;
4907 cast<CXXConstructorDecl>(SCS.CopyConstructor), ToType, From,
4908 /*FIXME:ConstructLoc*/ SourceLocation(), ConstructorArgs))
4909 return ExprError();
4910 return BuildCXXConstructExpr(
4911 /*FIXME:ConstructLoc*/ SourceLocation(), ToType,
4912 SCS.FoundCopyConstructor, SCS.CopyConstructor, ConstructorArgs,
4913 /*HadMultipleCandidates*/ false,
4914 /*ListInit*/ false, /*StdInitListInit*/ false, /*ZeroInit*/ false,
4916 }
4917 return BuildCXXConstructExpr(
4918 /*FIXME:ConstructLoc*/ SourceLocation(), ToType,
4920 /*HadMultipleCandidates*/ false,
4921 /*ListInit*/ false, /*StdInitListInit*/ false, /*ZeroInit*/ false,
4923 }
4924
4925 // Resolve overloaded function references.
4926 if (Context.hasSameType(FromType, Context.OverloadTy)) {
4929 true, Found);
4930 if (!Fn)
4931 return ExprError();
4932
4933 if (DiagnoseUseOfDecl(Fn, From->getBeginLoc()))
4934 return ExprError();
4935
4937 if (Res.isInvalid())
4938 return ExprError();
4939
4940 // We might get back another placeholder expression if we resolved to a
4941 // builtin.
4942 Res = CheckPlaceholderExpr(Res.get());
4943 if (Res.isInvalid())
4944 return ExprError();
4945
4946 From = Res.get();
4947 FromType = From->getType();
4948 }
4949
4950 // If we're converting to an atomic type, first convert to the corresponding
4951 // non-atomic type.
4952 QualType ToAtomicType;
4953 if (const AtomicType *ToAtomic = ToType->getAs<AtomicType>()) {
4954 ToAtomicType = ToType;
4955 ToType = ToAtomic->getValueType();
4956 }
4957
4958 QualType InitialFromType = FromType;
4959 // Perform the first implicit conversion.
4960 switch (SCS.First) {
4961 case ICK_Identity:
4962 if (const AtomicType *FromAtomic = FromType->getAs<AtomicType>()) {
4963 FromType = FromAtomic->getValueType().getUnqualifiedType();
4964 From = ImplicitCastExpr::Create(Context, FromType, CK_AtomicToNonAtomic,
4965 From, /*BasePath=*/nullptr, VK_PRValue,
4967 }
4968 break;
4969
4970 case ICK_Lvalue_To_Rvalue: {
4971 assert(From->getObjectKind() != OK_ObjCProperty);
4972 ExprResult FromRes = DefaultLvalueConversion(From);
4973 if (FromRes.isInvalid())
4974 return ExprError();
4975
4976 From = FromRes.get();
4977 FromType = From->getType();
4978 break;
4979 }
4980
4982 FromType = Context.getArrayDecayedType(FromType);
4983 From = ImpCastExprToType(From, FromType, CK_ArrayToPointerDecay, VK_PRValue,
4984 /*BasePath=*/nullptr, CCK)
4985 .get();
4986 break;
4987
4989 if (ToType->isArrayParameterType()) {
4990 FromType = Context.getArrayParameterType(FromType);
4991 } else if (FromType->isArrayParameterType()) {
4992 const ArrayParameterType *APT = cast<ArrayParameterType>(FromType);
4993 FromType = APT->getConstantArrayType(Context);
4994 }
4995 From = ImpCastExprToType(From, FromType, CK_HLSLArrayRValue, VK_PRValue,
4996 /*BasePath=*/nullptr, CCK)
4997 .get();
4998 break;
4999
5001 FromType = Context.getPointerType(FromType);
5002 From = ImpCastExprToType(From, FromType, CK_FunctionToPointerDecay,
5003 VK_PRValue, /*BasePath=*/nullptr, CCK)
5004 .get();
5005 break;
5006
5007 default:
5008 llvm_unreachable("Improper first standard conversion");
5009 }
5010
5011 // Perform the second implicit conversion
5012 switch (SCS.Second) {
5013 case ICK_Identity:
5014 // C++ [except.spec]p5:
5015 // [For] assignment to and initialization of pointers to functions,
5016 // pointers to member functions, and references to functions: the
5017 // target entity shall allow at least the exceptions allowed by the
5018 // source value in the assignment or initialization.
5019 switch (Action) {
5022 // Note, function argument passing and returning are initialization.
5027 if (CheckExceptionSpecCompatibility(From, ToType))
5028 return ExprError();
5029 break;
5030
5033 // Casts and implicit conversions are not initialization, so are not
5034 // checked for exception specification mismatches.
5035 break;
5036 }
5037 // Nothing else to do.
5038 break;
5039
5042 QualType ElTy = ToType;
5043 QualType StepTy = ToType;
5044 if (FromType->isVectorType() || ToType->isVectorType() ||
5045 FromType->isConstantMatrixType() || ToType->isConstantMatrixType())
5046 StepTy =
5047 adjustVectorOrConstantMatrixType(Context, FromType, ToType, &ElTy);
5048
5049 // Check for incompatible OBT kinds before converting
5050 if (checkIncompatibleOBTConversion(*this, FromType, StepTy, From))
5051 return ExprError();
5052
5053 if (ElTy->isBooleanType()) {
5054 assert(FromType->castAsEnumDecl()->isFixed() &&
5056 "only enums with fixed underlying type can promote to bool");
5057 From = ImpCastExprToType(From, StepTy, CK_IntegralToBoolean, VK_PRValue,
5058 /*BasePath=*/nullptr, CCK)
5059 .get();
5060 } else {
5061 From = ImpCastExprToType(From, StepTy, CK_IntegralCast, VK_PRValue,
5062 /*BasePath=*/nullptr, CCK)
5063 .get();
5064 }
5065 break;
5066 }
5067
5070 QualType StepTy = ToType;
5071 if (FromType->isVectorType() || ToType->isVectorType() ||
5072 FromType->isConstantMatrixType() || ToType->isConstantMatrixType())
5073 StepTy = adjustVectorOrConstantMatrixType(Context, FromType, ToType);
5074 From = ImpCastExprToType(From, StepTy, CK_FloatingCast, VK_PRValue,
5075 /*BasePath=*/nullptr, CCK)
5076 .get();
5077 break;
5078 }
5079
5082 QualType FromEl = From->getType()->castAs<ComplexType>()->getElementType();
5083 QualType ToEl = ToType->castAs<ComplexType>()->getElementType();
5084 CastKind CK;
5085 if (FromEl->isRealFloatingType()) {
5086 if (ToEl->isRealFloatingType())
5087 CK = CK_FloatingComplexCast;
5088 else
5089 CK = CK_FloatingComplexToIntegralComplex;
5090 } else if (ToEl->isRealFloatingType()) {
5091 CK = CK_IntegralComplexToFloatingComplex;
5092 } else {
5093 CK = CK_IntegralComplexCast;
5094 }
5095 From = ImpCastExprToType(From, ToType, CK, VK_PRValue, /*BasePath=*/nullptr,
5096 CCK)
5097 .get();
5098 break;
5099 }
5100
5101 case ICK_Floating_Integral: {
5102 QualType ElTy = ToType;
5103 QualType StepTy = ToType;
5104 if (FromType->isVectorType() || ToType->isVectorType() ||
5105 FromType->isConstantMatrixType() || ToType->isConstantMatrixType())
5106 StepTy =
5107 adjustVectorOrConstantMatrixType(Context, FromType, ToType, &ElTy);
5108 if (ElTy->isRealFloatingType())
5109 From = ImpCastExprToType(From, StepTy, CK_IntegralToFloating, VK_PRValue,
5110 /*BasePath=*/nullptr, CCK)
5111 .get();
5112 else
5113 From = ImpCastExprToType(From, StepTy, CK_FloatingToIntegral, VK_PRValue,
5114 /*BasePath=*/nullptr, CCK)
5115 .get();
5116 break;
5117 }
5118
5120 assert((FromType->isFixedPointType() || ToType->isFixedPointType()) &&
5121 "Attempting implicit fixed point conversion without a fixed "
5122 "point operand");
5123 if (FromType->isFloatingType())
5124 From = ImpCastExprToType(From, ToType, CK_FloatingToFixedPoint,
5125 VK_PRValue,
5126 /*BasePath=*/nullptr, CCK).get();
5127 else if (ToType->isFloatingType())
5128 From = ImpCastExprToType(From, ToType, CK_FixedPointToFloating,
5129 VK_PRValue,
5130 /*BasePath=*/nullptr, CCK).get();
5131 else if (FromType->isIntegralType(Context))
5132 From = ImpCastExprToType(From, ToType, CK_IntegralToFixedPoint,
5133 VK_PRValue,
5134 /*BasePath=*/nullptr, CCK).get();
5135 else if (ToType->isIntegralType(Context))
5136 From = ImpCastExprToType(From, ToType, CK_FixedPointToIntegral,
5137 VK_PRValue,
5138 /*BasePath=*/nullptr, CCK).get();
5139 else if (ToType->isBooleanType())
5140 From = ImpCastExprToType(From, ToType, CK_FixedPointToBoolean,
5141 VK_PRValue,
5142 /*BasePath=*/nullptr, CCK).get();
5143 else
5144 From = ImpCastExprToType(From, ToType, CK_FixedPointCast,
5145 VK_PRValue,
5146 /*BasePath=*/nullptr, CCK).get();
5147 break;
5148
5150 From = ImpCastExprToType(From, ToType, CK_NoOp, From->getValueKind(),
5151 /*BasePath=*/nullptr, CCK).get();
5152 break;
5153
5156 if (SCS.IncompatibleObjC && Action != AssignmentAction::Casting) {
5157 // Diagnose incompatible Objective-C conversions
5158 if (Action == AssignmentAction::Initializing ||
5160 Diag(From->getBeginLoc(),
5161 diag::ext_typecheck_convert_incompatible_pointer)
5162 << ToType << From->getType() << Action << From->getSourceRange()
5163 << 0;
5164 else
5165 Diag(From->getBeginLoc(),
5166 diag::ext_typecheck_convert_incompatible_pointer)
5167 << From->getType() << ToType << Action << From->getSourceRange()
5168 << 0;
5169
5170 if (From->getType()->isObjCObjectPointerType() &&
5171 ToType->isObjCObjectPointerType())
5173 } else if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers() &&
5174 !ObjC().CheckObjCARCUnavailableWeakConversion(ToType,
5175 From->getType())) {
5176 if (Action == AssignmentAction::Initializing)
5177 Diag(From->getBeginLoc(), diag::err_arc_weak_unavailable_assign);
5178 else
5179 Diag(From->getBeginLoc(), diag::err_arc_convesion_of_weak_unavailable)
5180 << (Action == AssignmentAction::Casting) << From->getType()
5181 << ToType << From->getSourceRange();
5182 }
5183
5184 // Defer address space conversion to the third conversion.
5185 QualType FromPteeType = From->getType()->getPointeeType();
5186 QualType ToPteeType = ToType->getPointeeType();
5187 QualType NewToType = ToType;
5188 if (!FromPteeType.isNull() && !ToPteeType.isNull() &&
5189 FromPteeType.getAddressSpace() != ToPteeType.getAddressSpace()) {
5190 NewToType = Context.removeAddrSpaceQualType(ToPteeType);
5191 NewToType = Context.getAddrSpaceQualType(NewToType,
5192 FromPteeType.getAddressSpace());
5193 if (ToType->isObjCObjectPointerType())
5194 NewToType = Context.getObjCObjectPointerType(NewToType);
5195 else if (ToType->isBlockPointerType())
5196 NewToType = Context.getBlockPointerType(NewToType);
5197 else
5198 NewToType = Context.getPointerType(NewToType);
5199 }
5200
5201 CastKind Kind;
5202 CXXCastPath BasePath;
5203 if (CheckPointerConversion(From, NewToType, Kind, BasePath, CStyle))
5204 return ExprError();
5205
5206 // Make sure we extend blocks if necessary.
5207 // FIXME: doing this here is really ugly.
5208 if (Kind == CK_BlockPointerToObjCPointerCast) {
5209 ExprResult E = From;
5211 From = E.get();
5212 }
5213 if (getLangOpts().allowsNonTrivialObjCLifetimeQualifiers())
5214 ObjC().CheckObjCConversion(SourceRange(), NewToType, From, CCK);
5215 From = ImpCastExprToType(From, NewToType, Kind, VK_PRValue, &BasePath, CCK)
5216 .get();
5217 break;
5218 }
5219
5220 case ICK_Pointer_Member: {
5221 CastKind Kind;
5222 CXXCastPath BasePath;
5224 From->getType(), ToType->castAs<MemberPointerType>(), Kind, BasePath,
5225 From->getExprLoc(), From->getSourceRange(), CStyle,
5228 assert((Kind != CK_NullToMemberPointer ||
5231 "Expr must be null pointer constant!");
5232 break;
5234 break;
5236 llvm_unreachable("unexpected result");
5238 llvm_unreachable("Should not have been called if derivation isn't OK.");
5241 return ExprError();
5242 }
5243 if (CheckExceptionSpecCompatibility(From, ToType))
5244 return ExprError();
5245
5246 From =
5247 ImpCastExprToType(From, ToType, Kind, VK_PRValue, &BasePath, CCK).get();
5248 break;
5249 }
5250
5252 // Perform half-to-boolean conversion via float.
5253 if (From->getType()->isHalfType()) {
5254 From = ImpCastExprToType(From, Context.FloatTy, CK_FloatingCast).get();
5255 FromType = Context.FloatTy;
5256 }
5257 QualType ElTy = FromType;
5258 QualType StepTy = ToType;
5259 if (FromType->isVectorType())
5260 ElTy = FromType->castAs<VectorType>()->getElementType();
5261 else if (FromType->isConstantMatrixType())
5262 ElTy = FromType->castAs<ConstantMatrixType>()->getElementType();
5263 if (getLangOpts().HLSL) {
5264 if (FromType->isVectorType() || ToType->isVectorType() ||
5265 FromType->isConstantMatrixType() || ToType->isConstantMatrixType())
5266 StepTy = adjustVectorOrConstantMatrixType(Context, FromType, ToType);
5267 }
5268
5269 From = ImpCastExprToType(From, StepTy, ScalarTypeToBooleanCastKind(ElTy),
5270 VK_PRValue,
5271 /*BasePath=*/nullptr, CCK)
5272 .get();
5273 break;
5274 }
5275
5276 case ICK_Derived_To_Base: {
5277 CXXCastPath BasePath;
5279 From->getType(), ToType.getNonReferenceType(), From->getBeginLoc(),
5280 From->getSourceRange(), &BasePath, CStyle))
5281 return ExprError();
5282
5283 From = ImpCastExprToType(From, ToType.getNonReferenceType(),
5284 CK_DerivedToBase, From->getValueKind(),
5285 &BasePath, CCK).get();
5286 break;
5287 }
5288
5290 From = ImpCastExprToType(From, ToType, CK_BitCast, VK_PRValue,
5291 /*BasePath=*/nullptr, CCK)
5292 .get();
5293 break;
5294
5297 From = ImpCastExprToType(From, ToType, CK_BitCast, VK_PRValue,
5298 /*BasePath=*/nullptr, CCK)
5299 .get();
5300 break;
5301
5302 case ICK_Vector_Splat: {
5303 // Vector splat from any arithmetic type to a vector.
5304 Expr *Elem = prepareVectorSplat(ToType, From).get();
5305 From = ImpCastExprToType(Elem, ToType, CK_VectorSplat, VK_PRValue,
5306 /*BasePath=*/nullptr, CCK)
5307 .get();
5308 break;
5309 }
5310
5311 case ICK_Complex_Real:
5312 // Case 1. x -> _Complex y
5313 if (const ComplexType *ToComplex = ToType->getAs<ComplexType>()) {
5314 QualType ElType = ToComplex->getElementType();
5315 bool isFloatingComplex = ElType->isRealFloatingType();
5316
5317 // x -> y
5318 if (Context.hasSameUnqualifiedType(ElType, From->getType())) {
5319 // do nothing
5320 } else if (From->getType()->isRealFloatingType()) {
5321 From = ImpCastExprToType(From, ElType,
5322 isFloatingComplex ? CK_FloatingCast : CK_FloatingToIntegral).get();
5323 } else {
5324 assert(From->getType()->isIntegerType());
5325 From = ImpCastExprToType(From, ElType,
5326 isFloatingComplex ? CK_IntegralToFloating : CK_IntegralCast).get();
5327 }
5328 // y -> _Complex y
5329 From = ImpCastExprToType(From, ToType,
5330 isFloatingComplex ? CK_FloatingRealToComplex
5331 : CK_IntegralRealToComplex).get();
5332
5333 // Case 2. _Complex x -> y
5334 } else {
5335 auto *FromComplex = From->getType()->castAs<ComplexType>();
5336 QualType ElType = FromComplex->getElementType();
5337 bool isFloatingComplex = ElType->isRealFloatingType();
5338
5339 // _Complex x -> x
5340 From = ImpCastExprToType(From, ElType,
5341 isFloatingComplex ? CK_FloatingComplexToReal
5342 : CK_IntegralComplexToReal,
5343 VK_PRValue, /*BasePath=*/nullptr, CCK)
5344 .get();
5345
5346 // x -> y
5347 if (Context.hasSameUnqualifiedType(ElType, ToType)) {
5348 // do nothing
5349 } else if (ToType->isRealFloatingType()) {
5350 From = ImpCastExprToType(From, ToType,
5351 isFloatingComplex ? CK_FloatingCast
5352 : CK_IntegralToFloating,
5353 VK_PRValue, /*BasePath=*/nullptr, CCK)
5354 .get();
5355 } else {
5356 assert(ToType->isIntegerType());
5357 From = ImpCastExprToType(From, ToType,
5358 isFloatingComplex ? CK_FloatingToIntegral
5359 : CK_IntegralCast,
5360 VK_PRValue, /*BasePath=*/nullptr, CCK)
5361 .get();
5362 }
5363 }
5364 break;
5365
5367 LangAS AddrSpaceL =
5369 LangAS AddrSpaceR =
5371 assert(Qualifiers::isAddressSpaceSupersetOf(AddrSpaceL, AddrSpaceR,
5372 getASTContext()) &&
5373 "Invalid cast");
5374 CastKind Kind =
5375 AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast;
5376 From = ImpCastExprToType(From, ToType.getUnqualifiedType(), Kind,
5377 VK_PRValue, /*BasePath=*/nullptr, CCK)
5378 .get();
5379 break;
5380 }
5381
5383 ExprResult FromRes = From;
5384 AssignConvertType ConvTy =
5386 if (FromRes.isInvalid())
5387 return ExprError();
5388 From = FromRes.get();
5389 assert((ConvTy == AssignConvertType::Compatible) &&
5390 "Improper transparent union conversion");
5391 (void)ConvTy;
5392 break;
5393 }
5394
5397 From = ImpCastExprToType(From, ToType,
5398 CK_ZeroToOCLOpaqueType,
5399 From->getValueKind()).get();
5400 break;
5401
5403 From = ImpCastExprToType(From, ToType, CK_IntegralCast,
5404 From->getValueKind(), nullptr, CCK)
5405 .get();
5406 break;
5407 }
5412 case ICK_Qualification:
5421 llvm_unreachable("Improper second standard conversion");
5422 }
5423
5424 if (SCS.Dimension != ICK_Identity) {
5425 // If SCS.Element is not ICK_Identity the To and From types must be HLSL
5426 // vectors or matrices.
5427 assert(
5428 (ToType->isVectorType() || ToType->isConstantMatrixType() ||
5429 ToType->isBuiltinType()) &&
5430 "Dimension conversion output must be vector, matrix, or scalar type.");
5431 switch (SCS.Dimension) {
5432 case ICK_HLSL_Vector_Splat: {
5433 // Vector splat from any arithmetic type to a vector.
5434 Expr *Elem = prepareVectorSplat(ToType, From).get();
5435 From = ImpCastExprToType(Elem, ToType, CK_VectorSplat, VK_PRValue,
5436 /*BasePath=*/nullptr, CCK)
5437 .get();
5438 break;
5439 }
5440 case ICK_HLSL_Matrix_Splat: {
5441 // Matrix splat from any arithmetic type to a matrix.
5442 Expr *Elem = prepareMatrixSplat(ToType, From).get();
5443 From =
5444 ImpCastExprToType(Elem, ToType, CK_HLSLAggregateSplatCast, VK_PRValue,
5445 /*BasePath=*/nullptr, CCK)
5446 .get();
5447 break;
5448 }
5450 // Note: HLSL built-in vectors are ExtVectors. Since this truncates a
5451 // vector to a smaller vector or to a scalar, this can only operate on
5452 // arguments where the source type is an ExtVector and the destination
5453 // type is destination type is either an ExtVectorType or a builtin scalar
5454 // type.
5455 auto *FromVec = From->getType()->castAs<VectorType>();
5456 QualType TruncTy = FromVec->getElementType();
5457 if (auto *ToVec = ToType->getAs<VectorType>())
5458 TruncTy = Context.getExtVectorType(TruncTy, ToVec->getNumElements());
5459 From = ImpCastExprToType(From, TruncTy, CK_HLSLVectorTruncation,
5460 From->getValueKind())
5461 .get();
5462
5463 break;
5464 }
5466 auto *FromMat = From->getType()->castAs<ConstantMatrixType>();
5467 QualType TruncTy = FromMat->getElementType();
5468 // Preserve any sugar (e.g. `row_major`/`column_major` HLSL TypeAttrs) on
5469 // `ToType` so that downstream CodeGen can query the destination layout
5470 // from the cast node itself rather than falling back to the TU default.
5471 if (ToType->getAs<ConstantMatrixType>())
5472 TruncTy = ToType;
5473 From = ImpCastExprToType(From, TruncTy, CK_HLSLMatrixTruncation,
5474 From->getValueKind())
5475 .get();
5476 break;
5477 }
5478 case ICK_Identity:
5479 default:
5480 llvm_unreachable("Improper element standard conversion");
5481 }
5482 }
5483
5484 switch (SCS.Third) {
5485 case ICK_Identity:
5486 // Nothing to do.
5487 break;
5488
5490 // If both sides are functions (or pointers/references to them), there could
5491 // be incompatible exception declarations.
5492 if (CheckExceptionSpecCompatibility(From, ToType))
5493 return ExprError();
5494
5495 From = ImpCastExprToType(From, ToType, CK_NoOp, VK_PRValue,
5496 /*BasePath=*/nullptr, CCK)
5497 .get();
5498 break;
5499
5500 case ICK_Qualification: {
5501 ExprValueKind VK = From->getValueKind();
5502 CastKind CK = CK_NoOp;
5503
5504 if (ToType->isReferenceType() &&
5505 ToType->getPointeeType().getAddressSpace() !=
5506 From->getType().getAddressSpace())
5507 CK = CK_AddressSpaceConversion;
5508
5509 if (ToType->isPointerType() &&
5510 ToType->getPointeeType().getAddressSpace() !=
5512 CK = CK_AddressSpaceConversion;
5513
5514 if (!isCast(CCK) &&
5515 !ToType->getPointeeType().getQualifiers().hasUnaligned() &&
5517 Diag(From->getBeginLoc(), diag::warn_imp_cast_drops_unaligned)
5518 << InitialFromType << ToType;
5519 }
5520
5521 From = ImpCastExprToType(From, ToType.getNonLValueExprType(Context), CK, VK,
5522 /*BasePath=*/nullptr, CCK)
5523 .get();
5524
5526 !getLangOpts().WritableStrings) {
5527 Diag(From->getBeginLoc(),
5529 ? diag::ext_deprecated_string_literal_conversion
5530 : diag::warn_deprecated_string_literal_conversion)
5531 << ToType.getNonReferenceType();
5532 }
5533
5534 break;
5535 }
5536
5537 default:
5538 llvm_unreachable("Improper third standard conversion");
5539 }
5540
5541 // If this conversion sequence involved a scalar -> atomic conversion, perform
5542 // that conversion now.
5543 if (!ToAtomicType.isNull()) {
5544 assert(Context.hasSameType(
5545 ToAtomicType->castAs<AtomicType>()->getValueType(), From->getType()));
5546 From = ImpCastExprToType(From, ToAtomicType, CK_NonAtomicToAtomic,
5547 VK_PRValue, nullptr, CCK)
5548 .get();
5549 }
5550
5551 // Materialize a temporary if we're implicitly converting to a reference
5552 // type. This is not required by the C++ rules but is necessary to maintain
5553 // AST invariants.
5554 if (ToType->isReferenceType() && From->isPRValue()) {
5556 if (Res.isInvalid())
5557 return ExprError();
5558 From = Res.get();
5559 }
5560
5561 // If this conversion sequence succeeded and involved implicitly converting a
5562 // _Nullable type to a _Nonnull one, complain.
5563 if (!isCast(CCK))
5564 diagnoseNullableToNonnullConversion(ToType, InitialFromType,
5565 From->getBeginLoc());
5566
5567 return From;
5568}
5569
5572 SourceLocation Loc,
5573 bool isIndirect) {
5574 assert(!LHS.get()->hasPlaceholderType() && !RHS.get()->hasPlaceholderType() &&
5575 "placeholders should have been weeded out by now");
5576
5577 // The LHS undergoes lvalue conversions if this is ->*, and undergoes the
5578 // temporary materialization conversion otherwise.
5579 if (isIndirect)
5580 LHS = DefaultLvalueConversion(LHS.get());
5581 else if (LHS.get()->isPRValue())
5583 if (LHS.isInvalid())
5584 return QualType();
5585
5586 // The RHS always undergoes lvalue conversions.
5587 RHS = DefaultLvalueConversion(RHS.get());
5588 if (RHS.isInvalid()) return QualType();
5589
5590 const char *OpSpelling = isIndirect ? "->*" : ".*";
5591 // C++ 5.5p2
5592 // The binary operator .* [p3: ->*] binds its second operand, which shall
5593 // be of type "pointer to member of T" (where T is a completely-defined
5594 // class type) [...]
5595 QualType RHSType = RHS.get()->getType();
5596 const MemberPointerType *MemPtr = RHSType->getAs<MemberPointerType>();
5597 if (!MemPtr) {
5598 Diag(Loc, diag::err_bad_memptr_rhs)
5599 << OpSpelling << RHSType << RHS.get()->getSourceRange();
5600 return QualType();
5601 }
5602
5603 CXXRecordDecl *RHSClass = MemPtr->getMostRecentCXXRecordDecl();
5604
5605 // Note: C++ [expr.mptr.oper]p2-3 says that the class type into which the
5606 // member pointer points must be completely-defined. However, there is no
5607 // reason for this semantic distinction, and the rule is not enforced by
5608 // other compilers. Therefore, we do not check this property, as it is
5609 // likely to be considered a defect.
5610
5611 // C++ 5.5p2
5612 // [...] to its first operand, which shall be of class T or of a class of
5613 // which T is an unambiguous and accessible base class. [p3: a pointer to
5614 // such a class]
5615 QualType LHSType = LHS.get()->getType();
5616 if (isIndirect) {
5617 if (const PointerType *Ptr = LHSType->getAs<PointerType>())
5618 LHSType = Ptr->getPointeeType();
5619 else {
5620 Diag(Loc, diag::err_bad_memptr_lhs)
5621 << OpSpelling << 1 << LHSType
5623 return QualType();
5624 }
5625 }
5626 CXXRecordDecl *LHSClass = LHSType->getAsCXXRecordDecl();
5627
5628 if (!declaresSameEntity(LHSClass, RHSClass)) {
5629 // If we want to check the hierarchy, we need a complete type.
5630 if (RequireCompleteType(Loc, LHSType, diag::err_bad_memptr_lhs,
5631 OpSpelling, (int)isIndirect)) {
5632 return QualType();
5633 }
5634
5635 if (!IsDerivedFrom(Loc, LHSClass, RHSClass)) {
5636 Diag(Loc, diag::err_bad_memptr_lhs) << OpSpelling
5637 << (int)isIndirect << LHS.get()->getType();
5638 return QualType();
5639 }
5640
5641 // FIXME: use sugared type from member pointer.
5642 CanQualType RHSClassType = Context.getCanonicalTagType(RHSClass);
5643 CXXCastPath BasePath;
5645 LHSType, RHSClassType, Loc,
5646 SourceRange(LHS.get()->getBeginLoc(), RHS.get()->getEndLoc()),
5647 &BasePath))
5648 return QualType();
5649
5650 // Cast LHS to type of use.
5651 QualType UseType =
5652 Context.getQualifiedType(RHSClassType, LHSType.getQualifiers());
5653 if (isIndirect)
5654 UseType = Context.getPointerType(UseType);
5655 ExprValueKind VK = isIndirect ? VK_PRValue : LHS.get()->getValueKind();
5656 LHS = ImpCastExprToType(LHS.get(), UseType, CK_DerivedToBase, VK,
5657 &BasePath);
5658 }
5659
5661 // Diagnose use of pointer-to-member type which when used as
5662 // the functional cast in a pointer-to-member expression.
5663 Diag(Loc, diag::err_pointer_to_member_type) << isIndirect;
5664 return QualType();
5665 }
5666
5667 // C++ 5.5p2
5668 // The result is an object or a function of the type specified by the
5669 // second operand.
5670 // The cv qualifiers are the union of those in the pointer and the left side,
5671 // in accordance with 5.5p5 and 5.2.5.
5672 QualType Result = MemPtr->getPointeeType();
5673 Result = Context.getCVRQualifiedType(Result, LHSType.getCVRQualifiers());
5674
5675 // C++0x [expr.mptr.oper]p6:
5676 // In a .* expression whose object expression is an rvalue, the program is
5677 // ill-formed if the second operand is a pointer to member function with
5678 // ref-qualifier &. In a ->* expression or in a .* expression whose object
5679 // expression is an lvalue, the program is ill-formed if the second operand
5680 // is a pointer to member function with ref-qualifier &&.
5681 if (const FunctionProtoType *Proto = Result->getAs<FunctionProtoType>()) {
5682 switch (Proto->getRefQualifier()) {
5683 case RQ_None:
5684 // Do nothing
5685 break;
5686
5687 case RQ_LValue:
5688 if (!isIndirect && !LHS.get()->Classify(Context).isLValue()) {
5689 // C++2a allows functions with ref-qualifier & if their cv-qualifier-seq
5690 // is (exactly) 'const'.
5691 if (Proto->isConst() && !Proto->isVolatile())
5693 ? diag::warn_cxx17_compat_pointer_to_const_ref_member_on_rvalue
5694 : diag::ext_pointer_to_const_ref_member_on_rvalue);
5695 else
5696 Diag(Loc, diag::err_pointer_to_member_oper_value_classify)
5697 << RHSType << 1 << LHS.get()->getSourceRange();
5698 }
5699 break;
5700
5701 case RQ_RValue:
5702 if (isIndirect || !LHS.get()->Classify(Context).isRValue())
5703 Diag(Loc, diag::err_pointer_to_member_oper_value_classify)
5704 << RHSType << 0 << LHS.get()->getSourceRange();
5705 break;
5706 }
5707 }
5708
5709 // C++ [expr.mptr.oper]p6:
5710 // The result of a .* expression whose second operand is a pointer
5711 // to a data member is of the same value category as its
5712 // first operand. The result of a .* expression whose second
5713 // operand is a pointer to a member function is a prvalue. The
5714 // result of an ->* expression is an lvalue if its second operand
5715 // is a pointer to data member and a prvalue otherwise.
5716 if (Result->isFunctionType()) {
5717 VK = VK_PRValue;
5718 return Context.BoundMemberTy;
5719 } else if (isIndirect) {
5720 VK = VK_LValue;
5721 } else {
5722 VK = LHS.get()->getValueKind();
5723 }
5724
5725 return Result;
5726}
5727
5728/// Try to convert a type to another according to C++11 5.16p3.
5729///
5730/// This is part of the parameter validation for the ? operator. If either
5731/// value operand is a class type, the two operands are attempted to be
5732/// converted to each other. This function does the conversion in one direction.
5733/// It returns true if the program is ill-formed and has already been diagnosed
5734/// as such.
5735static bool TryClassUnification(Sema &Self, Expr *From, Expr *To,
5736 SourceLocation QuestionLoc,
5737 bool &HaveConversion,
5738 QualType &ToType) {
5739 HaveConversion = false;
5740 ToType = To->getType();
5741
5742 InitializationKind Kind =
5744 // C++11 5.16p3
5745 // The process for determining whether an operand expression E1 of type T1
5746 // can be converted to match an operand expression E2 of type T2 is defined
5747 // as follows:
5748 // -- If E2 is an lvalue: E1 can be converted to match E2 if E1 can be
5749 // implicitly converted to type "lvalue reference to T2", subject to the
5750 // constraint that in the conversion the reference must bind directly to
5751 // an lvalue.
5752 // -- If E2 is an xvalue: E1 can be converted to match E2 if E1 can be
5753 // implicitly converted to the type "rvalue reference to R2", subject to
5754 // the constraint that the reference must bind directly.
5755 if (To->isGLValue()) {
5756 QualType T = Self.Context.getReferenceQualifiedType(To);
5758
5759 InitializationSequence InitSeq(Self, Entity, Kind, From);
5760 if (InitSeq.isDirectReferenceBinding()) {
5761 ToType = T;
5762 HaveConversion = true;
5763 return false;
5764 }
5765
5766 if (InitSeq.isAmbiguous())
5767 return InitSeq.Diagnose(Self, Entity, Kind, From);
5768 }
5769
5770 // -- If E2 is an rvalue, or if the conversion above cannot be done:
5771 // -- if E1 and E2 have class type, and the underlying class types are
5772 // the same or one is a base class of the other:
5773 QualType FTy = From->getType();
5774 QualType TTy = To->getType();
5775 const RecordType *FRec = FTy->getAsCanonical<RecordType>();
5776 const RecordType *TRec = TTy->getAsCanonical<RecordType>();
5777 bool FDerivedFromT = FRec && TRec && FRec != TRec &&
5778 Self.IsDerivedFrom(QuestionLoc, FTy, TTy);
5779 if (FRec && TRec && (FRec == TRec || FDerivedFromT ||
5780 Self.IsDerivedFrom(QuestionLoc, TTy, FTy))) {
5781 // E1 can be converted to match E2 if the class of T2 is the
5782 // same type as, or a base class of, the class of T1, and
5783 // [cv2 > cv1].
5784 if (FRec == TRec || FDerivedFromT) {
5785 if (TTy.isAtLeastAsQualifiedAs(FTy, Self.getASTContext())) {
5787 InitializationSequence InitSeq(Self, Entity, Kind, From);
5788 if (InitSeq) {
5789 HaveConversion = true;
5790 return false;
5791 }
5792
5793 if (InitSeq.isAmbiguous())
5794 return InitSeq.Diagnose(Self, Entity, Kind, From);
5795 }
5796 }
5797
5798 return false;
5799 }
5800
5801 // -- Otherwise: E1 can be converted to match E2 if E1 can be
5802 // implicitly converted to the type that expression E2 would have
5803 // if E2 were converted to an rvalue (or the type it has, if E2 is
5804 // an rvalue).
5805 //
5806 // This actually refers very narrowly to the lvalue-to-rvalue conversion, not
5807 // to the array-to-pointer or function-to-pointer conversions.
5808 TTy = TTy.getNonLValueExprType(Self.Context);
5809
5811 InitializationSequence InitSeq(Self, Entity, Kind, From);
5812 HaveConversion = !InitSeq.Failed();
5813 ToType = TTy;
5814 if (InitSeq.isAmbiguous())
5815 return InitSeq.Diagnose(Self, Entity, Kind, From);
5816
5817 return false;
5818}
5819
5820/// Try to find a common type for two according to C++0x 5.16p5.
5821///
5822/// This is part of the parameter validation for the ? operator. If either
5823/// value operand is a class type, overload resolution is used to find a
5824/// conversion to a common type.
5826 SourceLocation QuestionLoc) {
5827 Expr *Args[2] = { LHS.get(), RHS.get() };
5828 OverloadCandidateSet CandidateSet(QuestionLoc,
5830 Self.AddBuiltinOperatorCandidates(OO_Conditional, QuestionLoc, Args,
5831 CandidateSet);
5832
5834 switch (CandidateSet.BestViableFunction(Self, QuestionLoc, Best)) {
5835 case OR_Success: {
5836 // We found a match. Perform the conversions on the arguments and move on.
5837 ExprResult LHSRes = Self.PerformImplicitConversion(
5838 LHS.get(), Best->BuiltinParamTypes[0], Best->Conversions[0],
5840 if (LHSRes.isInvalid())
5841 break;
5842 LHS = LHSRes;
5843
5844 ExprResult RHSRes = Self.PerformImplicitConversion(
5845 RHS.get(), Best->BuiltinParamTypes[1], Best->Conversions[1],
5847 if (RHSRes.isInvalid())
5848 break;
5849 RHS = RHSRes;
5850 if (Best->Function)
5851 Self.MarkFunctionReferenced(QuestionLoc, Best->Function);
5852 return false;
5853 }
5854
5856
5857 // Emit a better diagnostic if one of the expressions is a null pointer
5858 // constant and the other is a pointer type. In this case, the user most
5859 // likely forgot to take the address of the other expression.
5860 if (Self.DiagnoseConditionalForNull(LHS.get(), RHS.get(), QuestionLoc))
5861 return true;
5862
5863 Self.Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
5864 << LHS.get()->getType() << RHS.get()->getType()
5865 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
5866 return true;
5867
5868 case OR_Ambiguous:
5869 Self.Diag(QuestionLoc, diag::err_conditional_ambiguous_ovl)
5870 << LHS.get()->getType() << RHS.get()->getType()
5871 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
5872 // FIXME: Print the possible common types by printing the return types of
5873 // the viable candidates.
5874 break;
5875
5876 case OR_Deleted:
5877 llvm_unreachable("Conditional operator has only built-in overloads");
5878 }
5879 return true;
5880}
5881
5882/// Perform an "extended" implicit conversion as returned by
5883/// TryClassUnification.
5886 InitializationKind Kind =
5888 Expr *Arg = E.get();
5889 InitializationSequence InitSeq(Self, Entity, Kind, Arg);
5890 ExprResult Result = InitSeq.Perform(Self, Entity, Kind, Arg);
5891 if (Result.isInvalid())
5892 return true;
5893
5894 E = Result;
5895 return false;
5896}
5897
5898// Check the condition operand of ?: to see if it is valid for the GCC
5899// extension.
5901 QualType CondTy) {
5902 bool IsSVEVectorType = CondTy->isSveVLSBuiltinType();
5903 if (!CondTy->isVectorType() && !CondTy->isExtVectorType() && !IsSVEVectorType)
5904 return false;
5905 const QualType EltTy =
5906 IsSVEVectorType
5907 ? cast<BuiltinType>(CondTy.getCanonicalType())->getSveEltType(Ctx)
5908 : cast<VectorType>(CondTy.getCanonicalType())->getElementType();
5909 assert(!EltTy->isEnumeralType() && "Vectors cant be enum types");
5910 return EltTy->isIntegralType(Ctx);
5911}
5912
5914 ExprResult &RHS,
5915 SourceLocation QuestionLoc) {
5918
5919 QualType CondType = Cond.get()->getType();
5920 QualType LHSType = LHS.get()->getType();
5921 QualType RHSType = RHS.get()->getType();
5922
5923 bool LHSSizelessVector = LHSType->isSizelessVectorType();
5924 bool RHSSizelessVector = RHSType->isSizelessVectorType();
5925 bool LHSIsVector = LHSType->isVectorType() || LHSSizelessVector;
5926 bool RHSIsVector = RHSType->isVectorType() || RHSSizelessVector;
5927
5928 auto GetVectorInfo =
5929 [&](QualType Type) -> std::pair<QualType, llvm::ElementCount> {
5930 if (const auto *VT = Type->getAs<VectorType>())
5931 return std::make_pair(VT->getElementType(),
5932 llvm::ElementCount::getFixed(VT->getNumElements()));
5934 Context.getBuiltinVectorTypeInfo(Type->castAs<BuiltinType>());
5935 return std::make_pair(VectorInfo.ElementType, VectorInfo.EC);
5936 };
5937
5938 auto [CondElementTy, CondElementCount] = GetVectorInfo(CondType);
5939
5940 QualType ResultType;
5941 if (LHSIsVector && RHSIsVector) {
5942 if (CondType->isExtVectorType() != LHSType->isExtVectorType()) {
5943 Diag(QuestionLoc, diag::err_conditional_vector_cond_result_mismatch)
5944 << /*isExtVectorNotSizeless=*/1;
5945 return {};
5946 }
5947
5948 // If both are vector types, they must be the same type.
5949 if (!Context.hasSameType(LHSType, RHSType)) {
5950 Diag(QuestionLoc, diag::err_conditional_vector_mismatched)
5951 << LHSType << RHSType;
5952 return {};
5953 }
5954 ResultType = Context.getCommonSugaredType(LHSType, RHSType);
5955 } else if (LHSIsVector || RHSIsVector) {
5956 bool ResultSizeless = LHSSizelessVector || RHSSizelessVector;
5957 if (ResultSizeless != CondType->isSizelessVectorType()) {
5958 Diag(QuestionLoc, diag::err_conditional_vector_cond_result_mismatch)
5959 << /*isExtVectorNotSizeless=*/0;
5960 return {};
5961 }
5962 if (ResultSizeless)
5963 ResultType = CheckSizelessVectorOperands(LHS, RHS, QuestionLoc,
5964 /*IsCompAssign*/ false,
5966 else
5967 ResultType = CheckVectorOperands(
5968 LHS, RHS, QuestionLoc, /*isCompAssign*/ false, /*AllowBothBool*/ true,
5969 /*AllowBoolConversions*/ false,
5970 /*AllowBoolOperation*/ true);
5971 if (ResultType.isNull())
5972 return {};
5973 } else {
5974 // Both are scalar.
5975 LHSType = LHSType.getUnqualifiedType();
5976 RHSType = RHSType.getUnqualifiedType();
5977 QualType ResultElementTy =
5978 Context.hasSameType(LHSType, RHSType)
5979 ? Context.getCommonSugaredType(LHSType, RHSType)
5980 : UsualArithmeticConversions(LHS, RHS, QuestionLoc,
5982
5983 if (ResultElementTy->isEnumeralType()) {
5984 Diag(QuestionLoc, diag::err_conditional_vector_operand_type)
5985 << ResultElementTy;
5986 return {};
5987 }
5988 if (CondType->isExtVectorType()) {
5989 ResultType = Context.getExtVectorType(ResultElementTy,
5990 CondElementCount.getFixedValue());
5991 } else if (CondType->isSizelessVectorType()) {
5992 ResultType = Context.getScalableVectorType(
5993 ResultElementTy, CondElementCount.getKnownMinValue());
5994 // There are not scalable vector type mappings for all element counts.
5995 if (ResultType.isNull()) {
5996 Diag(QuestionLoc, diag::err_conditional_vector_scalar_type_unsupported)
5997 << ResultElementTy << CondType;
5998 return {};
5999 }
6000 } else {
6001 ResultType = Context.getVectorType(ResultElementTy,
6002 CondElementCount.getFixedValue(),
6004 }
6005 LHS = ImpCastExprToType(LHS.get(), ResultType, CK_VectorSplat);
6006 RHS = ImpCastExprToType(RHS.get(), ResultType, CK_VectorSplat);
6007 }
6008
6009 assert(!ResultType.isNull() &&
6010 (ResultType->isVectorType() || ResultType->isSizelessVectorType()) &&
6011 (!CondType->isExtVectorType() || ResultType->isExtVectorType()) &&
6012 "Result should have been a vector type");
6013
6014 auto [ResultElementTy, ResultElementCount] = GetVectorInfo(ResultType);
6015 if (ResultElementCount != CondElementCount) {
6016 Diag(QuestionLoc, diag::err_conditional_vector_size) << CondType
6017 << ResultType;
6018 return {};
6019 }
6020
6021 // Boolean vectors are permitted outside of OpenCL mode.
6022 if (Context.getTypeSize(ResultElementTy) !=
6023 Context.getTypeSize(CondElementTy) &&
6024 (!CondElementTy->isBooleanType() || LangOpts.OpenCL)) {
6025 Diag(QuestionLoc, diag::err_conditional_vector_element_size)
6026 << CondType << ResultType;
6027 return {};
6028 }
6029
6030 return ResultType;
6031}
6032
6035 ExprObjectKind &OK,
6036 SourceLocation QuestionLoc) {
6037 // FIXME: Handle C99's complex types, block pointers and Obj-C++ interface
6038 // pointers.
6039
6040 // Assume r-value.
6041 VK = VK_PRValue;
6042 OK = OK_Ordinary;
6043 bool IsVectorConditional =
6045
6046 // C++11 [expr.cond]p1
6047 // The first expression is contextually converted to bool.
6048 if (!Cond.get()->isTypeDependent()) {
6049 ExprResult CondRes = IsVectorConditional
6051 : CheckCXXBooleanCondition(Cond.get());
6052 if (CondRes.isInvalid())
6053 return QualType();
6054 Cond = CondRes;
6055 } else {
6056 // To implement C++, the first expression typically doesn't alter the result
6057 // type of the conditional, however the GCC compatible vector extension
6058 // changes the result type to be that of the conditional. Since we cannot
6059 // know if this is a vector extension here, delay the conversion of the
6060 // LHS/RHS below until later.
6061 return Context.DependentTy;
6062 }
6063
6064
6065 // Either of the arguments dependent?
6066 if (LHS.get()->isTypeDependent() || RHS.get()->isTypeDependent())
6067 return Context.DependentTy;
6068
6069 // C++11 [expr.cond]p2
6070 // If either the second or the third operand has type (cv) void, ...
6071 QualType LTy = LHS.get()->getType();
6072 QualType RTy = RHS.get()->getType();
6073 bool LVoid = LTy->isVoidType();
6074 bool RVoid = RTy->isVoidType();
6075 if (LVoid || RVoid) {
6076 // ... one of the following shall hold:
6077 // -- The second or the third operand (but not both) is a (possibly
6078 // parenthesized) throw-expression; the result is of the type
6079 // and value category of the other.
6080 bool LThrow = isa<CXXThrowExpr>(LHS.get()->IgnoreParenImpCasts());
6081 bool RThrow = isa<CXXThrowExpr>(RHS.get()->IgnoreParenImpCasts());
6082
6083 // Void expressions aren't legal in the vector-conditional expressions.
6084 if (IsVectorConditional) {
6085 SourceRange DiagLoc =
6086 LVoid ? LHS.get()->getSourceRange() : RHS.get()->getSourceRange();
6087 bool IsThrow = LVoid ? LThrow : RThrow;
6088 Diag(DiagLoc.getBegin(), diag::err_conditional_vector_has_void)
6089 << DiagLoc << IsThrow;
6090 return QualType();
6091 }
6092
6093 if (LThrow != RThrow) {
6094 Expr *NonThrow = LThrow ? RHS.get() : LHS.get();
6095 VK = NonThrow->getValueKind();
6096 // DR (no number yet): the result is a bit-field if the
6097 // non-throw-expression operand is a bit-field.
6098 OK = NonThrow->getObjectKind();
6099 return NonThrow->getType();
6100 }
6101
6102 // -- Both the second and third operands have type void; the result is of
6103 // type void and is a prvalue.
6104 if (LVoid && RVoid)
6105 return Context.getCommonSugaredType(LTy, RTy);
6106
6107 // Neither holds, error.
6108 Diag(QuestionLoc, diag::err_conditional_void_nonvoid)
6109 << (LVoid ? RTy : LTy) << (LVoid ? 0 : 1)
6110 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
6111 return QualType();
6112 }
6113
6114 // Neither is void.
6115 if (IsVectorConditional)
6116 return CheckVectorConditionalTypes(Cond, LHS, RHS, QuestionLoc);
6117
6118 // WebAssembly tables are not allowed as conditional LHS or RHS.
6119 if (LTy->isWebAssemblyTableType() || RTy->isWebAssemblyTableType()) {
6120 Diag(QuestionLoc, diag::err_wasm_table_conditional_expression)
6121 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
6122 return QualType();
6123 }
6124
6125 // C++11 [expr.cond]p3
6126 // Otherwise, if the second and third operand have different types, and
6127 // either has (cv) class type [...] an attempt is made to convert each of
6128 // those operands to the type of the other.
6129 if (!Context.hasSameType(LTy, RTy) &&
6130 (LTy->isRecordType() || RTy->isRecordType())) {
6131 // These return true if a single direction is already ambiguous.
6132 QualType L2RType, R2LType;
6133 bool HaveL2R, HaveR2L;
6134 if (TryClassUnification(*this, LHS.get(), RHS.get(), QuestionLoc, HaveL2R, L2RType))
6135 return QualType();
6136 if (TryClassUnification(*this, RHS.get(), LHS.get(), QuestionLoc, HaveR2L, R2LType))
6137 return QualType();
6138
6139 // If both can be converted, [...] the program is ill-formed.
6140 if (HaveL2R && HaveR2L) {
6141 Diag(QuestionLoc, diag::err_conditional_ambiguous)
6142 << LTy << RTy << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
6143 return QualType();
6144 }
6145
6146 // If exactly one conversion is possible, that conversion is applied to
6147 // the chosen operand and the converted operands are used in place of the
6148 // original operands for the remainder of this section.
6149 if (HaveL2R) {
6150 if (ConvertForConditional(*this, LHS, L2RType) || LHS.isInvalid())
6151 return QualType();
6152 LTy = LHS.get()->getType();
6153 } else if (HaveR2L) {
6154 if (ConvertForConditional(*this, RHS, R2LType) || RHS.isInvalid())
6155 return QualType();
6156 RTy = RHS.get()->getType();
6157 }
6158 }
6159
6160 // C++11 [expr.cond]p3
6161 // if both are glvalues of the same value category and the same type except
6162 // for cv-qualification, an attempt is made to convert each of those
6163 // operands to the type of the other.
6164 // FIXME:
6165 // Resolving a defect in P0012R1: we extend this to cover all cases where
6166 // one of the operands is reference-compatible with the other, in order
6167 // to support conditionals between functions differing in noexcept. This
6168 // will similarly cover difference in array bounds after P0388R4.
6169 // FIXME: If LTy and RTy have a composite pointer type, should we convert to
6170 // that instead?
6171 ExprValueKind LVK = LHS.get()->getValueKind();
6172 ExprValueKind RVK = RHS.get()->getValueKind();
6173 if (!Context.hasSameType(LTy, RTy) && LVK == RVK && LVK != VK_PRValue) {
6174 // DerivedToBase was already handled by the class-specific case above.
6175 // FIXME: Should we allow ObjC conversions here?
6176 const ReferenceConversions AllowedConversions =
6177 ReferenceConversions::Qualification |
6178 ReferenceConversions::NestedQualification |
6179 ReferenceConversions::Function;
6180
6181 ReferenceConversions RefConv;
6182 if (CompareReferenceRelationship(QuestionLoc, LTy, RTy, &RefConv) ==
6184 !(RefConv & ~AllowedConversions) &&
6185 // [...] subject to the constraint that the reference must bind
6186 // directly [...]
6187 !RHS.get()->refersToBitField() && !RHS.get()->refersToVectorElement()) {
6188 RHS = ImpCastExprToType(RHS.get(), LTy, CK_NoOp, RVK);
6189 RTy = RHS.get()->getType();
6190 } else if (CompareReferenceRelationship(QuestionLoc, RTy, LTy, &RefConv) ==
6192 !(RefConv & ~AllowedConversions) &&
6193 !LHS.get()->refersToBitField() &&
6194 !LHS.get()->refersToVectorElement()) {
6195 LHS = ImpCastExprToType(LHS.get(), RTy, CK_NoOp, LVK);
6196 LTy = LHS.get()->getType();
6197 }
6198 }
6199
6200 // C++11 [expr.cond]p4
6201 // If the second and third operands are glvalues of the same value
6202 // category and have the same type, the result is of that type and
6203 // value category and it is a bit-field if the second or the third
6204 // operand is a bit-field, or if both are bit-fields.
6205 // We only extend this to bitfields, not to the crazy other kinds of
6206 // l-values.
6207 bool Same = Context.hasSameType(LTy, RTy);
6208 if (Same && LVK == RVK && LVK != VK_PRValue &&
6211 VK = LHS.get()->getValueKind();
6212 if (LHS.get()->getObjectKind() == OK_BitField ||
6213 RHS.get()->getObjectKind() == OK_BitField)
6214 OK = OK_BitField;
6215 return Context.getCommonSugaredType(LTy, RTy);
6216 }
6217
6218 // C++11 [expr.cond]p5
6219 // Otherwise, the result is a prvalue. If the second and third operands
6220 // do not have the same type, and either has (cv) class type, ...
6221 if (!Same && (LTy->isRecordType() || RTy->isRecordType())) {
6222 // ... overload resolution is used to determine the conversions (if any)
6223 // to be applied to the operands. If the overload resolution fails, the
6224 // program is ill-formed.
6225 if (FindConditionalOverload(*this, LHS, RHS, QuestionLoc))
6226 return QualType();
6227 }
6228
6229 // C++11 [expr.cond]p6
6230 // Lvalue-to-rvalue, array-to-pointer, and function-to-pointer standard
6231 // conversions are performed on the second and third operands.
6234 if (LHS.isInvalid() || RHS.isInvalid())
6235 return QualType();
6236 LTy = LHS.get()->getType();
6237 RTy = RHS.get()->getType();
6238
6239 // After those conversions, one of the following shall hold:
6240 // -- The second and third operands have the same type; the result
6241 // is of that type. If the operands have class type, the result
6242 // is a prvalue temporary of the result type, which is
6243 // copy-initialized from either the second operand or the third
6244 // operand depending on the value of the first operand.
6245 if (Context.hasSameType(LTy, RTy)) {
6246 if (LTy->isRecordType()) {
6247 // The operands have class type. Make a temporary copy.
6250 if (LHSCopy.isInvalid())
6251 return QualType();
6252
6255 if (RHSCopy.isInvalid())
6256 return QualType();
6257
6258 LHS = LHSCopy;
6259 RHS = RHSCopy;
6260 }
6261 return Context.getCommonSugaredType(LTy, RTy);
6262 }
6263
6264 // Extension: conditional operator involving vector types.
6265 if (LTy->isVectorType() || RTy->isVectorType())
6266 return CheckVectorOperands(LHS, RHS, QuestionLoc, /*isCompAssign*/ false,
6267 /*AllowBothBool*/ true,
6268 /*AllowBoolConversions*/ false,
6269 /*AllowBoolOperation*/ false);
6270
6271 // -- The second and third operands have arithmetic or enumeration type;
6272 // the usual arithmetic conversions are performed to bring them to a
6273 // common type, and the result is of that type.
6274 if (LTy->isArithmeticType() && RTy->isArithmeticType()) {
6275 QualType ResTy = UsualArithmeticConversions(LHS, RHS, QuestionLoc,
6277 if (LHS.isInvalid() || RHS.isInvalid())
6278 return QualType();
6279 if (ResTy.isNull()) {
6280 Diag(QuestionLoc,
6281 diag::err_typecheck_cond_incompatible_operands) << LTy << RTy
6282 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
6283 return QualType();
6284 }
6285
6286 LHS = ImpCastExprToType(LHS.get(), ResTy, PrepareScalarCast(LHS, ResTy));
6287 RHS = ImpCastExprToType(RHS.get(), ResTy, PrepareScalarCast(RHS, ResTy));
6288
6289 return ResTy;
6290 }
6291
6292 // -- The second and third operands have pointer type, or one has pointer
6293 // type and the other is a null pointer constant, or both are null
6294 // pointer constants, at least one of which is non-integral; pointer
6295 // conversions and qualification conversions are performed to bring them
6296 // to their composite pointer type. The result is of the composite
6297 // pointer type.
6298 // -- The second and third operands have pointer to member type, or one has
6299 // pointer to member type and the other is a null pointer constant;
6300 // pointer to member conversions and qualification conversions are
6301 // performed to bring them to a common type, whose cv-qualification
6302 // shall match the cv-qualification of either the second or the third
6303 // operand. The result is of the common type.
6304 QualType Composite = FindCompositePointerType(QuestionLoc, LHS, RHS);
6305 if (!Composite.isNull())
6306 return Composite;
6307
6308 // Similarly, attempt to find composite type of two objective-c pointers.
6309 Composite = ObjC().FindCompositeObjCPointerType(LHS, RHS, QuestionLoc);
6310 if (LHS.isInvalid() || RHS.isInvalid())
6311 return QualType();
6312 if (!Composite.isNull())
6313 return Composite;
6314
6315 // Check if we are using a null with a non-pointer type.
6316 if (DiagnoseConditionalForNull(LHS.get(), RHS.get(), QuestionLoc))
6317 return QualType();
6318
6319 Diag(QuestionLoc, diag::err_typecheck_cond_incompatible_operands)
6320 << LHS.get()->getType() << RHS.get()->getType()
6321 << LHS.get()->getSourceRange() << RHS.get()->getSourceRange();
6322 return QualType();
6323}
6324
6326 Expr *&E1, Expr *&E2,
6327 bool ConvertArgs) {
6328 assert(getLangOpts().CPlusPlus && "This function assumes C++");
6329
6330 // C++1z [expr]p14:
6331 // The composite pointer type of two operands p1 and p2 having types T1
6332 // and T2
6333 QualType T1 = E1->getType(), T2 = E2->getType();
6334
6335 // where at least one is a pointer or pointer to member type or
6336 // std::nullptr_t is:
6337 bool T1IsPointerLike = T1->isAnyPointerType() || T1->isMemberPointerType() ||
6338 T1->isNullPtrType();
6339 bool T2IsPointerLike = T2->isAnyPointerType() || T2->isMemberPointerType() ||
6340 T2->isNullPtrType();
6341 if (!T1IsPointerLike && !T2IsPointerLike)
6342 return QualType();
6343
6344 // - if both p1 and p2 are null pointer constants, std::nullptr_t;
6345 // This can't actually happen, following the standard, but we also use this
6346 // to implement the end of [expr.conv], which hits this case.
6347 //
6348 // - if either p1 or p2 is a null pointer constant, T2 or T1, respectively;
6349 if (T1IsPointerLike &&
6351 if (ConvertArgs)
6352 E2 = ImpCastExprToType(E2, T1, T1->isMemberPointerType()
6353 ? CK_NullToMemberPointer
6354 : CK_NullToPointer).get();
6355 return T1;
6356 }
6357 if (T2IsPointerLike &&
6359 if (ConvertArgs)
6360 E1 = ImpCastExprToType(E1, T2, T2->isMemberPointerType()
6361 ? CK_NullToMemberPointer
6362 : CK_NullToPointer).get();
6363 return T2;
6364 }
6365
6366 // Now both have to be pointers or member pointers.
6367 if (!T1IsPointerLike || !T2IsPointerLike)
6368 return QualType();
6369 assert(!T1->isNullPtrType() && !T2->isNullPtrType() &&
6370 "nullptr_t should be a null pointer constant");
6371
6372 struct Step {
6373 enum Kind { Pointer, ObjCPointer, MemberPointer, Array } K;
6374 // Qualifiers to apply under the step kind.
6375 Qualifiers Quals;
6376 /// The class for a pointer-to-member; a constant array type with a bound
6377 /// (if any) for an array.
6378 /// FIXME: Store Qualifier for pointer-to-member.
6379 const Type *ClassOrBound;
6380
6381 Step(Kind K, const Type *ClassOrBound = nullptr)
6382 : K(K), ClassOrBound(ClassOrBound) {}
6383 QualType rebuild(ASTContext &Ctx, QualType T) const {
6384 T = Ctx.getQualifiedType(T, Quals);
6385 switch (K) {
6386 case Pointer:
6387 return Ctx.getPointerType(T);
6388 case MemberPointer:
6389 return Ctx.getMemberPointerType(T, /*Qualifier=*/std::nullopt,
6390 ClassOrBound->getAsCXXRecordDecl());
6391 case ObjCPointer:
6392 return Ctx.getObjCObjectPointerType(T);
6393 case Array:
6394 if (auto *CAT = cast_or_null<ConstantArrayType>(ClassOrBound))
6395 return Ctx.getConstantArrayType(T, CAT->getSize(), nullptr,
6397 else
6399 }
6400 llvm_unreachable("unknown step kind");
6401 }
6402 };
6403
6405
6406 // - if T1 is "pointer to cv1 C1" and T2 is "pointer to cv2 C2", where C1
6407 // is reference-related to C2 or C2 is reference-related to C1 (8.6.3),
6408 // the cv-combined type of T1 and T2 or the cv-combined type of T2 and T1,
6409 // respectively;
6410 // - if T1 is "pointer to member of C1 of type cv1 U1" and T2 is "pointer
6411 // to member of C2 of type cv2 U2" for some non-function type U, where
6412 // C1 is reference-related to C2 or C2 is reference-related to C1, the
6413 // cv-combined type of T2 and T1 or the cv-combined type of T1 and T2,
6414 // respectively;
6415 // - if T1 and T2 are similar types (4.5), the cv-combined type of T1 and
6416 // T2;
6417 //
6418 // Dismantle T1 and T2 to simultaneously determine whether they are similar
6419 // and to prepare to form the cv-combined type if so.
6420 QualType Composite1 = T1;
6421 QualType Composite2 = T2;
6422 unsigned NeedConstBefore = 0;
6423 while (true) {
6424 assert(!Composite1.isNull() && !Composite2.isNull());
6425
6426 Qualifiers Q1, Q2;
6427 Composite1 = Context.getUnqualifiedArrayType(Composite1, Q1);
6428 Composite2 = Context.getUnqualifiedArrayType(Composite2, Q2);
6429
6430 // Top-level qualifiers are ignored. Merge at all lower levels.
6431 if (!Steps.empty()) {
6432 // Find the qualifier union: (approximately) the unique minimal set of
6433 // qualifiers that is compatible with both types.
6435 Q2.getCVRUQualifiers());
6436
6437 // Under one level of pointer or pointer-to-member, we can change to an
6438 // unambiguous compatible address space.
6439 if (Q1.getAddressSpace() == Q2.getAddressSpace()) {
6440 Quals.setAddressSpace(Q1.getAddressSpace());
6441 } else if (Steps.size() == 1) {
6442 bool MaybeQ1 = Q1.isAddressSpaceSupersetOf(Q2, getASTContext());
6443 bool MaybeQ2 = Q2.isAddressSpaceSupersetOf(Q1, getASTContext());
6444 if (MaybeQ1 == MaybeQ2) {
6445 // Exception for ptr size address spaces. Should be able to choose
6446 // either address space during comparison.
6449 MaybeQ1 = true;
6450 else
6451 return QualType(); // No unique best address space.
6452 }
6453 Quals.setAddressSpace(MaybeQ1 ? Q1.getAddressSpace()
6454 : Q2.getAddressSpace());
6455 } else {
6456 return QualType();
6457 }
6458
6459 // FIXME: In C, we merge __strong and none to __strong at the top level.
6460 if (Q1.getObjCGCAttr() == Q2.getObjCGCAttr())
6461 Quals.setObjCGCAttr(Q1.getObjCGCAttr());
6462 else if (T1->isVoidPointerType() || T2->isVoidPointerType())
6463 assert(Steps.size() == 1);
6464 else
6465 return QualType();
6466
6467 // Mismatched lifetime qualifiers never compatibly include each other.
6468 if (Q1.getObjCLifetime() == Q2.getObjCLifetime())
6469 Quals.setObjCLifetime(Q1.getObjCLifetime());
6470 else if (T1->isVoidPointerType() || T2->isVoidPointerType())
6471 assert(Steps.size() == 1);
6472 else
6473 return QualType();
6474
6476 Quals.setPointerAuth(Q1.getPointerAuth());
6477 else
6478 return QualType();
6479
6480 Steps.back().Quals = Quals;
6481 if (Q1 != Quals || Q2 != Quals)
6482 NeedConstBefore = Steps.size() - 1;
6483 }
6484
6485 // FIXME: Can we unify the following with UnwrapSimilarTypes?
6486
6487 const ArrayType *Arr1, *Arr2;
6488 if ((Arr1 = Context.getAsArrayType(Composite1)) &&
6489 (Arr2 = Context.getAsArrayType(Composite2))) {
6490 auto *CAT1 = dyn_cast<ConstantArrayType>(Arr1);
6491 auto *CAT2 = dyn_cast<ConstantArrayType>(Arr2);
6492 if (CAT1 && CAT2 && CAT1->getSize() == CAT2->getSize()) {
6493 Composite1 = Arr1->getElementType();
6494 Composite2 = Arr2->getElementType();
6495 Steps.emplace_back(Step::Array, CAT1);
6496 continue;
6497 }
6498 bool IAT1 = isa<IncompleteArrayType>(Arr1);
6499 bool IAT2 = isa<IncompleteArrayType>(Arr2);
6500 if ((IAT1 && IAT2) ||
6501 (getLangOpts().CPlusPlus20 && (IAT1 != IAT2) &&
6502 ((bool)CAT1 != (bool)CAT2) &&
6503 (Steps.empty() || Steps.back().K != Step::Array))) {
6504 // In C++20 onwards, we can unify an array of N T with an array of
6505 // a different or unknown bound. But we can't form an array whose
6506 // element type is an array of unknown bound by doing so.
6507 Composite1 = Arr1->getElementType();
6508 Composite2 = Arr2->getElementType();
6509 Steps.emplace_back(Step::Array);
6510 if (CAT1 || CAT2)
6511 NeedConstBefore = Steps.size();
6512 continue;
6513 }
6514 }
6515
6516 const PointerType *Ptr1, *Ptr2;
6517 if ((Ptr1 = Composite1->getAs<PointerType>()) &&
6518 (Ptr2 = Composite2->getAs<PointerType>())) {
6519 Composite1 = Ptr1->getPointeeType();
6520 Composite2 = Ptr2->getPointeeType();
6521 Steps.emplace_back(Step::Pointer);
6522 continue;
6523 }
6524
6525 const ObjCObjectPointerType *ObjPtr1, *ObjPtr2;
6526 if ((ObjPtr1 = Composite1->getAs<ObjCObjectPointerType>()) &&
6527 (ObjPtr2 = Composite2->getAs<ObjCObjectPointerType>())) {
6528 Composite1 = ObjPtr1->getPointeeType();
6529 Composite2 = ObjPtr2->getPointeeType();
6530 Steps.emplace_back(Step::ObjCPointer);
6531 continue;
6532 }
6533
6534 const MemberPointerType *MemPtr1, *MemPtr2;
6535 if ((MemPtr1 = Composite1->getAs<MemberPointerType>()) &&
6536 (MemPtr2 = Composite2->getAs<MemberPointerType>())) {
6537 Composite1 = MemPtr1->getPointeeType();
6538 Composite2 = MemPtr2->getPointeeType();
6539
6540 // At the top level, we can perform a base-to-derived pointer-to-member
6541 // conversion:
6542 //
6543 // - [...] where C1 is reference-related to C2 or C2 is
6544 // reference-related to C1
6545 //
6546 // (Note that the only kinds of reference-relatedness in scope here are
6547 // "same type or derived from".) At any other level, the class must
6548 // exactly match.
6549 CXXRecordDecl *Cls = nullptr,
6550 *Cls1 = MemPtr1->getMostRecentCXXRecordDecl(),
6551 *Cls2 = MemPtr2->getMostRecentCXXRecordDecl();
6552 if (declaresSameEntity(Cls1, Cls2))
6553 Cls = Cls1;
6554 else if (Steps.empty())
6555 Cls = IsDerivedFrom(Loc, Cls1, Cls2) ? Cls1
6556 : IsDerivedFrom(Loc, Cls2, Cls1) ? Cls2
6557 : nullptr;
6558 if (!Cls)
6559 return QualType();
6560
6561 Steps.emplace_back(Step::MemberPointer,
6562 Context.getCanonicalTagType(Cls).getTypePtr());
6563 continue;
6564 }
6565
6566 // Special case: at the top level, we can decompose an Objective-C pointer
6567 // and a 'cv void *'. Unify the qualifiers.
6568 if (Steps.empty() && ((Composite1->isVoidPointerType() &&
6569 Composite2->isObjCObjectPointerType()) ||
6570 (Composite1->isObjCObjectPointerType() &&
6571 Composite2->isVoidPointerType()))) {
6572 Composite1 = Composite1->getPointeeType();
6573 Composite2 = Composite2->getPointeeType();
6574 Steps.emplace_back(Step::Pointer);
6575 continue;
6576 }
6577
6578 // FIXME: block pointer types?
6579
6580 // Cannot unwrap any more types.
6581 break;
6582 }
6583
6584 // - if T1 or T2 is "pointer to noexcept function" and the other type is
6585 // "pointer to function", where the function types are otherwise the same,
6586 // "pointer to function";
6587 // - if T1 or T2 is "pointer to member of C1 of type function", the other
6588 // type is "pointer to member of C2 of type noexcept function", and C1
6589 // is reference-related to C2 or C2 is reference-related to C1, where
6590 // the function types are otherwise the same, "pointer to member of C2 of
6591 // type function" or "pointer to member of C1 of type function",
6592 // respectively;
6593 //
6594 // We also support 'noreturn' here, so as a Clang extension we generalize the
6595 // above to:
6596 //
6597 // - [Clang] If T1 and T2 are both of type "pointer to function" or
6598 // "pointer to member function" and the pointee types can be unified
6599 // by a function pointer conversion, that conversion is applied
6600 // before checking the following rules.
6601 //
6602 // We've already unwrapped down to the function types, and we want to merge
6603 // rather than just convert, so do this ourselves rather than calling
6604 // IsFunctionConversion.
6605 //
6606 // FIXME: In order to match the standard wording as closely as possible, we
6607 // currently only do this under a single level of pointers. Ideally, we would
6608 // allow this in general, and set NeedConstBefore to the relevant depth on
6609 // the side(s) where we changed anything. If we permit that, we should also
6610 // consider this conversion when determining type similarity and model it as
6611 // a qualification conversion.
6612 if (Steps.size() == 1) {
6613 if (auto *FPT1 = Composite1->getAs<FunctionProtoType>()) {
6614 if (auto *FPT2 = Composite2->getAs<FunctionProtoType>()) {
6615 FunctionProtoType::ExtProtoInfo EPI1 = FPT1->getExtProtoInfo();
6616 FunctionProtoType::ExtProtoInfo EPI2 = FPT2->getExtProtoInfo();
6617
6618 // The result is noreturn if both operands are.
6619 bool Noreturn =
6620 EPI1.ExtInfo.getNoReturn() && EPI2.ExtInfo.getNoReturn();
6621 EPI1.ExtInfo = EPI1.ExtInfo.withNoReturn(Noreturn);
6622 EPI2.ExtInfo = EPI2.ExtInfo.withNoReturn(Noreturn);
6623
6624 bool CFIUncheckedCallee =
6626 EPI1.CFIUncheckedCallee = CFIUncheckedCallee;
6627 EPI2.CFIUncheckedCallee = CFIUncheckedCallee;
6628
6629 // The result is nothrow if both operands are.
6630 SmallVector<QualType, 8> ExceptionTypeStorage;
6631 EPI1.ExceptionSpec = EPI2.ExceptionSpec = Context.mergeExceptionSpecs(
6632 EPI1.ExceptionSpec, EPI2.ExceptionSpec, ExceptionTypeStorage,
6634
6635 Composite1 = Context.getFunctionType(FPT1->getReturnType(),
6636 FPT1->getParamTypes(), EPI1);
6637 Composite2 = Context.getFunctionType(FPT2->getReturnType(),
6638 FPT2->getParamTypes(), EPI2);
6639 }
6640 }
6641 }
6642
6643 // There are some more conversions we can perform under exactly one pointer.
6644 if (Steps.size() == 1 && Steps.front().K == Step::Pointer &&
6645 !Context.hasSameType(Composite1, Composite2)) {
6646 // - if T1 or T2 is "pointer to cv1 void" and the other type is
6647 // "pointer to cv2 T", where T is an object type or void,
6648 // "pointer to cv12 void", where cv12 is the union of cv1 and cv2;
6649 if (Composite1->isVoidType() && Composite2->isObjectType())
6650 Composite2 = Composite1;
6651 else if (Composite2->isVoidType() && Composite1->isObjectType())
6652 Composite1 = Composite2;
6653 // - if T1 is "pointer to cv1 C1" and T2 is "pointer to cv2 C2", where C1
6654 // is reference-related to C2 or C2 is reference-related to C1 (8.6.3),
6655 // the cv-combined type of T1 and T2 or the cv-combined type of T2 and
6656 // T1, respectively;
6657 //
6658 // The "similar type" handling covers all of this except for the "T1 is a
6659 // base class of T2" case in the definition of reference-related.
6660 else if (IsDerivedFrom(Loc, Composite1, Composite2))
6661 Composite1 = Composite2;
6662 else if (IsDerivedFrom(Loc, Composite2, Composite1))
6663 Composite2 = Composite1;
6664 }
6665
6666 // At this point, either the inner types are the same or we have failed to
6667 // find a composite pointer type.
6668 if (!Context.hasSameType(Composite1, Composite2))
6669 return QualType();
6670
6671 // Per C++ [conv.qual]p3, add 'const' to every level before the last
6672 // differing qualifier.
6673 for (unsigned I = 0; I != NeedConstBefore; ++I)
6674 Steps[I].Quals.addConst();
6675
6676 // Rebuild the composite type.
6677 QualType Composite = Context.getCommonSugaredType(Composite1, Composite2);
6678 for (auto &S : llvm::reverse(Steps))
6679 Composite = S.rebuild(Context, Composite);
6680
6681 if (ConvertArgs) {
6682 // Convert the expressions to the composite pointer type.
6683 InitializedEntity Entity =
6685 InitializationKind Kind =
6687
6688 InitializationSequence E1ToC(*this, Entity, Kind, E1);
6689 if (!E1ToC)
6690 return QualType();
6691
6692 InitializationSequence E2ToC(*this, Entity, Kind, E2);
6693 if (!E2ToC)
6694 return QualType();
6695
6696 // FIXME: Let the caller know if these fail to avoid duplicate diagnostics.
6697 ExprResult E1Result = E1ToC.Perform(*this, Entity, Kind, E1);
6698 if (E1Result.isInvalid())
6699 return QualType();
6700 E1 = E1Result.get();
6701
6702 ExprResult E2Result = E2ToC.Perform(*this, Entity, Kind, E2);
6703 if (E2Result.isInvalid())
6704 return QualType();
6705 E2 = E2Result.get();
6706 }
6707
6708 return Composite;
6709}
6710
6712 if (!E)
6713 return ExprError();
6714
6715 assert(!isa<CXXBindTemporaryExpr>(E) && "Double-bound temporary?");
6716
6717 // If the result is a glvalue, we shouldn't bind it.
6718 if (E->isGLValue())
6719 return E;
6720
6721 // In ARC, calls that return a retainable type can return retained,
6722 // in which case we have to insert a consuming cast.
6723 if (getLangOpts().ObjCAutoRefCount &&
6724 E->getType()->isObjCRetainableType()) {
6725
6726 bool ReturnsRetained;
6727
6728 // For actual calls, we compute this by examining the type of the
6729 // called value.
6730 if (CallExpr *Call = dyn_cast<CallExpr>(E)) {
6731 Expr *Callee = Call->getCallee()->IgnoreParens();
6732 QualType T = Callee->getType();
6733
6734 if (T == Context.BoundMemberTy) {
6735 // Handle pointer-to-members.
6736 if (BinaryOperator *BinOp = dyn_cast<BinaryOperator>(Callee))
6737 T = BinOp->getRHS()->getType();
6738 else if (MemberExpr *Mem = dyn_cast<MemberExpr>(Callee))
6739 T = Mem->getMemberDecl()->getType();
6740 }
6741
6742 if (const PointerType *Ptr = T->getAs<PointerType>())
6743 T = Ptr->getPointeeType();
6744 else if (const BlockPointerType *Ptr = T->getAs<BlockPointerType>())
6745 T = Ptr->getPointeeType();
6746 else if (const MemberPointerType *MemPtr = T->getAs<MemberPointerType>())
6747 T = MemPtr->getPointeeType();
6748
6749 auto *FTy = T->castAs<FunctionType>();
6750 ReturnsRetained = FTy->getExtInfo().getProducesResult();
6751
6752 // ActOnStmtExpr arranges things so that StmtExprs of retainable
6753 // type always produce a +1 object.
6754 } else if (isa<StmtExpr>(E)) {
6755 ReturnsRetained = true;
6756
6757 // We hit this case with the lambda conversion-to-block optimization;
6758 // we don't want any extra casts here.
6759 } else if (isa<CastExpr>(E) &&
6760 isa<BlockExpr>(cast<CastExpr>(E)->getSubExpr())) {
6761 return E;
6762
6763 // For message sends and property references, we try to find an
6764 // actual method. FIXME: we should infer retention by selector in
6765 // cases where we don't have an actual method.
6766 } else {
6767 ObjCMethodDecl *D = nullptr;
6768 if (ObjCMessageExpr *Send = dyn_cast<ObjCMessageExpr>(E)) {
6769 D = Send->getMethodDecl();
6770 } else if (auto *OL = dyn_cast<ObjCObjectLiteral>(E);
6771 OL && OL->isGlobalAllocation()) {
6772 return E;
6773 } else if (ObjCBoxedExpr *BoxedExpr = dyn_cast<ObjCBoxedExpr>(E)) {
6774 D = BoxedExpr->getBoxingMethod();
6775 } else if (ObjCArrayLiteral *ArrayLit = dyn_cast<ObjCArrayLiteral>(E)) {
6776 // Don't do reclaims if we're using the zero-element array
6777 // constant.
6778 if (ArrayLit->getNumElements() == 0 &&
6779 Context.getLangOpts().ObjCRuntime.hasEmptyCollections())
6780 return E;
6781
6782 D = ArrayLit->getArrayWithObjectsMethod();
6783 } else if (ObjCDictionaryLiteral *DictLit =
6784 dyn_cast<ObjCDictionaryLiteral>(E)) {
6785 // Don't do reclaims if we're using the zero-element dictionary
6786 // constant.
6787 if (DictLit->getNumElements() == 0 &&
6788 Context.getLangOpts().ObjCRuntime.hasEmptyCollections())
6789 return E;
6790
6791 D = DictLit->getDictWithObjectsMethod();
6792 }
6793
6794 ReturnsRetained = (D && D->hasAttr<NSReturnsRetainedAttr>());
6795
6796 // Don't do reclaims on performSelector calls; despite their
6797 // return type, the invoked method doesn't necessarily actually
6798 // return an object.
6799 if (!ReturnsRetained &&
6801 return E;
6802 }
6803
6804 // Don't reclaim an object of Class type.
6805 if (!ReturnsRetained && E->getType()->isObjCARCImplicitlyUnretainedType())
6806 return E;
6807
6808 Cleanup.setExprNeedsCleanups(true);
6809
6810 CastKind ck = (ReturnsRetained ? CK_ARCConsumeObject
6811 : CK_ARCReclaimReturnedObject);
6812 return ImplicitCastExpr::Create(Context, E->getType(), ck, E, nullptr,
6814 }
6815
6817 Cleanup.setExprNeedsCleanups(true);
6818
6819 if (!getLangOpts().CPlusPlus)
6820 return E;
6821
6822 // Search for the base element type (cf. ASTContext::getBaseElementType) with
6823 // a fast path for the common case that the type is directly a RecordType.
6824 const Type *T = Context.getCanonicalType(E->getType().getTypePtr());
6825 const RecordType *RT = nullptr;
6826 while (!RT) {
6827 switch (T->getTypeClass()) {
6828 case Type::Record:
6829 RT = cast<RecordType>(T);
6830 break;
6831 case Type::ConstantArray:
6832 case Type::IncompleteArray:
6833 case Type::VariableArray:
6834 case Type::DependentSizedArray:
6835 T = cast<ArrayType>(T)->getElementType().getTypePtr();
6836 break;
6837 default:
6838 return E;
6839 }
6840 }
6841
6842 // That should be enough to guarantee that this type is complete, if we're
6843 // not processing a decltype expression.
6844 auto *RD = cast<CXXRecordDecl>(RT->getDecl())->getDefinitionOrSelf();
6845 if (RD->isInvalidDecl() || RD->isDependentContext())
6846 return E;
6847
6848 bool IsDecltype = ExprEvalContexts.back().ExprContext ==
6851
6852 if (Destructor) {
6855 PDiag(diag::err_access_dtor_temp)
6856 << E->getType());
6858 return ExprError();
6859
6860 // If destructor is trivial, we can avoid the extra copy.
6861 if (Destructor->isTrivial())
6862 return E;
6863
6864 // We need a cleanup, but we don't need to remember the temporary.
6865 Cleanup.setExprNeedsCleanups(true);
6866 }
6867
6870
6871 if (IsDecltype)
6872 ExprEvalContexts.back().DelayedDecltypeBinds.push_back(Bind);
6873
6874 return Bind;
6875}
6876
6879 if (SubExpr.isInvalid())
6880 return ExprError();
6881
6882 return MaybeCreateExprWithCleanups(SubExpr.get());
6883}
6884
6886 assert(SubExpr && "subexpression can't be null!");
6887
6889
6890 unsigned FirstCleanup = ExprEvalContexts.back().NumCleanupObjects;
6891 assert(ExprCleanupObjects.size() >= FirstCleanup);
6892 assert(Cleanup.exprNeedsCleanups() ||
6893 ExprCleanupObjects.size() == FirstCleanup);
6894 if (!Cleanup.exprNeedsCleanups())
6895 return SubExpr;
6896
6897 auto Cleanups = llvm::ArrayRef(ExprCleanupObjects.begin() + FirstCleanup,
6898 ExprCleanupObjects.size() - FirstCleanup);
6899
6900 auto *E = ExprWithCleanups::Create(
6901 Context, SubExpr, Cleanup.cleanupsHaveSideEffects(), Cleanups);
6903
6904 return E;
6905}
6906
6908 assert(SubStmt && "sub-statement can't be null!");
6909
6911
6912 if (!Cleanup.exprNeedsCleanups())
6913 return SubStmt;
6914
6915 // FIXME: In order to attach the temporaries, wrap the statement into
6916 // a StmtExpr; currently this is only used for asm statements.
6917 // This is hacky, either create a new CXXStmtWithTemporaries statement or
6918 // a new AsmStmtWithTemporaries.
6919 CompoundStmt *CompStmt =
6922 Expr *E = new (Context)
6923 StmtExpr(CompStmt, Context.VoidTy, SourceLocation(), SourceLocation(),
6924 /*FIXME TemplateDepth=*/0);
6926}
6927
6929 assert(ExprEvalContexts.back().ExprContext ==
6931 "not in a decltype expression");
6932
6934 if (Result.isInvalid())
6935 return ExprError();
6936 E = Result.get();
6937
6938 // C++11 [expr.call]p11:
6939 // If a function call is a prvalue of object type,
6940 // -- if the function call is either
6941 // -- the operand of a decltype-specifier, or
6942 // -- the right operand of a comma operator that is the operand of a
6943 // decltype-specifier,
6944 // a temporary object is not introduced for the prvalue.
6945
6946 // Recursively rebuild ParenExprs and comma expressions to strip out the
6947 // outermost CXXBindTemporaryExpr, if any.
6948 if (ParenExpr *PE = dyn_cast<ParenExpr>(E)) {
6949 ExprResult SubExpr = ActOnDecltypeExpression(PE->getSubExpr());
6950 if (SubExpr.isInvalid())
6951 return ExprError();
6952 if (SubExpr.get() == PE->getSubExpr())
6953 return E;
6954 return ActOnParenExpr(PE->getLParen(), PE->getRParen(), SubExpr.get());
6955 }
6956 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
6957 if (BO->getOpcode() == BO_Comma) {
6958 ExprResult RHS = ActOnDecltypeExpression(BO->getRHS());
6959 if (RHS.isInvalid())
6960 return ExprError();
6961 if (RHS.get() == BO->getRHS())
6962 return E;
6963 return BinaryOperator::Create(Context, BO->getLHS(), RHS.get(), BO_Comma,
6964 BO->getType(), BO->getValueKind(),
6965 BO->getObjectKind(), BO->getOperatorLoc(),
6966 BO->getFPFeatures());
6967 }
6968 }
6969
6970 CXXBindTemporaryExpr *TopBind = dyn_cast<CXXBindTemporaryExpr>(E);
6971 CallExpr *TopCall = TopBind ? dyn_cast<CallExpr>(TopBind->getSubExpr())
6972 : nullptr;
6973 if (TopCall)
6974 E = TopCall;
6975 else
6976 TopBind = nullptr;
6977
6978 // Disable the special decltype handling now.
6979 ExprEvalContexts.back().ExprContext =
6981
6983 if (Result.isInvalid())
6984 return ExprError();
6985 E = Result.get();
6986
6987 // In MS mode, don't perform any extra checking of call return types within a
6988 // decltype expression.
6989 if (getLangOpts().MSVCCompat)
6990 return E;
6991
6992 // Perform the semantic checks we delayed until this point.
6993 for (unsigned I = 0, N = ExprEvalContexts.back().DelayedDecltypeCalls.size();
6994 I != N; ++I) {
6995 CallExpr *Call = ExprEvalContexts.back().DelayedDecltypeCalls[I];
6996 if (Call == TopCall)
6997 continue;
6998
6999 if (CheckCallReturnType(Call->getCallReturnType(Context),
7000 Call->getBeginLoc(), Call, Call->getDirectCallee()))
7001 return ExprError();
7002 }
7003
7004 // Now all relevant types are complete, check the destructors are accessible
7005 // and non-deleted, and annotate them on the temporaries.
7006 for (unsigned I = 0, N = ExprEvalContexts.back().DelayedDecltypeBinds.size();
7007 I != N; ++I) {
7009 ExprEvalContexts.back().DelayedDecltypeBinds[I];
7010 if (Bind == TopBind)
7011 continue;
7012
7013 CXXTemporary *Temp = Bind->getTemporary();
7014
7015 CXXRecordDecl *RD =
7016 Bind->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl();
7019
7020 MarkFunctionReferenced(Bind->getExprLoc(), Destructor);
7021 CheckDestructorAccess(Bind->getExprLoc(), Destructor,
7022 PDiag(diag::err_access_dtor_temp)
7023 << Bind->getType());
7024 if (DiagnoseUseOfDecl(Destructor, Bind->getExprLoc()))
7025 return ExprError();
7026
7027 // We need a cleanup, but we don't need to remember the temporary.
7028 Cleanup.setExprNeedsCleanups(true);
7029 }
7030
7031 // Possibly strip off the top CXXBindTemporaryExpr.
7032 return E;
7033}
7034
7035/// Note a set of 'operator->' functions that were used for a member access.
7037 ArrayRef<FunctionDecl *> OperatorArrows) {
7038 unsigned SkipStart = OperatorArrows.size(), SkipCount = 0;
7039 // FIXME: Make this configurable?
7040 unsigned Limit = 9;
7041 if (OperatorArrows.size() > Limit) {
7042 // Produce Limit-1 normal notes and one 'skipping' note.
7043 SkipStart = (Limit - 1) / 2 + (Limit - 1) % 2;
7044 SkipCount = OperatorArrows.size() - (Limit - 1);
7045 }
7046
7047 for (unsigned I = 0; I < OperatorArrows.size(); /**/) {
7048 if (I == SkipStart) {
7049 S.Diag(OperatorArrows[I]->getLocation(),
7050 diag::note_operator_arrows_suppressed)
7051 << SkipCount;
7052 I += SkipCount;
7053 } else {
7054 S.Diag(OperatorArrows[I]->getLocation(), diag::note_operator_arrow_here)
7055 << OperatorArrows[I]->getCallResultType();
7056 ++I;
7057 }
7058 }
7059}
7060
7062 SourceLocation OpLoc,
7063 tok::TokenKind OpKind,
7064 ParsedType &ObjectType,
7065 bool &MayBePseudoDestructor) {
7066 // Since this might be a postfix expression, get rid of ParenListExprs.
7068 if (Result.isInvalid()) return ExprError();
7069 Base = Result.get();
7070
7072 if (Result.isInvalid()) return ExprError();
7073 Base = Result.get();
7074
7075 QualType BaseType = Base->getType();
7076 MayBePseudoDestructor = false;
7077 if (BaseType->isDependentType()) {
7078 // If we have a pointer to a dependent type and are using the -> operator,
7079 // the object type is the type that the pointer points to. We might still
7080 // have enough information about that type to do something useful.
7081 if (OpKind == tok::arrow)
7082 if (const PointerType *Ptr = BaseType->getAs<PointerType>())
7083 BaseType = Ptr->getPointeeType();
7084
7085 ObjectType = ParsedType::make(BaseType);
7086 MayBePseudoDestructor = true;
7087 return Base;
7088 }
7089
7090 // C++ [over.match.oper]p8:
7091 // [...] When operator->returns, the operator-> is applied to the value
7092 // returned, with the original second operand.
7093 if (OpKind == tok::arrow) {
7094 QualType StartingType = BaseType;
7095 bool NoArrowOperatorFound = false;
7096 bool FirstIteration = true;
7097 FunctionDecl *CurFD = dyn_cast<FunctionDecl>(CurContext);
7098 // The set of types we've considered so far.
7100 SmallVector<FunctionDecl*, 8> OperatorArrows;
7101 CTypes.insert(Context.getCanonicalType(BaseType));
7102
7103 while (BaseType->isRecordType()) {
7104 if (OperatorArrows.size() >= getLangOpts().ArrowDepth) {
7105 Diag(OpLoc, diag::err_operator_arrow_depth_exceeded)
7106 << StartingType << getLangOpts().ArrowDepth << Base->getSourceRange();
7107 noteOperatorArrows(*this, OperatorArrows);
7108 Diag(OpLoc, diag::note_operator_arrow_depth)
7109 << getLangOpts().ArrowDepth;
7110 return ExprError();
7111 }
7112
7114 S, Base, OpLoc,
7115 // When in a template specialization and on the first loop iteration,
7116 // potentially give the default diagnostic (with the fixit in a
7117 // separate note) instead of having the error reported back to here
7118 // and giving a diagnostic with a fixit attached to the error itself.
7119 (FirstIteration && CurFD && CurFD->isFunctionTemplateSpecialization())
7120 ? nullptr
7121 : &NoArrowOperatorFound);
7122 if (Result.isInvalid()) {
7123 if (NoArrowOperatorFound) {
7124 if (FirstIteration) {
7125 Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
7126 << BaseType << 1 << Base->getSourceRange()
7127 << FixItHint::CreateReplacement(OpLoc, ".");
7128 OpKind = tok::period;
7129 break;
7130 }
7131 Diag(OpLoc, diag::err_typecheck_member_reference_arrow)
7132 << BaseType << Base->getSourceRange();
7133 CallExpr *CE = dyn_cast<CallExpr>(Base);
7134 if (Decl *CD = (CE ? CE->getCalleeDecl() : nullptr)) {
7135 Diag(CD->getBeginLoc(),
7136 diag::note_member_reference_arrow_from_operator_arrow);
7137 }
7138 }
7139 return ExprError();
7140 }
7141 Base = Result.get();
7142 if (CXXOperatorCallExpr *OpCall = dyn_cast<CXXOperatorCallExpr>(Base))
7143 OperatorArrows.push_back(OpCall->getDirectCallee());
7144 BaseType = Base->getType();
7145 CanQualType CBaseType = Context.getCanonicalType(BaseType);
7146 if (!CTypes.insert(CBaseType).second) {
7147 Diag(OpLoc, diag::err_operator_arrow_circular) << StartingType;
7148 noteOperatorArrows(*this, OperatorArrows);
7149 return ExprError();
7150 }
7151 FirstIteration = false;
7152 }
7153
7154 if (OpKind == tok::arrow) {
7155 if (BaseType->isPointerType())
7156 BaseType = BaseType->getPointeeType();
7157 else if (auto *AT = Context.getAsArrayType(BaseType))
7158 BaseType = AT->getElementType();
7159 }
7160 }
7161
7162 // Objective-C properties allow "." access on Objective-C pointer types,
7163 // so adjust the base type to the object type itself.
7164 if (BaseType->isObjCObjectPointerType())
7165 BaseType = BaseType->getPointeeType();
7166
7167 // C++ [basic.lookup.classref]p2:
7168 // [...] If the type of the object expression is of pointer to scalar
7169 // type, the unqualified-id is looked up in the context of the complete
7170 // postfix-expression.
7171 //
7172 // This also indicates that we could be parsing a pseudo-destructor-name.
7173 // Note that Objective-C class and object types can be pseudo-destructor
7174 // expressions or normal member (ivar or property) access expressions, and
7175 // it's legal for the type to be incomplete if this is a pseudo-destructor
7176 // call. We'll do more incomplete-type checks later in the lookup process,
7177 // so just skip this check for ObjC types.
7178 if (!BaseType->isRecordType()) {
7179 ObjectType = ParsedType::make(BaseType);
7180 MayBePseudoDestructor = true;
7181 return Base;
7182 }
7183
7184 // The object type must be complete (or dependent), or
7185 // C++11 [expr.prim.general]p3:
7186 // Unlike the object expression in other contexts, *this is not required to
7187 // be of complete type for purposes of class member access (5.2.5) outside
7188 // the member function body.
7189 if (!BaseType->isDependentType() &&
7191 RequireCompleteType(OpLoc, BaseType,
7192 diag::err_incomplete_member_access)) {
7193 return CreateRecoveryExpr(Base->getBeginLoc(), Base->getEndLoc(), {Base});
7194 }
7195
7196 // C++ [basic.lookup.classref]p2:
7197 // If the id-expression in a class member access (5.2.5) is an
7198 // unqualified-id, and the type of the object expression is of a class
7199 // type C (or of pointer to a class type C), the unqualified-id is looked
7200 // up in the scope of class C. [...]
7201 ObjectType = ParsedType::make(BaseType);
7202 return Base;
7203}
7204
7205static bool CheckArrow(Sema &S, QualType &ObjectType, Expr *&Base,
7206 tok::TokenKind &OpKind, SourceLocation OpLoc) {
7207 if (Base->hasPlaceholderType()) {
7209 if (result.isInvalid()) return true;
7210 Base = result.get();
7211 }
7212 ObjectType = Base->getType();
7213
7214 // C++ [expr.pseudo]p2:
7215 // The left-hand side of the dot operator shall be of scalar type. The
7216 // left-hand side of the arrow operator shall be of pointer to scalar type.
7217 // This scalar type is the object type.
7218 // Note that this is rather different from the normal handling for the
7219 // arrow operator.
7220 if (OpKind == tok::arrow) {
7221 // The operator requires a prvalue, so perform lvalue conversions.
7222 // Only do this if we might plausibly end with a pointer, as otherwise
7223 // this was likely to be intended to be a '.'.
7224 if (ObjectType->isPointerType() || ObjectType->isArrayType() ||
7225 ObjectType->isFunctionType()) {
7227 if (BaseResult.isInvalid())
7228 return true;
7229 Base = BaseResult.get();
7230 ObjectType = Base->getType();
7231 }
7232
7233 if (const PointerType *Ptr = ObjectType->getAs<PointerType>()) {
7234 ObjectType = Ptr->getPointeeType();
7235 } else if (!Base->isTypeDependent()) {
7236 // The user wrote "p->" when they probably meant "p."; fix it.
7237 S.Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
7238 << ObjectType << true
7239 << FixItHint::CreateReplacement(OpLoc, ".");
7240 if (S.isSFINAEContext())
7241 return true;
7242
7243 OpKind = tok::period;
7244 }
7245 }
7246
7247 return false;
7248}
7249
7250/// Check if it's ok to try and recover dot pseudo destructor calls on
7251/// pointer objects.
7252static bool
7254 QualType DestructedType) {
7255 // If this is a record type, check if its destructor is callable.
7256 if (auto *RD = DestructedType->getAsCXXRecordDecl()) {
7257 if (RD->hasDefinition())
7258 if (CXXDestructorDecl *D = SemaRef.LookupDestructor(RD))
7259 return SemaRef.CanUseDecl(D, /*TreatUnavailableAsInvalid=*/false);
7260 return false;
7261 }
7262
7263 // Otherwise, check if it's a type for which it's valid to use a pseudo-dtor.
7264 return DestructedType->isDependentType() || DestructedType->isScalarType() ||
7265 DestructedType->isVectorType();
7266}
7267
7269 SourceLocation OpLoc,
7270 tok::TokenKind OpKind,
7271 const CXXScopeSpec &SS,
7272 TypeSourceInfo *ScopeTypeInfo,
7273 SourceLocation CCLoc,
7274 SourceLocation TildeLoc,
7275 PseudoDestructorTypeStorage Destructed) {
7276 TypeSourceInfo *DestructedTypeInfo = Destructed.getTypeSourceInfo();
7277
7278 QualType ObjectType;
7279 if (CheckArrow(*this, ObjectType, Base, OpKind, OpLoc))
7280 return ExprError();
7281
7282 if (!ObjectType->isDependentType() && !ObjectType->isScalarType() &&
7283 !ObjectType->isVectorType() && !ObjectType->isMatrixType()) {
7284 if (getLangOpts().MSVCCompat && ObjectType->isVoidType())
7285 Diag(OpLoc, diag::ext_pseudo_dtor_on_void) << Base->getSourceRange();
7286 else {
7287 Diag(OpLoc, diag::err_pseudo_dtor_base_not_scalar)
7288 << ObjectType << Base->getSourceRange();
7289 return ExprError();
7290 }
7291 }
7292
7293 // C++ [expr.pseudo]p2:
7294 // [...] The cv-unqualified versions of the object type and of the type
7295 // designated by the pseudo-destructor-name shall be the same type.
7296 if (DestructedTypeInfo) {
7297 QualType DestructedType = DestructedTypeInfo->getType();
7298 SourceLocation DestructedTypeStart =
7299 DestructedTypeInfo->getTypeLoc().getBeginLoc();
7300 if (!DestructedType->isDependentType() && !ObjectType->isDependentType()) {
7301 if (!Context.hasSameUnqualifiedType(DestructedType, ObjectType)) {
7302 // Detect dot pseudo destructor calls on pointer objects, e.g.:
7303 // Foo *foo;
7304 // foo.~Foo();
7305 if (OpKind == tok::period && ObjectType->isPointerType() &&
7306 Context.hasSameUnqualifiedType(DestructedType,
7307 ObjectType->getPointeeType())) {
7308 auto Diagnostic =
7309 Diag(OpLoc, diag::err_typecheck_member_reference_suggestion)
7310 << ObjectType << /*IsArrow=*/0 << Base->getSourceRange();
7311
7312 // Issue a fixit only when the destructor is valid.
7314 *this, DestructedType))
7316
7317 // Recover by setting the object type to the destructed type and the
7318 // operator to '->'.
7319 ObjectType = DestructedType;
7320 OpKind = tok::arrow;
7321 } else {
7322 Diag(DestructedTypeStart, diag::err_pseudo_dtor_type_mismatch)
7323 << ObjectType << DestructedType << Base->getSourceRange()
7324 << DestructedTypeInfo->getTypeLoc().getSourceRange();
7325
7326 // Recover by setting the destructed type to the object type.
7327 DestructedType = ObjectType;
7328 DestructedTypeInfo =
7329 Context.getTrivialTypeSourceInfo(ObjectType, DestructedTypeStart);
7330 Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo);
7331 }
7332 } else if (DestructedType.getObjCLifetime() !=
7333 ObjectType.getObjCLifetime()) {
7334
7335 if (DestructedType.getObjCLifetime() == Qualifiers::OCL_None) {
7336 // Okay: just pretend that the user provided the correctly-qualified
7337 // type.
7338 } else {
7339 Diag(DestructedTypeStart, diag::err_arc_pseudo_dtor_inconstant_quals)
7340 << ObjectType << DestructedType << Base->getSourceRange()
7341 << DestructedTypeInfo->getTypeLoc().getSourceRange();
7342 }
7343
7344 // Recover by setting the destructed type to the object type.
7345 DestructedType = ObjectType;
7346 DestructedTypeInfo = Context.getTrivialTypeSourceInfo(ObjectType,
7347 DestructedTypeStart);
7348 Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo);
7349 }
7350 }
7351 }
7352
7353 // C++ [expr.pseudo]p2:
7354 // [...] Furthermore, the two type-names in a pseudo-destructor-name of the
7355 // form
7356 //
7357 // ::[opt] nested-name-specifier[opt] type-name :: ~ type-name
7358 //
7359 // shall designate the same scalar type.
7360 if (ScopeTypeInfo) {
7361 QualType ScopeType = ScopeTypeInfo->getType();
7362 if (!ScopeType->isDependentType() && !ObjectType->isDependentType() &&
7363 !Context.hasSameUnqualifiedType(ScopeType, ObjectType)) {
7364
7365 Diag(ScopeTypeInfo->getTypeLoc().getSourceRange().getBegin(),
7366 diag::err_pseudo_dtor_type_mismatch)
7367 << ObjectType << ScopeType << Base->getSourceRange()
7368 << ScopeTypeInfo->getTypeLoc().getSourceRange();
7369
7370 ScopeType = QualType();
7371 ScopeTypeInfo = nullptr;
7372 }
7373 }
7374
7375 Expr *Result
7377 OpKind == tok::arrow, OpLoc,
7379 ScopeTypeInfo,
7380 CCLoc,
7381 TildeLoc,
7382 Destructed);
7383
7384 return Result;
7385}
7386
7388 SourceLocation OpLoc,
7389 tok::TokenKind OpKind,
7390 CXXScopeSpec &SS,
7391 UnqualifiedId &FirstTypeName,
7392 SourceLocation CCLoc,
7393 SourceLocation TildeLoc,
7394 UnqualifiedId &SecondTypeName) {
7395 assert((FirstTypeName.getKind() == UnqualifiedIdKind::IK_TemplateId ||
7396 FirstTypeName.getKind() == UnqualifiedIdKind::IK_Identifier) &&
7397 "Invalid first type name in pseudo-destructor");
7398 assert((SecondTypeName.getKind() == UnqualifiedIdKind::IK_TemplateId ||
7399 SecondTypeName.getKind() == UnqualifiedIdKind::IK_Identifier) &&
7400 "Invalid second type name in pseudo-destructor");
7401
7402 QualType ObjectType;
7403 if (CheckArrow(*this, ObjectType, Base, OpKind, OpLoc))
7404 return ExprError();
7405
7406 // Compute the object type that we should use for name lookup purposes. Only
7407 // record types and dependent types matter.
7408 ParsedType ObjectTypePtrForLookup;
7409 if (!SS.isSet()) {
7410 if (ObjectType->isRecordType())
7411 ObjectTypePtrForLookup = ParsedType::make(ObjectType);
7412 else if (ObjectType->isDependentType())
7413 ObjectTypePtrForLookup = ParsedType::make(Context.DependentTy);
7414 }
7415
7416 // Convert the name of the type being destructed (following the ~) into a
7417 // type (with source-location information).
7418 QualType DestructedType;
7419 TypeSourceInfo *DestructedTypeInfo = nullptr;
7420 PseudoDestructorTypeStorage Destructed;
7421 if (SecondTypeName.getKind() == UnqualifiedIdKind::IK_Identifier) {
7422 ParsedType T = getTypeName(*SecondTypeName.Identifier,
7423 SecondTypeName.StartLocation,
7424 S, &SS, true, false, ObjectTypePtrForLookup,
7425 /*IsCtorOrDtorName*/true);
7426 if (!T &&
7427 ((SS.isSet() && !computeDeclContext(SS, false)) ||
7428 (!SS.isSet() && ObjectType->isDependentType()))) {
7429 // The name of the type being destroyed is a dependent name, and we
7430 // couldn't find anything useful in scope. Just store the identifier and
7431 // it's location, and we'll perform (qualified) name lookup again at
7432 // template instantiation time.
7433 Destructed = PseudoDestructorTypeStorage(SecondTypeName.Identifier,
7434 SecondTypeName.StartLocation);
7435 } else if (!T) {
7436 Diag(SecondTypeName.StartLocation,
7437 diag::err_pseudo_dtor_destructor_non_type)
7438 << SecondTypeName.Identifier << ObjectType;
7439 if (isSFINAEContext())
7440 return ExprError();
7441
7442 // Recover by assuming we had the right type all along.
7443 DestructedType = ObjectType;
7444 } else
7445 DestructedType = GetTypeFromParser(T, &DestructedTypeInfo);
7446 } else {
7447 // Resolve the template-id to a type.
7448 TemplateIdAnnotation *TemplateId = SecondTypeName.TemplateId;
7449 ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
7450 TemplateId->NumArgs);
7453 /*ElaboratedKeywordLoc=*/SourceLocation(), SS,
7454 TemplateId->TemplateKWLoc, TemplateId->Template, TemplateId->Name,
7455 TemplateId->TemplateNameLoc, TemplateId->LAngleLoc, TemplateArgsPtr,
7456 TemplateId->RAngleLoc,
7457 /*IsCtorOrDtorName*/ true);
7458 if (T.isInvalid() || !T.get()) {
7459 // Recover by assuming we had the right type all along.
7460 DestructedType = ObjectType;
7461 } else
7462 DestructedType = GetTypeFromParser(T.get(), &DestructedTypeInfo);
7463 }
7464
7465 // If we've performed some kind of recovery, (re-)build the type source
7466 // information.
7467 if (!DestructedType.isNull()) {
7468 if (!DestructedTypeInfo)
7469 DestructedTypeInfo = Context.getTrivialTypeSourceInfo(DestructedType,
7470 SecondTypeName.StartLocation);
7471 Destructed = PseudoDestructorTypeStorage(DestructedTypeInfo);
7472 }
7473
7474 // Convert the name of the scope type (the type prior to '::') into a type.
7475 TypeSourceInfo *ScopeTypeInfo = nullptr;
7476 QualType ScopeType;
7477 if (FirstTypeName.getKind() == UnqualifiedIdKind::IK_TemplateId ||
7478 FirstTypeName.Identifier) {
7479 if (FirstTypeName.getKind() == UnqualifiedIdKind::IK_Identifier) {
7480 ParsedType T = getTypeName(*FirstTypeName.Identifier,
7481 FirstTypeName.StartLocation,
7482 S, &SS, true, false, ObjectTypePtrForLookup,
7483 /*IsCtorOrDtorName*/true);
7484 if (!T) {
7485 Diag(FirstTypeName.StartLocation,
7486 diag::err_pseudo_dtor_destructor_non_type)
7487 << FirstTypeName.Identifier << ObjectType;
7488
7489 if (isSFINAEContext())
7490 return ExprError();
7491
7492 // Just drop this type. It's unnecessary anyway.
7493 ScopeType = QualType();
7494 } else
7495 ScopeType = GetTypeFromParser(T, &ScopeTypeInfo);
7496 } else {
7497 // Resolve the template-id to a type.
7498 TemplateIdAnnotation *TemplateId = FirstTypeName.TemplateId;
7499 ASTTemplateArgsPtr TemplateArgsPtr(TemplateId->getTemplateArgs(),
7500 TemplateId->NumArgs);
7503 /*ElaboratedKeywordLoc=*/SourceLocation(), SS,
7504 TemplateId->TemplateKWLoc, TemplateId->Template, TemplateId->Name,
7505 TemplateId->TemplateNameLoc, TemplateId->LAngleLoc, TemplateArgsPtr,
7506 TemplateId->RAngleLoc,
7507 /*IsCtorOrDtorName*/ true);
7508 if (T.isInvalid() || !T.get()) {
7509 // Recover by dropping this type.
7510 ScopeType = QualType();
7511 } else
7512 ScopeType = GetTypeFromParser(T.get(), &ScopeTypeInfo);
7513 }
7514 }
7515
7516 if (!ScopeType.isNull() && !ScopeTypeInfo)
7517 ScopeTypeInfo = Context.getTrivialTypeSourceInfo(ScopeType,
7518 FirstTypeName.StartLocation);
7519
7520
7521 return BuildPseudoDestructorExpr(Base, OpLoc, OpKind, SS,
7522 ScopeTypeInfo, CCLoc, TildeLoc,
7523 Destructed);
7524}
7525
7527 SourceLocation OpLoc,
7528 tok::TokenKind OpKind,
7529 SourceLocation TildeLoc,
7530 const DeclSpec& DS) {
7531 QualType ObjectType;
7532 QualType T;
7533 TypeLocBuilder TLB;
7534 if (CheckArrow(*this, ObjectType, Base, OpKind, OpLoc) ||
7536 return ExprError();
7537
7538 switch (DS.getTypeSpecType()) {
7540 Diag(DS.getTypeSpecTypeLoc(), diag::err_decltype_auto_invalid);
7541 return true;
7542 }
7544 T = BuildDecltypeType(DS.getRepAsExpr(), /*AsUnevaluated=*/false);
7545 DecltypeTypeLoc DecltypeTL = TLB.push<DecltypeTypeLoc>(T);
7546 DecltypeTL.setDecltypeLoc(DS.getTypeSpecTypeLoc());
7547 DecltypeTL.setRParenLoc(DS.getTypeofParensRange().getEnd());
7548 break;
7549 }
7551 TypeSourceInfo *TSI = nullptr;
7552 T = GetTypeFromParser(DS.getRepAsType(), &TSI);
7554 TLB.pushFullCopy(TSI->getTypeLoc());
7556 PITL.setEllipsisLoc(DS.getEllipsisLoc());
7557 break;
7558 }
7559 default:
7560 llvm_unreachable("Unsupported type in pseudo destructor");
7561 }
7562 TypeSourceInfo *DestructedTypeInfo = TLB.getTypeSourceInfo(Context, T);
7563 PseudoDestructorTypeStorage Destructed(DestructedTypeInfo);
7564
7565 return BuildPseudoDestructorExpr(Base, OpLoc, OpKind, CXXScopeSpec(),
7566 nullptr, SourceLocation(), TildeLoc,
7567 Destructed);
7568}
7569
7571 SourceLocation RParen) {
7572 // If the operand is an unresolved lookup expression, the expression is ill-
7573 // formed per [over.over]p1, because overloaded function names cannot be used
7574 // without arguments except in explicit contexts.
7575 ExprResult R = CheckPlaceholderExpr(Operand);
7576 if (R.isInvalid())
7577 return R;
7578
7579 R = CheckUnevaluatedOperand(R.get());
7580 if (R.isInvalid())
7581 return ExprError();
7582
7583 Operand = R.get();
7584
7585 if (!inTemplateInstantiation() && !Operand->isInstantiationDependent() &&
7586 Operand->HasSideEffects(Context, false)) {
7587 // The expression operand for noexcept is in an unevaluated expression
7588 // context, so side effects could result in unintended consequences.
7589 Diag(Operand->getExprLoc(), diag::warn_side_effects_unevaluated_context);
7590 }
7591
7592 CanThrowResult CanThrow = canThrow(Operand);
7593 return new (Context)
7594 CXXNoexceptExpr(Context.BoolTy, Operand, CanThrow, KeyLoc, RParen);
7595}
7596
7598 Expr *Operand, SourceLocation RParen) {
7599 return BuildCXXNoexceptExpr(KeyLoc, Operand, RParen);
7600}
7601
7603 Expr *E, llvm::DenseMap<const VarDecl *, int> &RefsMinusAssignments) {
7604 DeclRefExpr *LHS = nullptr;
7605 bool IsCompoundAssign = false;
7606 bool isIncrementDecrementUnaryOp = false;
7607 if (BinaryOperator *BO = dyn_cast<BinaryOperator>(E)) {
7608 if (BO->getLHS()->getType()->isDependentType() ||
7609 BO->getRHS()->getType()->isDependentType()) {
7610 if (BO->getOpcode() != BO_Assign)
7611 return;
7612 } else if (!BO->isAssignmentOp())
7613 return;
7614 else
7615 IsCompoundAssign = BO->isCompoundAssignmentOp();
7616 LHS = dyn_cast<DeclRefExpr>(BO->getLHS());
7617 } else if (CXXOperatorCallExpr *COCE = dyn_cast<CXXOperatorCallExpr>(E)) {
7618 if (COCE->getOperator() != OO_Equal)
7619 return;
7620 LHS = dyn_cast<DeclRefExpr>(COCE->getArg(0));
7621 } else if (UnaryOperator *UO = dyn_cast<UnaryOperator>(E)) {
7622 if (!UO->isIncrementDecrementOp())
7623 return;
7624 isIncrementDecrementUnaryOp = true;
7625 LHS = dyn_cast<DeclRefExpr>(UO->getSubExpr());
7626 }
7627 if (!LHS)
7628 return;
7629 VarDecl *VD = dyn_cast<VarDecl>(LHS->getDecl());
7630 if (!VD)
7631 return;
7632 // Don't decrement RefsMinusAssignments if volatile variable with compound
7633 // assignment (+=, ...) or increment/decrement unary operator to avoid
7634 // potential unused-but-set-variable warning.
7635 if ((IsCompoundAssign || isIncrementDecrementUnaryOp) &&
7637 return;
7638 auto iter = RefsMinusAssignments.find(VD->getCanonicalDecl());
7639 if (iter == RefsMinusAssignments.end())
7640 return;
7641 iter->getSecond()--;
7642}
7643
7644/// Perform the conversions required for an expression used in a
7645/// context that ignores the result.
7648
7649 if (E->hasPlaceholderType()) {
7650 ExprResult result = CheckPlaceholderExpr(E);
7651 if (result.isInvalid()) return E;
7652 E = result.get();
7653 }
7654
7655 if (getLangOpts().CPlusPlus) {
7656 // The C++11 standard defines the notion of a discarded-value expression;
7657 // normally, we don't need to do anything to handle it, but if it is a
7658 // volatile lvalue with a special form, we perform an lvalue-to-rvalue
7659 // conversion.
7662 if (Res.isInvalid())
7663 return E;
7664 E = Res.get();
7665 } else {
7666 // Per C++2a [expr.ass]p5, a volatile assignment is not deprecated if
7667 // it occurs as a discarded-value expression.
7669 }
7670
7671 // C++1z:
7672 // If the expression is a prvalue after this optional conversion, the
7673 // temporary materialization conversion is applied.
7674 //
7675 // We do not materialize temporaries by default in order to avoid creating
7676 // unnecessary temporary objects. If we skip this step, IR generation is
7677 // able to synthesize the storage for itself in the aggregate case, and
7678 // adding the extra node to the AST is just clutter.
7680 E->isPRValue() && !E->getType()->isVoidType()) {
7682 if (Res.isInvalid())
7683 return E;
7684 E = Res.get();
7685 }
7686 return E;
7687 }
7688
7689 // C99 6.3.2.1:
7690 // [Except in specific positions,] an lvalue that does not have
7691 // array type is converted to the value stored in the
7692 // designated object (and is no longer an lvalue).
7693 if (E->isPRValue()) {
7694 // In C, function designators (i.e. expressions of function type)
7695 // are r-values, but we still want to do function-to-pointer decay
7696 // on them. This is both technically correct and convenient for
7697 // some clients.
7698 if (!getLangOpts().CPlusPlus && E->getType()->isFunctionType())
7700
7701 return E;
7702 }
7703
7704 // GCC seems to also exclude expressions of incomplete enum type.
7705 if (const auto *ED = E->getType()->getAsEnumDecl(); ED && !ED->isComplete()) {
7706 // FIXME: stupid workaround for a codegen bug!
7707 E = ImpCastExprToType(E, Context.VoidTy, CK_ToVoid).get();
7708 return E;
7709 }
7710
7712 if (Res.isInvalid())
7713 return E;
7714 E = Res.get();
7715
7716 if (!E->getType()->isVoidType())
7718 diag::err_incomplete_type);
7719 return E;
7720}
7721
7723 // Per C++2a [expr.ass]p5, a volatile assignment is not deprecated if
7724 // it occurs as an unevaluated operand.
7726
7727 return E;
7728}
7729
7730// If we can unambiguously determine whether Var can never be used
7731// in a constant expression, return true.
7732// - if the variable and its initializer are non-dependent, then
7733// we can unambiguously check if the variable is a constant expression.
7734// - if the initializer is not value dependent - we can determine whether
7735// it can be used to initialize a constant expression. If Init can not
7736// be used to initialize a constant expression we conclude that Var can
7737// never be a constant expression.
7738// - FXIME: if the initializer is dependent, we can still do some analysis and
7739// identify certain cases unambiguously as non-const by using a Visitor:
7740// - such as those that involve odr-use of a ParmVarDecl, involve a new
7741// delete, lambda-expr, dynamic-cast, reinterpret-cast etc...
7743 ASTContext &Context) {
7744 if (isa<ParmVarDecl>(Var)) return true;
7745 const VarDecl *DefVD = nullptr;
7746
7747 // If there is no initializer - this can not be a constant expression.
7748 const Expr *Init = Var->getAnyInitializer(DefVD);
7749 if (!Init)
7750 return true;
7751 assert(DefVD);
7752 if (DefVD->isWeak())
7753 return false;
7754
7755 if (Var->getType()->isDependentType() || Init->isValueDependent()) {
7756 // FIXME: Teach the constant evaluator to deal with the non-dependent parts
7757 // of value-dependent expressions, and use it here to determine whether the
7758 // initializer is a potential constant expression.
7759 return false;
7760 }
7761
7762 return !Var->isUsableInConstantExpressions(Context);
7763}
7764
7765/// Check if the current lambda has any potential captures
7766/// that must be captured by any of its enclosing lambdas that are ready to
7767/// capture. If there is a lambda that can capture a nested
7768/// potential-capture, go ahead and do so. Also, check to see if any
7769/// variables are uncaptureable or do not involve an odr-use so do not
7770/// need to be captured.
7771
7773 Expr *const FE, LambdaScopeInfo *const CurrentLSI, Sema &S) {
7774
7775 assert(!S.isUnevaluatedContext());
7776#ifndef NDEBUG
7777 DeclContext *DC = S.CurContext;
7778 while (isa_and_nonnull<CapturedDecl>(DC))
7779 DC = DC->getParent();
7780 assert(
7781 (CurrentLSI->CallOperator == DC || !CurrentLSI->AfterParameterList) &&
7782 "The current call operator must be synchronized with Sema's CurContext");
7783#endif // NDEBUG
7784
7785 const bool IsFullExprInstantiationDependent = FE->isInstantiationDependent();
7786
7787 // All the potentially captureable variables in the current nested
7788 // lambda (within a generic outer lambda), must be captured by an
7789 // outer lambda that is enclosed within a non-dependent context.
7790 CurrentLSI->visitPotentialCaptures([&](ValueDecl *Var, Expr *VarExpr) {
7791 // If the variable is clearly identified as non-odr-used and the full
7792 // expression is not instantiation dependent, only then do we not
7793 // need to check enclosing lambda's for speculative captures.
7794 // For e.g.:
7795 // Even though 'x' is not odr-used, it should be captured.
7796 // int test() {
7797 // const int x = 10;
7798 // auto L = [=](auto a) {
7799 // (void) +x + a;
7800 // };
7801 // }
7802 if (CurrentLSI->isVariableExprMarkedAsNonODRUsed(VarExpr) &&
7803 !IsFullExprInstantiationDependent)
7804 return;
7805
7806 VarDecl *UnderlyingVar = Var->getPotentiallyDecomposedVarDecl();
7807 if (!UnderlyingVar)
7808 return;
7809
7810 // If we have a capture-capable lambda for the variable, go ahead and
7811 // capture the variable in that lambda (and all its enclosing lambdas).
7812 if (const UnsignedOrNone Index =
7814 S.FunctionScopes, Var, S))
7815 S.MarkCaptureUsedInEnclosingContext(Var, VarExpr->getExprLoc(), *Index);
7816 const bool IsVarNeverAConstantExpression =
7818 if (!IsFullExprInstantiationDependent || IsVarNeverAConstantExpression) {
7819 // This full expression is not instantiation dependent or the variable
7820 // can not be used in a constant expression - which means
7821 // this variable must be odr-used here, so diagnose a
7822 // capture violation early, if the variable is un-captureable.
7823 // This is purely for diagnosing errors early. Otherwise, this
7824 // error would get diagnosed when the lambda becomes capture ready.
7825 QualType CaptureType, DeclRefType;
7826 SourceLocation ExprLoc = VarExpr->getExprLoc();
7827 if (S.tryCaptureVariable(Var, ExprLoc, TryCaptureKind::Implicit,
7828 /*EllipsisLoc*/ SourceLocation(),
7829 /*BuildAndDiagnose*/ false, CaptureType,
7830 DeclRefType, nullptr)) {
7831 // We will never be able to capture this variable, and we need
7832 // to be able to in any and all instantiations, so diagnose it.
7834 /*EllipsisLoc*/ SourceLocation(),
7835 /*BuildAndDiagnose*/ true, CaptureType,
7836 DeclRefType, nullptr);
7837 }
7838 }
7839 });
7840
7841 // Check if 'this' needs to be captured.
7842 if (CurrentLSI->hasPotentialThisCapture()) {
7843 // If we have a capture-capable lambda for 'this', go ahead and capture
7844 // 'this' in that lambda (and all its enclosing lambdas).
7845 if (const UnsignedOrNone Index =
7847 S.FunctionScopes, /*0 is 'this'*/ nullptr, S)) {
7848 const unsigned FunctionScopeIndexOfCapturableLambda = *Index;
7850 /*Explicit*/ false, /*BuildAndDiagnose*/ true,
7851 &FunctionScopeIndexOfCapturableLambda);
7852 }
7853 }
7854
7855 // Reset all the potential captures at the end of each full-expression.
7856 CurrentLSI->clearPotentialCaptures();
7857}
7858
7860 bool DiscardedValue, bool IsConstexpr,
7861 bool IsTemplateArgument) {
7862 ExprResult FullExpr = FE;
7863
7864 if (!FullExpr.get())
7865 return ExprError();
7866
7867 if (!IsTemplateArgument && DiagnoseUnexpandedParameterPack(FullExpr.get()))
7868 return ExprError();
7869
7870 if (DiscardedValue) {
7871 // Top-level expressions default to 'id' when we're in a debugger.
7872 if (getLangOpts().DebuggerCastResultToId &&
7873 FullExpr.get()->getType() == Context.UnknownAnyTy) {
7874 FullExpr = forceUnknownAnyToType(FullExpr.get(), Context.getObjCIdType());
7875 if (FullExpr.isInvalid())
7876 return ExprError();
7877 }
7878
7880 if (FullExpr.isInvalid())
7881 return ExprError();
7882
7884 if (FullExpr.isInvalid())
7885 return ExprError();
7886
7887 DiagnoseUnusedExprResult(FullExpr.get(), diag::warn_unused_expr);
7888 }
7889
7890 if (FullExpr.isInvalid())
7891 return ExprError();
7892
7893 CheckCompletedExpr(FullExpr.get(), CC, IsConstexpr);
7894
7895 // At the end of this full expression (which could be a deeply nested
7896 // lambda), if there is a potential capture within the nested lambda,
7897 // have the outer capture-able lambda try and capture it.
7898 // Consider the following code:
7899 // void f(int, int);
7900 // void f(const int&, double);
7901 // void foo() {
7902 // const int x = 10, y = 20;
7903 // auto L = [=](auto a) {
7904 // auto M = [=](auto b) {
7905 // f(x, b); <-- requires x to be captured by L and M
7906 // f(y, a); <-- requires y to be captured by L, but not all Ms
7907 // };
7908 // };
7909 // }
7910
7911 // FIXME: Also consider what happens for something like this that involves
7912 // the gnu-extension statement-expressions or even lambda-init-captures:
7913 // void f() {
7914 // const int n = 0;
7915 // auto L = [&](auto a) {
7916 // +n + ({ 0; a; });
7917 // };
7918 // }
7919 //
7920 // Here, we see +n, and then the full-expression 0; ends, so we don't
7921 // capture n (and instead remove it from our list of potential captures),
7922 // and then the full-expression +n + ({ 0; }); ends, but it's too late
7923 // for us to see that we need to capture n after all.
7924
7925 LambdaScopeInfo *const CurrentLSI =
7926 getCurLambda(/*IgnoreCapturedRegions=*/true);
7927 // FIXME: PR 17877 showed that getCurLambda() can return a valid pointer
7928 // even if CurContext is not a lambda call operator. Refer to that Bug Report
7929 // for an example of the code that might cause this asynchrony.
7930 // By ensuring we are in the context of a lambda's call operator
7931 // we can fix the bug (we only need to check whether we need to capture
7932 // if we are within a lambda's body); but per the comments in that
7933 // PR, a proper fix would entail :
7934 // "Alternative suggestion:
7935 // - Add to Sema an integer holding the smallest (outermost) scope
7936 // index that we are *lexically* within, and save/restore/set to
7937 // FunctionScopes.size() in InstantiatingTemplate's
7938 // constructor/destructor.
7939 // - Teach the handful of places that iterate over FunctionScopes to
7940 // stop at the outermost enclosing lexical scope."
7941 DeclContext *DC = CurContext;
7942 while (isa_and_nonnull<CapturedDecl>(DC))
7943 DC = DC->getParent();
7944 const bool IsInLambdaDeclContext = isLambdaCallOperator(DC);
7945 if (IsInLambdaDeclContext && CurrentLSI &&
7946 CurrentLSI->hasPotentialCaptures() && !FullExpr.isInvalid())
7948 *this);
7950}
7951
7953 if (!FullStmt) return StmtError();
7954
7955 return MaybeCreateStmtWithCleanups(FullStmt);
7956}
7957
7960 const DeclarationNameInfo &TargetNameInfo) {
7961 DeclarationName TargetName = TargetNameInfo.getName();
7962 if (!TargetName)
7964
7965 // If the name itself is dependent, then the result is dependent.
7966 if (TargetName.isDependentName())
7968
7969 // Do the redeclaration lookup in the current scope.
7970 LookupResult R(*this, TargetNameInfo, Sema::LookupAnyName,
7972 LookupParsedName(R, S, &SS, /*ObjectType=*/QualType());
7973 R.suppressDiagnostics();
7974
7975 switch (R.getResultKind()) {
7981
7984
7987 }
7988
7989 llvm_unreachable("Invalid LookupResult Kind!");
7990}
7991
7993 SourceLocation KeywordLoc,
7994 bool IsIfExists,
7995 CXXScopeSpec &SS,
7996 UnqualifiedId &Name) {
7997 DeclarationNameInfo TargetNameInfo = GetNameFromUnqualifiedId(Name);
7998
7999 // Check for an unexpanded parameter pack.
8000 auto UPPC = IsIfExists ? UPPC_IfExists : UPPC_IfNotExists;
8001 if (DiagnoseUnexpandedParameterPack(SS, UPPC) ||
8002 DiagnoseUnexpandedParameterPack(TargetNameInfo, UPPC))
8003 return IfExistsResult::Error;
8004
8005 return CheckMicrosoftIfExistsSymbol(S, SS, TargetNameInfo);
8006}
8007
8009 return BuildExprRequirement(E, /*IsSimple=*/true,
8010 /*NoexceptLoc=*/SourceLocation(),
8011 /*ReturnTypeRequirement=*/{});
8012}
8013
8015 SourceLocation TypenameKWLoc, CXXScopeSpec &SS, SourceLocation NameLoc,
8016 const IdentifierInfo *TypeName, TemplateIdAnnotation *TemplateId) {
8017 assert(((!TypeName && TemplateId) || (TypeName && !TemplateId)) &&
8018 "Exactly one of TypeName and TemplateId must be specified.");
8019 TypeSourceInfo *TSI = nullptr;
8020 if (TypeName) {
8021 QualType T =
8023 SS.getWithLocInContext(Context), *TypeName, NameLoc,
8024 &TSI, /*DeducedTSTContext=*/false);
8025 if (T.isNull())
8026 return nullptr;
8027 } else {
8028 ASTTemplateArgsPtr ArgsPtr(TemplateId->getTemplateArgs(),
8029 TemplateId->NumArgs);
8030 TypeResult T = ActOnTypenameType(CurScope, TypenameKWLoc, SS,
8031 TemplateId->TemplateKWLoc,
8032 TemplateId->Template, TemplateId->Name,
8033 TemplateId->TemplateNameLoc,
8034 TemplateId->LAngleLoc, ArgsPtr,
8035 TemplateId->RAngleLoc);
8036 if (T.isInvalid())
8037 return nullptr;
8038 if (GetTypeFromParser(T.get(), &TSI).isNull())
8039 return nullptr;
8040 }
8041 return BuildTypeRequirement(TSI);
8042}
8043
8046 return BuildExprRequirement(E, /*IsSimple=*/false, NoexceptLoc,
8047 /*ReturnTypeRequirement=*/{});
8048}
8049
8052 Expr *E, SourceLocation NoexceptLoc, CXXScopeSpec &SS,
8053 TemplateIdAnnotation *TypeConstraint, unsigned Depth) {
8054 // C++2a [expr.prim.req.compound] p1.3.3
8055 // [..] the expression is deduced against an invented function template
8056 // F [...] F is a void function template with a single type template
8057 // parameter T declared with the constrained-parameter. Form a new
8058 // cv-qualifier-seq cv by taking the union of const and volatile specifiers
8059 // around the constrained-parameter. F has a single parameter whose
8060 // type-specifier is cv T followed by the abstract-declarator. [...]
8061 //
8062 // The cv part is done in the calling function - we get the concept with
8063 // arguments and the abstract declarator with the correct CV qualification and
8064 // have to synthesize T and the single parameter of F.
8065 auto &II = Context.Idents.get("expr-type");
8068 SourceLocation(), Depth,
8069 /*Index=*/0, &II,
8070 /*Typename=*/true,
8071 /*ParameterPack=*/false,
8072 /*HasTypeConstraint=*/true);
8073
8074 if (BuildTypeConstraint(SS, TypeConstraint, TParam,
8075 /*EllipsisLoc=*/SourceLocation(),
8076 /*AllowUnexpandedPack=*/true))
8077 // Just produce a requirement with no type requirements.
8078 return BuildExprRequirement(E, /*IsSimple=*/false, NoexceptLoc, {});
8079
8082 ArrayRef<NamedDecl *>(TParam),
8084 /*RequiresClause=*/nullptr);
8085 return BuildExprRequirement(
8086 E, /*IsSimple=*/false, NoexceptLoc,
8088}
8089
8092 Expr *E, bool IsSimple, SourceLocation NoexceptLoc,
8095 ConceptSpecializationExpr *SubstitutedConstraintExpr = nullptr;
8097 ReturnTypeRequirement.isDependent())
8099 else if (NoexceptLoc.isValid() && canThrow(E) == CanThrowResult::CT_Can)
8101 else if (ReturnTypeRequirement.isSubstitutionFailure())
8103 else if (ReturnTypeRequirement.isTypeConstraint()) {
8104 // C++2a [expr.prim.req]p1.3.3
8105 // The immediately-declared constraint ([temp]) of decltype((E)) shall
8106 // be satisfied.
8108 ReturnTypeRequirement.getTypeConstraintTemplateParameterList();
8109 QualType MatchedType = Context.getReferenceQualifiedType(E);
8111 Args.push_back(TemplateArgument(MatchedType));
8112
8113 auto *Param = cast<TemplateTypeParmDecl>(TPL->getParam(0));
8114
8115 MultiLevelTemplateArgumentList MLTAL(Param, Args, /*Final=*/true);
8116 MLTAL.addOuterRetainedLevels(TPL->getDepth());
8117 const TypeConstraint *TC = Param->getTypeConstraint();
8118 assert(TC && "Type Constraint cannot be null here");
8119 auto *IDC = TC->getImmediatelyDeclaredConstraint();
8120 assert(IDC && "ImmediatelyDeclaredConstraint can't be null here.");
8121
8122 SFINAETrap Trap(*this);
8123 ExprResult Constraint = SubstExpr(IDC, MLTAL);
8124 bool HasError = Constraint.isInvalid();
8125 if (!HasError) {
8126 SubstitutedConstraintExpr =
8128 if (SubstitutedConstraintExpr->getSatisfaction().ContainsErrors)
8129 HasError = true;
8130 }
8131 if (HasError) {
8132 // FIXME: Capture diagnostics from the SFINAE trap and store them in the
8133 // requirement.
8135 createSubstDiagAt(IDC->getExprLoc(),
8136 [&](llvm::raw_ostream &OS) {
8137 IDC->printPretty(OS, /*Helper=*/nullptr,
8138 getPrintingPolicy());
8139 }),
8140 IsSimple, NoexceptLoc, ReturnTypeRequirement);
8141 }
8142 if (!SubstitutedConstraintExpr->isSatisfied())
8144 }
8145 return new (Context) concepts::ExprRequirement(E, IsSimple, NoexceptLoc,
8146 ReturnTypeRequirement, Status,
8147 SubstitutedConstraintExpr);
8148}
8149
8152 concepts::Requirement::SubstitutionDiagnostic *ExprSubstitutionDiagnostic,
8153 bool IsSimple, SourceLocation NoexceptLoc,
8155 return new (Context) concepts::ExprRequirement(ExprSubstitutionDiagnostic,
8156 IsSimple, NoexceptLoc,
8157 ReturnTypeRequirement);
8158}
8159
8164
8170
8174
8177 ConstraintSatisfaction Satisfaction;
8179 if (!Constraint->isInstantiationDependent() &&
8180 !Constraint->isValueDependent() &&
8182 /*TemplateArgs=*/{},
8183 Constraint->getSourceRange(), Satisfaction))
8184 return nullptr;
8185
8186 if (Satisfaction.HasSubstitutionFailure()) {
8187 SmallString<128> Entity;
8188 llvm::raw_svector_ostream OS(Entity);
8189 Constraint->printPretty(OS, nullptr, SemaRef.getPrintingPolicy());
8191 Context, Context.backupStr(Entity), std::move(Satisfaction));
8192 }
8193
8194 return new (Context) concepts::NestedRequirement(Context, Constraint,
8195 Satisfaction);
8196}
8197
8199Sema::BuildNestedRequirement(StringRef InvalidConstraintEntity,
8200 const ASTConstraintSatisfaction &Satisfaction) {
8202 InvalidConstraintEntity,
8204}
8205
8208 ArrayRef<ParmVarDecl *> LocalParameters,
8209 Scope *BodyScope) {
8210 assert(BodyScope);
8211
8213 RequiresKWLoc);
8214
8215 PushDeclContext(BodyScope, Body);
8216
8217 for (ParmVarDecl *Param : LocalParameters) {
8218 if (Param->getType()->isVoidType()) {
8219 if (LocalParameters.size() > 1) {
8220 Diag(Param->getBeginLoc(), diag::err_void_only_param);
8221 Param->setType(Context.IntTy);
8222 } else if (Param->getIdentifier()) {
8223 Diag(Param->getBeginLoc(), diag::err_param_with_void_type);
8224 Param->setType(Context.IntTy);
8225 } else if (Param->getType().hasQualifiers()) {
8226 Diag(Param->getBeginLoc(), diag::err_void_param_qualified);
8227 }
8228 } else if (Param->hasDefaultArg()) {
8229 // C++2a [expr.prim.req] p4
8230 // [...] A local parameter of a requires-expression shall not have a
8231 // default argument. [...]
8232 Diag(Param->getDefaultArgRange().getBegin(),
8233 diag::err_requires_expr_local_parameter_default_argument);
8234 // Ignore default argument and move on
8235 } else if (Param->isExplicitObjectParameter()) {
8236 // C++23 [dcl.fct]p6:
8237 // An explicit-object-parameter-declaration is a parameter-declaration
8238 // with a this specifier. An explicit-object-parameter-declaration
8239 // shall appear only as the first parameter-declaration of a
8240 // parameter-declaration-list of either:
8241 // - a member-declarator that declares a member function, or
8242 // - a lambda-declarator.
8243 //
8244 // The parameter-declaration-list of a requires-expression is not such
8245 // a context.
8246 Diag(Param->getExplicitObjectParamThisLoc(),
8247 diag::err_requires_expr_explicit_object_parameter);
8248 Param->setExplicitObjectParameterLoc(SourceLocation());
8249 }
8250
8251 Param->setDeclContext(Body);
8252 // If this has an identifier, add it to the scope stack.
8253 if (Param->getIdentifier()) {
8254 CheckShadow(BodyScope, Param);
8255 PushOnScopeChains(Param, BodyScope);
8256 }
8257 }
8258 return Body;
8259}
8260
8262 assert(CurContext && "DeclContext imbalance!");
8263 CurContext = CurContext->getLexicalParent();
8264 assert(CurContext && "Popped translation unit!");
8265}
8266
8268 SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body,
8269 SourceLocation LParenLoc, ArrayRef<ParmVarDecl *> LocalParameters,
8270 SourceLocation RParenLoc, ArrayRef<concepts::Requirement *> Requirements,
8271 SourceLocation ClosingBraceLoc) {
8272 auto *RE = RequiresExpr::Create(Context, RequiresKWLoc, Body, LParenLoc,
8273 LocalParameters, RParenLoc, Requirements,
8274 ClosingBraceLoc);
8276 return ExprError();
8277 return RE;
8278}
Defines the clang::ASTContext interface.
This file provides some common utility functions for processing Lambda related AST Constructs.
Defines a function that returns the minimum OS versions supporting C++17's aligned allocation functio...
static bool CanThrow(Expr *E, ASTContext &Ctx)
Definition CFG.cpp:2854
static const char * getPlatformName(Darwin::DarwinPlatformKind Platform, Darwin::DarwinEnvironmentKind Environment)
Definition Darwin.cpp:3888
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines the classes used to store parsed information about declaration-specifiers and decla...
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
Result
Implement __builtin_bit_cast and related operations.
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.
@ NotForRedeclaration
The lookup is a reference to this name that is not for the purpose of redeclaring the name.
This file declares semantic analysis for CUDA constructs.
static bool doesUsualArrayDeleteWantSize(Sema &S, SourceLocation loc, TypeAwareAllocationMode PassType, QualType allocType)
Determine whether a given type is a class for which 'delete[]' would call a member 'operator delete[]...
static void collectPublicBases(CXXRecordDecl *RD, llvm::DenseMap< CXXRecordDecl *, unsigned > &SubobjectsSeen, llvm::SmallPtrSetImpl< CXXRecordDecl * > &VBases, llvm::SetVector< CXXRecordDecl * > &PublicSubobjectsSeen, bool ParentIsPublic)
static void DiagnoseAllocationLookupFailure(Sema &SemaRef, const LookupResult &R, SourceRange Range, AllocationArgumentSet &ArgumentCandidates, ArrayRef< Expr * > PlacementArguments)
static bool ConvertForConditional(Sema &Self, ExprResult &E, QualType T)
Perform an "extended" implicit conversion as returned by TryClassUnification.
static void MaybeDecrementCount(Expr *E, llvm::DenseMap< const VarDecl *, int > &RefsMinusAssignments)
static bool CheckDeleteOperator(Sema &S, SourceLocation StartLoc, SourceRange Range, bool Diagnose, CXXRecordDecl *NamingClass, DeclAccessPair Decl, FunctionDecl *Operator)
static void DiagnoseMismatchedNewDelete(Sema &SemaRef, SourceLocation DeleteLoc, const MismatchingNewDeleteDetector &Detector)
static void getUnambiguousPublicSubobjects(CXXRecordDecl *RD, llvm::SmallVectorImpl< CXXRecordDecl * > &Objects)
static bool isLegalArrayNewInitializer(CXXNewInitializationStyle Style, Expr *Init, bool IsCPlusPlus20)
static void CheckIfAnyEnclosingLambdasMustCaptureAnyPotentialCaptures(Expr *const FE, LambdaScopeInfo *const CurrentLSI, Sema &S)
Check if the current lambda has any potential captures that must be captured by any of its enclosing ...
static void getUuidAttrOfType(Sema &SemaRef, QualType QT, llvm::SmallSetVector< const UuidAttr *, 1 > &UuidAttrs)
Grabs __declspec(uuid()) off a type, or returns 0 if we cannot resolve to a single GUID.
DeallocLookupMode
static QualType adjustVectorOrConstantMatrixType(ASTContext &Context, QualType FromTy, QualType ToType, QualType *ElTy=nullptr)
static QualType adjustCVQualifiersForCXXThisWithinLambda(ArrayRef< FunctionScopeInfo * > FunctionScopes, QualType ThisTy, DeclContext *CurSemaContext, ASTContext &ASTCtx)
static bool FindConditionalOverload(Sema &Self, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
Try to find a common type for two according to C++0x 5.16p5.
static bool TryClassUnification(Sema &Self, Expr *From, Expr *To, SourceLocation QuestionLoc, bool &HaveConversion, QualType &ToType)
Try to convert a type to another according to C++11 5.16p3.
AllocatorResolveResult
static UsualDeallocFnInfo resolveDeallocationOverload(Sema &S, LookupResult &R, const ImplicitDeallocationParameters &IDP, SourceLocation Loc, llvm::SmallVectorImpl< UsualDeallocFnInfo > *BestFns=nullptr)
Select the correct "usual" deallocation function to use from a selection of deallocation functions (e...
static bool hasNewExtendedAlignment(Sema &S, QualType AllocType)
Determine whether a type has new-extended alignment.
static ExprResult BuildCXXCastArgument(Sema &S, SourceLocation CastLoc, QualType Ty, CastKind Kind, CXXMethodDecl *Method, DeclAccessPair FoundDecl, bool HadMultipleCandidates, Expr *From)
static bool VariableCanNeverBeAConstantExpression(VarDecl *Var, ASTContext &Context)
static bool canRecoverDotPseudoDestructorCallsOnPointerObjects(Sema &SemaRef, QualType DestructedType)
Check if it's ok to try and recover dot pseudo destructor calls on pointer objects.
static bool CheckArrow(Sema &S, QualType &ObjectType, Expr *&Base, tok::TokenKind &OpKind, SourceLocation OpLoc)
static bool resolveBuiltinNewDeleteOverload(Sema &S, CallExpr *TheCall, bool IsDelete, FunctionDecl *&Operator)
static bool isValidVectorForConditionalCondition(ASTContext &Ctx, QualType CondTy)
static void diagnoseNoViableFunctionForAllocationOverloadResolution(Sema &S, const LookupResult &R, SourceRange Range, ArrayRef< Expr * > Args, OverloadCandidateSet &Candidates, OverloadCandidateSet *AlignedCandidates, Expr *AlignArg, bool IncludedMSVCFallback, bool AlignedBeforeUnaligned)
static void LookupGlobalDeallocationFunctions(Sema &S, SourceLocation Loc, LookupResult &FoundDelete, DeallocLookupMode Mode, DeclarationName Name)
static void noteOperatorArrows(Sema &S, ArrayRef< FunctionDecl * > OperatorArrows)
Note a set of 'operator->' functions that were used for a member access.
static void buildLambdaThisCaptureFixit(Sema &Sema, LambdaScopeInfo *LSI)
static bool checkIncompatibleOBTConversion(Sema &S, QualType FromType, QualType ToType, Expr *From)
Check if an integral conversion involves incompatible overflow behavior types.
static AllocatorResolveResult resolveAllocationOverload(Sema &S, const LookupResult &BaseLookup, SourceRange Range, ImplicitAllocationArguments &AllocationArgs, MultiExprArg TrialArguments, FunctionDecl *&Operator, OverloadCandidateSet &Candidates, bool Diagnose)
static bool isNonPlacementDeallocationFunction(Sema &S, FunctionDecl *FD)
Determine whether the given function is a non-placement deallocation function.
This file declares semantic analysis for HLSL constructs.
This file provides some common utility functions for processing Lambdas.
This file declares semantic analysis for Objective-C.
This file declares semantic analysis functions specific to PowerPC.
static QualType getPointeeType(const MemRegion *R)
Defines the clang::TokenKind enum and support functions.
Defines the clang::TypeLoc interface and its subclasses.
C Language Family Type Representation.
a trap message and trap category.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:245
TranslationUnitDecl * getTranslationUnitDecl() const
DeclarationNameTable DeclarationNames
Definition ASTContext.h:860
QualType getPointerType(QualType T) const
Return the uniqued reference to the type for a pointer to the specified type.
QualType getConstantArrayType(QualType EltTy, const llvm::APInt &ArySize, const Expr *SizeExpr, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return the unique reference to the type for a constant array of the specified element type.
QualType getBaseElementType(const ArrayType *VAT) const
Return the innermost element type of an array type.
QualType getQualifiedType(SplitQualType split) const
Un-split a SplitQualType.
QualType getObjCObjectPointerType(QualType OIT) const
Return a ObjCObjectPointerType type for the given ObjCObjectType.
unsigned getTypeAlignIfKnown(QualType T, bool NeedsPreferredAlignment=false) const
Return the alignment of a type, in bits, or 0 if the type is incomplete and we cannot determine the a...
QualType getMemberPointerType(QualType T, NestedNameSpecifier Qualifier, const CXXRecordDecl *Cls) const
Return the uniqued reference to the type for a member pointer to the specified type in the specified ...
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
QualType getSizeType() const
Return the unique type for "size_t" (C99 7.17), defined in <stddef.h>.
const TargetInfo & getTargetInfo() const
Definition ASTContext.h:975
CanQualType getCanonicalTagType(const TagDecl *TD) const
static bool hasSameUnqualifiedType(QualType T1, QualType T2)
Determine whether the given types are equivalent after cvr-qualifiers have been removed.
QualType getIncompleteArrayType(QualType EltTy, ArraySizeModifier ASM, unsigned IndexTypeQuals) const
Return a unique reference to the type for an incomplete array of the specified element type.
PtrTy get() const
Definition Ownership.h:171
bool isInvalid() const
Definition Ownership.h:167
Represents a constant array type that does not decay to a pointer when used as a function parameter.
Definition TypeBase.h:3990
QualType getConstantArrayType(const ASTContext &Ctx) const
Definition Type.cpp:401
Represents an array type, per C99 6.7.5.2 - Array Declarators.
Definition TypeBase.h:3820
QualType getElementType() const
Definition TypeBase.h:3832
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
Definition TypeBase.h:8262
Attr - This represents one attribute.
Definition Attr.h:46
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4086
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:5144
Pointer to a block type.
Definition TypeBase.h:3653
This class is used for builtin types like 'int'.
Definition TypeBase.h:3245
Represents a base class of a C++ class.
Definition DeclCXX.h:146
Represents binding an expression to a temporary.
Definition ExprCXX.h:1498
static CXXBindTemporaryExpr * Create(const ASTContext &C, CXXTemporary *Temp, Expr *SubExpr)
Definition ExprCXX.cpp:1150
const Expr * getSubExpr() const
Definition ExprCXX.h:1520
A boolean literal, per ([C++ lex.bool] Boolean literals).
Definition ExprCXX.h:728
Represents a call to a C++ constructor.
Definition ExprCXX.h:1553
Represents a C++ constructor within a class.
Definition DeclCXX.h:2642
Represents a C++ conversion function within a class.
Definition DeclCXX.h:2977
Represents a C++ base or member initializer.
Definition DeclCXX.h:2407
FieldDecl * getMember() const
If this is a member initializer, returns the declaration of the non-static data member being initiali...
Definition DeclCXX.h:2547
Expr * getInit() const
Get the initializer.
Definition DeclCXX.h:2609
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2631
bool isArrayForm() const
Definition ExprCXX.h:2657
SourceLocation getBeginLoc() const
Definition ExprCXX.h:2681
Represents a C++ destructor within a class.
Definition DeclCXX.h:2907
static CXXFunctionalCastExpr * Create(const ASTContext &Context, QualType T, ExprValueKind VK, TypeSourceInfo *Written, CastKind Kind, Expr *Op, const CXXCastPath *Path, FPOptionsOverride FPO, SourceLocation LPLoc, SourceLocation RPLoc)
Definition ExprCXX.cpp:950
Represents a static or instance method of a struct/union/class.
Definition DeclCXX.h:2150
bool isVirtual() const
Definition DeclCXX.h:2205
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Definition DeclCXX.h:2293
QualType getFunctionObjectParameterType() const
Definition DeclCXX.h:2317
bool isConst() const
Definition DeclCXX.h:2202
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2360
static CXXNewExpr * Create(const ASTContext &Ctx, bool IsGlobalNew, FunctionDecl *OperatorNew, FunctionDecl *OperatorDelete, const ImplicitAllocationParameters &IAP, bool UsualArrayDeleteWantsSize, ArrayRef< Expr * > PlacementArgs, SourceRange TypeIdParens, std::optional< Expr * > ArraySize, CXXNewInitializationStyle InitializationStyle, Expr *Initializer, QualType Ty, TypeSourceInfo *AllocatedTypeInfo, SourceRange Range, SourceRange DirectInitRange)
Create a c++ new expression.
Definition ExprCXX.cpp:300
Represents a C++11 noexcept expression (C++ [expr.unary.noexcept]).
Definition ExprCXX.h:4363
The null pointer literal (C++11 [lex.nullptr])
Definition ExprCXX.h:773
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:86
Represents a C++ pseudo-destructor (C++ [expr.pseudo]).
Definition ExprCXX.h:2750
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
static CXXRecordDecl * Create(const ASTContext &C, TagKind TK, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, CXXRecordDecl *PrevDecl=nullptr)
Definition DeclCXX.cpp:133
base_class_range bases()
Definition DeclCXX.h:609
bool isPolymorphic() const
Whether this class is polymorphic (C++ [class.virtual]), which means that the class contains or inher...
Definition DeclCXX.h:1224
capture_const_range captures() const
Definition DeclCXX.h:1107
ctor_range ctors() const
Definition DeclCXX.h:671
bool isAbstract() const
Determine whether this class has a pure virtual function.
Definition DeclCXX.h:1231
bool hasIrrelevantDestructor() const
Determine whether this class has a destructor which has no semantic effect.
Definition DeclCXX.h:1418
bool hasDefinition() const
Definition DeclCXX.h:562
CXXDestructorDecl * getDestructor() const
Returns the destructor decl for this class.
Definition DeclCXX.cpp:2129
CXXMethodDecl * getLambdaCallOperator() const
Retrieve the lambda call operator of the closure type if this is a closure type.
Definition DeclCXX.cpp:1744
An expression "T()" which creates an rvalue of a non-class type T.
Definition ExprCXX.h:2201
Represents a C++ nested-name-specifier or a global scope specifier.
Definition DeclSpec.h:76
bool isNotEmpty() const
A scope specifier is present, but may be valid or invalid.
Definition DeclSpec.h:183
SourceLocation getLastQualifierNameLoc() const
Retrieve the location of the name in the last qualifier in this nested name specifier.
Definition DeclSpec.cpp:116
SourceLocation getEndLoc() const
Definition DeclSpec.h:87
SourceRange getRange() const
Definition DeclSpec.h:82
bool isSet() const
Deprecated.
Definition DeclSpec.h:201
NestedNameSpecifier getScopeRep() const
Retrieve the representation of the nested-name-specifier.
Definition DeclSpec.h:97
NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const
Retrieve a nested-name-specifier with location information, copied into the given AST context.
Definition DeclSpec.cpp:123
bool isInvalid() const
An error occurred during parsing of the scope specifier.
Definition DeclSpec.h:186
void Adopt(NestedNameSpecifierLoc Other)
Adopt an existing nested-name-specifier (with source-range information).
Definition DeclSpec.cpp:103
Represents a C++ temporary.
Definition ExprCXX.h:1464
void setDestructor(const CXXDestructorDecl *Dtor)
Definition ExprCXX.h:1477
static CXXTemporary * Create(const ASTContext &C, const CXXDestructorDecl *Destructor)
Definition ExprCXX.cpp:1145
Represents the this expression in C++.
Definition ExprCXX.h:1159
static CXXThisExpr * Create(const ASTContext &Ctx, SourceLocation L, QualType Ty, bool IsImplicit)
Definition ExprCXX.cpp:1616
A C++ throw-expression (C++ [except.throw]).
Definition ExprCXX.h:1213
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition ExprCXX.h:853
static CXXUnresolvedConstructExpr * Create(const ASTContext &Context, QualType T, TypeSourceInfo *TSI, SourceLocation LParenLoc, ArrayRef< Expr * > Args, SourceLocation RParenLoc, bool IsListInit)
Definition ExprCXX.cpp:1520
A Microsoft C++ __uuidof expression, which gets the _GUID that corresponds to the supplied type or ex...
Definition ExprCXX.h:1073
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:2991
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
Definition Expr.h:3195
SourceLocation getBeginLoc() const
Definition Expr.h:3325
void setArg(unsigned Arg, Expr *ArgExpr)
setArg - Set the specified argument.
Definition Expr.h:3208
Expr * getCallee()
Definition Expr.h:3138
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
Definition Expr.h:3182
arg_range arguments()
Definition Expr.h:3243
Decl * getCalleeDecl()
Definition Expr.h:3168
This is an opaque type for sizes expressed in character units.
Definition CharUnits.h:38
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
Definition CharUnits.h:155
Declaration of a class template.
Complex values, per C99 6.2.5p11.
Definition TypeBase.h:3362
CompoundStmt - This represents a group of statements like { stmt stmt }.
Definition Stmt.h:1752
static CompoundStmt * Create(const ASTContext &C, ArrayRef< Stmt * > Stmts, FPOptionsOverride FPFeatures, SourceLocation LB, SourceLocation RB)
Definition Stmt.cpp:399
Represents the specialization of a concept - evaluates to a prvalue of type bool.
bool isSatisfied() const
Whether or not the concept with the given arguments was satisfied when the expression was created.
const ASTConstraintSatisfaction & getSatisfaction() const
Get elaborated satisfaction info about the template arguments' satisfaction of the named concept.
Represents the canonical version of C arrays with a specified constant size.
Definition TypeBase.h:3858
Represents a concrete matrix type with constant number of rows and columns.
Definition TypeBase.h:4490
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:47
A POD class for pairing a NamedDecl* with an access specifier.
static DeclAccessPair make(NamedDecl *D, AccessSpecifier AS)
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
Definition DeclBase.h:1466
DeclContext * getParent()
getParent - Returns the containing DeclContext.
Definition DeclBase.h:2120
lookup_result::iterator lookup_iterator
Definition DeclBase.h:2622
DeclContextLookupResult lookup_result
Definition DeclBase.h:2621
bool isDependentContext() const
Determines whether this context is dependent on a template parameter.
lookup_result lookup(DeclarationName Name) const
lookup - Find the declarations (if any) with the given Name in this context.
bool isRecord() const
Definition DeclBase.h:2220
void addDecl(Decl *D)
Add the declaration D into this context.
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1294
ValueDecl * getDecl()
Definition Expr.h:1362
Captures information about "declaration specifiers".
Definition DeclSpec.h:220
bool hasAutoTypeSpec() const
Definition DeclSpec.h:583
Expr * getPackIndexingExpr() const
Definition DeclSpec.h:548
TST getTypeSpecType() const
Definition DeclSpec.h:525
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclSpec.h:563
static const TST TST_typename_pack_indexing
Definition DeclSpec.h:286
ParsedType getRepAsType() const
Definition DeclSpec.h:535
SourceLocation getEllipsisLoc() const
Definition DeclSpec.h:612
Expr * getRepAsExpr() const
Definition DeclSpec.h:543
static const TST TST_decltype
Definition DeclSpec.h:284
SourceLocation getTypeSpecTypeLoc() const
Definition DeclSpec.h:570
static const TST TST_decltype_auto
Definition DeclSpec.h:285
static const TST TST_error
Definition DeclSpec.h:304
SourceRange getTypeofParensRange() const
Definition DeclSpec.h:580
Decl - This represents one declaration (or definition), e.g.
Definition DeclBase.h:86
bool isImplicit() const
isImplicit - Indicates whether the declaration was implicitly generated by the implementation.
Definition DeclBase.h:601
void setInvalidDecl(bool Invalid=true)
setInvalidDecl - Indicates the Decl had a semantic error.
Definition DeclBase.cpp:178
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
Definition DeclBase.cpp:273
bool isInvalidDecl() const
Definition DeclBase.h:596
SourceLocation getLocation() const
Definition DeclBase.h:447
void setLocalOwningModule(Module *M)
Definition DeclBase.h:841
void setImplicit(bool I=true)
Definition DeclBase.h:602
DeclContext * getDeclContext()
Definition DeclBase.h:456
bool hasAttr() const
Definition DeclBase.h:585
@ ReachableWhenImported
This declaration has an owning module, and is visible to lookups that occurs within that module.
Definition DeclBase.h:242
void setModuleOwnershipKind(ModuleOwnershipKind MOK)
Set whether this declaration is hidden from name lookup.
Definition DeclBase.h:898
DeclarationName getCXXOperatorName(OverloadedOperatorKind Op)
Get the name of the overloadable C++ operator corresponding to Op.
The name of a declaration.
bool isDependentName() const
Determines whether the name itself is dependent, e.g., because it involves a C++ type that is itself ...
bool isAnyOperatorDelete() const
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Decl.h:832
Information about one declarator, including the parsed type information and the identifier.
Definition DeclSpec.h:1955
const DeclaratorChunk & getTypeObject(unsigned i) const
Return the specified TypeInfo from this declarator.
Definition DeclSpec.h:2453
const DeclSpec & getDeclSpec() const
getDeclSpec - Return the declaration-specifier that this declarator was declared with.
Definition DeclSpec.h:2102
SourceLocation getEndLoc() const LLVM_READONLY
Definition DeclSpec.h:2139
void DropFirstTypeObject()
Definition DeclSpec.h:2470
unsigned getNumTypeObjects() const
Return the number of types applied to this declarator.
Definition DeclSpec.h:2449
bool isInvalidType() const
Definition DeclSpec.h:2769
SourceRange getSourceRange() const LLVM_READONLY
Get the source range that spans this declarator.
Definition DeclSpec.h:2137
void setRParenLoc(SourceLocation Loc)
Definition TypeLoc.h:2322
void setDecltypeLoc(SourceLocation Loc)
Definition TypeLoc.h:2319
A little helper class (which is basically a smart pointer that forwards info from DiagnosticsEngine a...
DiagnosticOptions & getDiagnosticOptions() const
Retrieve the diagnostic options.
Definition Diagnostic.h:635
Represents an enum.
Definition Decl.h:4150
bool isComplete() const
Returns true if this can be considered a complete type.
Definition Decl.h:4382
static EnumDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, EnumDecl *PrevDecl, bool IsScoped, bool IsScopedUsingClassTag, bool IsFixed)
Definition Decl.cpp:5155
bool isFixed() const
Returns true if this is an Objective-C, C++11, or Microsoft-style enumeration with a fixed underlying...
Definition Decl.h:4377
static ExprWithCleanups * Create(const ASTContext &C, EmptyShell empty, unsigned numObjects)
Definition ExprCXX.cpp:1496
bool isLValue() const
Definition Expr.h:391
bool isRValue() const
Definition Expr.h:395
This represents one expression.
Definition Expr.h:113
bool isReadIfDiscardedInCPlusPlus11() const
Determine whether an lvalue-to-rvalue conversion should implicitly be applied to this expression if i...
Definition Expr.cpp:2604
bool isGLValue() const
Definition Expr.h:288
void setType(QualType t)
Definition Expr.h:146
bool isValueDependent() const
Determines whether the value of this expression depends on.
Definition Expr.h:178
ExprValueKind getValueKind() const
getValueKind - The value kind that this expression produces.
Definition Expr.h:448
bool refersToVectorElement() const
Returns whether this expression refers to a vector element.
Definition Expr.cpp:4332
bool isTypeDependent() const
Determines whether the type of this expression depends on.
Definition Expr.h:195
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Definition Expr.cpp:3129
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
Definition Expr.cpp:3125
bool isPRValue() const
Definition Expr.h:286
static bool hasAnyTypeDependentArguments(ArrayRef< Expr * > Exprs)
hasAnyTypeDependentArguments - Determines if any of the expressions in Exprs is type-dependent.
Definition Expr.cpp:3378
@ NPC_ValueDependentIsNull
Specifies that a value-dependent expression of integral or dependent type should be considered a null...
Definition Expr.h:855
ExprObjectKind getObjectKind() const
getObjectKind - The object kind that this expression produces.
Definition Expr.h:455
bool HasSideEffects(const ASTContext &Ctx, bool IncludePossibleEffects=true) const
HasSideEffects - This routine returns true for all those expressions which have any effect other than...
Definition Expr.cpp:3728
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
Definition Expr.h:224
NullPointerConstantKind isNullPointerConstant(ASTContext &Ctx, NullPointerConstantValueDependence NPC) const
isNullPointerConstant - C99 6.3.2.3p3 - Test if this reduces down to a Null pointer constant.
Definition Expr.cpp:4110
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Definition Expr.cpp:283
bool refersToBitField() const
Returns true if this expression is a gl-value that potentially refers to a bit-field.
Definition Expr.h:480
Classification Classify(ASTContext &Ctx) const
Classify - Classify this expression according to the C++11 expression taxonomy.
Definition Expr.h:416
QualType getType() const
Definition Expr.h:145
bool isOrdinaryOrBitFieldObject() const
Definition Expr.h:459
bool hasPlaceholderType() const
Returns whether this expression has a placeholder type.
Definition Expr.h:527
static ExprValueKind getValueKindForType(QualType T)
getValueKindForType - Given a formal return or parameter type, give its value kind.
Definition Expr.h:438
Represents difference between two FPOptions values.
Represents a member of a struct/union/class.
Definition Decl.h:3299
Annotates a diagnostic with some code that should be inserted, removed, or replaced to fix the proble...
Definition Diagnostic.h:79
static FixItHint CreateReplacement(CharSourceRange RemoveRange, StringRef Code)
Create a code modification hint that replaces the given source range with the given code string.
Definition Diagnostic.h:140
static FixItHint CreateRemoval(CharSourceRange RemoveRange)
Create a code modification hint that removes the given source range.
Definition Diagnostic.h:129
static FixItHint CreateInsertion(SourceLocation InsertionLoc, StringRef Code, bool BeforePreviousInsertions=false)
Create a code modification hint that inserts the given code string at a specific location.
Definition Diagnostic.h:103
FullExpr - Represents a "full-expression" node.
Definition Expr.h:1073
Represents a function declaration or definition.
Definition Decl.h:2059
static constexpr unsigned RequiredTypeAwareDeleteParameterCount
Count of mandatory parameters for type aware operator delete.
Definition Decl.h:2773
static FunctionDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc, SourceLocation NLoc, DeclarationName N, QualType T, TypeSourceInfo *TInfo, StorageClass SC, bool UsesFPIntrin=false, bool isInlineSpecified=false, bool hasWrittenPrototype=true, ConstexprSpecKind ConstexprKind=ConstexprSpecKind::Unspecified, const AssociatedConstraint &TrailingRequiresClause={})
Definition Decl.h:2303
const ParmVarDecl * getParamDecl(unsigned i) const
Definition Decl.h:2932
bool isFunctionTemplateSpecialization() const
Determine whether this function is a function template specialization.
Definition Decl.cpp:4254
bool isThisDeclarationADefinition() const
Returns whether this specific declaration of the function is also a definition that does not contain ...
Definition Decl.h:2428
StringLiteral * getDeletedMessage() const
Get the message that indicates why this function was deleted.
Definition Decl.h:2889
QualType getReturnType() const
Definition Decl.h:2980
bool isTrivial() const
Whether this function is "trivial" in some specialized C++ senses.
Definition Decl.h:2504
bool isReplaceableGlobalAllocationFunction(UnsignedOrNone *AlignmentParam=nullptr, bool *IsNothrow=nullptr) const
Determines whether this function is one of the replaceable global allocation functions:
Definition Decl.h:2723
bool isDeleted() const
Whether this function has been deleted.
Definition Decl.h:2667
bool isTypeAwareOperatorNewOrDelete() const
Determine whether this is a type aware operator new or delete.
Definition Decl.cpp:3606
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:4618
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
Definition Decl.cpp:3873
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:3238
Represents a prototype with parameter type info, e.g.
Definition TypeBase.h:5416
QualType getParamType(unsigned i) const
Definition TypeBase.h:5696
Declaration of a template function.
ExtInfo withCallingConv(CallingConv cc) const
Definition TypeBase.h:4835
ExtInfo withNoReturn(bool noReturn) const
Definition TypeBase.h:4794
FunctionType - C99 6.7.5.3 - Function Declarators.
Definition TypeBase.h:4612
One of these records is kept for each identifier that is lexed.
ReservedIdentifierStatus isReserved(const LangOptions &LangOpts) const
Determine whether this is a name reserved for the implementation (C99 7.1.3, C++ [lib....
ReservedLiteralSuffixIdStatus isReservedLiteralSuffixId() const
Determine whether this is a name reserved for future standardization or the implementation (C++ [usrl...
StringRef getName() const
Return the actual identifier string.
ImplicitCastExpr - Allows us to explicitly represent implicit type conversions, which have no direct ...
Definition Expr.h:3901
static ImplicitCastExpr * Create(const ASTContext &Context, QualType T, CastKind Kind, Expr *Operand, const CXXCastPath *BasePath, ExprValueKind Cat, FPOptionsOverride FPO)
Definition Expr.cpp:2109
ImplicitConversionSequence - Represents an implicit conversion sequence, which may be a standard conv...
Definition Overload.h:626
StandardConversionSequence Standard
When ConversionKind == StandardConversion, provides the details of the standard conversion sequence.
Definition Overload.h:677
UserDefinedConversionSequence UserDefined
When ConversionKind == UserDefinedConversion, provides the details of the user-defined conversion seq...
Definition Overload.h:681
void DiagnoseAmbiguousConversion(Sema &S, SourceLocation CaretLoc, const PartialDiagnostic &PDiag) const
Diagnoses an ambiguous conversion.
Describes an C or C++ initializer list.
Definition Expr.h:5356
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)
static InitializationKind CreateValue(SourceLocation InitLoc, SourceLocation LParenLoc, SourceLocation RParenLoc, bool isImplicit=false)
Create a value initialization.
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.
bool isAmbiguous() const
Determine whether this initialization failed due to an ambiguity.
bool Diagnose(Sema &S, const InitializedEntity &Entity, const InitializationKind &Kind, ArrayRef< Expr * > Args)
Diagnose an potentially-invalid initialization sequence.
bool Failed() const
Determine whether the initialization sequence is invalid.
bool isDirectReferenceBinding() const
Determine whether this initialization is a direct reference binding (C++ [dcl.init....
Describes an entity that is being initialized.
static InitializedEntity InitializeException(SourceLocation ThrowLoc, QualType Type)
Create the initialization entity for an exception object.
static InitializedEntity InitializeTemporary(QualType Type)
Create the initialization entity for a temporary.
static InitializedEntity InitializeNew(SourceLocation NewLoc, QualType Type, NewArrayKind IsVariableLengthArrayNew)
Create the initialization entity for an object allocated via new.
static InitializedEntity InitializeParameter(ASTContext &Context, ParmVarDecl *Parm)
Create the initialization entity for a parameter.
static IntegerLiteral * Create(const ASTContext &C, const llvm::APInt &V, QualType type, SourceLocation l)
Returns a new integer literal with value 'V' and type 'type'.
Definition Expr.cpp:985
static SourceLocation findLocationAfterToken(SourceLocation loc, tok::TokenKind TKind, const SourceManager &SM, const LangOptions &LangOpts, bool SkipTrailingWhitespaceAndNewLine)
Checks that the given token is the first token that occurs after the given location (this excludes co...
Definition Lexer.cpp:1437
A stack-allocated class that identifies which local variable declaration instantiations are present i...
Definition Template.h:377
A class for iterating through a result set and possibly filtering out results.
Definition Lookup.h:677
void erase()
Erase the last element returned from this iterator.
Definition Lookup.h:723
Represents the results of name lookup.
Definition Lookup.h:147
LLVM_ATTRIBUTE_REINITIALIZES void clear()
Clears out any current state.
Definition Lookup.h:607
void 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
SourceLocation getNameLoc() const
Gets the location of the identifier.
Definition Lookup.h:666
Filter makeFilter()
Create a filter for this result set.
Definition Lookup.h:751
bool isAmbiguous() const
Definition Lookup.h:324
CXXRecordDecl * getNamingClass() const
Returns the 'naming class' for this lookup, i.e.
Definition Lookup.h:452
UnresolvedSetImpl::iterator iterator
Definition Lookup.h:154
void suppressDiagnostics()
Suppress the diagnostics that would normally fire because of this lookup.
Definition Lookup.h:636
DeclarationName getLookupName() const
Gets the name to look up.
Definition Lookup.h:265
iterator end() const
Definition Lookup.h:359
iterator begin() const
Definition Lookup.h:358
A global _GUID constant.
Definition DeclCXX.h:4451
MSGuidDeclParts Parts
Definition DeclCXX.h:4453
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3412
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
Definition Expr.h:3495
A pointer to member type per C++ 8.3.3 - Pointers to members.
Definition TypeBase.h:3751
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
Definition Type.cpp:5847
QualType getPointeeType() const
Definition TypeBase.h:3769
Data structure that captures multiple levels of template argument lists for use in template instantia...
Definition Template.h:76
void addOuterRetainedLevels(unsigned Num)
Definition Template.h:272
This represents a decl that may have a name.
Definition Decl.h:275
NamedDecl * getUnderlyingDecl()
Looks through UsingDecls and ObjCCompatibleAliasDecls for the underlying named decl.
Definition Decl.h:488
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
Definition Decl.h:296
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Definition Decl.h:341
A C++ nested-name-specifier augmented with source location information.
NamespaceAndPrefixLoc getAsNamespaceAndPrefix() const
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
@ MicrosoftSuper
Microsoft's '__super' specifier, stored as a CXXRecordDecl* of the class it appeared in.
@ Global
The global specifier '::'. There is no stored value.
@ Namespace
A namespace-like entity, stored as a NamespaceBaseDecl*.
ObjCArrayLiteral - used for objective-c array containers; as in: @["Hello", NSApp,...
Definition ExprObjC.h:219
ObjCBoxedExpr - used for generalized expression boxing.
Definition ExprObjC.h:158
ObjCDictionaryLiteral - AST node to represent objective-c dictionary literals; as in:"name" : NSUserN...
Definition ExprObjC.h:341
An expression that sends a message to the given Objective-C object or class.
Definition ExprObjC.h:972
ObjCMethodDecl - Represents an instance or class method declaration.
Definition DeclObjC.h:140
ObjCMethodFamily getMethodFamily() const
Determines the family of this method.
Represents a pointer to an Objective C object.
Definition TypeBase.h:8087
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
Definition TypeBase.h:8099
static OpaquePtr getFromOpaquePtr(void *P)
Definition Ownership.h:92
static OpaquePtr make(QualType P)
Definition Ownership.h:61
OpaqueValueExpr - An expression referring to an opaque object of a fixed type and value class.
Definition Expr.h:1202
OverloadCandidateSet - A set of overload candidates, used in C++ overload resolution (C++ 13....
Definition Overload.h:1164
@ CSK_Normal
Normal lookup.
Definition Overload.h:1168
@ CSK_Operator
C++ [over.match.oper]: Lookup of operator function candidates in a call using operator syntax.
Definition Overload.h:1175
SmallVectorImpl< OverloadCandidate >::iterator iterator
Definition Overload.h:1380
void NoteCandidates(PartialDiagnosticAt PA, Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, StringRef Opc="", SourceLocation Loc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
When overload resolution fails, prints diagnostic messages containing the candidates in the candidate...
OverloadingResult BestViableFunction(Sema &S, SourceLocation Loc, OverloadCandidateSet::iterator &Best)
Find the best viable function on this overload set, if it exists.
SmallVector< OverloadCandidate *, 32 > CompleteCandidates(Sema &S, OverloadCandidateDisplayKind OCD, ArrayRef< Expr * > Args, SourceLocation OpLoc=SourceLocation(), llvm::function_ref< bool(OverloadCandidate &)> Filter=[](OverloadCandidate &) { return true;})
void setEllipsisLoc(SourceLocation Loc)
Definition TypeLoc.h:2347
ParenExpr - This represents a parenthesized expression, e.g.
Definition Expr.h:2230
Represents a parameter to a function.
Definition Decl.h:1820
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:2948
bool isEquivalent(PointerAuthQualifier Other) const
Definition TypeBase.h:302
PointerType - C99 6.7.5.1 - Pointer Declarators.
Definition TypeBase.h:3403
QualType getPointeeType() const
Definition TypeBase.h:3413
Stores the type being destroyed by a pseudo-destructor expression.
Definition ExprCXX.h:2699
TypeSourceInfo * getTypeSourceInfo() const
Definition ExprCXX.h:2715
A (possibly-)qualified type.
Definition TypeBase.h:938
bool isVolatileQualified() const
Determine whether this type is volatile-qualified.
Definition TypeBase.h:8530
QualType getNonLValueExprType(const ASTContext &Context) const
Determine the type of a (typically non-lvalue) expression with the specified result type.
Definition Type.cpp:3827
QualType withConst() const
Definition TypeBase.h:1175
void addConst()
Add the const type qualifier to this QualType.
Definition TypeBase.h:1172
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Definition TypeBase.h:1005
const Type * getTypePtr() const
Retrieves a pointer to the underlying (unqualified) type.
Definition TypeBase.h:8446
LangAS getAddressSpace() const
Return the address space of this type.
Definition TypeBase.h:8572
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Definition TypeBase.h:8486
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
Definition TypeBase.h:1454
void getAsStringInternal(std::string &Str, const PrintingPolicy &Policy) const
QualType getNonReferenceType() const
If Type is a reference type (e.g., const int&), returns the type that the reference refers to ("const...
Definition TypeBase.h:8631
QualType getCanonicalType() const
Definition TypeBase.h:8498
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
Definition TypeBase.h:8540
bool isWebAssemblyReferenceType() const
Returns true if it is a WebAssembly Reference Type.
Definition Type.cpp:3170
bool isConstQualified() const
Determine whether this type is const-qualified.
Definition TypeBase.h:8519
DestructionKind isDestructedType() const
Returns a nonzero value if objects of this type require non-trivial work to clean up after.
Definition TypeBase.h:1561
unsigned getCVRQualifiers() const
Retrieve the set of CVR (const-volatile-restrict) qualifiers applied to this type.
Definition TypeBase.h:8492
static std::string getAsString(SplitQualType split, const PrintingPolicy &Policy)
Definition TypeBase.h:1348
bool isAtLeastAsQualifiedAs(QualType Other, const ASTContext &Ctx) const
Determine whether this type is at least as qualified as the other given type, requiring exact equalit...
Definition TypeBase.h:8611
The collection of all-type qualifiers we support.
Definition TypeBase.h:332
void removeCVRQualifiers(unsigned mask)
Definition TypeBase.h:496
GC getObjCGCAttr() const
Definition TypeBase.h:520
@ OCL_None
There is no lifetime qualification on this type.
Definition TypeBase.h:351
bool hasCVRQualifiers() const
Definition TypeBase.h:488
bool hasUnaligned() const
Definition TypeBase.h:512
static bool isAddressSpaceSupersetOf(LangAS A, LangAS B, const ASTContext &Ctx)
Returns true if address space A is equal to or a superset of B.
Definition TypeBase.h:709
void setAddressSpace(LangAS space)
Definition TypeBase.h:592
unsigned getCVRUQualifiers() const
Definition TypeBase.h:490
PointerAuthQualifier getPointerAuth() const
Definition TypeBase.h:604
void setObjCGCAttr(GC type)
Definition TypeBase.h:521
ObjCLifetime getObjCLifetime() const
Definition TypeBase.h:546
static Qualifiers fromCVRUMask(unsigned CVRU)
Definition TypeBase.h:442
LangAS getAddressSpace() const
Definition TypeBase.h:572
void setPointerAuth(PointerAuthQualifier Q)
Definition TypeBase.h:607
static std::string getAddrSpaceAsString(LangAS AS)
void setObjCLifetime(ObjCLifetime type)
Definition TypeBase.h:549
Represents a struct/union/class.
Definition Decl.h:4464
Represents the body of a requires-expression.
Definition DeclCXX.h:2119
static RequiresExprBodyDecl * Create(ASTContext &C, DeclContext *DC, SourceLocation StartLoc)
Definition DeclCXX.cpp:2405
static RequiresExpr * Create(ASTContext &C, SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation RBraceLoc)
Scope - A scope is a transient data structure that is used while parsing the program.
Definition Scope.h:41
unsigned getFlags() const
getFlags - Return the flags for this scope.
Definition Scope.h:269
bool isDeclScope(const Decl *D) const
isDeclScope - Return true if this is the scope that the specified decl is declared in.
Definition Scope.h:384
DeclContext * getEntity() const
Get the entity corresponding to this scope.
Definition Scope.h:387
const Scope * getParent() const
getParent - Return the scope that this is nested in.
Definition Scope.h:280
@ BlockScope
This is a scope that corresponds to a block/closure object.
Definition Scope.h:75
@ ClassScope
The scope of a struct/union/class definition.
Definition Scope.h:69
@ TryScope
This is the scope of a C++ try statement.
Definition Scope.h:105
@ FnScope
This indicates that the scope corresponds to a function, which means that labels are set here.
Definition Scope.h:51
@ ObjCMethodScope
This scope corresponds to an Objective-C method body.
Definition Scope.h:99
A generic diagnostic builder for errors which may or may not be deferred.
Definition SemaBase.h:111
PartialDiagnostic PDiag(unsigned DiagID=0)
Build a partial diagnostic.
Definition SemaBase.cpp:33
Sema & SemaRef
Definition SemaBase.h:40
SemaDiagnosticBuilder DiagCompat(SourceLocation Loc, unsigned CompatDiagId)
Emit a compatibility diagnostic.
Definition SemaBase.cpp:98
SemaDiagnosticBuilder Diag(SourceLocation Loc, unsigned DiagID)
Emit a diagnostic.
Definition SemaBase.cpp:61
CUDAFunctionTarget CurrentTarget()
Gets the CUDA target for the current context.
Definition SemaCUDA.h:153
SemaDiagnosticBuilder DiagIfDeviceCode(SourceLocation Loc, unsigned DiagID)
Creates a SemaDiagnosticBuilder that emits the diagnostic if the current context is "used as device c...
Definition SemaCUDA.cpp:953
void EraseUnwantedMatches(const FunctionDecl *Caller, llvm::SmallVectorImpl< std::pair< DeclAccessPair, FunctionDecl * > > &Matches)
Finds a function in Matches with highest calling priority from Caller context and erases all function...
Definition SemaCUDA.cpp:409
CUDAFunctionPreference IdentifyPreference(const FunctionDecl *Caller, const FunctionDecl *Callee)
Identifies relative preference of a given Caller/Callee combination, based on their host/device attri...
Definition SemaCUDA.cpp:311
QualType FindCompositeObjCPointerType(ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
FindCompositeObjCPointerType - Helper method to find composite type of two objective-c pointer types ...
void EmitRelatedResultTypeNote(const Expr *E)
If the given expression involves a message send to a method with a related result type,...
CastKind PrepareCastToObjCObjectPointer(ExprResult &E)
Prepare a conversion of the given expression to an ObjC object pointer type.
ARCConversionResult CheckObjCConversion(SourceRange castRange, QualType castType, Expr *&op, CheckedConversionKind CCK, bool Diagnose=true, bool DiagnoseCFAudited=false, BinaryOperatorKind Opc=BO_PtrMemD, bool IsReinterpretCast=false)
Checks for invalid conversions and casts between retainable pointers and other pointer kinds for ARC ...
bool CheckPPCMMAType(QualType Type, SourceLocation TypeLoc)
Definition SemaPPC.cpp:422
CXXThisScopeRAII(Sema &S, Decl *ContextDecl, Qualifiers CXXThisTypeQuals, bool Enabled=true)
Introduce a new scope where 'this' may be allowed (when enabled), using the given declaration (which ...
A RAII object to temporarily push a declaration context.
Definition Sema.h:3627
Abstract base class used to perform a contextual implicit conversion from an expression to any type p...
Definition Sema.h:10485
RAII class used to determine whether SFINAE has trapped any errors that occur during template argumen...
Definition Sema.h:12673
Sema - This implements semantic analysis and AST building for C.
Definition Sema.h:863
void DeclareGlobalNewDelete()
DeclareGlobalNewDelete - Declare the global forms of operator new and delete.
IfExistsResult CheckMicrosoftIfExistsSymbol(Scope *S, CXXScopeSpec &SS, const DeclarationNameInfo &TargetNameInfo)
ParsedType CreateParsedType(QualType T, TypeSourceInfo *TInfo)
Package the given type and TSI into a ParsedType.
FunctionDecl * FindUsualDeallocationFunction(SourceLocation StartLoc, ImplicitDeallocationParameters, DeclarationName Name, bool Diagnose=true)
ExprResult ActOnCXXTypeid(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXTypeid - Parse typeid( something ).
QualType getCurrentThisType()
Try to retrieve the type of the 'this' pointer.
ExprResult ActOnCXXUuidof(SourceLocation OpLoc, SourceLocation LParenLoc, bool isType, void *TyOrExpr, SourceLocation RParenLoc)
ActOnCXXUuidof - Parse __uuidof( something ).
Scope * getCurScope() const
Retrieve the parser's current scope.
Definition Sema.h:1165
QualType CheckVectorConditionalTypes(ExprResult &Cond, ExprResult &LHS, ExprResult &RHS, SourceLocation QuestionLoc)
bool checkArrayElementAlignment(QualType EltTy, SourceLocation Loc)
ExprResult IgnoredValueConversions(Expr *E)
IgnoredValueConversions - Given that an expression's result is syntactically ignored,...
bool RequireCompleteSizedType(SourceLocation Loc, QualType T, unsigned DiagID, const Ts &...Args)
Definition Sema.h:8395
@ LookupOrdinaryName
Ordinary name lookup, which finds ordinary names (functions, variables, typedefs, etc....
Definition Sema.h:9494
@ LookupDestructorName
Look up a name following ~ in a destructor name.
Definition Sema.h:9509
@ LookupTagName
Tag name lookup, which finds the names of enums, classes, structs, and unions.
Definition Sema.h:9497
@ LookupAnyName
Look up any declaration with any name.
Definition Sema.h:9539
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:418
ExprResult ActOnNoexceptExpr(SourceLocation KeyLoc, SourceLocation LParen, Expr *Operand, SourceLocation RParen)
bool BuildTypeConstraint(const CXXScopeSpec &SS, TemplateIdAnnotation *TypeConstraint, TemplateTypeParmDecl *ConstrainedParameter, SourceLocation EllipsisLoc, bool AllowUnexpandedPack)
bool FindDeallocationFunction(SourceLocation StartLoc, CXXRecordDecl *RD, DeclarationName Name, FunctionDecl *&Operator, ImplicitDeallocationParameters, bool Diagnose=true)
bool CheckCXXThisType(SourceLocation Loc, QualType Type)
Check whether the type of 'this' is valid in the current context.
QualType UsualArithmeticConversions(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, ArithConvKind ACK)
UsualArithmeticConversions - Performs various conversions that are common to binary operators (C99 6....
QualType tryBuildStdTypeIdentity(QualType Type, SourceLocation Loc)
Looks for the std::type_identity template and instantiates it with Type, or returns a null type if ty...
SemaCUDA & CUDA()
Definition Sema.h:1499
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 ...
ExprResult CheckBooleanCondition(SourceLocation Loc, Expr *E, bool IsConstexpr=false)
CheckBooleanCondition - Diagnose problems involving the use of the given expression as a boolean cond...
@ Boolean
A boolean condition, from 'if', 'while', 'for', or 'do'.
Definition Sema.h:7990
@ Switch
An integral condition for a 'switch' statement.
Definition Sema.h:7992
@ ConstexprIf
A constant boolean condition from 'if constexpr'.
Definition Sema.h:7991
bool RequireCompleteDeclContext(CXXScopeSpec &SS, DeclContext *DC)
Require that the context specified by SS be complete.
bool GatherArgumentsForCall(SourceLocation CallLoc, FunctionDecl *FDecl, const FunctionProtoType *Proto, unsigned FirstParam, ArrayRef< Expr * > Args, SmallVectorImpl< Expr * > &AllArgs, VariadicCallType CallType=VariadicCallType::DoesNotApply, bool AllowExplicit=false, bool IsListInitialization=false)
GatherArgumentsForCall - Collector argument expressions for various form of call prototypes.
SmallVector< sema::FunctionScopeInfo *, 4 > FunctionScopes
Stack containing information about each of the nested function, block, and method scopes that are cur...
Definition Sema.h:1268
@ Ref_Compatible
Ref_Compatible - The two types are reference-compatible.
Definition Sema.h:10577
@ AR_inaccessible
Definition Sema.h:1717
ExprResult BuildCXXFunctionalCastExpr(TypeSourceInfo *TInfo, QualType Type, SourceLocation LParenLoc, Expr *CastExpr, SourceLocation RParenLoc)
bool CheckCXXThisCapture(SourceLocation Loc, bool Explicit=false, bool BuildAndDiagnose=true, const unsigned *const FunctionScopeIndexToStopAt=nullptr, bool ByCopy=false)
Make sure the value of 'this' is actually available in the current context, if it is a potentially ev...
ExprResult MaybeBindToTemporary(Expr *E)
MaybeBindToTemporary - If the passed in expression has a record type with a non-trivial destructor,...
void MarkCaptureUsedInEnclosingContext(ValueDecl *Capture, SourceLocation Loc, unsigned CapturingScopeIndex)
ExprResult ActOnStartCXXMemberReference(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, ParsedType &ObjectType, bool &MayBePseudoDestructor)
concepts::Requirement * ActOnSimpleRequirement(Expr *E)
FPOptionsOverride CurFPFeatureOverrides()
Definition Sema.h:2107
concepts::Requirement * ActOnCompoundRequirement(Expr *E, SourceLocation NoexceptLoc)
ExprResult BuildOverloadedArrowExpr(Scope *S, Expr *Base, SourceLocation OpLoc, bool *NoArrowOperatorFound=nullptr)
BuildOverloadedArrowExpr - Build a call to an overloaded operator-> (if one exists),...
FunctionDecl * FindDeallocationFunctionForDestructor(SourceLocation StartLoc, CXXRecordDecl *RD, bool Diagnose, bool LookForGlobal, DeclarationName Name)
concepts::Requirement::SubstitutionDiagnostic * createSubstDiagAt(SourceLocation Location, EntityPrinter Printer)
create a Requirement::SubstitutionDiagnostic with only a SubstitutedEntity and DiagLoc using ASTConte...
FunctionDecl * getCurFunctionDecl(bool AllowLambda=false) const
Returns a pointer to the innermost enclosing function, or nullptr if the current context is not insid...
Definition Sema.cpp:1769
ExprResult PerformContextualImplicitConversion(SourceLocation Loc, Expr *FromE, ContextualImplicitConverter &Converter)
Perform a contextual implicit conversion.
ExprResult CheckUnevaluatedOperand(Expr *E)
ExprResult ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, bool ArrayForm, Expr *Operand)
ActOnCXXDelete - Parsed a C++ 'delete' expression (C++ 5.3.5), as in:
void DiagnoseExceptionUse(SourceLocation Loc, bool IsTry)
ExprResult CheckSwitchCondition(SourceLocation SwitchLoc, Expr *Cond)
ASTContext & Context
Definition Sema.h:1332
void diagnoseNullableToNonnullConversion(QualType DstType, QualType SrcType, SourceLocation Loc)
Warn if we're implicitly casting from a _Nullable pointer type to a _Nonnull one.
Definition Sema.cpp:702
ExprResult ActOnCXXNullPtrLiteral(SourceLocation Loc)
ActOnCXXNullPtrLiteral - Parse 'nullptr'.
ExprResult BuildCXXTypeId(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc)
Build a C++ typeid expression with a type operand.
bool DiagnoseUseOfDecl(NamedDecl *D, ArrayRef< SourceLocation > Locs, const ObjCInterfaceDecl *UnknownObjCClass=nullptr, bool ObjCPropertyAccess=false, bool AvoidPartialAvailabilityChecks=false, ObjCInterfaceDecl *ClassReceiver=nullptr, bool SkipTrailingRequiresClause=false)
Determine whether the use of this declaration is valid, and emit any corresponding diagnostics.
Definition SemaExpr.cpp:228
ExprResult SubstExpr(Expr *E, const MultiLevelTemplateArgumentList &TemplateArgs)
DiagnosticsEngine & getDiagnostics() const
Definition Sema.h:932
ExprResult MaybeConvertParenListExprToParenExpr(Scope *S, Expr *ME)
This is not an AltiVec-style cast or or C++ direct-initialization, so turn the ParenListExpr into a s...
concepts::TypeRequirement * BuildTypeRequirement(TypeSourceInfo *Type)
AccessResult CheckDestructorAccess(SourceLocation Loc, CXXDestructorDecl *Dtor, const PartialDiagnostic &PDiag, QualType objectType=QualType())
bool isStdTypeIdentity(QualType Ty, QualType *TypeArgument, const Decl **MalformedDecl=nullptr)
Tests whether Ty is an instance of std::type_identity and, if it is and TypeArgument is not NULL,...
SemaObjC & ObjC()
Definition Sema.h:1544
FunctionDecl * ResolveAddressOfOverloadedFunction(Expr *AddressOfExpr, QualType TargetType, bool Complain, DeclAccessPair &Found, bool *pHadMultipleCandidates=nullptr)
ResolveAddressOfOverloadedFunction - Try to resolve the address of an overloaded function (C++ [over....
void PushOnScopeChains(NamedDecl *D, Scope *S, bool AddToContext=true)
Add this decl to the scope shadowed decl chains.
ParsedType getDestructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, ParsedType ObjectType, bool EnteringContext)
void CleanupVarDeclMarking()
ExprResult DefaultFunctionArrayLvalueConversion(Expr *E, bool Diagnose=true)
Definition SemaExpr.cpp:768
ASTContext & getASTContext() const
Definition Sema.h:935
void DeclareGlobalAllocationFunction(DeclarationName Name, QualType Return, ArrayRef< QualType > Params)
DeclareGlobalAllocationFunction - Declares a single implicit global allocation function if it doesn't...
bool DiagnoseUnexpandedParameterPackInRequiresExpr(RequiresExpr *RE)
If the given requirees-expression contains an unexpanded reference to one of its own parameter packs,...
CXXDestructorDecl * LookupDestructor(CXXRecordDecl *Class)
Look for the destructor of the given class.
bool tryCaptureVariable(ValueDecl *Var, SourceLocation Loc, TryCaptureKind Kind, SourceLocation EllipsisLoc, bool BuildAndDiagnose, QualType &CaptureType, QualType &DeclRefType, const unsigned *const FunctionScopeIndexToStopAt)
Try to capture the given variable.
NamespaceDecl * getOrCreateStdNamespace()
Retrieve the special "std" namespace, which may require us to implicitly define the namespace.
ExprResult ImpCastExprToType(Expr *E, QualType Type, CastKind CK, ExprValueKind VK=VK_PRValue, const CXXCastPath *BasePath=nullptr, CheckedConversionKind CCK=CheckedConversionKind::Implicit)
ImpCastExprToType - If Expr is not of type 'Type', insert an implicit cast.
Definition Sema.cpp:778
ExprResult ActOnPseudoDestructorExpr(Scope *S, Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, CXXScopeSpec &SS, UnqualifiedId &FirstTypeName, SourceLocation CCLoc, SourceLocation TildeLoc, UnqualifiedId &SecondTypeName)
bool CheckArgsForPlaceholders(MultiExprArg args)
Check an argument list for placeholders that we won't try to handle later.
AccessResult CheckAllocationAccess(SourceLocation OperatorLoc, SourceRange PlacementRange, CXXRecordDecl *NamingClass, DeclAccessPair FoundDecl, bool Diagnose=true)
Checks access to an overloaded operator new or delete.
AccessResult CheckMemberOperatorAccess(SourceLocation Loc, Expr *ObjectExpr, const SourceRange &, DeclAccessPair FoundDecl)
void ActOnFinishRequiresExpr()
ExprResult BuildCXXNew(SourceRange Range, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, QualType AllocType, TypeSourceInfo *AllocTypeInfo, std::optional< Expr * > ArraySize, SourceRange DirectInitRange, Expr *Initializer)
void DiagnoseUseOfDeletedFunction(SourceLocation Loc, SourceRange Range, DeclarationName Name, OverloadCandidateSet &CandidateSet, FunctionDecl *Fn, MultiExprArg Args, bool IsMember=false)
PrintingPolicy getPrintingPolicy() const
Retrieve a suitable printing policy for diagnostics.
Definition Sema.h:1236
ExprResult ActOnCXXThrow(Scope *S, SourceLocation OpLoc, Expr *expr)
DeclRefExpr * BuildDeclRefExpr(ValueDecl *D, QualType Ty, ExprValueKind VK, SourceLocation Loc, const CXXScopeSpec *SS=nullptr)
ExprResult CheckConvertedConstantExpression(Expr *From, QualType T, llvm::APSInt &Value, CCEKind CCE)
bool CheckConstraintSatisfaction(ConstrainedDeclOrNestedRequirement Entity, ArrayRef< AssociatedConstraint > AssociatedConstraints, const MultiLevelTemplateArgumentList &TemplateArgLists, SourceRange TemplateIDRange, ConstraintSatisfaction &Satisfaction, const ConceptReference *TopLevelConceptId=nullptr, Expr **ConvertedExpr=nullptr)
Check whether the given list of constraint expressions are satisfied (as if in a 'conjunction') given...
EnumDecl * getStdAlignValT() const
LazyDeclPtr StdBadAlloc
The C++ "std::bad_alloc" class, which is defined by the C++ standard library.
Definition Sema.h:8513
NamedReturnInfo getNamedReturnInfo(Expr *&E, SimplerImplicitMoveMode Mode=SimplerImplicitMoveMode::Normal)
Determine whether the given expression might be move-eligible or copy-elidable in either a (co_)retur...
void AddTemplateOverloadCandidate(FunctionTemplateDecl *FunctionTemplate, DeclAccessPair FoundDecl, TemplateArgumentListInfo *ExplicitTemplateArgs, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false)
Add a C++ function template specialization as a candidate in the candidate set, using template argume...
bool checkLiteralOperatorId(const CXXScopeSpec &SS, const UnqualifiedId &Id, bool IsUDSuffix)
void DiagnoseUnusedExprResult(const Stmt *S, unsigned DiagID)
DiagnoseUnusedExprResult - If the statement passed in is an expression whose result is unused,...
Definition SemaStmt.cpp:406
FPOptions & getCurFPFeatures()
Definition Sema.h:930
Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer, TranslationUnitKind TUKind=TU_Complete, CodeCompleteConsumer *CompletionConsumer=nullptr)
Definition Sema.cpp:278
SourceLocation getLocForEndOfToken(SourceLocation Loc, unsigned Offset=0)
Calls Lexer::getLocForEndOfToken()
Definition Sema.cpp:84
@ UPPC_IfExists
Microsoft __if_exists.
Definition Sema.h:14686
@ UPPC_IfNotExists
Microsoft __if_not_exists.
Definition Sema.h:14689
const LangOptions & getLangOpts() const
Definition Sema.h:928
StmtResult ActOnFinishFullStmt(Stmt *Stmt)
CastKind PrepareScalarCast(ExprResult &src, QualType destType)
Prepares for a scalar cast, performing all the necessary stages except the final cast and returning t...
QualType ActOnPackIndexingType(QualType Pattern, Expr *IndexExpr, SourceLocation Loc)
SemaOpenACC & OpenACC()
Definition Sema.h:1549
void diagnoseUnavailableAlignedAllocation(const FunctionDecl &FD, SourceLocation Loc)
Produce diagnostics if FD is an aligned allocation or deallocation function that is unavailable.
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:1331
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)
bool BuildCtorClosureDefaultArgs(SourceLocation Loc, CXXConstructorDecl *Ctor, bool IsCopy=false)
ExprResult ActOnCXXBoolLiteral(SourceLocation OpLoc, tok::TokenKind Kind)
ActOnCXXBoolLiteral - Parse {true,false} literals.
ExprResult BuildCXXTypeConstructExpr(TypeSourceInfo *Type, SourceLocation LParenLoc, MultiExprArg Exprs, SourceLocation RParenLoc, bool ListInitialization)
AssignConvertType CheckAssignmentConstraints(SourceLocation Loc, QualType LHSType, QualType RHSType)
CheckAssignmentConstraints - Perform type checking for assignment, argument passing,...
void AddOverloadCandidate(FunctionDecl *Function, DeclAccessPair FoundDecl, ArrayRef< Expr * > Args, OverloadCandidateSet &CandidateSet, bool SuppressUserConversions=false, bool PartialOverloading=false, bool AllowExplicit=true, bool AllowExplicitConversion=false, ADLCallKind IsADLCandidate=ADLCallKind::NotADL, ConversionSequenceList EarlyConversions={}, OverloadCandidateParamOrder PO={}, bool AggregateCandidateDeduction=false, bool StrictPackMatch=false)
AddOverloadCandidate - Adds the given function to the set of candidate functions, using the given fun...
const LangOptions & LangOpts
Definition Sema.h:1330
sema::LambdaScopeInfo * getCurLambda(bool IgnoreNonLambdaCapturingScope=false)
Retrieve the current lambda scope info, if any.
Definition Sema.cpp:2727
ExprResult BuildCXXMemberCallExpr(Expr *Exp, NamedDecl *FoundDecl, CXXConversionDecl *Method, bool HadMultipleCandidates)
ExprResult CheckConditionVariable(VarDecl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
Check the use of the given variable as a C++ condition in an if, while, do-while, or switch statement...
ExprResult TemporaryMaterializationConversion(Expr *E)
If E is a prvalue denoting an unmaterialized temporary, materialize it as an xvalue.
SemaHLSL & HLSL()
Definition Sema.h:1509
CXXRecordDecl * getStdBadAlloc() const
ExprResult ActOnCXXTypeConstructExpr(ParsedType TypeRep, SourceLocation LParenOrBraceLoc, MultiExprArg Exprs, SourceLocation RParenOrBraceLoc, bool ListInitialization)
ActOnCXXTypeConstructExpr - Parse construction of a specified type.
void CheckUnusedVolatileAssignment(Expr *E)
Check whether E, which is either a discarded-value expression or an unevaluated operand,...
QualType CheckTypenameType(ElaboratedTypeKeyword Keyword, SourceLocation KeywordLoc, NestedNameSpecifierLoc QualifierLoc, const IdentifierInfo &II, SourceLocation IILoc, TypeSourceInfo **TSI, bool DeducedTSTContext)
ExprResult prepareMatrixSplat(QualType MatrixTy, Expr *SplattedExpr)
Prepare SplattedExpr for a matrix splat operation, adding implicit casts if necessary.
bool CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid)
Determine whether the use of this declaration is valid, without emitting diagnostics.
Definition SemaExpr.cpp:79
ConditionResult ActOnConditionVariable(Decl *ConditionVar, SourceLocation StmtLoc, ConditionKind CK)
void MarkAnyDeclReferenced(SourceLocation Loc, Decl *D, bool MightBeOdrUse)
Perform marking for a reference to an arbitrary declaration.
void MarkVTableUsed(SourceLocation Loc, CXXRecordDecl *Class, bool DefinitionRequired=false)
Note that the vtable for the given class was used at the given location.
bool CheckAllocatedType(QualType AllocType, SourceLocation Loc, SourceRange R)
Checks that a type is suitable as the allocated type in a new-expression.
CleanupInfo Cleanup
Used to control the generation of ExprWithCleanups.
Definition Sema.h:7107
ExprResult ActOnRequiresExpr(SourceLocation RequiresKWLoc, RequiresExprBodyDecl *Body, SourceLocation LParenLoc, ArrayRef< ParmVarDecl * > LocalParameters, SourceLocation RParenLoc, ArrayRef< concepts::Requirement * > Requirements, SourceLocation ClosingBraceLoc)
QualType FindCompositePointerType(SourceLocation Loc, Expr *&E1, Expr *&E2, bool ConvertArgs=true)
Find a merged pointer type and convert the two expressions to it.
static CastKind ScalarTypeToBooleanCastKind(QualType ScalarTy)
ScalarTypeToBooleanCastKind - Returns the cast kind corresponding to the conversion from scalar type ...
Definition Sema.cpp:885
ReferenceConversionsScope::ReferenceConversions ReferenceConversions
Definition Sema.h:10596
CXXRecordDecl * getCurrentClass(Scope *S, const CXXScopeSpec *SS)
Get the class that is directly named by the current context.
ExprResult BuildCXXUuidof(QualType TypeInfoType, SourceLocation TypeidLoc, TypeSourceInfo *Operand, SourceLocation RParenLoc)
Build a Microsoft __uuidof expression with a type operand.
MemberPointerConversionResult CheckMemberPointerConversion(QualType FromType, const MemberPointerType *ToPtrType, CastKind &Kind, CXXCastPath &BasePath, SourceLocation CheckLoc, SourceRange OpRange, bool IgnoreBaseAccess, MemberPointerConversionDirection Direction)
CheckMemberPointerConversion - Check the member pointer conversion from the expression From to the ty...
Expr * BuildCXXThisExpr(SourceLocation Loc, QualType Type, bool IsImplicit)
Build a CXXThisExpr and mark it referenced in the current context.
QualType CheckSizelessVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, ArithConvKind OperationKind)
llvm::DenseMap< const VarDecl *, int > RefsMinusAssignments
Increment when we find a reference; decrement when we find an ignored assignment.
Definition Sema.h:7104
bool checkArrayTooLarge(QualType ElementType, const llvm::APSInt &NumElements, SourceLocation Loc, SourceRange Range=SourceRange())
Diagnose an array of NumElements elements of type ElementType that is too large.
QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsCompAssign, bool AllowBothBool, bool AllowBoolConversion, bool AllowBoolOperation)
type checking for vector binary operators.
QualType DeduceTemplateSpecializationFromInitializer(TypeSourceInfo *TInfo, const InitializedEntity &Entity, const InitializationKind &Kind, MultiExprArg Init)
void MarkThisReferenced(CXXThisExpr *This)
ExprResult DefaultLvalueConversion(Expr *E)
Definition SemaExpr.cpp:648
bool CheckDerivedToBaseConversion(QualType Derived, QualType Base, SourceLocation Loc, SourceRange Range, CXXCastPath *BasePath=nullptr, bool IgnoreAccess=false)
bool isInLifetimeExtendingContext() const
Definition Sema.h:8340
Module * getCurrentModule() const
Get the module unit whose scope we are currently within.
Definition Sema.h:10022
AssignConvertType CheckTransparentUnionArgumentConstraints(QualType ArgType, ExprResult &RHS)
static bool isCast(CheckedConversionKind CCK)
Definition Sema.h:2668
ExprResult prepareVectorSplat(QualType VectorTy, Expr *SplattedExpr)
Prepare SplattedExpr for a vector splat operation, adding implicit casts if necessary.
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
Definition Sema.h:1472
DeclarationNameInfo GetNameFromUnqualifiedId(const UnqualifiedId &Name)
Retrieves the declaration name from a parsed unqualified-id.
ExprResult PerformContextuallyConvertToBool(Expr *From)
PerformContextuallyConvertToBool - Perform a contextual conversion of the expression From to bool (C+...
AccessResult CheckConstructorAccess(SourceLocation Loc, CXXConstructorDecl *D, DeclAccessPair FoundDecl, const InitializedEntity &Entity, bool IsCopyBindingRefToTemp=false)
Checks access to a constructor.
bool DiagnoseConditionalForNull(const Expr *LHSExpr, const Expr *RHSExpr, SourceLocation QuestionLoc)
Emit a specialized diagnostic when one expression is a null pointer constant and the other is not a p...
ParsedType getDestructorTypeForDecltype(const DeclSpec &DS, ParsedType ObjectType)
bool IsDerivedFrom(SourceLocation Loc, CXXRecordDecl *Derived, CXXRecordDecl *Base, CXXBasePaths &Paths)
Determine whether the type Derived is a C++ class that is derived from the type Base.
bool isUnevaluatedContext() const
Determines whether we are currently in a context that is not evaluated as per C++ [expr] p5.
Definition Sema.h:8332
DeclContext * getFunctionLevelDeclContext(bool AllowLambda=false) const
If AllowLambda is true, treat lambda as function.
Definition Sema.cpp:1748
Stmt * MaybeCreateStmtWithCleanups(Stmt *SubStmt)
ExprResult ActOnCXXNew(SourceLocation StartLoc, bool UseGlobal, SourceLocation PlacementLParen, MultiExprArg PlacementArgs, SourceLocation PlacementRParen, SourceRange TypeIdParens, Declarator &D, Expr *Initializer)
Parsed a C++ 'new' expression (C++ 5.3.4).
ExprResult BuildCXXNoexceptExpr(SourceLocation KeyLoc, Expr *Operand, SourceLocation RParen)
bool GlobalNewDeleteDeclared
A flag to remember whether the implicit forms of operator new and delete have been declared.
Definition Sema.h:8524
ExprResult ActOnParenExpr(SourceLocation L, SourceLocation R, Expr *E)
ExprResult CheckPlaceholderExpr(Expr *E)
Check for operands with placeholder types and complain if found.
ExprResult TransformToPotentiallyEvaluated(Expr *E)
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:14184
SourceManager & getSourceManager() const
Definition Sema.h:933
QualType CXXThisTypeOverride
When non-NULL, the C++ 'this' expression is allowed despite the current context not being a non-stati...
Definition Sema.h:8595
ExprResult FixOverloadedFunctionReference(Expr *E, DeclAccessPair FoundDecl, FunctionDecl *Fn)
FixOverloadedFunctionReference - E is an expression that refers to a C++ overloaded function (possibl...
ExprResult PerformMoveOrCopyInitialization(const InitializedEntity &Entity, const NamedReturnInfo &NRInfo, Expr *Value, bool SupressSimplerImplicitMoves=false)
Perform the initialization of a potentially-movable value, which is the result of return value.
ExprResult CheckCXXBooleanCondition(Expr *CondExpr, bool IsConstexpr=false)
CheckCXXBooleanCondition - Returns true if conversion to bool is invalid.
bool inConstraintSubstitution() const
Determine whether we are currently performing constraint substitution.
Definition Sema.h:14189
CanThrowResult canThrow(const Stmt *E)
bool isThisOutsideMemberFunctionBody(QualType BaseType)
Determine whether the given type is the type of *this that is used outside of the body of a member fu...
DeclContext * computeDeclContext(QualType T)
Compute the DeclContext that is associated with the given type.
QualType CheckPointerToMemberOperands(ExprResult &LHS, ExprResult &RHS, ExprValueKind &VK, SourceLocation OpLoc, bool isIndirect)
concepts::ExprRequirement * BuildExprRequirement(Expr *E, bool IsSatisfied, SourceLocation NoexceptLoc, concepts::ExprRequirement::ReturnTypeRequirement ReturnTypeRequirement)
QualType CXXCheckConditionalOperands(ExprResult &cond, ExprResult &lhs, ExprResult &rhs, ExprValueKind &VK, ExprObjectKind &OK, SourceLocation questionLoc)
Check the operands of ?
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 ...
bool isSFINAEContext() const
Definition Sema.h:13927
concepts::Requirement * ActOnTypeRequirement(SourceLocation TypenameKWLoc, CXXScopeSpec &SS, SourceLocation NameLoc, const IdentifierInfo *TypeName, TemplateIdAnnotation *TemplateId)
void CheckShadow(NamedDecl *D, NamedDecl *ShadowedDecl, const LookupResult &R)
Diagnose variable or built-in function shadowing.
ParsedType getInheritingConstructorName(CXXScopeSpec &SS, SourceLocation NameLoc, const IdentifierInfo &Name)
Handle the result of the special case name lookup for inheriting constructor declarations.
TypeResult ActOnTypenameType(Scope *S, SourceLocation TypenameLoc, const CXXScopeSpec &SS, const IdentifierInfo &II, SourceLocation IdLoc, ImplicitTypenameContext IsImplicitTypename=ImplicitTypenameContext::No)
Called when the parser has parsed a C++ typename specifier, e.g., "typename T::type".
bool isCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind=CompleteTypeKind::Default)
Definition Sema.h:15733
ExprResult BuildPseudoDestructorExpr(Expr *Base, SourceLocation OpLoc, tok::TokenKind OpKind, const CXXScopeSpec &SS, TypeSourceInfo *ScopeType, SourceLocation CCLoc, SourceLocation TildeLoc, PseudoDestructorTypeStorage DestroyedType)
RecordDecl * CXXTypeInfoDecl
The C++ "type_info" declaration, which is defined in <typeinfo>.
Definition Sema.h:8520
CXXConstructorDecl * LookupCopyingConstructor(CXXRecordDecl *Class, unsigned Quals)
Look up the copying constructor for the given class.
ExprResult VerifyIntegerConstantExpression(Expr *E, llvm::APSInt *Result, VerifyICEDiagnoser &Diagnoser, AllowFoldKind CanFold=AllowFoldKind::No)
VerifyIntegerConstantExpression - Verifies that an expression is an ICE, and reports the appropriate ...
ParsedType getTypeName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec *SS=nullptr, bool isClassName=false, bool HasTrailingDot=false, ParsedType ObjectType=nullptr, bool IsCtorOrDtorName=false, bool WantNontrivialTypeSourceInfo=false, bool IsClassTemplateDeductionContext=true, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No, IdentifierInfo **CorrectedII=nullptr)
If the identifier refers to a type name within this scope, return the declaration of that type.
Definition SemaDecl.cpp:275
RequiresExprBodyDecl * ActOnStartRequiresExpr(SourceLocation RequiresKWLoc, ArrayRef< ParmVarDecl * > LocalParameters, Scope *BodyScope)
bool CheckPointerConversion(Expr *From, QualType ToType, CastKind &Kind, CXXCastPath &BasePath, bool IgnoreBaseAccess, bool Diagnose=true)
CheckPointerConversion - Check the pointer conversion from the expression From to the type ToType.
SmallVector< ExprWithCleanups::CleanupObject, 8 > ExprCleanupObjects
ExprCleanupObjects - This is the stack of objects requiring cleanup that are created by the current f...
Definition Sema.h:7111
void NoteDeletedFunction(FunctionDecl *FD)
Emit a note explaining that this function is deleted.
Definition SemaExpr.cpp:127
void AddKnownFunctionAttributesForReplaceableGlobalAllocationFunction(FunctionDecl *FD)
If this function is a C++ replaceable global allocation function (C++2a [basic.stc....
QualType BuildDecltypeType(Expr *E, bool AsUnevaluated=true)
If AsUnevaluated is false, E is treated as though it were an evaluated context, such as when building...
TypeSourceInfo * GetTypeForDeclarator(Declarator &D)
GetTypeForDeclarator - Convert the type for the specified declarator to Type instances.
bool CheckCallReturnType(QualType ReturnType, SourceLocation Loc, CallExpr *CE, FunctionDecl *FD)
CheckCallReturnType - Checks that a call expression's return type is complete.
SemaPPC & PPC()
Definition Sema.h:1564
bool RequireCompleteType(SourceLocation Loc, QualType T, CompleteTypeKind Kind, TypeDiagnoser &Diagnoser)
Ensure that the type T is a complete type.
ReferenceCompareResult CompareReferenceRelationship(SourceLocation Loc, QualType T1, QualType T2, ReferenceConversions *Conv=nullptr)
CompareReferenceRelationship - Compare the two types T1 and T2 to determine whether they are referenc...
ExprResult forceUnknownAnyToType(Expr *E, QualType ToType)
Force an expression with unknown-type to an expression of the given type.
bool LookupQualifiedName(LookupResult &R, DeclContext *LookupCtx, bool InUnqualifiedLookup=false)
Perform qualified name lookup into a given context.
llvm::MapVector< FieldDecl *, DeleteLocs > DeleteExprs
Delete-expressions to be analyzed at the end of translation unit.
Definition Sema.h:8531
Expr * MaybeCreateExprWithCleanups(Expr *SubExpr)
MaybeCreateExprWithCleanups - If the current full-expression requires any cleanups,...
void DiscardCleanupsInEvaluationContext()
SmallVector< ExpressionEvaluationContextRecord, 8 > ExprEvalContexts
A stack of expression evaluation contexts.
Definition Sema.h:8468
void PushDeclContext(Scope *S, DeclContext *DC)
Set the current declaration context until it gets popped.
bool isDependentScopeSpecifier(const CXXScopeSpec &SS)
bool CheckDestructor(CXXDestructorDecl *Destructor)
CheckDestructor - Checks a fully-formed destructor definition for well-formedness,...
bool isUnavailableAlignedAllocationFunction(const FunctionDecl &FD) const
Determine whether FD is an aligned allocation or deallocation function that is unavailable.
DiagnosticsEngine & Diags
Definition Sema.h:1334
TypeAwareAllocationMode ShouldUseTypeAwareOperatorNewOrDelete() const
NamespaceDecl * getStdNamespace() const
ExprResult BuildCXXThrow(SourceLocation OpLoc, Expr *Ex, bool IsThrownVarInScope)
ExprResult DefaultFunctionArrayConversion(Expr *E, bool Diagnose=true)
DefaultFunctionArrayConversion (C99 6.3.2.1p3, C99 6.3.2.1p4).
Definition SemaExpr.cpp:524
ExprResult PerformCopyInitialization(const InitializedEntity &Entity, SourceLocation EqualLoc, ExprResult Init, bool TopLevelOfInitList=false, bool AllowExplicit=false)
bool CheckQualifiedFunctionForTypeId(QualType T, SourceLocation Loc)
friend class InitializationSequence
Definition Sema.h:1614
concepts::NestedRequirement * BuildNestedRequirement(Expr *E)
TemplateDeductionResult DeduceTemplateArguments(ClassTemplatePartialSpecializationDecl *Partial, ArrayRef< TemplateArgument > TemplateArgs, sema::TemplateDeductionInfo &Info)
bool isUsualDeallocationFunction(const CXXMethodDecl *FD)
TypeResult ActOnTemplateIdType(Scope *S, ElaboratedTypeKeyword ElaboratedKeyword, SourceLocation ElaboratedKeywordLoc, CXXScopeSpec &SS, SourceLocation TemplateKWLoc, TemplateTy Template, const IdentifierInfo *TemplateII, SourceLocation TemplateIILoc, SourceLocation LAngleLoc, ASTTemplateArgsPtr TemplateArgs, SourceLocation RAngleLoc, bool IsCtorOrDtorName=false, bool IsClassName=false, ImplicitTypenameContext AllowImplicitTypename=ImplicitTypenameContext::No)
bool DiagnoseAssignmentResult(AssignConvertType ConvTy, SourceLocation Loc, QualType DstType, QualType SrcType, Expr *SrcExpr, AssignmentAction Action, bool *Complained=nullptr)
DiagnoseAssignmentResult - Emit a diagnostic, if required, for the assignment conversion type specifi...
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,...
SemaDiagnosticBuilder targetDiag(SourceLocation Loc, unsigned DiagID, const FunctionDecl *FD=nullptr)
Definition Sema.cpp:2270
ExprResult CreateRecoveryExpr(SourceLocation Begin, SourceLocation End, ArrayRef< Expr * > SubExprs, QualType T=QualType())
Attempts to produce a RecoveryExpr after some AST node cannot be created.
ParsedType getConstructorName(const IdentifierInfo &II, SourceLocation NameLoc, Scope *S, CXXScopeSpec &SS, bool EnteringContext)
LazyDeclPtr StdAlignValT
The C++ "std::align_val_t" enum class, which is defined by the C++ standard library.
Definition Sema.h:8517
std::optional< ResolvedAllocation > FindAllocationFunctions(SourceLocation StartLoc, SourceRange Range, AllocationFunctionScope NewScope, AllocationFunctionScope DeleteScope, QualType AllocType, bool IsArray, const ImplicitAllocationParameters &IAP, MultiExprArg PlaceArgs, bool Diagnose=true)
Finds the overloads of operator new and delete that are appropriate for the allocation.
@ Diagnose
Diagnose issues that are non-constant or that are extensions.
Definition Sema.h:6559
bool CheckCXXThrowOperand(SourceLocation ThrowLoc, QualType ThrowTy, Expr *E)
CheckCXXThrowOperand - Validate the operand of a throw.
TemplateDeductionResult DeduceAutoType(TypeLoc AutoTypeLoc, Expr *Initializer, QualType &Result, sema::TemplateDeductionInfo &Info, bool DependentDeduction=false, bool IgnoreConstraints=false, TemplateSpecCandidateSet *FailedTSC=nullptr)
Deduce the type for an auto type-specifier (C++11 [dcl.spec.auto]p6)
bool LookupName(LookupResult &R, Scope *S, bool AllowBuiltinCreation=false, bool ForceNoCPlusPlus=false)
Perform unqualified name lookup starting from a given scope.
static QualType GetTypeFromParser(ParsedType Ty, TypeSourceInfo **TInfo=nullptr)
concepts::Requirement * ActOnNestedRequirement(Expr *Constraint)
QualType adjustCCAndNoReturn(QualType ArgFunctionType, QualType FunctionType, bool AdjustExceptionSpec=false)
Adjust the type ArgFunctionType to match the calling convention, noreturn, and optionally the excepti...
bool IsStringLiteralToNonConstPointerConversion(Expr *From, QualType ToType)
Helper function to determine whether this is the (deprecated) C++ conversion from a string literal to...
bool CheckExceptionSpecCompatibility(Expr *From, QualType ToType)
static ConditionResult ConditionError()
Definition Sema.h:7976
IdentifierResolver IdResolver
Definition Sema.h:3620
FunctionTemplateDecl * getMoreSpecializedTemplate(FunctionTemplateDecl *FT1, FunctionTemplateDecl *FT2, SourceLocation Loc, TemplatePartialOrderingContext TPOC, unsigned NumCallArguments1, QualType RawObj1Ty={}, QualType RawObj2Ty={}, bool Reversed=false, bool PartialOverloading=false)
Returns the more specialized function template according to the rules of function template partial or...
ExprResult ActOnCXXThis(SourceLocation Loc)
ExprResult ActOnDecltypeExpression(Expr *E)
Process the expression contained within a decltype.
void CheckVirtualDtorCall(CXXDestructorDecl *dtor, SourceLocation Loc, bool IsDelete, bool CallCanBeVirtual, bool WarnOnNonAbstractTypes, SourceLocation DtorLoc)
ExprResult ActOnFinishFullExpr(Expr *Expr, bool DiscardedValue)
Definition Sema.h:8812
void checkCall(NamedDecl *FDecl, const FunctionProtoType *Proto, const Expr *ThisArg, ArrayRef< const Expr * > Args, bool IsMemberFunction, SourceLocation Loc, SourceRange Range, VariadicCallType CallType)
Handles the checks for format strings, non-POD arguments to vararg functions, NULL arguments passed t...
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
SourceLocation getEnd() const
SourceLocation getBegin() const
StandardConversionSequence - represents a standard conversion sequence (C++ 13.3.3....
Definition Overload.h:301
DeclAccessPair FoundCopyConstructor
Definition Overload.h:395
ImplicitConversionKind Second
Second - The second conversion can be an integral promotion, floating point promotion,...
Definition Overload.h:312
ImplicitConversionKind First
First – The first conversion can be an lvalue-to-rvalue conversion, array-to-pointer conversion,...
Definition Overload.h:306
unsigned DeprecatedStringLiteralToCharPtr
Whether this is the deprecated conversion of a string literal to a pointer to non-const character dat...
Definition Overload.h:327
CXXConstructorDecl * CopyConstructor
CopyConstructor - The copy constructor that is used to perform this conversion, when the conversion i...
Definition Overload.h:394
unsigned IncompatibleObjC
IncompatibleObjC - Whether this is an Objective-C conversion that we should warn about (if we actuall...
Definition Overload.h:337
ImplicitConversionKind Third
Third - The third conversion can be a qualification conversion or a function conversion.
Definition Overload.h:321
ImplicitConversionKind Dimension
Dimension - Between the second and third conversion a vector or matrix dimension conversion may occur...
Definition Overload.h:317
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Definition Expr.h:4643
Stmt - This represents one statement.
Definition Stmt.h:85
SourceLocation getEndLoc() const LLVM_READONLY
Definition Stmt.cpp:367
void printPretty(raw_ostream &OS, PrinterHelper *Helper, const PrintingPolicy &Policy, unsigned Indentation=0, StringRef NewlineSymbol="\n", const ASTContext *Context=nullptr) const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
Definition Stmt.cpp:343
SourceLocation getBeginLoc() const LLVM_READONLY
Definition Stmt.cpp:355
StringLiteral - This represents a string literal expression, e.g.
Definition Expr.h:1823
StringRef getString() const
Definition Expr.h:1891
unsigned getNewAlign() const
Return the largest alignment for which a suitably-sized allocation with 'operator new(size_t)' is gua...
Definition TargetInfo.h:762
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
A template argument list.
ArrayRef< TemplateArgument > asArray() const
Produce this as an array ref.
Represents a template argument.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Type
The template argument is a type.
Stores a list of template parameters for a TemplateDecl and its derived classes.
NamedDecl * getParam(unsigned Idx)
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
static TemplateParameterList * Create(const ASTContext &C, SourceLocation TemplateLoc, SourceLocation LAngleLoc, ArrayRef< NamedDecl * > Params, SourceLocation RAngleLoc, Expr *RequiresClause)
static TemplateTypeParmDecl * Create(const ASTContext &C, DeclContext *DC, SourceLocation KeyLoc, SourceLocation NameLoc, int D, int P, IdentifierInfo *Id, bool Typename, bool ParameterPack, bool HasTypeConstraint=false, UnsignedOrNone NumExpanded=std::nullopt)
Models the abbreviated syntax to constrain a template type parameter: template <convertible_to<string...
Definition ASTConcept.h:227
Expr * getImmediatelyDeclaredConstraint() const
Get the immediately-declared constraint expression introduced by this type-constraint,...
Definition ASTConcept.h:244
Represents a declaration of a type.
Definition Decl.h:3652
TyLocType push(QualType T)
Pushes space for a new TypeLoc of the given type.
void pushFullCopy(TypeLoc L)
Pushes a copy of the given TypeLoc onto this builder.
TypeSourceInfo * getTypeSourceInfo(ASTContext &Context, QualType T)
Creates a TypeSourceInfo for the given type.
SourceRange getSourceRange() const LLVM_READONLY
Get the full source range.
Definition TypeLoc.h:154
SourceLocation getBeginLoc() const
Get the begin source location.
Definition TypeLoc.cpp:193
A container of type source information.
Definition TypeBase.h:8417
TypeLoc getTypeLoc() const
Return the TypeLoc wrapper for the type source info.
Definition TypeLoc.h:267
QualType getType() const
Return the type wrapped by this type source info.
Definition TypeBase.h:8428
The base class of the type hierarchy.
Definition TypeBase.h:1879
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:2789
bool isBlockPointerType() const
Definition TypeBase.h:8703
bool isVoidType() const
Definition TypeBase.h:9068
bool isBooleanType() const
Definition TypeBase.h:9209
bool isPlaceholderType() const
Test for a type which does not represent an actual type-system type but is instead used as a placehol...
Definition TypeBase.h:9044
bool isIntegralOrUnscopedEnumerationType() const
Determine whether this type is an integral or unscoped enumeration type.
Definition Type.cpp:2299
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
Definition Type.h:26
bool isVoidPointerType() const
Definition Type.cpp:845
bool isArrayType() const
Definition TypeBase.h:8782
CXXRecordDecl * castAsCXXRecordDecl() const
Definition Type.h:36
bool isArithmeticType() const
Definition Type.cpp:2550
bool isConstantMatrixType() const
Definition TypeBase.h:8850
bool isPointerType() const
Definition TypeBase.h:8683
bool isArrayParameterType() const
Definition TypeBase.h:8798
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
Definition TypeBase.h:9116
const T * castAs() const
Member-template castAs<specific type>.
Definition TypeBase.h:9366
bool isReferenceType() const
Definition TypeBase.h:8707
bool isEnumeralType() const
Definition TypeBase.h:8814
bool isScalarType() const
Definition TypeBase.h:9178
bool isSveVLSBuiltinType() const
Determines if this is a sizeless type supported by the 'arm_sve_vector_bits' type attribute,...
Definition Type.cpp:2829
bool isIntegralType(const ASTContext &Ctx) const
Determine whether this type is an integral type.
Definition Type.cpp:2282
bool isAlignValT() const
Definition Type.cpp:3441
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
Definition Type.cpp:885
bool isExtVectorType() const
Definition TypeBase.h:8826
TagDecl * getAsTagDecl() const
Retrieves the TagDecl that this type refers to, either because the type is a TagType or because it is...
Definition Type.h:63
bool isBuiltinType() const
Helper methods to distinguish type categories.
Definition TypeBase.h:8806
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
Definition TypeBase.h:2863
bool isFixedPointType() const
Return true if this is a fixed point type according to ISO/IEC JTC1 SC22 WG14 N1169.
Definition TypeBase.h:9132
bool isHalfType() const
Definition TypeBase.h:9076
DeducedType * getContainedDeducedType() const
Get the DeducedType whose type will be deduced for a variable with an initializer of this type.
Definition Type.cpp:2235
bool isWebAssemblyTableType() const
Returns true if this is a WebAssembly table type: either an array of reference types,...
Definition Type.cpp:2779
const Type * getBaseElementTypeUnsafe() const
Get the base element type of this type, potentially discarding type qualifiers.
Definition TypeBase.h:9252
bool isMemberPointerType() const
Definition TypeBase.h:8764
bool isMatrixType() const
Definition TypeBase.h:8846
EnumDecl * castAsEnumDecl() const
Definition Type.h:59
bool isVariablyModifiedType() const
Whether this type is a variably-modified type (C99 6.7.5).
Definition TypeBase.h:2881
bool isObjCLifetimeType() const
Returns true if objects of this type have lifetime semantics under ARC.
Definition Type.cpp:5630
bool isObjectType() const
Determine whether this type is an object type.
Definition TypeBase.h:2574
EnumDecl * getAsEnumDecl() const
Retrieves the EnumDecl this type refers to.
Definition Type.h:53
bool isPointerOrReferenceType() const
Definition TypeBase.h:8687
Qualifiers::ObjCLifetime getObjCARCImplicitLifetime() const
Return the implicit lifetime for this type, which must not be dependent.
Definition Type.cpp:5574
bool isFunctionType() const
Definition TypeBase.h:8679
bool isObjCObjectPointerType() const
Definition TypeBase.h:8862
bool isVectorType() const
Definition TypeBase.h:8822
bool isRealFloatingType() const
Floating point categories.
Definition Type.cpp:2533
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
Definition TypeBase.h:3002
bool isFloatingType() const
Definition Type.cpp:2517
bool isAnyPointerType() const
Definition TypeBase.h:8691
const T * getAs() const
Member-template getAs<specific type>'.
Definition TypeBase.h:9299
bool isObjCARCImplicitlyUnretainedType() const
Determines if this type, which must satisfy isObjCLifetimeType(), is implicitly __unsafe_unretained r...
Definition Type.cpp:5580
bool isNullPtrType() const
Definition TypeBase.h:9109
bool isRecordType() const
Definition TypeBase.h:8810
bool isObjCRetainableType() const
Definition Type.cpp:5611
bool isSizelessVectorType() const
Returns true for all scalable vector types.
Definition Type.cpp:2791
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2292
Represents a C++ unqualified-id that has been parsed.
Definition DeclSpec.h:1042
SourceLocation getBeginLoc() const LLVM_READONLY
Definition DeclSpec.h:1254
SourceRange getSourceRange() const LLVM_READONLY
Return the source range that covers this unqualified-id.
Definition DeclSpec.h:1251
SourceLocation getEndLoc() const LLVM_READONLY
Definition DeclSpec.h:1255
SourceLocation StartLocation
The location of the first token that describes this unqualified-id, which will be the location of the...
Definition DeclSpec.h:1100
const IdentifierInfo * Identifier
When Kind == IK_Identifier, the parsed identifier, or when Kind == IK_UserLiteralId,...
Definition DeclSpec.h:1070
UnqualifiedIdKind getKind() const
Determine what kind of name we have.
Definition DeclSpec.h:1124
TemplateIdAnnotation * TemplateId
When Kind == IK_TemplateId or IK_ConstructorTemplateId, the template-id annotation that contains the ...
Definition DeclSpec.h:1094
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:713
QualType getType() const
Definition Decl.h:724
bool isWeak() const
Determine whether this symbol is weakly-imported, or declared with the weak or weak-ref attr.
Definition Decl.cpp:5662
VarDecl * getPotentiallyDecomposedVarDecl()
Definition DeclCXX.cpp:3695
Represents a variable declaration or definition.
Definition Decl.h:933
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Definition Decl.cpp:2170
VarDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
Definition Decl.cpp:2237
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:2513
const Expr * getAnyInitializer() const
Get the initializer for this variable, no matter which declaration it is attached to.
Definition Decl.h:1382
Represents a GCC generic vector type.
Definition TypeBase.h:4273
TemplateParameterList * getTypeConstraintTemplateParameterList() const
A requires-expression requirement which queries the validity and properties of an expression ('simple...
A requires-expression requirement which is satisfied when a general constraint expression is satisfie...
A static requirement that can be used in a requires-expression to check properties of types and expre...
A requires-expression requirement which queries the existence of a type name or type template special...
ImplicitCaptureStyle ImpCaptureStyle
Definition ScopeInfo.h:709
Capture & getCXXThisCapture()
Retrieve the capture of C++ 'this', if it has been captured.
Definition ScopeInfo.h:759
bool isCXXThisCaptured() const
Determine whether the C++ 'this' is captured.
Definition ScopeInfo.h:756
void addThisCapture(bool isNested, SourceLocation Loc, QualType CaptureType, bool ByCopy)
Definition ScopeInfo.h:1099
SourceLocation PotentialThisCaptureLocation
Definition ScopeInfo.h:953
bool hasPotentialThisCapture() const
Definition ScopeInfo.h:1005
SourceRange IntroducerRange
Source range covering the lambda introducer [...].
Definition ScopeInfo.h:887
bool lambdaCaptureShouldBeConst() const
bool hasPotentialCaptures() const
Definition ScopeInfo.h:1071
bool isVariableExprMarkedAsNonODRUsed(Expr *CapturingVarExpr) const
Definition ScopeInfo.h:1054
CXXRecordDecl * Lambda
The class that describes the lambda.
Definition ScopeInfo.h:872
void visitPotentialCaptures(llvm::function_ref< void(ValueDecl *, Expr *)> Callback) const
unsigned NumExplicitCaptures
The number of captures in the Captures list that are explicit captures.
Definition ScopeInfo.h:895
bool AfterParameterList
Indicate that we parsed the parameter list at which point the mutability of the lambda is known.
Definition ScopeInfo.h:880
CXXMethodDecl * CallOperator
The lambda's compiler-generated operator().
Definition ScopeInfo.h:875
Provides information about an attempted template argument deduction, whose success or failure was des...
Defines the clang::TargetInfo interface.
Definition SPIR.cpp:47
SmallVector< BoundNodes, 1 > match(MatcherT Matcher, const NodeT &Node, ASTContext &Context)
Returns the results of matching Matcher on Node.
bool NE(InterpState &S, CodePtr OpPC)
Definition Interp.h:1513
ComparisonCategoryResult Compare(const T &X, const T &Y)
Helper to compare two comparable types.
Definition Primitives.h:42
TokenKind
Provides a simple uniform namespace for tokens from all C languages.
Definition TokenKinds.h:33
Top level wrappers for InstallAPI frontend operations.
CanQual< Type > CanQualType
Represents a canonical, potentially-qualified type.
bool isLambdaCallWithImplicitObjectParameter(const DeclContext *DC)
Definition ASTLambda.h:50
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ Match
This is not an overload because the signature exactly matches an existing declaration.
Definition Sema.h:824
bool isa(CodeGen::Address addr)
Definition Address.h:330
@ CPlusPlus20
@ CPlusPlus
@ CPlusPlus11
@ CPlusPlus14
@ CPlusPlus17
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
@ OR_Deleted
Succeeded, but refers to a deleted function.
Definition Overload.h:61
@ OR_Success
Overload resolution succeeded.
Definition Overload.h:52
@ OR_Ambiguous
Ambiguous candidates found.
Definition Overload.h:58
@ OR_No_Viable_Function
No viable function found.
Definition Overload.h:55
VariadicCallType
Definition Sema.h:507
CanThrowResult
Possible results from evaluation of a noexcept expression.
AllocationFunctionScope
The scope in which to find allocation functions.
Definition Sema.h:785
@ Both
Look for allocation functions in both the global scope and in the scope of the allocated class.
Definition Sema.h:793
@ Global
Only look for allocation functions in the global scope.
Definition Sema.h:787
@ Class
Only look for allocation functions in the scope of the allocated class.
Definition Sema.h:790
DeclContext * getLambdaAwareParentOfDeclContext(DeclContext *DC)
Definition ASTLambda.h:102
bool isReservedInAllContexts(ReservedIdentifierStatus Status)
Determine whether an identifier is reserved in all contexts.
bool isUnresolvedExceptionSpec(ExceptionSpecificationType ESpecType)
@ Ambiguous
Name lookup results in an ambiguity; use getAmbiguityKind to figure out what kind of ambiguity we hav...
Definition Lookup.h:64
@ NotFound
No entity found met the criteria.
Definition Lookup.h:41
@ FoundOverloaded
Name lookup found a set of overloaded functions that met the criteria.
Definition Lookup.h:54
@ Found
Name lookup found a single declaration that met the criteria.
Definition Lookup.h:50
@ FoundUnresolvedValue
Name lookup found an unresolvable value declaration and cannot yet complete.
Definition Lookup.h:59
@ NotFoundInCurrentInstantiation
No entity found met the criteria within the current instantiation,, but there were dependent base cla...
Definition Lookup.h:46
AlignedAllocationMode alignedAllocationModeFromBool(bool IsAligned)
Definition ExprCXX.h:2274
@ Conditional
A conditional (?:) operator.
Definition Sema.h:663
@ RQ_None
No ref-qualifier was provided.
Definition TypeBase.h:1801
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
Definition TypeBase.h:1804
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
Definition TypeBase.h:1807
@ Success
Annotation was successful.
Definition Parser.h:65
@ 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
ExprObjectKind
A further classification of the kind of object referenced by an l-value or x-value.
Definition Specifiers.h:153
@ OK_ObjCProperty
An Objective-C property is a logical field of an Objective-C object which is read and written via Obj...
Definition Specifiers.h:165
@ OK_Ordinary
An ordinary object is located at an address in memory.
Definition Specifiers.h:155
@ OK_BitField
A bitfield object is a bitfield on a C or C++ record.
Definition Specifiers.h:158
UnsignedOrNone getStackIndexOfNearestEnclosingCaptureCapableLambda(ArrayRef< const sema::FunctionScopeInfo * > FunctionScopes, ValueDecl *VarToCapture, Sema &S)
Examines the FunctionScopeInfo stack to determine the nearest enclosing lambda (to the current lambda...
@ LCK_StarThis
Capturing the *this object by copy.
Definition Lambda.h:35
@ Bind
'bind' clause, allowed on routine constructs.
@ Self
'self' clause, allowed on Compute and Combined Constructs, plus 'update'.
@ IK_TemplateId
A template-id, e.g., f<int>.
Definition DeclSpec.h:1034
@ IK_LiteralOperatorId
A user-defined literal name, e.g., operator "" _i.
Definition DeclSpec.h:1026
@ IK_Identifier
An identifier.
Definition DeclSpec.h:1020
@ AS_public
Definition Specifiers.h:128
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
bool isLambdaCallWithExplicitObjectParameter(const DeclContext *DC)
Definition ASTLambda.h:45
@ SC_None
Definition Specifiers.h:254
bool isAlignedAllocation(AlignedAllocationMode Mode)
Definition ExprCXX.h:2270
@ OMF_performSelector
MutableArrayRef< Expr * > MultiExprArg
Definition Ownership.h:259
AlignedAllocationMode
Definition ExprCXX.h:2268
StmtResult StmtError()
Definition Ownership.h:266
bool isLambdaCallOperator(const CXXMethodDecl *MD)
Definition ASTLambda.h:28
@ Result
The result type of a method or function.
Definition TypeBase.h:906
ActionResult< ParsedType > TypeResult
Definition Ownership.h:251
SmallVector< ImplicitAllocationArguments, 3 > AllocationArgumentSet
Definition Sema.h:230
OptionalUnsigned< unsigned > UnsignedOrNone
const FunctionProtoType * T
@ ICK_Complex_Conversion
Complex conversions (C99 6.3.1.6)
Definition Overload.h:139
@ ICK_Floating_Promotion
Floating point promotions (C++ [conv.fpprom])
Definition Overload.h:127
@ ICK_Boolean_Conversion
Boolean conversions (C++ [conv.bool])
Definition Overload.h:151
@ ICK_Integral_Conversion
Integral conversions (C++ [conv.integral])
Definition Overload.h:133
@ ICK_HLSL_Vector_Splat
Definition Overload.h:208
@ ICK_Fixed_Point_Conversion
Fixed point type conversions according to N1169.
Definition Overload.h:196
@ ICK_Vector_Conversion
Vector conversions.
Definition Overload.h:160
@ ICK_Block_Pointer_Conversion
Block Pointer conversions.
Definition Overload.h:175
@ ICK_Pointer_Member
Pointer-to-member conversions (C++ [conv.mem])
Definition Overload.h:148
@ ICK_Floating_Integral
Floating-integral conversions (C++ [conv.fpint])
Definition Overload.h:142
@ ICK_HLSL_Array_RValue
HLSL non-decaying array rvalue cast.
Definition Overload.h:205
@ ICK_SVE_Vector_Conversion
Arm SVE Vector conversions.
Definition Overload.h:163
@ ICK_HLSL_Vector_Truncation
HLSL vector truncation.
Definition Overload.h:199
@ ICK_Incompatible_Pointer_Conversion
C-only conversion between pointers with incompatible types.
Definition Overload.h:193
@ ICK_Array_To_Pointer
Array-to-pointer conversion (C++ [conv.array])
Definition Overload.h:112
@ ICK_RVV_Vector_Conversion
RISC-V RVV Vector conversions.
Definition Overload.h:166
@ ICK_Complex_Promotion
Complex promotions (Clang extension)
Definition Overload.h:130
@ ICK_Num_Conversion_Kinds
The number of conversion kinds.
Definition Overload.h:217
@ ICK_HLSL_Packed_Type_Conversion
HLSL packed type conversion to and from uint.
Definition Overload.h:214
@ ICK_HLSL_Matrix_Splat
HLSL matrix splat from scalar or boolean type.
Definition Overload.h:211
@ ICK_Function_Conversion
Function pointer conversion (C++17 [conv.fctptr])
Definition Overload.h:118
@ ICK_Vector_Splat
A vector splat from an arithmetic type.
Definition Overload.h:169
@ ICK_Zero_Queue_Conversion
Zero constant to queue.
Definition Overload.h:187
@ ICK_Identity
Identity conversion (no conversion)
Definition Overload.h:106
@ ICK_Derived_To_Base
Derived-to-base (C++ [over.best.ics])
Definition Overload.h:157
@ ICK_Lvalue_To_Rvalue
Lvalue-to-rvalue conversion (C++ [conv.lval])
Definition Overload.h:109
@ ICK_Qualification
Qualification conversions (C++ [conv.qual])
Definition Overload.h:121
@ ICK_Pointer_Conversion
Pointer conversions (C++ [conv.ptr])
Definition Overload.h:145
@ ICK_TransparentUnionConversion
Transparent Union Conversions.
Definition Overload.h:178
@ ICK_Integral_Promotion
Integral promotions (C++ [conv.prom])
Definition Overload.h:124
@ ICK_HLSL_Matrix_Truncation
HLSL Matrix truncation.
Definition Overload.h:202
@ ICK_Floating_Conversion
Floating point conversions (C++ [conv.double].
Definition Overload.h:136
@ ICK_Compatible_Conversion
Conversions between compatible types in C99.
Definition Overload.h:154
@ ICK_C_Only_Conversion
Conversions allowed in C, but not C++.
Definition Overload.h:190
@ ICK_Writeback_Conversion
Objective-C ARC writeback conversion.
Definition Overload.h:181
@ ICK_Zero_Event_Conversion
Zero constant to event (OpenCL1.2 6.12.10)
Definition Overload.h:184
@ ICK_Complex_Real
Complex-real conversions (C99 6.3.1.7)
Definition Overload.h:172
@ ICK_Function_To_Pointer
Function-to-pointer (C++ [conv.array])
Definition Overload.h:115
@ Template
We are parsing a template declaration.
Definition Parser.h:81
ActionResult< CXXBaseSpecifier * > BaseResult
Definition Ownership.h:252
llvm::VersionTuple alignedAllocMinVersion(llvm::Triple::OSType OS)
AssignConvertType
AssignConvertType - All of the 'assignment' semantic checks return this enum to indicate whether the ...
Definition Sema.h:683
@ Incompatible
Incompatible - We reject this conversion outright, it is invalid to represent it in the AST.
Definition Sema.h:781
@ Compatible
Compatible - the types are compatible according to the standard.
Definition Sema.h:685
@ Class
The "class" keyword.
Definition TypeBase.h:6050
ExprResult ExprError()
Definition Ownership.h:265
bool isTypeAwareAllocation(TypeAwareAllocationMode Mode)
Definition ExprCXX.h:2258
LangAS
Defines the address space values used by the address space qualifier of QualType.
CastKind
CastKind - The kind of operation required for a conversion.
MutableArrayRef< ParsedTemplateArgument > ASTTemplateArgsPtr
Definition Ownership.h:261
SizedDeallocationMode sizedDeallocationModeFromBool(bool IsSized)
Definition ExprCXX.h:2284
AssignmentAction
Definition Sema.h:217
@ Deduced
The normal deduced case.
Definition TypeBase.h:1818
inits_range inits()
std::pair< SourceLocation, PartialDiagnostic > PartialDiagnosticAt
A partial diagnostic along with the source location where this diagnostic occurs.
bool isPtrSizeAddressSpace(LangAS AS)
SizedDeallocationMode
Definition ExprCXX.h:2278
ExprValueKind
The categorization of expression values, currently following the C++11 scheme.
Definition Specifiers.h:136
@ VK_PRValue
A pr-value expression (in the C++11 taxonomy) produces a temporary value.
Definition Specifiers.h:139
@ VK_LValue
An l-value expression is a reference to an object with independent storage.
Definition Specifiers.h:143
SmallVector< CXXBaseSpecifier *, 4 > CXXCastPath
A simple array of base specifiers.
Definition ASTContext.h:147
bool isSizedDeallocation(SizedDeallocationMode Mode)
Definition ExprCXX.h:2280
TypeAwareAllocationMode
Definition ExprCXX.h:2256
IfExistsResult
Describes the result of an "if-exists" condition check.
Definition Sema.h:797
@ Dependent
The name is a dependent name, so the results will differ from one instantiation to the next.
Definition Sema.h:806
@ Exists
The symbol exists.
Definition Sema.h:799
@ Error
An error occurred.
Definition Sema.h:809
@ DoesNotExist
The symbol does not exist.
Definition Sema.h:802
@ TPOC_Call
Partial ordering of function templates for a function call.
Definition Template.h:312
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
Definition DeclBase.h:1305
TemplateDeductionResult
Describes the result of template argument deduction.
Definition Sema.h:374
@ Success
Template argument deduction was successful.
Definition Sema.h:376
@ AlreadyDiagnosed
Some error which was already diagnosed.
Definition Sema.h:428
TypeAwareAllocationMode typeAwareAllocationModeFromBool(bool IsTypeAwareAllocation)
Definition ExprCXX.h:2263
@ Generic
not a target-specific vector type
Definition TypeBase.h:4234
U cast(CodeGen::Address addr)
Definition Address.h:327
@ ArrayBound
Array bound in array declarator or new-expression.
Definition Sema.h:838
OpaquePtr< QualType > ParsedType
An opaque type for threading parsed type information through the parser.
Definition Ownership.h:230
@ None
No keyword precedes the qualified type name.
Definition TypeBase.h:6035
@ Class
The "class" keyword introduces the elaborated-type-specifier.
Definition TypeBase.h:6025
@ Typename
The "typename" keyword precedes the qualified type name, e.g., typename T::type.
Definition TypeBase.h:6032
ReservedIdentifierStatus
ActionResult< Expr * > ExprResult
Definition Ownership.h:249
@ Other
Other implicit parameter.
Definition Decl.h:1775
CXXNewInitializationStyle
Definition ExprCXX.h:2245
@ Parens
New-expression has a C++98 paren-delimited initializer.
Definition ExprCXX.h:2250
@ None
New-expression has no initializer as written.
Definition ExprCXX.h:2247
@ Braces
New-expression has a C++11 list-initializer.
Definition ExprCXX.h:2253
@ EST_BasicNoexcept
noexcept
@ EST_Dynamic
throw(T1, T2)
CheckedConversionKind
The kind of conversion being performed.
Definition Sema.h:432
@ CStyleCast
A C-style cast.
Definition Sema.h:436
@ ForBuiltinOverloadedOp
A conversion for an operand of a builtin overloaded operator.
Definition Sema.h:442
@ FunctionalCast
A functional-style cast.
Definition Sema.h:438
ActionResult< Stmt * > StmtResult
Definition Ownership.h:250
bool isGenericLambdaCallOperatorSpecialization(const CXXMethodDecl *MD)
Definition ASTLambda.h:60
#define false
Definition stdbool.h:26
The result of a constraint satisfaction check, containing the necessary information to diagnose an un...
Definition ASTConcept.h:91
static ASTConstraintSatisfaction * Rebuild(const ASTContext &C, const ASTConstraintSatisfaction &Satisfaction)
DeclarationNameInfo - A collector data type for bundling together a DeclarationName and the correspon...
DeclarationName getName() const
getName - Returns the embedded declaration name.
unsigned hasStatic
True if this dimension included the 'static' keyword.
Definition DeclSpec.h:1359
Expr * NumElts
This is the size of the array, or null if [] or [*] was specified.
Definition DeclSpec.h:1368
One instance of this struct is used for each type in a declarator that is parsed.
Definition DeclSpec.h:1290
ArrayTypeInfo Arr
Definition DeclSpec.h:1688
SourceLocation Loc
Loc - The place where this type was defined.
Definition DeclSpec.h:1298
enum clang::DeclaratorChunk::@340323374315200305336204205154073066142310370142 Kind
ExceptionSpecificationType Type
The kind of exception specification this is.
Definition TypeBase.h:5475
ArrayRef< QualType > Exceptions
Explicitly-specified list of exception types.
Definition TypeBase.h:5478
Extra information about a function prototype.
Definition TypeBase.h:5501
const LookupResult & updateLookupForMSVCCompatibility(Sema &, const LookupResult &, std::optional< LookupResult > &) const
AlignedAllocationMode PassAlignment
Definition ExprCXX.h:2312
TypeAwareAllocationMode PassTypeIdentity
Definition ExprCXX.h:2311
TypeAwareAllocationMode PassTypeIdentity
Definition ExprCXX.h:2343
SizedDeallocationMode PassSize
Definition ExprCXX.h:2345
AlignedAllocationMode PassAlignment
Definition ExprCXX.h:2344
OverloadCandidate - A single candidate in an overload set (C++ 13.3).
Definition Overload.h:937
Information about a template-id annotation token.
const IdentifierInfo * Name
FIXME: Temporarily stores the name of a specialization.
unsigned NumArgs
NumArgs - The number of template arguments.
SourceLocation TemplateNameLoc
TemplateNameLoc - The location of the template name within the source.
ParsedTemplateArgument * getTemplateArgs()
Retrieves a pointer to the template arguments.
SourceLocation RAngleLoc
The location of the '>' after the template argument list.
SourceLocation LAngleLoc
The location of the '<' before the template argument list.
SourceLocation TemplateKWLoc
TemplateKWLoc - The location of the template keyword.
ParsedTemplateTy Template
The declaration of the template corresponding to the template-name.
StandardConversionSequence Before
Represents the standard conversion that occurs before the actual user-defined conversion.
Definition Overload.h:493
FunctionDecl * ConversionFunction
ConversionFunction - The function that will perform the user-defined conversion.
Definition Overload.h:515
bool HadMultipleCandidates
HadMultipleCandidates - When this is true, it means that the conversion function was resolved from an...
Definition Overload.h:506
StandardConversionSequence After
After - Represents the standard conversion that occurs after the actual user-defined conversion.
Definition Overload.h:510
bool EllipsisConversion
EllipsisConversion - When this is true, it means user-defined conversion sequence starts with a ....
Definition Overload.h:501
DeclAccessPair FoundConversionFunction
The declaration that we found via name lookup, which might be the same as ConversionFunction or it mi...
Definition Overload.h:520