1//===--- DeclCXX.cpp - C++ Declaration AST Node Implementation ------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements the C++ related Decl classes. 11// 12//===----------------------------------------------------------------------===// 13#include "clang/AST/DeclCXX.h" 14#include "clang/AST/ASTContext.h" 15#include "clang/AST/ASTLambda.h" 16#include "clang/AST/ASTMutationListener.h" 17#include "clang/AST/CXXInheritance.h" 18#include "clang/AST/DeclTemplate.h" 19#include "clang/AST/Expr.h" 20#include "clang/AST/ExprCXX.h" 21#include "clang/AST/TypeLoc.h" 22#include "clang/Basic/IdentifierTable.h" 23#include "llvm/ADT/STLExtras.h" 24#include "llvm/ADT/SmallPtrSet.h" 25using namespace clang; 26 27//===----------------------------------------------------------------------===// 28// Decl Allocation/Deallocation Method Implementations 29//===----------------------------------------------------------------------===// 30 31void AccessSpecDecl::anchor() { } 32 33AccessSpecDecl *AccessSpecDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 34 return new (C, ID) AccessSpecDecl(EmptyShell()); 35} 36 37void LazyASTUnresolvedSet::getFromExternalSource(ASTContext &C) const { 38 ExternalASTSource *Source = C.getExternalSource(); 39 assert(Impl.Decls.isLazy() && "getFromExternalSource for non-lazy set"); 40 assert(Source && "getFromExternalSource with no external source"); 41 42 for (ASTUnresolvedSet::iterator I = Impl.begin(); I != Impl.end(); ++I) 43 I.setDecl(cast<NamedDecl>(Source->GetExternalDecl( 44 reinterpret_cast<uintptr_t>(I.getDecl()) >> 2))); 45 Impl.Decls.setLazy(false); 46} 47 48CXXRecordDecl::DefinitionData::DefinitionData(CXXRecordDecl *D) 49 : UserDeclaredConstructor(false), UserDeclaredSpecialMembers(0), 50 Aggregate(true), PlainOldData(true), Empty(true), Polymorphic(false), 51 Abstract(false), IsStandardLayout(true), HasNoNonEmptyBases(true), 52 HasPrivateFields(false), HasProtectedFields(false), 53 HasPublicFields(false), HasMutableFields(false), HasVariantMembers(false), 54 HasOnlyCMembers(true), HasInClassInitializer(false), 55 HasUninitializedReferenceMember(false), HasUninitializedFields(false), 56 HasInheritedConstructor(false), HasInheritedAssignment(false), 57 NeedOverloadResolutionForMoveConstructor(false), 58 NeedOverloadResolutionForMoveAssignment(false), 59 NeedOverloadResolutionForDestructor(false), 60 DefaultedMoveConstructorIsDeleted(false), 61 DefaultedMoveAssignmentIsDeleted(false), 62 DefaultedDestructorIsDeleted(false), HasTrivialSpecialMembers(SMF_All), 63 DeclaredNonTrivialSpecialMembers(0), HasIrrelevantDestructor(true), 64 HasConstexprNonCopyMoveConstructor(false), 65 HasDefaultedDefaultConstructor(false), 66 DefaultedDefaultConstructorIsConstexpr(true), 67 HasConstexprDefaultConstructor(false), 68 HasNonLiteralTypeFieldsOrBases(false), ComputedVisibleConversions(false), 69 UserProvidedDefaultConstructor(false), DeclaredSpecialMembers(0), 70 ImplicitCopyConstructorHasConstParam(true), 71 ImplicitCopyAssignmentHasConstParam(true), 72 HasDeclaredCopyConstructorWithConstParam(false), 73 HasDeclaredCopyAssignmentWithConstParam(false), IsLambda(false), 74 IsParsingBaseSpecifiers(false), NumBases(0), NumVBases(0), Bases(), 75 VBases(), Definition(D), FirstFriend() {} 76 77CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getBasesSlowCase() const { 78 return Bases.get(Definition->getASTContext().getExternalSource()); 79} 80 81CXXBaseSpecifier *CXXRecordDecl::DefinitionData::getVBasesSlowCase() const { 82 return VBases.get(Definition->getASTContext().getExternalSource()); 83} 84 85CXXRecordDecl::CXXRecordDecl(Kind K, TagKind TK, const ASTContext &C, 86 DeclContext *DC, SourceLocation StartLoc, 87 SourceLocation IdLoc, IdentifierInfo *Id, 88 CXXRecordDecl *PrevDecl) 89 : RecordDecl(K, TK, C, DC, StartLoc, IdLoc, Id, PrevDecl), 90 DefinitionData(PrevDecl ? PrevDecl->DefinitionData 91 : nullptr), 92 TemplateOrInstantiation() {} 93 94CXXRecordDecl *CXXRecordDecl::Create(const ASTContext &C, TagKind TK, 95 DeclContext *DC, SourceLocation StartLoc, 96 SourceLocation IdLoc, IdentifierInfo *Id, 97 CXXRecordDecl* PrevDecl, 98 bool DelayTypeCreation) { 99 CXXRecordDecl *R = new (C, DC) CXXRecordDecl(CXXRecord, TK, C, DC, StartLoc, 100 IdLoc, Id, PrevDecl); 101 R->MayHaveOutOfDateDef = C.getLangOpts().Modules; 102 103 // FIXME: DelayTypeCreation seems like such a hack 104 if (!DelayTypeCreation) 105 C.getTypeDeclType(R, PrevDecl); 106 return R; 107} 108 109CXXRecordDecl * 110CXXRecordDecl::CreateLambda(const ASTContext &C, DeclContext *DC, 111 TypeSourceInfo *Info, SourceLocation Loc, 112 bool Dependent, bool IsGeneric, 113 LambdaCaptureDefault CaptureDefault) { 114 CXXRecordDecl *R = 115 new (C, DC) CXXRecordDecl(CXXRecord, TTK_Class, C, DC, Loc, Loc, 116 nullptr, nullptr); 117 R->IsBeingDefined = true; 118 R->DefinitionData = 119 new (C) struct LambdaDefinitionData(R, Info, Dependent, IsGeneric, 120 CaptureDefault); 121 R->MayHaveOutOfDateDef = false; 122 R->setImplicit(true); 123 C.getTypeDeclType(R, /*PrevDecl=*/nullptr); 124 return R; 125} 126 127CXXRecordDecl * 128CXXRecordDecl::CreateDeserialized(const ASTContext &C, unsigned ID) { 129 CXXRecordDecl *R = new (C, ID) CXXRecordDecl( 130 CXXRecord, TTK_Struct, C, nullptr, SourceLocation(), SourceLocation(), 131 nullptr, nullptr); 132 R->MayHaveOutOfDateDef = false; 133 return R; 134} 135 136void 137CXXRecordDecl::setBases(CXXBaseSpecifier const * const *Bases, 138 unsigned NumBases) { 139 ASTContext &C = getASTContext(); 140 141 if (!data().Bases.isOffset() && data().NumBases > 0) 142 C.Deallocate(data().getBases()); 143 144 if (NumBases) { 145 if (!C.getLangOpts().CPlusPlus1z) { 146 // C++ [dcl.init.aggr]p1: 147 // An aggregate is [...] a class with [...] no base classes [...]. 148 data().Aggregate = false; 149 } 150 151 // C++ [class]p4: 152 // A POD-struct is an aggregate class... 153 data().PlainOldData = false; 154 } 155 156 // The set of seen virtual base types. 157 llvm::SmallPtrSet<CanQualType, 8> SeenVBaseTypes; 158 159 // The virtual bases of this class. 160 SmallVector<const CXXBaseSpecifier *, 8> VBases; 161 162 data().Bases = new(C) CXXBaseSpecifier [NumBases]; 163 data().NumBases = NumBases; 164 for (unsigned i = 0; i < NumBases; ++i) { 165 data().getBases()[i] = *Bases[i]; 166 // Keep track of inherited vbases for this base class. 167 const CXXBaseSpecifier *Base = Bases[i]; 168 QualType BaseType = Base->getType(); 169 // Skip dependent types; we can't do any checking on them now. 170 if (BaseType->isDependentType()) 171 continue; 172 CXXRecordDecl *BaseClassDecl 173 = cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl()); 174 175 if (!BaseClassDecl->isEmpty()) { 176 if (!data().Empty) { 177 // C++0x [class]p7: 178 // A standard-layout class is a class that: 179 // [...] 180 // -- either has no non-static data members in the most derived 181 // class and at most one base class with non-static data members, 182 // or has no base classes with non-static data members, and 183 // If this is the second non-empty base, then neither of these two 184 // clauses can be true. 185 data().IsStandardLayout = false; 186 } 187 188 // C++14 [meta.unary.prop]p4: 189 // T is a class type [...] with [...] no base class B for which 190 // is_empty<B>::value is false. 191 data().Empty = false; 192 data().HasNoNonEmptyBases = false; 193 } 194 195 // C++1z [dcl.init.agg]p1: 196 // An aggregate is a class with [...] no private or protected base classes 197 if (Base->getAccessSpecifier() != AS_public) 198 data().Aggregate = false; 199 200 // C++ [class.virtual]p1: 201 // A class that declares or inherits a virtual function is called a 202 // polymorphic class. 203 if (BaseClassDecl->isPolymorphic()) 204 data().Polymorphic = true; 205 206 // C++0x [class]p7: 207 // A standard-layout class is a class that: [...] 208 // -- has no non-standard-layout base classes 209 if (!BaseClassDecl->isStandardLayout()) 210 data().IsStandardLayout = false; 211 212 // Record if this base is the first non-literal field or base. 213 if (!hasNonLiteralTypeFieldsOrBases() && !BaseType->isLiteralType(C)) 214 data().HasNonLiteralTypeFieldsOrBases = true; 215 216 // Now go through all virtual bases of this base and add them. 217 for (const auto &VBase : BaseClassDecl->vbases()) { 218 // Add this base if it's not already in the list. 219 if (SeenVBaseTypes.insert(C.getCanonicalType(VBase.getType())).second) { 220 VBases.push_back(&VBase); 221 222 // C++11 [class.copy]p8: 223 // The implicitly-declared copy constructor for a class X will have 224 // the form 'X::X(const X&)' if each [...] virtual base class B of X 225 // has a copy constructor whose first parameter is of type 226 // 'const B&' or 'const volatile B&' [...] 227 if (CXXRecordDecl *VBaseDecl = VBase.getType()->getAsCXXRecordDecl()) 228 if (!VBaseDecl->hasCopyConstructorWithConstParam()) 229 data().ImplicitCopyConstructorHasConstParam = false; 230 231 // C++1z [dcl.init.agg]p1: 232 // An aggregate is a class with [...] no virtual base classes 233 data().Aggregate = false; 234 } 235 } 236 237 if (Base->isVirtual()) { 238 // Add this base if it's not already in the list. 239 if (SeenVBaseTypes.insert(C.getCanonicalType(BaseType)).second) 240 VBases.push_back(Base); 241 242 // C++14 [meta.unary.prop] is_empty: 243 // T is a class type, but not a union type, with ... no virtual base 244 // classes 245 data().Empty = false; 246 247 // C++1z [dcl.init.agg]p1: 248 // An aggregate is a class with [...] no virtual base classes 249 data().Aggregate = false; 250 251 // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25: 252 // A [default constructor, copy/move constructor, or copy/move assignment 253 // operator for a class X] is trivial [...] if: 254 // -- class X has [...] no virtual base classes 255 data().HasTrivialSpecialMembers &= SMF_Destructor; 256 257 // C++0x [class]p7: 258 // A standard-layout class is a class that: [...] 259 // -- has [...] no virtual base classes 260 data().IsStandardLayout = false; 261 262 // C++11 [dcl.constexpr]p4: 263 // In the definition of a constexpr constructor [...] 264 // -- the class shall not have any virtual base classes 265 data().DefaultedDefaultConstructorIsConstexpr = false; 266 } else { 267 // C++ [class.ctor]p5: 268 // A default constructor is trivial [...] if: 269 // -- all the direct base classes of its class have trivial default 270 // constructors. 271 if (!BaseClassDecl->hasTrivialDefaultConstructor()) 272 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor; 273 274 // C++0x [class.copy]p13: 275 // A copy/move constructor for class X is trivial if [...] 276 // [...] 277 // -- the constructor selected to copy/move each direct base class 278 // subobject is trivial, and 279 if (!BaseClassDecl->hasTrivialCopyConstructor()) 280 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor; 281 // If the base class doesn't have a simple move constructor, we'll eagerly 282 // declare it and perform overload resolution to determine which function 283 // it actually calls. If it does have a simple move constructor, this 284 // check is correct. 285 if (!BaseClassDecl->hasTrivialMoveConstructor()) 286 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor; 287 288 // C++0x [class.copy]p27: 289 // A copy/move assignment operator for class X is trivial if [...] 290 // [...] 291 // -- the assignment operator selected to copy/move each direct base 292 // class subobject is trivial, and 293 if (!BaseClassDecl->hasTrivialCopyAssignment()) 294 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment; 295 // If the base class doesn't have a simple move assignment, we'll eagerly 296 // declare it and perform overload resolution to determine which function 297 // it actually calls. If it does have a simple move assignment, this 298 // check is correct. 299 if (!BaseClassDecl->hasTrivialMoveAssignment()) 300 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment; 301 302 // C++11 [class.ctor]p6: 303 // If that user-written default constructor would satisfy the 304 // requirements of a constexpr constructor, the implicitly-defined 305 // default constructor is constexpr. 306 if (!BaseClassDecl->hasConstexprDefaultConstructor()) 307 data().DefaultedDefaultConstructorIsConstexpr = false; 308 } 309 310 // C++ [class.ctor]p3: 311 // A destructor is trivial if all the direct base classes of its class 312 // have trivial destructors. 313 if (!BaseClassDecl->hasTrivialDestructor()) 314 data().HasTrivialSpecialMembers &= ~SMF_Destructor; 315 316 if (!BaseClassDecl->hasIrrelevantDestructor()) 317 data().HasIrrelevantDestructor = false; 318 319 // C++11 [class.copy]p18: 320 // The implicitly-declared copy assignment oeprator for a class X will 321 // have the form 'X& X::operator=(const X&)' if each direct base class B 322 // of X has a copy assignment operator whose parameter is of type 'const 323 // B&', 'const volatile B&', or 'B' [...] 324 if (!BaseClassDecl->hasCopyAssignmentWithConstParam()) 325 data().ImplicitCopyAssignmentHasConstParam = false; 326 327 // C++11 [class.copy]p8: 328 // The implicitly-declared copy constructor for a class X will have 329 // the form 'X::X(const X&)' if each direct [...] base class B of X 330 // has a copy constructor whose first parameter is of type 331 // 'const B&' or 'const volatile B&' [...] 332 if (!BaseClassDecl->hasCopyConstructorWithConstParam()) 333 data().ImplicitCopyConstructorHasConstParam = false; 334 335 // A class has an Objective-C object member if... or any of its bases 336 // has an Objective-C object member. 337 if (BaseClassDecl->hasObjectMember()) 338 setHasObjectMember(true); 339 340 if (BaseClassDecl->hasVolatileMember()) 341 setHasVolatileMember(true); 342 343 // Keep track of the presence of mutable fields. 344 if (BaseClassDecl->hasMutableFields()) 345 data().HasMutableFields = true; 346 347 if (BaseClassDecl->hasUninitializedReferenceMember()) 348 data().HasUninitializedReferenceMember = true; 349 350 if (!BaseClassDecl->allowConstDefaultInit()) 351 data().HasUninitializedFields = true; 352 353 addedClassSubobject(BaseClassDecl); 354 } 355 356 if (VBases.empty()) { 357 data().IsParsingBaseSpecifiers = false; 358 return; 359 } 360 361 // Create base specifier for any direct or indirect virtual bases. 362 data().VBases = new (C) CXXBaseSpecifier[VBases.size()]; 363 data().NumVBases = VBases.size(); 364 for (int I = 0, E = VBases.size(); I != E; ++I) { 365 QualType Type = VBases[I]->getType(); 366 if (!Type->isDependentType()) 367 addedClassSubobject(Type->getAsCXXRecordDecl()); 368 data().getVBases()[I] = *VBases[I]; 369 } 370 371 data().IsParsingBaseSpecifiers = false; 372} 373 374void CXXRecordDecl::addedClassSubobject(CXXRecordDecl *Subobj) { 375 // C++11 [class.copy]p11: 376 // A defaulted copy/move constructor for a class X is defined as 377 // deleted if X has: 378 // -- a direct or virtual base class B that cannot be copied/moved [...] 379 // -- a non-static data member of class type M (or array thereof) 380 // that cannot be copied or moved [...] 381 if (!Subobj->hasSimpleMoveConstructor()) 382 data().NeedOverloadResolutionForMoveConstructor = true; 383 384 // C++11 [class.copy]p23: 385 // A defaulted copy/move assignment operator for a class X is defined as 386 // deleted if X has: 387 // -- a direct or virtual base class B that cannot be copied/moved [...] 388 // -- a non-static data member of class type M (or array thereof) 389 // that cannot be copied or moved [...] 390 if (!Subobj->hasSimpleMoveAssignment()) 391 data().NeedOverloadResolutionForMoveAssignment = true; 392 393 // C++11 [class.ctor]p5, C++11 [class.copy]p11, C++11 [class.dtor]p5: 394 // A defaulted [ctor or dtor] for a class X is defined as 395 // deleted if X has: 396 // -- any direct or virtual base class [...] has a type with a destructor 397 // that is deleted or inaccessible from the defaulted [ctor or dtor]. 398 // -- any non-static data member has a type with a destructor 399 // that is deleted or inaccessible from the defaulted [ctor or dtor]. 400 if (!Subobj->hasSimpleDestructor()) { 401 data().NeedOverloadResolutionForMoveConstructor = true; 402 data().NeedOverloadResolutionForDestructor = true; 403 } 404} 405 406bool CXXRecordDecl::hasAnyDependentBases() const { 407 if (!isDependentContext()) 408 return false; 409 410 return !forallBases([](const CXXRecordDecl *) { return true; }); 411} 412 413bool CXXRecordDecl::isTriviallyCopyable() const { 414 // C++0x [class]p5: 415 // A trivially copyable class is a class that: 416 // -- has no non-trivial copy constructors, 417 if (hasNonTrivialCopyConstructor()) return false; 418 // -- has no non-trivial move constructors, 419 if (hasNonTrivialMoveConstructor()) return false; 420 // -- has no non-trivial copy assignment operators, 421 if (hasNonTrivialCopyAssignment()) return false; 422 // -- has no non-trivial move assignment operators, and 423 if (hasNonTrivialMoveAssignment()) return false; 424 // -- has a trivial destructor. 425 if (!hasTrivialDestructor()) return false; 426 427 return true; 428} 429 430void CXXRecordDecl::markedVirtualFunctionPure() { 431 // C++ [class.abstract]p2: 432 // A class is abstract if it has at least one pure virtual function. 433 data().Abstract = true; 434} 435 436void CXXRecordDecl::addedMember(Decl *D) { 437 if (!D->isImplicit() && 438 !isa<FieldDecl>(D) && 439 !isa<IndirectFieldDecl>(D) && 440 (!isa<TagDecl>(D) || cast<TagDecl>(D)->getTagKind() == TTK_Class || 441 cast<TagDecl>(D)->getTagKind() == TTK_Interface)) 442 data().HasOnlyCMembers = false; 443 444 // Ignore friends and invalid declarations. 445 if (D->getFriendObjectKind() || D->isInvalidDecl()) 446 return; 447 448 FunctionTemplateDecl *FunTmpl = dyn_cast<FunctionTemplateDecl>(D); 449 if (FunTmpl) 450 D = FunTmpl->getTemplatedDecl(); 451 452 // FIXME: Pass NamedDecl* to addedMember? 453 Decl *DUnderlying = D; 454 if (auto *ND = dyn_cast<NamedDecl>(DUnderlying)) { 455 DUnderlying = ND->getUnderlyingDecl(); 456 if (FunctionTemplateDecl *UnderlyingFunTmpl = 457 dyn_cast<FunctionTemplateDecl>(DUnderlying)) 458 DUnderlying = UnderlyingFunTmpl->getTemplatedDecl(); 459 } 460 461 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 462 if (Method->isVirtual()) { 463 // C++ [dcl.init.aggr]p1: 464 // An aggregate is an array or a class with [...] no virtual functions. 465 data().Aggregate = false; 466 467 // C++ [class]p4: 468 // A POD-struct is an aggregate class... 469 data().PlainOldData = false; 470 471 // C++14 [meta.unary.prop]p4: 472 // T is a class type [...] with [...] no virtual member functions... 473 data().Empty = false; 474 475 // C++ [class.virtual]p1: 476 // A class that declares or inherits a virtual function is called a 477 // polymorphic class. 478 data().Polymorphic = true; 479 480 // C++11 [class.ctor]p5, C++11 [class.copy]p12, C++11 [class.copy]p25: 481 // A [default constructor, copy/move constructor, or copy/move 482 // assignment operator for a class X] is trivial [...] if: 483 // -- class X has no virtual functions [...] 484 data().HasTrivialSpecialMembers &= SMF_Destructor; 485 486 // C++0x [class]p7: 487 // A standard-layout class is a class that: [...] 488 // -- has no virtual functions 489 data().IsStandardLayout = false; 490 } 491 } 492 493 // Notify the listener if an implicit member was added after the definition 494 // was completed. 495 if (!isBeingDefined() && D->isImplicit()) 496 if (ASTMutationListener *L = getASTMutationListener()) 497 L->AddedCXXImplicitMember(data().Definition, D); 498 499 // The kind of special member this declaration is, if any. 500 unsigned SMKind = 0; 501 502 // Handle constructors. 503 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 504 if (!Constructor->isImplicit()) { 505 // Note that we have a user-declared constructor. 506 data().UserDeclaredConstructor = true; 507 508 // C++ [class]p4: 509 // A POD-struct is an aggregate class [...] 510 // Since the POD bit is meant to be C++03 POD-ness, clear it even if the 511 // type is technically an aggregate in C++0x since it wouldn't be in 03. 512 data().PlainOldData = false; 513 } 514 515 if (Constructor->isDefaultConstructor()) { 516 SMKind |= SMF_DefaultConstructor; 517 518 if (Constructor->isUserProvided()) 519 data().UserProvidedDefaultConstructor = true; 520 if (Constructor->isConstexpr()) 521 data().HasConstexprDefaultConstructor = true; 522 if (Constructor->isDefaulted()) 523 data().HasDefaultedDefaultConstructor = true; 524 } 525 526 if (!FunTmpl) { 527 unsigned Quals; 528 if (Constructor->isCopyConstructor(Quals)) { 529 SMKind |= SMF_CopyConstructor; 530 531 if (Quals & Qualifiers::Const) 532 data().HasDeclaredCopyConstructorWithConstParam = true; 533 } else if (Constructor->isMoveConstructor()) 534 SMKind |= SMF_MoveConstructor; 535 } 536 } 537 538 // Handle constructors, including those inherited from base classes. 539 if (CXXConstructorDecl *Constructor = 540 dyn_cast<CXXConstructorDecl>(DUnderlying)) { 541 // Record if we see any constexpr constructors which are neither copy 542 // nor move constructors. 543 // C++1z [basic.types]p10: 544 // [...] has at least one constexpr constructor or constructor template 545 // (possibly inherited from a base class) that is not a copy or move 546 // constructor [...] 547 if (Constructor->isConstexpr() && !Constructor->isCopyOrMoveConstructor()) 548 data().HasConstexprNonCopyMoveConstructor = true; 549 550 // C++ [dcl.init.aggr]p1: 551 // An aggregate is an array or a class with no user-declared 552 // constructors [...]. 553 // C++11 [dcl.init.aggr]p1: 554 // An aggregate is an array or a class with no user-provided 555 // constructors [...]. 556 // C++11 [dcl.init.aggr]p1: 557 // An aggregate is an array or a class with no user-provided 558 // constructors (including those inherited from a base class) [...]. 559 if (getASTContext().getLangOpts().CPlusPlus11 560 ? Constructor->isUserProvided() 561 : !Constructor->isImplicit()) 562 data().Aggregate = false; 563 } 564 565 // Handle destructors. 566 if (CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(D)) { 567 SMKind |= SMF_Destructor; 568 569 if (DD->isUserProvided()) 570 data().HasIrrelevantDestructor = false; 571 // If the destructor is explicitly defaulted and not trivial or not public 572 // or if the destructor is deleted, we clear HasIrrelevantDestructor in 573 // finishedDefaultedOrDeletedMember. 574 575 // C++11 [class.dtor]p5: 576 // A destructor is trivial if [...] the destructor is not virtual. 577 if (DD->isVirtual()) 578 data().HasTrivialSpecialMembers &= ~SMF_Destructor; 579 } 580 581 // Handle member functions. 582 if (CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) { 583 if (Method->isCopyAssignmentOperator()) { 584 SMKind |= SMF_CopyAssignment; 585 586 const ReferenceType *ParamTy = 587 Method->getParamDecl(0)->getType()->getAs<ReferenceType>(); 588 if (!ParamTy || ParamTy->getPointeeType().isConstQualified()) 589 data().HasDeclaredCopyAssignmentWithConstParam = true; 590 } 591 592 if (Method->isMoveAssignmentOperator()) 593 SMKind |= SMF_MoveAssignment; 594 595 // Keep the list of conversion functions up-to-date. 596 if (CXXConversionDecl *Conversion = dyn_cast<CXXConversionDecl>(D)) { 597 // FIXME: We use the 'unsafe' accessor for the access specifier here, 598 // because Sema may not have set it yet. That's really just a misdesign 599 // in Sema. However, LLDB *will* have set the access specifier correctly, 600 // and adds declarations after the class is technically completed, 601 // so completeDefinition()'s overriding of the access specifiers doesn't 602 // work. 603 AccessSpecifier AS = Conversion->getAccessUnsafe(); 604 605 if (Conversion->getPrimaryTemplate()) { 606 // We don't record specializations. 607 } else { 608 ASTContext &Ctx = getASTContext(); 609 ASTUnresolvedSet &Conversions = data().Conversions.get(Ctx); 610 NamedDecl *Primary = 611 FunTmpl ? cast<NamedDecl>(FunTmpl) : cast<NamedDecl>(Conversion); 612 if (Primary->getPreviousDecl()) 613 Conversions.replace(cast<NamedDecl>(Primary->getPreviousDecl()), 614 Primary, AS); 615 else 616 Conversions.addDecl(Ctx, Primary, AS); 617 } 618 } 619 620 if (SMKind) { 621 // If this is the first declaration of a special member, we no longer have 622 // an implicit trivial special member. 623 data().HasTrivialSpecialMembers &= 624 data().DeclaredSpecialMembers | ~SMKind; 625 626 if (!Method->isImplicit() && !Method->isUserProvided()) { 627 // This method is user-declared but not user-provided. We can't work out 628 // whether it's trivial yet (not until we get to the end of the class). 629 // We'll handle this method in finishedDefaultedOrDeletedMember. 630 } else if (Method->isTrivial()) 631 data().HasTrivialSpecialMembers |= SMKind; 632 else 633 data().DeclaredNonTrivialSpecialMembers |= SMKind; 634 635 // Note when we have declared a declared special member, and suppress the 636 // implicit declaration of this special member. 637 data().DeclaredSpecialMembers |= SMKind; 638 639 if (!Method->isImplicit()) { 640 data().UserDeclaredSpecialMembers |= SMKind; 641 642 // C++03 [class]p4: 643 // A POD-struct is an aggregate class that has [...] no user-defined 644 // copy assignment operator and no user-defined destructor. 645 // 646 // Since the POD bit is meant to be C++03 POD-ness, and in C++03, 647 // aggregates could not have any constructors, clear it even for an 648 // explicitly defaulted or deleted constructor. 649 // type is technically an aggregate in C++0x since it wouldn't be in 03. 650 // 651 // Also, a user-declared move assignment operator makes a class non-POD. 652 // This is an extension in C++03. 653 data().PlainOldData = false; 654 } 655 } 656 657 return; 658 } 659 660 // Handle non-static data members. 661 if (FieldDecl *Field = dyn_cast<FieldDecl>(D)) { 662 // C++ [class.bit]p2: 663 // A declaration for a bit-field that omits the identifier declares an 664 // unnamed bit-field. Unnamed bit-fields are not members and cannot be 665 // initialized. 666 if (Field->isUnnamedBitfield()) 667 return; 668 669 // C++ [dcl.init.aggr]p1: 670 // An aggregate is an array or a class (clause 9) with [...] no 671 // private or protected non-static data members (clause 11). 672 // 673 // A POD must be an aggregate. 674 if (D->getAccess() == AS_private || D->getAccess() == AS_protected) { 675 data().Aggregate = false; 676 data().PlainOldData = false; 677 } 678 679 // C++0x [class]p7: 680 // A standard-layout class is a class that: 681 // [...] 682 // -- has the same access control for all non-static data members, 683 switch (D->getAccess()) { 684 case AS_private: data().HasPrivateFields = true; break; 685 case AS_protected: data().HasProtectedFields = true; break; 686 case AS_public: data().HasPublicFields = true; break; 687 case AS_none: llvm_unreachable("Invalid access specifier"); 688 }; 689 if ((data().HasPrivateFields + data().HasProtectedFields + 690 data().HasPublicFields) > 1) 691 data().IsStandardLayout = false; 692 693 // Keep track of the presence of mutable fields. 694 if (Field->isMutable()) 695 data().HasMutableFields = true; 696 697 // C++11 [class.union]p8, DR1460: 698 // If X is a union, a non-static data member of X that is not an anonymous 699 // union is a variant member of X. 700 if (isUnion() && !Field->isAnonymousStructOrUnion()) 701 data().HasVariantMembers = true; 702 703 // C++0x [class]p9: 704 // A POD struct is a class that is both a trivial class and a 705 // standard-layout class, and has no non-static data members of type 706 // non-POD struct, non-POD union (or array of such types). 707 // 708 // Automatic Reference Counting: the presence of a member of Objective-C pointer type 709 // that does not explicitly have no lifetime makes the class a non-POD. 710 ASTContext &Context = getASTContext(); 711 QualType T = Context.getBaseElementType(Field->getType()); 712 if (T->isObjCRetainableType() || T.isObjCGCStrong()) { 713 if (!Context.getLangOpts().ObjCAutoRefCount) { 714 setHasObjectMember(true); 715 } else if (T.getObjCLifetime() != Qualifiers::OCL_ExplicitNone) { 716 // Objective-C Automatic Reference Counting: 717 // If a class has a non-static data member of Objective-C pointer 718 // type (or array thereof), it is a non-POD type and its 719 // default constructor (if any), copy constructor, move constructor, 720 // copy assignment operator, move assignment operator, and destructor are 721 // non-trivial. 722 setHasObjectMember(true); 723 struct DefinitionData &Data = data(); 724 Data.PlainOldData = false; 725 Data.HasTrivialSpecialMembers = 0; 726 Data.HasIrrelevantDestructor = false; 727 } 728 } else if (!T.isCXX98PODType(Context)) 729 data().PlainOldData = false; 730 731 if (T->isReferenceType()) { 732 if (!Field->hasInClassInitializer()) 733 data().HasUninitializedReferenceMember = true; 734 735 // C++0x [class]p7: 736 // A standard-layout class is a class that: 737 // -- has no non-static data members of type [...] reference, 738 data().IsStandardLayout = false; 739 } 740 741 if (!Field->hasInClassInitializer() && !Field->isMutable()) { 742 if (CXXRecordDecl *FieldType = Field->getType()->getAsCXXRecordDecl()) { 743 if (FieldType->hasDefinition() && !FieldType->allowConstDefaultInit()) 744 data().HasUninitializedFields = true; 745 } else { 746 data().HasUninitializedFields = true; 747 } 748 } 749 750 // Record if this field is the first non-literal or volatile field or base. 751 if (!T->isLiteralType(Context) || T.isVolatileQualified()) 752 data().HasNonLiteralTypeFieldsOrBases = true; 753 754 if (Field->hasInClassInitializer() || 755 (Field->isAnonymousStructOrUnion() && 756 Field->getType()->getAsCXXRecordDecl()->hasInClassInitializer())) { 757 data().HasInClassInitializer = true; 758 759 // C++11 [class]p5: 760 // A default constructor is trivial if [...] no non-static data member 761 // of its class has a brace-or-equal-initializer. 762 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor; 763 764 // C++11 [dcl.init.aggr]p1: 765 // An aggregate is a [...] class with [...] no 766 // brace-or-equal-initializers for non-static data members. 767 // 768 // This rule was removed in C++14. 769 if (!getASTContext().getLangOpts().CPlusPlus14) 770 data().Aggregate = false; 771 772 // C++11 [class]p10: 773 // A POD struct is [...] a trivial class. 774 data().PlainOldData = false; 775 } 776 777 // C++11 [class.copy]p23: 778 // A defaulted copy/move assignment operator for a class X is defined 779 // as deleted if X has: 780 // -- a non-static data member of reference type 781 if (T->isReferenceType()) 782 data().DefaultedMoveAssignmentIsDeleted = true; 783 784 if (const RecordType *RecordTy = T->getAs<RecordType>()) { 785 CXXRecordDecl* FieldRec = cast<CXXRecordDecl>(RecordTy->getDecl()); 786 if (FieldRec->getDefinition()) { 787 addedClassSubobject(FieldRec); 788 789 // We may need to perform overload resolution to determine whether a 790 // field can be moved if it's const or volatile qualified. 791 if (T.getCVRQualifiers() & (Qualifiers::Const | Qualifiers::Volatile)) { 792 data().NeedOverloadResolutionForMoveConstructor = true; 793 data().NeedOverloadResolutionForMoveAssignment = true; 794 } 795 796 // C++11 [class.ctor]p5, C++11 [class.copy]p11: 797 // A defaulted [special member] for a class X is defined as 798 // deleted if: 799 // -- X is a union-like class that has a variant member with a 800 // non-trivial [corresponding special member] 801 if (isUnion()) { 802 if (FieldRec->hasNonTrivialMoveConstructor()) 803 data().DefaultedMoveConstructorIsDeleted = true; 804 if (FieldRec->hasNonTrivialMoveAssignment()) 805 data().DefaultedMoveAssignmentIsDeleted = true; 806 if (FieldRec->hasNonTrivialDestructor()) 807 data().DefaultedDestructorIsDeleted = true; 808 } 809 810 // C++0x [class.ctor]p5: 811 // A default constructor is trivial [...] if: 812 // -- for all the non-static data members of its class that are of 813 // class type (or array thereof), each such class has a trivial 814 // default constructor. 815 if (!FieldRec->hasTrivialDefaultConstructor()) 816 data().HasTrivialSpecialMembers &= ~SMF_DefaultConstructor; 817 818 // C++0x [class.copy]p13: 819 // A copy/move constructor for class X is trivial if [...] 820 // [...] 821 // -- for each non-static data member of X that is of class type (or 822 // an array thereof), the constructor selected to copy/move that 823 // member is trivial; 824 if (!FieldRec->hasTrivialCopyConstructor()) 825 data().HasTrivialSpecialMembers &= ~SMF_CopyConstructor; 826 // If the field doesn't have a simple move constructor, we'll eagerly 827 // declare the move constructor for this class and we'll decide whether 828 // it's trivial then. 829 if (!FieldRec->hasTrivialMoveConstructor()) 830 data().HasTrivialSpecialMembers &= ~SMF_MoveConstructor; 831 832 // C++0x [class.copy]p27: 833 // A copy/move assignment operator for class X is trivial if [...] 834 // [...] 835 // -- for each non-static data member of X that is of class type (or 836 // an array thereof), the assignment operator selected to 837 // copy/move that member is trivial; 838 if (!FieldRec->hasTrivialCopyAssignment()) 839 data().HasTrivialSpecialMembers &= ~SMF_CopyAssignment; 840 // If the field doesn't have a simple move assignment, we'll eagerly 841 // declare the move assignment for this class and we'll decide whether 842 // it's trivial then. 843 if (!FieldRec->hasTrivialMoveAssignment()) 844 data().HasTrivialSpecialMembers &= ~SMF_MoveAssignment; 845 846 if (!FieldRec->hasTrivialDestructor()) 847 data().HasTrivialSpecialMembers &= ~SMF_Destructor; 848 if (!FieldRec->hasIrrelevantDestructor()) 849 data().HasIrrelevantDestructor = false; 850 if (FieldRec->hasObjectMember()) 851 setHasObjectMember(true); 852 if (FieldRec->hasVolatileMember()) 853 setHasVolatileMember(true); 854 855 // C++0x [class]p7: 856 // A standard-layout class is a class that: 857 // -- has no non-static data members of type non-standard-layout 858 // class (or array of such types) [...] 859 if (!FieldRec->isStandardLayout()) 860 data().IsStandardLayout = false; 861 862 // C++0x [class]p7: 863 // A standard-layout class is a class that: 864 // [...] 865 // -- has no base classes of the same type as the first non-static 866 // data member. 867 // We don't want to expend bits in the state of the record decl 868 // tracking whether this is the first non-static data member so we 869 // cheat a bit and use some of the existing state: the empty bit. 870 // Virtual bases and virtual methods make a class non-empty, but they 871 // also make it non-standard-layout so we needn't check here. 872 // A non-empty base class may leave the class standard-layout, but not 873 // if we have arrived here, and have at least one non-static data 874 // member. If IsStandardLayout remains true, then the first non-static 875 // data member must come through here with Empty still true, and Empty 876 // will subsequently be set to false below. 877 if (data().IsStandardLayout && data().Empty) { 878 for (const auto &BI : bases()) { 879 if (Context.hasSameUnqualifiedType(BI.getType(), T)) { 880 data().IsStandardLayout = false; 881 break; 882 } 883 } 884 } 885 886 // Keep track of the presence of mutable fields. 887 if (FieldRec->hasMutableFields()) 888 data().HasMutableFields = true; 889 890 // C++11 [class.copy]p13: 891 // If the implicitly-defined constructor would satisfy the 892 // requirements of a constexpr constructor, the implicitly-defined 893 // constructor is constexpr. 894 // C++11 [dcl.constexpr]p4: 895 // -- every constructor involved in initializing non-static data 896 // members [...] shall be a constexpr constructor 897 if (!Field->hasInClassInitializer() && 898 !FieldRec->hasConstexprDefaultConstructor() && !isUnion()) 899 // The standard requires any in-class initializer to be a constant 900 // expression. We consider this to be a defect. 901 data().DefaultedDefaultConstructorIsConstexpr = false; 902 903 // C++11 [class.copy]p8: 904 // The implicitly-declared copy constructor for a class X will have 905 // the form 'X::X(const X&)' if [...] for all the non-static data 906 // members of X that are of a class type M (or array thereof), each 907 // such class type has a copy constructor whose first parameter is 908 // of type 'const M&' or 'const volatile M&'. 909 if (!FieldRec->hasCopyConstructorWithConstParam()) 910 data().ImplicitCopyConstructorHasConstParam = false; 911 912 // C++11 [class.copy]p18: 913 // The implicitly-declared copy assignment oeprator for a class X will 914 // have the form 'X& X::operator=(const X&)' if [...] for all the 915 // non-static data members of X that are of a class type M (or array 916 // thereof), each such class type has a copy assignment operator whose 917 // parameter is of type 'const M&', 'const volatile M&' or 'M'. 918 if (!FieldRec->hasCopyAssignmentWithConstParam()) 919 data().ImplicitCopyAssignmentHasConstParam = false; 920 921 if (FieldRec->hasUninitializedReferenceMember() && 922 !Field->hasInClassInitializer()) 923 data().HasUninitializedReferenceMember = true; 924 925 // C++11 [class.union]p8, DR1460: 926 // a non-static data member of an anonymous union that is a member of 927 // X is also a variant member of X. 928 if (FieldRec->hasVariantMembers() && 929 Field->isAnonymousStructOrUnion()) 930 data().HasVariantMembers = true; 931 } 932 } else { 933 // Base element type of field is a non-class type. 934 if (!T->isLiteralType(Context) || 935 (!Field->hasInClassInitializer() && !isUnion())) 936 data().DefaultedDefaultConstructorIsConstexpr = false; 937 938 // C++11 [class.copy]p23: 939 // A defaulted copy/move assignment operator for a class X is defined 940 // as deleted if X has: 941 // -- a non-static data member of const non-class type (or array 942 // thereof) 943 if (T.isConstQualified()) 944 data().DefaultedMoveAssignmentIsDeleted = true; 945 } 946 947 // C++0x [class]p7: 948 // A standard-layout class is a class that: 949 // [...] 950 // -- either has no non-static data members in the most derived 951 // class and at most one base class with non-static data members, 952 // or has no base classes with non-static data members, and 953 // At this point we know that we have a non-static data member, so the last 954 // clause holds. 955 if (!data().HasNoNonEmptyBases) 956 data().IsStandardLayout = false; 957 958 // C++14 [meta.unary.prop]p4: 959 // T is a class type [...] with [...] no non-static data members other 960 // than bit-fields of length 0... 961 if (data().Empty) { 962 if (!Field->isBitField() || 963 (!Field->getBitWidth()->isTypeDependent() && 964 !Field->getBitWidth()->isValueDependent() && 965 Field->getBitWidthValue(Context) != 0)) 966 data().Empty = false; 967 } 968 } 969 970 // Handle using declarations of conversion functions. 971 if (UsingShadowDecl *Shadow = dyn_cast<UsingShadowDecl>(D)) { 972 if (Shadow->getDeclName().getNameKind() 973 == DeclarationName::CXXConversionFunctionName) { 974 ASTContext &Ctx = getASTContext(); 975 data().Conversions.get(Ctx).addDecl(Ctx, Shadow, Shadow->getAccess()); 976 } 977 } 978 979 if (UsingDecl *Using = dyn_cast<UsingDecl>(D)) { 980 if (Using->getDeclName().getNameKind() == 981 DeclarationName::CXXConstructorName) 982 data().HasInheritedConstructor = true; 983 984 if (Using->getDeclName().getCXXOverloadedOperator() == OO_Equal) 985 data().HasInheritedAssignment = true; 986 } 987} 988 989void CXXRecordDecl::finishedDefaultedOrDeletedMember(CXXMethodDecl *D) { 990 assert(!D->isImplicit() && !D->isUserProvided()); 991 992 // The kind of special member this declaration is, if any. 993 unsigned SMKind = 0; 994 995 if (CXXConstructorDecl *Constructor = dyn_cast<CXXConstructorDecl>(D)) { 996 if (Constructor->isDefaultConstructor()) { 997 SMKind |= SMF_DefaultConstructor; 998 if (Constructor->isConstexpr()) 999 data().HasConstexprDefaultConstructor = true; 1000 } 1001 if (Constructor->isCopyConstructor()) 1002 SMKind |= SMF_CopyConstructor; 1003 else if (Constructor->isMoveConstructor()) 1004 SMKind |= SMF_MoveConstructor; 1005 else if (Constructor->isConstexpr()) 1006 // We may now know that the constructor is constexpr. 1007 data().HasConstexprNonCopyMoveConstructor = true; 1008 } else if (isa<CXXDestructorDecl>(D)) { 1009 SMKind |= SMF_Destructor; 1010 if (!D->isTrivial() || D->getAccess() != AS_public || D->isDeleted()) 1011 data().HasIrrelevantDestructor = false; 1012 } else if (D->isCopyAssignmentOperator()) 1013 SMKind |= SMF_CopyAssignment; 1014 else if (D->isMoveAssignmentOperator()) 1015 SMKind |= SMF_MoveAssignment; 1016 1017 // Update which trivial / non-trivial special members we have. 1018 // addedMember will have skipped this step for this member. 1019 if (D->isTrivial()) 1020 data().HasTrivialSpecialMembers |= SMKind; 1021 else 1022 data().DeclaredNonTrivialSpecialMembers |= SMKind; 1023} 1024 1025bool CXXRecordDecl::isCLike() const { 1026 if (getTagKind() == TTK_Class || getTagKind() == TTK_Interface || 1027 !TemplateOrInstantiation.isNull()) 1028 return false; 1029 if (!hasDefinition()) 1030 return true; 1031 1032 return isPOD() && data().HasOnlyCMembers; 1033} 1034 1035bool CXXRecordDecl::isGenericLambda() const { 1036 if (!isLambda()) return false; 1037 return getLambdaData().IsGenericLambda; 1038} 1039 1040CXXMethodDecl* CXXRecordDecl::getLambdaCallOperator() const { 1041 if (!isLambda()) return nullptr; 1042 DeclarationName Name = 1043 getASTContext().DeclarationNames.getCXXOperatorName(OO_Call); 1044 DeclContext::lookup_result Calls = lookup(Name); 1045 1046 assert(!Calls.empty() && "Missing lambda call operator!"); 1047 assert(Calls.size() == 1 && "More than one lambda call operator!"); 1048 1049 NamedDecl *CallOp = Calls.front(); 1050 if (FunctionTemplateDecl *CallOpTmpl = 1051 dyn_cast<FunctionTemplateDecl>(CallOp)) 1052 return cast<CXXMethodDecl>(CallOpTmpl->getTemplatedDecl()); 1053 1054 return cast<CXXMethodDecl>(CallOp); 1055} 1056 1057CXXMethodDecl* CXXRecordDecl::getLambdaStaticInvoker() const { 1058 if (!isLambda()) return nullptr; 1059 DeclarationName Name = 1060 &getASTContext().Idents.get(getLambdaStaticInvokerName()); 1061 DeclContext::lookup_result Invoker = lookup(Name); 1062 if (Invoker.empty()) return nullptr; 1063 assert(Invoker.size() == 1 && "More than one static invoker operator!"); 1064 NamedDecl *InvokerFun = Invoker.front(); 1065 if (FunctionTemplateDecl *InvokerTemplate = 1066 dyn_cast<FunctionTemplateDecl>(InvokerFun)) 1067 return cast<CXXMethodDecl>(InvokerTemplate->getTemplatedDecl()); 1068 1069 return cast<CXXMethodDecl>(InvokerFun); 1070} 1071 1072void CXXRecordDecl::getCaptureFields( 1073 llvm::DenseMap<const VarDecl *, FieldDecl *> &Captures, 1074 FieldDecl *&ThisCapture) const { 1075 Captures.clear(); 1076 ThisCapture = nullptr; 1077 1078 LambdaDefinitionData &Lambda = getLambdaData(); 1079 RecordDecl::field_iterator Field = field_begin(); 1080 for (const LambdaCapture *C = Lambda.Captures, *CEnd = C + Lambda.NumCaptures; 1081 C != CEnd; ++C, ++Field) { 1082 if (C->capturesThis()) 1083 ThisCapture = *Field; 1084 else if (C->capturesVariable()) 1085 Captures[C->getCapturedVar()] = *Field; 1086 } 1087 assert(Field == field_end()); 1088} 1089 1090TemplateParameterList * 1091CXXRecordDecl::getGenericLambdaTemplateParameterList() const { 1092 if (!isLambda()) return nullptr; 1093 CXXMethodDecl *CallOp = getLambdaCallOperator(); 1094 if (FunctionTemplateDecl *Tmpl = CallOp->getDescribedFunctionTemplate()) 1095 return Tmpl->getTemplateParameters(); 1096 return nullptr; 1097} 1098 1099static CanQualType GetConversionType(ASTContext &Context, NamedDecl *Conv) { 1100 QualType T = 1101 cast<CXXConversionDecl>(Conv->getUnderlyingDecl()->getAsFunction()) 1102 ->getConversionType(); 1103 return Context.getCanonicalType(T); 1104} 1105 1106/// Collect the visible conversions of a base class. 1107/// 1108/// \param Record a base class of the class we're considering 1109/// \param InVirtual whether this base class is a virtual base (or a base 1110/// of a virtual base) 1111/// \param Access the access along the inheritance path to this base 1112/// \param ParentHiddenTypes the conversions provided by the inheritors 1113/// of this base 1114/// \param Output the set to which to add conversions from non-virtual bases 1115/// \param VOutput the set to which to add conversions from virtual bases 1116/// \param HiddenVBaseCs the set of conversions which were hidden in a 1117/// virtual base along some inheritance path 1118static void CollectVisibleConversions(ASTContext &Context, 1119 CXXRecordDecl *Record, 1120 bool InVirtual, 1121 AccessSpecifier Access, 1122 const llvm::SmallPtrSet<CanQualType, 8> &ParentHiddenTypes, 1123 ASTUnresolvedSet &Output, 1124 UnresolvedSetImpl &VOutput, 1125 llvm::SmallPtrSet<NamedDecl*, 8> &HiddenVBaseCs) { 1126 // The set of types which have conversions in this class or its 1127 // subclasses. As an optimization, we don't copy the derived set 1128 // unless it might change. 1129 const llvm::SmallPtrSet<CanQualType, 8> *HiddenTypes = &ParentHiddenTypes; 1130 llvm::SmallPtrSet<CanQualType, 8> HiddenTypesBuffer; 1131 1132 // Collect the direct conversions and figure out which conversions 1133 // will be hidden in the subclasses. 1134 CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin(); 1135 CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end(); 1136 if (ConvI != ConvE) { 1137 HiddenTypesBuffer = ParentHiddenTypes; 1138 HiddenTypes = &HiddenTypesBuffer; 1139 1140 for (CXXRecordDecl::conversion_iterator I = ConvI; I != ConvE; ++I) { 1141 CanQualType ConvType(GetConversionType(Context, I.getDecl())); 1142 bool Hidden = ParentHiddenTypes.count(ConvType); 1143 if (!Hidden) 1144 HiddenTypesBuffer.insert(ConvType); 1145 1146 // If this conversion is hidden and we're in a virtual base, 1147 // remember that it's hidden along some inheritance path. 1148 if (Hidden && InVirtual) 1149 HiddenVBaseCs.insert(cast<NamedDecl>(I.getDecl()->getCanonicalDecl())); 1150 1151 // If this conversion isn't hidden, add it to the appropriate output. 1152 else if (!Hidden) { 1153 AccessSpecifier IAccess 1154 = CXXRecordDecl::MergeAccess(Access, I.getAccess()); 1155 1156 if (InVirtual) 1157 VOutput.addDecl(I.getDecl(), IAccess); 1158 else 1159 Output.addDecl(Context, I.getDecl(), IAccess); 1160 } 1161 } 1162 } 1163 1164 // Collect information recursively from any base classes. 1165 for (const auto &I : Record->bases()) { 1166 const RecordType *RT = I.getType()->getAs<RecordType>(); 1167 if (!RT) continue; 1168 1169 AccessSpecifier BaseAccess 1170 = CXXRecordDecl::MergeAccess(Access, I.getAccessSpecifier()); 1171 bool BaseInVirtual = InVirtual || I.isVirtual(); 1172 1173 CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl()); 1174 CollectVisibleConversions(Context, Base, BaseInVirtual, BaseAccess, 1175 *HiddenTypes, Output, VOutput, HiddenVBaseCs); 1176 } 1177} 1178 1179/// Collect the visible conversions of a class. 1180/// 1181/// This would be extremely straightforward if it weren't for virtual 1182/// bases. It might be worth special-casing that, really. 1183static void CollectVisibleConversions(ASTContext &Context, 1184 CXXRecordDecl *Record, 1185 ASTUnresolvedSet &Output) { 1186 // The collection of all conversions in virtual bases that we've 1187 // found. These will be added to the output as long as they don't 1188 // appear in the hidden-conversions set. 1189 UnresolvedSet<8> VBaseCs; 1190 1191 // The set of conversions in virtual bases that we've determined to 1192 // be hidden. 1193 llvm::SmallPtrSet<NamedDecl*, 8> HiddenVBaseCs; 1194 1195 // The set of types hidden by classes derived from this one. 1196 llvm::SmallPtrSet<CanQualType, 8> HiddenTypes; 1197 1198 // Go ahead and collect the direct conversions and add them to the 1199 // hidden-types set. 1200 CXXRecordDecl::conversion_iterator ConvI = Record->conversion_begin(); 1201 CXXRecordDecl::conversion_iterator ConvE = Record->conversion_end(); 1202 Output.append(Context, ConvI, ConvE); 1203 for (; ConvI != ConvE; ++ConvI) 1204 HiddenTypes.insert(GetConversionType(Context, ConvI.getDecl())); 1205 1206 // Recursively collect conversions from base classes. 1207 for (const auto &I : Record->bases()) { 1208 const RecordType *RT = I.getType()->getAs<RecordType>(); 1209 if (!RT) continue; 1210 1211 CollectVisibleConversions(Context, cast<CXXRecordDecl>(RT->getDecl()), 1212 I.isVirtual(), I.getAccessSpecifier(), 1213 HiddenTypes, Output, VBaseCs, HiddenVBaseCs); 1214 } 1215 1216 // Add any unhidden conversions provided by virtual bases. 1217 for (UnresolvedSetIterator I = VBaseCs.begin(), E = VBaseCs.end(); 1218 I != E; ++I) { 1219 if (!HiddenVBaseCs.count(cast<NamedDecl>(I.getDecl()->getCanonicalDecl()))) 1220 Output.addDecl(Context, I.getDecl(), I.getAccess()); 1221 } 1222} 1223 1224/// getVisibleConversionFunctions - get all conversion functions visible 1225/// in current class; including conversion function templates. 1226llvm::iterator_range<CXXRecordDecl::conversion_iterator> 1227CXXRecordDecl::getVisibleConversionFunctions() { 1228 ASTContext &Ctx = getASTContext(); 1229 1230 ASTUnresolvedSet *Set; 1231 if (bases_begin() == bases_end()) { 1232 // If root class, all conversions are visible. 1233 Set = &data().Conversions.get(Ctx); 1234 } else { 1235 Set = &data().VisibleConversions.get(Ctx); 1236 // If visible conversion list is not evaluated, evaluate it. 1237 if (!data().ComputedVisibleConversions) { 1238 CollectVisibleConversions(Ctx, this, *Set); 1239 data().ComputedVisibleConversions = true; 1240 } 1241 } 1242 return llvm::make_range(Set->begin(), Set->end()); 1243} 1244 1245void CXXRecordDecl::removeConversion(const NamedDecl *ConvDecl) { 1246 // This operation is O(N) but extremely rare. Sema only uses it to 1247 // remove UsingShadowDecls in a class that were followed by a direct 1248 // declaration, e.g.: 1249 // class A : B { 1250 // using B::operator int; 1251 // operator int(); 1252 // }; 1253 // This is uncommon by itself and even more uncommon in conjunction 1254 // with sufficiently large numbers of directly-declared conversions 1255 // that asymptotic behavior matters. 1256 1257 ASTUnresolvedSet &Convs = data().Conversions.get(getASTContext()); 1258 for (unsigned I = 0, E = Convs.size(); I != E; ++I) { 1259 if (Convs[I].getDecl() == ConvDecl) { 1260 Convs.erase(I); 1261 assert(std::find(Convs.begin(), Convs.end(), ConvDecl) == Convs.end() 1262 && "conversion was found multiple times in unresolved set"); 1263 return; 1264 } 1265 } 1266 1267 llvm_unreachable("conversion not found in set!"); 1268} 1269 1270CXXRecordDecl *CXXRecordDecl::getInstantiatedFromMemberClass() const { 1271 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) 1272 return cast<CXXRecordDecl>(MSInfo->getInstantiatedFrom()); 1273 1274 return nullptr; 1275} 1276 1277MemberSpecializationInfo *CXXRecordDecl::getMemberSpecializationInfo() const { 1278 return TemplateOrInstantiation.dyn_cast<MemberSpecializationInfo *>(); 1279} 1280 1281void 1282CXXRecordDecl::setInstantiationOfMemberClass(CXXRecordDecl *RD, 1283 TemplateSpecializationKind TSK) { 1284 assert(TemplateOrInstantiation.isNull() && 1285 "Previous template or instantiation?"); 1286 assert(!isa<ClassTemplatePartialSpecializationDecl>(this)); 1287 TemplateOrInstantiation 1288 = new (getASTContext()) MemberSpecializationInfo(RD, TSK); 1289} 1290 1291ClassTemplateDecl *CXXRecordDecl::getDescribedClassTemplate() const { 1292 return TemplateOrInstantiation.dyn_cast<ClassTemplateDecl *>(); 1293} 1294 1295void CXXRecordDecl::setDescribedClassTemplate(ClassTemplateDecl *Template) { 1296 TemplateOrInstantiation = Template; 1297} 1298 1299TemplateSpecializationKind CXXRecordDecl::getTemplateSpecializationKind() const{ 1300 if (const ClassTemplateSpecializationDecl *Spec 1301 = dyn_cast<ClassTemplateSpecializationDecl>(this)) 1302 return Spec->getSpecializationKind(); 1303 1304 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) 1305 return MSInfo->getTemplateSpecializationKind(); 1306 1307 return TSK_Undeclared; 1308} 1309 1310void 1311CXXRecordDecl::setTemplateSpecializationKind(TemplateSpecializationKind TSK) { 1312 if (ClassTemplateSpecializationDecl *Spec 1313 = dyn_cast<ClassTemplateSpecializationDecl>(this)) { 1314 Spec->setSpecializationKind(TSK); 1315 return; 1316 } 1317 1318 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) { 1319 MSInfo->setTemplateSpecializationKind(TSK); 1320 return; 1321 } 1322 1323 llvm_unreachable("Not a class template or member class specialization"); 1324} 1325 1326const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const { 1327 // If it's a class template specialization, find the template or partial 1328 // specialization from which it was instantiated. 1329 if (auto *TD = dyn_cast<ClassTemplateSpecializationDecl>(this)) { 1330 auto From = TD->getInstantiatedFrom(); 1331 if (auto *CTD = From.dyn_cast<ClassTemplateDecl *>()) { 1332 while (auto *NewCTD = CTD->getInstantiatedFromMemberTemplate()) { 1333 if (NewCTD->isMemberSpecialization()) 1334 break; 1335 CTD = NewCTD; 1336 } 1337 return CTD->getTemplatedDecl()->getDefinition(); 1338 } 1339 if (auto *CTPSD = 1340 From.dyn_cast<ClassTemplatePartialSpecializationDecl *>()) { 1341 while (auto *NewCTPSD = CTPSD->getInstantiatedFromMember()) { 1342 if (NewCTPSD->isMemberSpecialization()) 1343 break; 1344 CTPSD = NewCTPSD; 1345 } 1346 return CTPSD->getDefinition(); 1347 } 1348 } 1349 1350 if (MemberSpecializationInfo *MSInfo = getMemberSpecializationInfo()) { 1351 if (isTemplateInstantiation(MSInfo->getTemplateSpecializationKind())) { 1352 const CXXRecordDecl *RD = this; 1353 while (auto *NewRD = RD->getInstantiatedFromMemberClass()) 1354 RD = NewRD; 1355 return RD->getDefinition(); 1356 } 1357 } 1358 1359 assert(!isTemplateInstantiation(this->getTemplateSpecializationKind()) && 1360 "couldn't find pattern for class template instantiation"); 1361 return nullptr; 1362} 1363 1364CXXDestructorDecl *CXXRecordDecl::getDestructor() const { 1365 ASTContext &Context = getASTContext(); 1366 QualType ClassType = Context.getTypeDeclType(this); 1367 1368 DeclarationName Name 1369 = Context.DeclarationNames.getCXXDestructorName( 1370 Context.getCanonicalType(ClassType)); 1371 1372 DeclContext::lookup_result R = lookup(Name); 1373 if (R.empty()) 1374 return nullptr; 1375 1376 CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(R.front()); 1377 return Dtor; 1378} 1379 1380bool CXXRecordDecl::isAnyDestructorNoReturn() const { 1381 // Destructor is noreturn. 1382 if (const CXXDestructorDecl *Destructor = getDestructor()) 1383 if (Destructor->isNoReturn()) 1384 return true; 1385 1386 // Check base classes destructor for noreturn. 1387 for (const auto &Base : bases()) 1388 if (Base.getType()->getAsCXXRecordDecl()->isAnyDestructorNoReturn()) 1389 return true; 1390 1391 // Check fields for noreturn. 1392 for (const auto *Field : fields()) 1393 if (const CXXRecordDecl *RD = 1394 Field->getType()->getBaseElementTypeUnsafe()->getAsCXXRecordDecl()) 1395 if (RD->isAnyDestructorNoReturn()) 1396 return true; 1397 1398 // All destructors are not noreturn. 1399 return false; 1400} 1401 1402void CXXRecordDecl::completeDefinition() { 1403 completeDefinition(nullptr); 1404} 1405 1406void CXXRecordDecl::completeDefinition(CXXFinalOverriderMap *FinalOverriders) { 1407 RecordDecl::completeDefinition(); 1408 1409 // If the class may be abstract (but hasn't been marked as such), check for 1410 // any pure final overriders. 1411 if (mayBeAbstract()) { 1412 CXXFinalOverriderMap MyFinalOverriders; 1413 if (!FinalOverriders) { 1414 getFinalOverriders(MyFinalOverriders); 1415 FinalOverriders = &MyFinalOverriders; 1416 } 1417 1418 bool Done = false; 1419 for (CXXFinalOverriderMap::iterator M = FinalOverriders->begin(), 1420 MEnd = FinalOverriders->end(); 1421 M != MEnd && !Done; ++M) { 1422 for (OverridingMethods::iterator SO = M->second.begin(), 1423 SOEnd = M->second.end(); 1424 SO != SOEnd && !Done; ++SO) { 1425 assert(SO->second.size() > 0 && 1426 "All virtual functions have overridding virtual functions"); 1427 1428 // C++ [class.abstract]p4: 1429 // A class is abstract if it contains or inherits at least one 1430 // pure virtual function for which the final overrider is pure 1431 // virtual. 1432 if (SO->second.front().Method->isPure()) { 1433 data().Abstract = true; 1434 Done = true; 1435 break; 1436 } 1437 } 1438 } 1439 } 1440 1441 // Set access bits correctly on the directly-declared conversions. 1442 for (conversion_iterator I = conversion_begin(), E = conversion_end(); 1443 I != E; ++I) 1444 I.setAccess((*I)->getAccess()); 1445} 1446 1447bool CXXRecordDecl::mayBeAbstract() const { 1448 if (data().Abstract || isInvalidDecl() || !data().Polymorphic || 1449 isDependentContext()) 1450 return false; 1451 1452 for (const auto &B : bases()) { 1453 CXXRecordDecl *BaseDecl 1454 = cast<CXXRecordDecl>(B.getType()->getAs<RecordType>()->getDecl()); 1455 if (BaseDecl->isAbstract()) 1456 return true; 1457 } 1458 1459 return false; 1460} 1461 1462void CXXMethodDecl::anchor() { } 1463 1464bool CXXMethodDecl::isStatic() const { 1465 const CXXMethodDecl *MD = getCanonicalDecl(); 1466 1467 if (MD->getStorageClass() == SC_Static) 1468 return true; 1469 1470 OverloadedOperatorKind OOK = getDeclName().getCXXOverloadedOperator(); 1471 return isStaticOverloadedOperator(OOK); 1472} 1473 1474static bool recursivelyOverrides(const CXXMethodDecl *DerivedMD, 1475 const CXXMethodDecl *BaseMD) { 1476 for (CXXMethodDecl::method_iterator I = DerivedMD->begin_overridden_methods(), 1477 E = DerivedMD->end_overridden_methods(); I != E; ++I) { 1478 const CXXMethodDecl *MD = *I; 1479 if (MD->getCanonicalDecl() == BaseMD->getCanonicalDecl()) 1480 return true; 1481 if (recursivelyOverrides(MD, BaseMD)) 1482 return true; 1483 } 1484 return false; 1485} 1486 1487CXXMethodDecl * 1488CXXMethodDecl::getCorrespondingMethodInClass(const CXXRecordDecl *RD, 1489 bool MayBeBase) { 1490 if (this->getParent()->getCanonicalDecl() == RD->getCanonicalDecl()) 1491 return this; 1492 1493 // Lookup doesn't work for destructors, so handle them separately. 1494 if (isa<CXXDestructorDecl>(this)) { 1495 CXXMethodDecl *MD = RD->getDestructor(); 1496 if (MD) { 1497 if (recursivelyOverrides(MD, this)) 1498 return MD; 1499 if (MayBeBase && recursivelyOverrides(this, MD)) 1500 return MD; 1501 } 1502 return nullptr; 1503 } 1504 1505 for (auto *ND : RD->lookup(getDeclName())) { 1506 CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(ND); 1507 if (!MD) 1508 continue; 1509 if (recursivelyOverrides(MD, this)) 1510 return MD; 1511 if (MayBeBase && recursivelyOverrides(this, MD)) 1512 return MD; 1513 } 1514 1515 for (const auto &I : RD->bases()) { 1516 const RecordType *RT = I.getType()->getAs<RecordType>(); 1517 if (!RT) 1518 continue; 1519 const CXXRecordDecl *Base = cast<CXXRecordDecl>(RT->getDecl()); 1520 CXXMethodDecl *T = this->getCorrespondingMethodInClass(Base); 1521 if (T) 1522 return T; 1523 } 1524 1525 return nullptr; 1526} 1527 1528CXXMethodDecl * 1529CXXMethodDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1530 SourceLocation StartLoc, 1531 const DeclarationNameInfo &NameInfo, 1532 QualType T, TypeSourceInfo *TInfo, 1533 StorageClass SC, bool isInline, 1534 bool isConstexpr, SourceLocation EndLocation) { 1535 return new (C, RD) CXXMethodDecl(CXXMethod, C, RD, StartLoc, NameInfo, 1536 T, TInfo, SC, isInline, isConstexpr, 1537 EndLocation); 1538} 1539 1540CXXMethodDecl *CXXMethodDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1541 return new (C, ID) CXXMethodDecl(CXXMethod, C, nullptr, SourceLocation(), 1542 DeclarationNameInfo(), QualType(), nullptr, 1543 SC_None, false, false, SourceLocation()); 1544} 1545 1546bool CXXMethodDecl::isUsualDeallocationFunction() const { 1547 if (getOverloadedOperator() != OO_Delete && 1548 getOverloadedOperator() != OO_Array_Delete) 1549 return false; 1550 1551 // C++ [basic.stc.dynamic.deallocation]p2: 1552 // A template instance is never a usual deallocation function, 1553 // regardless of its signature. 1554 if (getPrimaryTemplate()) 1555 return false; 1556 1557 // C++ [basic.stc.dynamic.deallocation]p2: 1558 // If a class T has a member deallocation function named operator delete 1559 // with exactly one parameter, then that function is a usual (non-placement) 1560 // deallocation function. [...] 1561 if (getNumParams() == 1) 1562 return true; 1563 1564 // C++ [basic.stc.dynamic.deallocation]p2: 1565 // [...] If class T does not declare such an operator delete but does 1566 // declare a member deallocation function named operator delete with 1567 // exactly two parameters, the second of which has type std::size_t (18.1), 1568 // then this function is a usual deallocation function. 1569 ASTContext &Context = getASTContext(); 1570 if (getNumParams() != 2 || 1571 !Context.hasSameUnqualifiedType(getParamDecl(1)->getType(), 1572 Context.getSizeType())) 1573 return false; 1574 1575 // This function is a usual deallocation function if there are no 1576 // single-parameter deallocation functions of the same kind. 1577 DeclContext::lookup_result R = getDeclContext()->lookup(getDeclName()); 1578 for (DeclContext::lookup_result::iterator I = R.begin(), E = R.end(); 1579 I != E; ++I) { 1580 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(*I)) 1581 if (FD->getNumParams() == 1) 1582 return false; 1583 } 1584 1585 return true; 1586} 1587 1588bool CXXMethodDecl::isCopyAssignmentOperator() const { 1589 // C++0x [class.copy]p17: 1590 // A user-declared copy assignment operator X::operator= is a non-static 1591 // non-template member function of class X with exactly one parameter of 1592 // type X, X&, const X&, volatile X& or const volatile X&. 1593 if (/*operator=*/getOverloadedOperator() != OO_Equal || 1594 /*non-static*/ isStatic() || 1595 /*non-template*/getPrimaryTemplate() || getDescribedFunctionTemplate() || 1596 getNumParams() != 1) 1597 return false; 1598 1599 QualType ParamType = getParamDecl(0)->getType(); 1600 if (const LValueReferenceType *Ref = ParamType->getAs<LValueReferenceType>()) 1601 ParamType = Ref->getPointeeType(); 1602 1603 ASTContext &Context = getASTContext(); 1604 QualType ClassType 1605 = Context.getCanonicalType(Context.getTypeDeclType(getParent())); 1606 return Context.hasSameUnqualifiedType(ClassType, ParamType); 1607} 1608 1609bool CXXMethodDecl::isMoveAssignmentOperator() const { 1610 // C++0x [class.copy]p19: 1611 // A user-declared move assignment operator X::operator= is a non-static 1612 // non-template member function of class X with exactly one parameter of type 1613 // X&&, const X&&, volatile X&&, or const volatile X&&. 1614 if (getOverloadedOperator() != OO_Equal || isStatic() || 1615 getPrimaryTemplate() || getDescribedFunctionTemplate() || 1616 getNumParams() != 1) 1617 return false; 1618 1619 QualType ParamType = getParamDecl(0)->getType(); 1620 if (!isa<RValueReferenceType>(ParamType)) 1621 return false; 1622 ParamType = ParamType->getPointeeType(); 1623 1624 ASTContext &Context = getASTContext(); 1625 QualType ClassType 1626 = Context.getCanonicalType(Context.getTypeDeclType(getParent())); 1627 return Context.hasSameUnqualifiedType(ClassType, ParamType); 1628} 1629 1630void CXXMethodDecl::addOverriddenMethod(const CXXMethodDecl *MD) { 1631 assert(MD->isCanonicalDecl() && "Method is not canonical!"); 1632 assert(!MD->getParent()->isDependentContext() && 1633 "Can't add an overridden method to a class template!"); 1634 assert(MD->isVirtual() && "Method is not virtual!"); 1635 1636 getASTContext().addOverriddenMethod(this, MD); 1637} 1638 1639CXXMethodDecl::method_iterator CXXMethodDecl::begin_overridden_methods() const { 1640 if (isa<CXXConstructorDecl>(this)) return nullptr; 1641 return getASTContext().overridden_methods_begin(this); 1642} 1643 1644CXXMethodDecl::method_iterator CXXMethodDecl::end_overridden_methods() const { 1645 if (isa<CXXConstructorDecl>(this)) return nullptr; 1646 return getASTContext().overridden_methods_end(this); 1647} 1648 1649unsigned CXXMethodDecl::size_overridden_methods() const { 1650 if (isa<CXXConstructorDecl>(this)) return 0; 1651 return getASTContext().overridden_methods_size(this); 1652} 1653 1654CXXMethodDecl::overridden_method_range 1655CXXMethodDecl::overridden_methods() const { 1656 if (isa<CXXConstructorDecl>(this)) 1657 return overridden_method_range(nullptr, nullptr); 1658 return getASTContext().overridden_methods(this); 1659} 1660 1661QualType CXXMethodDecl::getThisType(ASTContext &C) const { 1662 // C++ 9.3.2p1: The type of this in a member function of a class X is X*. 1663 // If the member function is declared const, the type of this is const X*, 1664 // if the member function is declared volatile, the type of this is 1665 // volatile X*, and if the member function is declared const volatile, 1666 // the type of this is const volatile X*. 1667 1668 assert(isInstance() && "No 'this' for static methods!"); 1669 1670 QualType ClassTy = C.getTypeDeclType(getParent()); 1671 ClassTy = C.getQualifiedType(ClassTy, 1672 Qualifiers::fromCVRUMask(getTypeQualifiers())); 1673 return C.getPointerType(ClassTy); 1674} 1675 1676bool CXXMethodDecl::hasInlineBody() const { 1677 // If this function is a template instantiation, look at the template from 1678 // which it was instantiated. 1679 const FunctionDecl *CheckFn = getTemplateInstantiationPattern(); 1680 if (!CheckFn) 1681 CheckFn = this; 1682 1683 const FunctionDecl *fn; 1684 return CheckFn->hasBody(fn) && !fn->isOutOfLine(); 1685} 1686 1687bool CXXMethodDecl::isLambdaStaticInvoker() const { 1688 const CXXRecordDecl *P = getParent(); 1689 if (P->isLambda()) { 1690 if (const CXXMethodDecl *StaticInvoker = P->getLambdaStaticInvoker()) { 1691 if (StaticInvoker == this) return true; 1692 if (P->isGenericLambda() && this->isFunctionTemplateSpecialization()) 1693 return StaticInvoker == this->getPrimaryTemplate()->getTemplatedDecl(); 1694 } 1695 } 1696 return false; 1697} 1698 1699CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1700 TypeSourceInfo *TInfo, bool IsVirtual, 1701 SourceLocation L, Expr *Init, 1702 SourceLocation R, 1703 SourceLocation EllipsisLoc) 1704 : Initializee(TInfo), MemberOrEllipsisLocation(EllipsisLoc), Init(Init), 1705 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(IsVirtual), 1706 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1707{ 1708} 1709 1710CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1711 FieldDecl *Member, 1712 SourceLocation MemberLoc, 1713 SourceLocation L, Expr *Init, 1714 SourceLocation R) 1715 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 1716 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 1717 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1718{ 1719} 1720 1721CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1722 IndirectFieldDecl *Member, 1723 SourceLocation MemberLoc, 1724 SourceLocation L, Expr *Init, 1725 SourceLocation R) 1726 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 1727 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 1728 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1729{ 1730} 1731 1732CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1733 TypeSourceInfo *TInfo, 1734 SourceLocation L, Expr *Init, 1735 SourceLocation R) 1736 : Initializee(TInfo), MemberOrEllipsisLocation(), Init(Init), 1737 LParenLoc(L), RParenLoc(R), IsDelegating(true), IsVirtual(false), 1738 IsWritten(false), SourceOrderOrNumArrayIndices(0) 1739{ 1740} 1741 1742CXXCtorInitializer::CXXCtorInitializer(ASTContext &Context, 1743 FieldDecl *Member, 1744 SourceLocation MemberLoc, 1745 SourceLocation L, Expr *Init, 1746 SourceLocation R, 1747 VarDecl **Indices, 1748 unsigned NumIndices) 1749 : Initializee(Member), MemberOrEllipsisLocation(MemberLoc), Init(Init), 1750 LParenLoc(L), RParenLoc(R), IsDelegating(false), IsVirtual(false), 1751 IsWritten(false), SourceOrderOrNumArrayIndices(NumIndices) 1752{ 1753 std::uninitialized_copy(Indices, Indices + NumIndices, 1754 getTrailingObjects<VarDecl *>()); 1755} 1756 1757CXXCtorInitializer *CXXCtorInitializer::Create(ASTContext &Context, 1758 FieldDecl *Member, 1759 SourceLocation MemberLoc, 1760 SourceLocation L, Expr *Init, 1761 SourceLocation R, 1762 VarDecl **Indices, 1763 unsigned NumIndices) { 1764 void *Mem = Context.Allocate(totalSizeToAlloc<VarDecl *>(NumIndices), 1765 llvm::alignOf<CXXCtorInitializer>()); 1766 return new (Mem) CXXCtorInitializer(Context, Member, MemberLoc, L, Init, R, 1767 Indices, NumIndices); 1768} 1769 1770TypeLoc CXXCtorInitializer::getBaseClassLoc() const { 1771 if (isBaseInitializer()) 1772 return Initializee.get<TypeSourceInfo*>()->getTypeLoc(); 1773 else 1774 return TypeLoc(); 1775} 1776 1777const Type *CXXCtorInitializer::getBaseClass() const { 1778 if (isBaseInitializer()) 1779 return Initializee.get<TypeSourceInfo*>()->getType().getTypePtr(); 1780 else 1781 return nullptr; 1782} 1783 1784SourceLocation CXXCtorInitializer::getSourceLocation() const { 1785 if (isInClassMemberInitializer()) 1786 return getAnyMember()->getLocation(); 1787 1788 if (isAnyMemberInitializer()) 1789 return getMemberLocation(); 1790 1791 if (TypeSourceInfo *TSInfo = Initializee.get<TypeSourceInfo*>()) 1792 return TSInfo->getTypeLoc().getLocalSourceRange().getBegin(); 1793 1794 return SourceLocation(); 1795} 1796 1797SourceRange CXXCtorInitializer::getSourceRange() const { 1798 if (isInClassMemberInitializer()) { 1799 FieldDecl *D = getAnyMember(); 1800 if (Expr *I = D->getInClassInitializer()) 1801 return I->getSourceRange(); 1802 return SourceRange(); 1803 } 1804 1805 return SourceRange(getSourceLocation(), getRParenLoc()); 1806} 1807 1808void CXXConstructorDecl::anchor() { } 1809 1810CXXConstructorDecl *CXXConstructorDecl::CreateDeserialized(ASTContext &C, 1811 unsigned ID, 1812 bool Inherited) { 1813 unsigned Extra = additionalSizeToAlloc<InheritedConstructor>(Inherited); 1814 auto *Result = new (C, ID, Extra) CXXConstructorDecl( 1815 C, nullptr, SourceLocation(), DeclarationNameInfo(), QualType(), nullptr, 1816 false, false, false, false, InheritedConstructor()); 1817 Result->IsInheritingConstructor = Inherited; 1818 return Result; 1819} 1820 1821CXXConstructorDecl * 1822CXXConstructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1823 SourceLocation StartLoc, 1824 const DeclarationNameInfo &NameInfo, 1825 QualType T, TypeSourceInfo *TInfo, 1826 bool isExplicit, bool isInline, 1827 bool isImplicitlyDeclared, bool isConstexpr, 1828 InheritedConstructor Inherited) { 1829 assert(NameInfo.getName().getNameKind() 1830 == DeclarationName::CXXConstructorName && 1831 "Name must refer to a constructor"); 1832 unsigned Extra = 1833 additionalSizeToAlloc<InheritedConstructor>(Inherited ? 1 : 0); 1834 return new (C, RD, Extra) CXXConstructorDecl( 1835 C, RD, StartLoc, NameInfo, T, TInfo, isExplicit, isInline, 1836 isImplicitlyDeclared, isConstexpr, Inherited); 1837} 1838 1839CXXConstructorDecl::init_const_iterator CXXConstructorDecl::init_begin() const { 1840 return CtorInitializers.get(getASTContext().getExternalSource()); 1841} 1842 1843CXXConstructorDecl *CXXConstructorDecl::getTargetConstructor() const { 1844 assert(isDelegatingConstructor() && "Not a delegating constructor!"); 1845 Expr *E = (*init_begin())->getInit()->IgnoreImplicit(); 1846 if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(E)) 1847 return Construct->getConstructor(); 1848 1849 return nullptr; 1850} 1851 1852bool CXXConstructorDecl::isDefaultConstructor() const { 1853 // C++ [class.ctor]p5: 1854 // A default constructor for a class X is a constructor of class 1855 // X that can be called without an argument. 1856 return (getNumParams() == 0) || 1857 (getNumParams() > 0 && getParamDecl(0)->hasDefaultArg()); 1858} 1859 1860bool 1861CXXConstructorDecl::isCopyConstructor(unsigned &TypeQuals) const { 1862 return isCopyOrMoveConstructor(TypeQuals) && 1863 getParamDecl(0)->getType()->isLValueReferenceType(); 1864} 1865 1866bool CXXConstructorDecl::isMoveConstructor(unsigned &TypeQuals) const { 1867 return isCopyOrMoveConstructor(TypeQuals) && 1868 getParamDecl(0)->getType()->isRValueReferenceType(); 1869} 1870 1871/// \brief Determine whether this is a copy or move constructor. 1872bool CXXConstructorDecl::isCopyOrMoveConstructor(unsigned &TypeQuals) const { 1873 // C++ [class.copy]p2: 1874 // A non-template constructor for class X is a copy constructor 1875 // if its first parameter is of type X&, const X&, volatile X& or 1876 // const volatile X&, and either there are no other parameters 1877 // or else all other parameters have default arguments (8.3.6). 1878 // C++0x [class.copy]p3: 1879 // A non-template constructor for class X is a move constructor if its 1880 // first parameter is of type X&&, const X&&, volatile X&&, or 1881 // const volatile X&&, and either there are no other parameters or else 1882 // all other parameters have default arguments. 1883 if ((getNumParams() < 1) || 1884 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) || 1885 (getPrimaryTemplate() != nullptr) || 1886 (getDescribedFunctionTemplate() != nullptr)) 1887 return false; 1888 1889 const ParmVarDecl *Param = getParamDecl(0); 1890 1891 // Do we have a reference type? 1892 const ReferenceType *ParamRefType = Param->getType()->getAs<ReferenceType>(); 1893 if (!ParamRefType) 1894 return false; 1895 1896 // Is it a reference to our class type? 1897 ASTContext &Context = getASTContext(); 1898 1899 CanQualType PointeeType 1900 = Context.getCanonicalType(ParamRefType->getPointeeType()); 1901 CanQualType ClassTy 1902 = Context.getCanonicalType(Context.getTagDeclType(getParent())); 1903 if (PointeeType.getUnqualifiedType() != ClassTy) 1904 return false; 1905 1906 // FIXME: other qualifiers? 1907 1908 // We have a copy or move constructor. 1909 TypeQuals = PointeeType.getCVRQualifiers(); 1910 return true; 1911} 1912 1913bool CXXConstructorDecl::isConvertingConstructor(bool AllowExplicit) const { 1914 // C++ [class.conv.ctor]p1: 1915 // A constructor declared without the function-specifier explicit 1916 // that can be called with a single parameter specifies a 1917 // conversion from the type of its first parameter to the type of 1918 // its class. Such a constructor is called a converting 1919 // constructor. 1920 if (isExplicit() && !AllowExplicit) 1921 return false; 1922 1923 return (getNumParams() == 0 && 1924 getType()->getAs<FunctionProtoType>()->isVariadic()) || 1925 (getNumParams() == 1) || 1926 (getNumParams() > 1 && 1927 (getParamDecl(1)->hasDefaultArg() || 1928 getParamDecl(1)->isParameterPack())); 1929} 1930 1931bool CXXConstructorDecl::isSpecializationCopyingObject() const { 1932 if ((getNumParams() < 1) || 1933 (getNumParams() > 1 && !getParamDecl(1)->hasDefaultArg()) || 1934 (getDescribedFunctionTemplate() != nullptr)) 1935 return false; 1936 1937 const ParmVarDecl *Param = getParamDecl(0); 1938 1939 ASTContext &Context = getASTContext(); 1940 CanQualType ParamType = Context.getCanonicalType(Param->getType()); 1941 1942 // Is it the same as our our class type? 1943 CanQualType ClassTy 1944 = Context.getCanonicalType(Context.getTagDeclType(getParent())); 1945 if (ParamType.getUnqualifiedType() != ClassTy) 1946 return false; 1947 1948 return true; 1949} 1950 1951void CXXDestructorDecl::anchor() { } 1952 1953CXXDestructorDecl * 1954CXXDestructorDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1955 return new (C, ID) 1956 CXXDestructorDecl(C, nullptr, SourceLocation(), DeclarationNameInfo(), 1957 QualType(), nullptr, false, false); 1958} 1959 1960CXXDestructorDecl * 1961CXXDestructorDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1962 SourceLocation StartLoc, 1963 const DeclarationNameInfo &NameInfo, 1964 QualType T, TypeSourceInfo *TInfo, 1965 bool isInline, bool isImplicitlyDeclared) { 1966 assert(NameInfo.getName().getNameKind() 1967 == DeclarationName::CXXDestructorName && 1968 "Name must refer to a destructor"); 1969 return new (C, RD) CXXDestructorDecl(C, RD, StartLoc, NameInfo, T, TInfo, 1970 isInline, isImplicitlyDeclared); 1971} 1972 1973void CXXDestructorDecl::setOperatorDelete(FunctionDecl *OD) { 1974 auto *First = cast<CXXDestructorDecl>(getFirstDecl()); 1975 if (OD && !First->OperatorDelete) { 1976 First->OperatorDelete = OD; 1977 if (auto *L = getASTMutationListener()) 1978 L->ResolvedOperatorDelete(First, OD); 1979 } 1980} 1981 1982void CXXConversionDecl::anchor() { } 1983 1984CXXConversionDecl * 1985CXXConversionDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 1986 return new (C, ID) CXXConversionDecl(C, nullptr, SourceLocation(), 1987 DeclarationNameInfo(), QualType(), 1988 nullptr, false, false, false, 1989 SourceLocation()); 1990} 1991 1992CXXConversionDecl * 1993CXXConversionDecl::Create(ASTContext &C, CXXRecordDecl *RD, 1994 SourceLocation StartLoc, 1995 const DeclarationNameInfo &NameInfo, 1996 QualType T, TypeSourceInfo *TInfo, 1997 bool isInline, bool isExplicit, 1998 bool isConstexpr, SourceLocation EndLocation) { 1999 assert(NameInfo.getName().getNameKind() 2000 == DeclarationName::CXXConversionFunctionName && 2001 "Name must refer to a conversion function"); 2002 return new (C, RD) CXXConversionDecl(C, RD, StartLoc, NameInfo, T, TInfo, 2003 isInline, isExplicit, isConstexpr, 2004 EndLocation); 2005} 2006 2007bool CXXConversionDecl::isLambdaToBlockPointerConversion() const { 2008 return isImplicit() && getParent()->isLambda() && 2009 getConversionType()->isBlockPointerType(); 2010} 2011 2012void LinkageSpecDecl::anchor() { } 2013 2014LinkageSpecDecl *LinkageSpecDecl::Create(ASTContext &C, 2015 DeclContext *DC, 2016 SourceLocation ExternLoc, 2017 SourceLocation LangLoc, 2018 LanguageIDs Lang, 2019 bool HasBraces) { 2020 return new (C, DC) LinkageSpecDecl(DC, ExternLoc, LangLoc, Lang, HasBraces); 2021} 2022 2023LinkageSpecDecl *LinkageSpecDecl::CreateDeserialized(ASTContext &C, 2024 unsigned ID) { 2025 return new (C, ID) LinkageSpecDecl(nullptr, SourceLocation(), 2026 SourceLocation(), lang_c, false); 2027} 2028 2029void UsingDirectiveDecl::anchor() { } 2030 2031UsingDirectiveDecl *UsingDirectiveDecl::Create(ASTContext &C, DeclContext *DC, 2032 SourceLocation L, 2033 SourceLocation NamespaceLoc, 2034 NestedNameSpecifierLoc QualifierLoc, 2035 SourceLocation IdentLoc, 2036 NamedDecl *Used, 2037 DeclContext *CommonAncestor) { 2038 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Used)) 2039 Used = NS->getOriginalNamespace(); 2040 return new (C, DC) UsingDirectiveDecl(DC, L, NamespaceLoc, QualifierLoc, 2041 IdentLoc, Used, CommonAncestor); 2042} 2043 2044UsingDirectiveDecl *UsingDirectiveDecl::CreateDeserialized(ASTContext &C, 2045 unsigned ID) { 2046 return new (C, ID) UsingDirectiveDecl(nullptr, SourceLocation(), 2047 SourceLocation(), 2048 NestedNameSpecifierLoc(), 2049 SourceLocation(), nullptr, nullptr); 2050} 2051 2052NamespaceDecl *UsingDirectiveDecl::getNominatedNamespace() { 2053 if (NamespaceAliasDecl *NA = 2054 dyn_cast_or_null<NamespaceAliasDecl>(NominatedNamespace)) 2055 return NA->getNamespace(); 2056 return cast_or_null<NamespaceDecl>(NominatedNamespace); 2057} 2058 2059NamespaceDecl::NamespaceDecl(ASTContext &C, DeclContext *DC, bool Inline, 2060 SourceLocation StartLoc, SourceLocation IdLoc, 2061 IdentifierInfo *Id, NamespaceDecl *PrevDecl) 2062 : NamedDecl(Namespace, DC, IdLoc, Id), DeclContext(Namespace), 2063 redeclarable_base(C), LocStart(StartLoc), RBraceLoc(), 2064 AnonOrFirstNamespaceAndInline(nullptr, Inline) { 2065 setPreviousDecl(PrevDecl); 2066 2067 if (PrevDecl) 2068 AnonOrFirstNamespaceAndInline.setPointer(PrevDecl->getOriginalNamespace()); 2069} 2070 2071NamespaceDecl *NamespaceDecl::Create(ASTContext &C, DeclContext *DC, 2072 bool Inline, SourceLocation StartLoc, 2073 SourceLocation IdLoc, IdentifierInfo *Id, 2074 NamespaceDecl *PrevDecl) { 2075 return new (C, DC) NamespaceDecl(C, DC, Inline, StartLoc, IdLoc, Id, 2076 PrevDecl); 2077} 2078 2079NamespaceDecl *NamespaceDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2080 return new (C, ID) NamespaceDecl(C, nullptr, false, SourceLocation(), 2081 SourceLocation(), nullptr, nullptr); 2082} 2083 2084NamespaceDecl *NamespaceDecl::getOriginalNamespace() { 2085 if (isFirstDecl()) 2086 return this; 2087 2088 return AnonOrFirstNamespaceAndInline.getPointer(); 2089} 2090 2091const NamespaceDecl *NamespaceDecl::getOriginalNamespace() const { 2092 if (isFirstDecl()) 2093 return this; 2094 2095 return AnonOrFirstNamespaceAndInline.getPointer(); 2096} 2097 2098bool NamespaceDecl::isOriginalNamespace() const { return isFirstDecl(); } 2099 2100NamespaceDecl *NamespaceDecl::getNextRedeclarationImpl() { 2101 return getNextRedeclaration(); 2102} 2103NamespaceDecl *NamespaceDecl::getPreviousDeclImpl() { 2104 return getPreviousDecl(); 2105} 2106NamespaceDecl *NamespaceDecl::getMostRecentDeclImpl() { 2107 return getMostRecentDecl(); 2108} 2109 2110void NamespaceAliasDecl::anchor() { } 2111 2112NamespaceAliasDecl *NamespaceAliasDecl::getNextRedeclarationImpl() { 2113 return getNextRedeclaration(); 2114} 2115NamespaceAliasDecl *NamespaceAliasDecl::getPreviousDeclImpl() { 2116 return getPreviousDecl(); 2117} 2118NamespaceAliasDecl *NamespaceAliasDecl::getMostRecentDeclImpl() { 2119 return getMostRecentDecl(); 2120} 2121 2122NamespaceAliasDecl *NamespaceAliasDecl::Create(ASTContext &C, DeclContext *DC, 2123 SourceLocation UsingLoc, 2124 SourceLocation AliasLoc, 2125 IdentifierInfo *Alias, 2126 NestedNameSpecifierLoc QualifierLoc, 2127 SourceLocation IdentLoc, 2128 NamedDecl *Namespace) { 2129 // FIXME: Preserve the aliased namespace as written. 2130 if (NamespaceDecl *NS = dyn_cast_or_null<NamespaceDecl>(Namespace)) 2131 Namespace = NS->getOriginalNamespace(); 2132 return new (C, DC) NamespaceAliasDecl(C, DC, UsingLoc, AliasLoc, Alias, 2133 QualifierLoc, IdentLoc, Namespace); 2134} 2135 2136NamespaceAliasDecl * 2137NamespaceAliasDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2138 return new (C, ID) NamespaceAliasDecl(C, nullptr, SourceLocation(), 2139 SourceLocation(), nullptr, 2140 NestedNameSpecifierLoc(), 2141 SourceLocation(), nullptr); 2142} 2143 2144void UsingShadowDecl::anchor() { } 2145 2146UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, DeclContext *DC, 2147 SourceLocation Loc, UsingDecl *Using, 2148 NamedDecl *Target) 2149 : NamedDecl(K, DC, Loc, Using ? Using->getDeclName() : DeclarationName()), 2150 redeclarable_base(C), Underlying(Target), 2151 UsingOrNextShadow(cast<NamedDecl>(Using)) { 2152 if (Target) 2153 IdentifierNamespace = Target->getIdentifierNamespace(); 2154 setImplicit(); 2155} 2156 2157UsingShadowDecl::UsingShadowDecl(Kind K, ASTContext &C, EmptyShell Empty) 2158 : NamedDecl(K, nullptr, SourceLocation(), DeclarationName()), 2159 redeclarable_base(C), Underlying(), UsingOrNextShadow() {} 2160 2161UsingShadowDecl * 2162UsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2163 return new (C, ID) UsingShadowDecl(UsingShadow, C, EmptyShell()); 2164} 2165 2166UsingDecl *UsingShadowDecl::getUsingDecl() const { 2167 const UsingShadowDecl *Shadow = this; 2168 while (const UsingShadowDecl *NextShadow = 2169 dyn_cast<UsingShadowDecl>(Shadow->UsingOrNextShadow)) 2170 Shadow = NextShadow; 2171 return cast<UsingDecl>(Shadow->UsingOrNextShadow); 2172} 2173 2174void ConstructorUsingShadowDecl::anchor() { } 2175 2176ConstructorUsingShadowDecl * 2177ConstructorUsingShadowDecl::Create(ASTContext &C, DeclContext *DC, 2178 SourceLocation Loc, UsingDecl *Using, 2179 NamedDecl *Target, bool IsVirtual) { 2180 return new (C, DC) ConstructorUsingShadowDecl(C, DC, Loc, Using, Target, 2181 IsVirtual); 2182} 2183 2184ConstructorUsingShadowDecl * 2185ConstructorUsingShadowDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2186 return new (C, ID) ConstructorUsingShadowDecl(C, EmptyShell()); 2187} 2188 2189CXXRecordDecl *ConstructorUsingShadowDecl::getNominatedBaseClass() const { 2190 return getUsingDecl()->getQualifier()->getAsRecordDecl(); 2191} 2192 2193void UsingDecl::anchor() { } 2194 2195void UsingDecl::addShadowDecl(UsingShadowDecl *S) { 2196 assert(std::find(shadow_begin(), shadow_end(), S) == shadow_end() && 2197 "declaration already in set"); 2198 assert(S->getUsingDecl() == this); 2199 2200 if (FirstUsingShadow.getPointer()) 2201 S->UsingOrNextShadow = FirstUsingShadow.getPointer(); 2202 FirstUsingShadow.setPointer(S); 2203} 2204 2205void UsingDecl::removeShadowDecl(UsingShadowDecl *S) { 2206 assert(std::find(shadow_begin(), shadow_end(), S) != shadow_end() && 2207 "declaration not in set"); 2208 assert(S->getUsingDecl() == this); 2209 2210 // Remove S from the shadow decl chain. This is O(n) but hopefully rare. 2211 2212 if (FirstUsingShadow.getPointer() == S) { 2213 FirstUsingShadow.setPointer( 2214 dyn_cast<UsingShadowDecl>(S->UsingOrNextShadow)); 2215 S->UsingOrNextShadow = this; 2216 return; 2217 } 2218 2219 UsingShadowDecl *Prev = FirstUsingShadow.getPointer(); 2220 while (Prev->UsingOrNextShadow != S) 2221 Prev = cast<UsingShadowDecl>(Prev->UsingOrNextShadow); 2222 Prev->UsingOrNextShadow = S->UsingOrNextShadow; 2223 S->UsingOrNextShadow = this; 2224} 2225 2226UsingDecl *UsingDecl::Create(ASTContext &C, DeclContext *DC, SourceLocation UL, 2227 NestedNameSpecifierLoc QualifierLoc, 2228 const DeclarationNameInfo &NameInfo, 2229 bool HasTypename) { 2230 return new (C, DC) UsingDecl(DC, UL, QualifierLoc, NameInfo, HasTypename); 2231} 2232 2233UsingDecl *UsingDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2234 return new (C, ID) UsingDecl(nullptr, SourceLocation(), 2235 NestedNameSpecifierLoc(), DeclarationNameInfo(), 2236 false); 2237} 2238 2239SourceRange UsingDecl::getSourceRange() const { 2240 SourceLocation Begin = isAccessDeclaration() 2241 ? getQualifierLoc().getBeginLoc() : UsingLocation; 2242 return SourceRange(Begin, getNameInfo().getEndLoc()); 2243} 2244 2245void UnresolvedUsingValueDecl::anchor() { } 2246 2247UnresolvedUsingValueDecl * 2248UnresolvedUsingValueDecl::Create(ASTContext &C, DeclContext *DC, 2249 SourceLocation UsingLoc, 2250 NestedNameSpecifierLoc QualifierLoc, 2251 const DeclarationNameInfo &NameInfo) { 2252 return new (C, DC) UnresolvedUsingValueDecl(DC, C.DependentTy, UsingLoc, 2253 QualifierLoc, NameInfo); 2254} 2255 2256UnresolvedUsingValueDecl * 2257UnresolvedUsingValueDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2258 return new (C, ID) UnresolvedUsingValueDecl(nullptr, QualType(), 2259 SourceLocation(), 2260 NestedNameSpecifierLoc(), 2261 DeclarationNameInfo()); 2262} 2263 2264SourceRange UnresolvedUsingValueDecl::getSourceRange() const { 2265 SourceLocation Begin = isAccessDeclaration() 2266 ? getQualifierLoc().getBeginLoc() : UsingLocation; 2267 return SourceRange(Begin, getNameInfo().getEndLoc()); 2268} 2269 2270void UnresolvedUsingTypenameDecl::anchor() { } 2271 2272UnresolvedUsingTypenameDecl * 2273UnresolvedUsingTypenameDecl::Create(ASTContext &C, DeclContext *DC, 2274 SourceLocation UsingLoc, 2275 SourceLocation TypenameLoc, 2276 NestedNameSpecifierLoc QualifierLoc, 2277 SourceLocation TargetNameLoc, 2278 DeclarationName TargetName) { 2279 return new (C, DC) UnresolvedUsingTypenameDecl( 2280 DC, UsingLoc, TypenameLoc, QualifierLoc, TargetNameLoc, 2281 TargetName.getAsIdentifierInfo()); 2282} 2283 2284UnresolvedUsingTypenameDecl * 2285UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) { 2286 return new (C, ID) UnresolvedUsingTypenameDecl( 2287 nullptr, SourceLocation(), SourceLocation(), NestedNameSpecifierLoc(), 2288 SourceLocation(), nullptr); 2289} 2290 2291void StaticAssertDecl::anchor() { } 2292 2293StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC, 2294 SourceLocation StaticAssertLoc, 2295 Expr *AssertExpr, 2296 StringLiteral *Message, 2297 SourceLocation RParenLoc, 2298 bool Failed) { 2299 return new (C, DC) StaticAssertDecl(DC, StaticAssertLoc, AssertExpr, Message, 2300 RParenLoc, Failed); 2301} 2302 2303StaticAssertDecl *StaticAssertDecl::CreateDeserialized(ASTContext &C, 2304 unsigned ID) { 2305 return new (C, ID) StaticAssertDecl(nullptr, SourceLocation(), nullptr, 2306 nullptr, SourceLocation(), false); 2307} 2308 2309MSPropertyDecl *MSPropertyDecl::Create(ASTContext &C, DeclContext *DC, 2310 SourceLocation L, DeclarationName N, 2311 QualType T, TypeSourceInfo *TInfo, 2312 SourceLocation StartL, 2313 IdentifierInfo *Getter, 2314 IdentifierInfo *Setter) { 2315 return new (C, DC) MSPropertyDecl(DC, L, N, T, TInfo, StartL, Getter, Setter); 2316} 2317 2318MSPropertyDecl *MSPropertyDecl::CreateDeserialized(ASTContext &C, 2319 unsigned ID) { 2320 return new (C, ID) MSPropertyDecl(nullptr, SourceLocation(), 2321 DeclarationName(), QualType(), nullptr, 2322 SourceLocation(), nullptr, nullptr); 2323} 2324 2325static const char *getAccessName(AccessSpecifier AS) { 2326 switch (AS) { 2327 case AS_none: 2328 llvm_unreachable("Invalid access specifier!"); 2329 case AS_public: 2330 return "public"; 2331 case AS_private: 2332 return "private"; 2333 case AS_protected: 2334 return "protected"; 2335 } 2336 llvm_unreachable("Invalid access specifier!"); 2337} 2338 2339const DiagnosticBuilder &clang::operator<<(const DiagnosticBuilder &DB, 2340 AccessSpecifier AS) { 2341 return DB << getAccessName(AS); 2342} 2343 2344const PartialDiagnostic &clang::operator<<(const PartialDiagnostic &DB, 2345 AccessSpecifier AS) { 2346 return DB << getAccessName(AS); 2347} 2348