1 //===--- DeclSpec.h - Parsed declaration specifiers -------------*- C++ -*-===// 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 /// \file 11 /// \brief This file defines the classes used to store parsed information about 12 /// declaration-specifiers and declarators. 13 /// 14 /// \verbatim 15 /// static const int volatile x, *y, *(*(*z)[10])(const void *x); 16 /// ------------------------- - -- --------------------------- 17 /// declaration-specifiers \ | / 18 /// declarators 19 /// \endverbatim 20 /// 21 //===----------------------------------------------------------------------===// 22 23 #ifndef LLVM_CLANG_SEMA_DECLSPEC_H 24 #define LLVM_CLANG_SEMA_DECLSPEC_H 25 26 #include "clang/AST/NestedNameSpecifier.h" 27 #include "clang/Basic/ExceptionSpecificationType.h" 28 #include "clang/Basic/Lambda.h" 29 #include "clang/Basic/OperatorKinds.h" 30 #include "clang/Basic/Specifiers.h" 31 #include "clang/Lex/Token.h" 32 #include "clang/Sema/AttributeList.h" 33 #include "clang/Sema/Ownership.h" 34 #include "llvm/ADT/SmallVector.h" 35 #include "llvm/Support/Compiler.h" 36 #include "llvm/Support/ErrorHandling.h" 37 38 namespace clang { 39 class ASTContext; 40 class CXXRecordDecl; 41 class TypeLoc; 42 class LangOptions; 43 class IdentifierInfo; 44 class NamespaceAliasDecl; 45 class NamespaceDecl; 46 class ObjCDeclSpec; 47 class Sema; 48 class Declarator; 49 struct TemplateIdAnnotation; 50 51 /// \brief Represents a C++ nested-name-specifier or a global scope specifier. 52 /// 53 /// These can be in 3 states: 54 /// 1) Not present, identified by isEmpty() 55 /// 2) Present, identified by isNotEmpty() 56 /// 2.a) Valid, identified by isValid() 57 /// 2.b) Invalid, identified by isInvalid(). 58 /// 59 /// isSet() is deprecated because it mostly corresponded to "valid" but was 60 /// often used as if it meant "present". 61 /// 62 /// The actual scope is described by getScopeRep(). 63 class CXXScopeSpec { 64 SourceRange Range; 65 NestedNameSpecifierLocBuilder Builder; 66 67 public: getRange()68 SourceRange getRange() const { return Range; } setRange(SourceRange R)69 void setRange(SourceRange R) { Range = R; } setBeginLoc(SourceLocation Loc)70 void setBeginLoc(SourceLocation Loc) { Range.setBegin(Loc); } setEndLoc(SourceLocation Loc)71 void setEndLoc(SourceLocation Loc) { Range.setEnd(Loc); } getBeginLoc()72 SourceLocation getBeginLoc() const { return Range.getBegin(); } getEndLoc()73 SourceLocation getEndLoc() const { return Range.getEnd(); } 74 75 /// \brief Retrieve the representation of the nested-name-specifier. getScopeRep()76 NestedNameSpecifier *getScopeRep() const { 77 return Builder.getRepresentation(); 78 } 79 80 /// \brief Extend the current nested-name-specifier by another 81 /// nested-name-specifier component of the form 'type::'. 82 /// 83 /// \param Context The AST context in which this nested-name-specifier 84 /// resides. 85 /// 86 /// \param TemplateKWLoc The location of the 'template' keyword, if present. 87 /// 88 /// \param TL The TypeLoc that describes the type preceding the '::'. 89 /// 90 /// \param ColonColonLoc The location of the trailing '::'. 91 void Extend(ASTContext &Context, SourceLocation TemplateKWLoc, TypeLoc TL, 92 SourceLocation ColonColonLoc); 93 94 /// \brief Extend the current nested-name-specifier by another 95 /// nested-name-specifier component of the form 'identifier::'. 96 /// 97 /// \param Context The AST context in which this nested-name-specifier 98 /// resides. 99 /// 100 /// \param Identifier The identifier. 101 /// 102 /// \param IdentifierLoc The location of the identifier. 103 /// 104 /// \param ColonColonLoc The location of the trailing '::'. 105 void Extend(ASTContext &Context, IdentifierInfo *Identifier, 106 SourceLocation IdentifierLoc, SourceLocation ColonColonLoc); 107 108 /// \brief Extend the current nested-name-specifier by another 109 /// nested-name-specifier component of the form 'namespace::'. 110 /// 111 /// \param Context The AST context in which this nested-name-specifier 112 /// resides. 113 /// 114 /// \param Namespace The namespace. 115 /// 116 /// \param NamespaceLoc The location of the namespace name. 117 /// 118 /// \param ColonColonLoc The location of the trailing '::'. 119 void Extend(ASTContext &Context, NamespaceDecl *Namespace, 120 SourceLocation NamespaceLoc, SourceLocation ColonColonLoc); 121 122 /// \brief Extend the current nested-name-specifier by another 123 /// nested-name-specifier component of the form 'namespace-alias::'. 124 /// 125 /// \param Context The AST context in which this nested-name-specifier 126 /// resides. 127 /// 128 /// \param Alias The namespace alias. 129 /// 130 /// \param AliasLoc The location of the namespace alias 131 /// name. 132 /// 133 /// \param ColonColonLoc The location of the trailing '::'. 134 void Extend(ASTContext &Context, NamespaceAliasDecl *Alias, 135 SourceLocation AliasLoc, SourceLocation ColonColonLoc); 136 137 /// \brief Turn this (empty) nested-name-specifier into the global 138 /// nested-name-specifier '::'. 139 void MakeGlobal(ASTContext &Context, SourceLocation ColonColonLoc); 140 141 /// \brief Turns this (empty) nested-name-specifier into '__super' 142 /// nested-name-specifier. 143 /// 144 /// \param Context The AST context in which this nested-name-specifier 145 /// resides. 146 /// 147 /// \param RD The declaration of the class in which nested-name-specifier 148 /// appeared. 149 /// 150 /// \param SuperLoc The location of the '__super' keyword. 151 /// name. 152 /// 153 /// \param ColonColonLoc The location of the trailing '::'. 154 void MakeSuper(ASTContext &Context, CXXRecordDecl *RD, 155 SourceLocation SuperLoc, SourceLocation ColonColonLoc); 156 157 /// \brief Make a new nested-name-specifier from incomplete source-location 158 /// information. 159 /// 160 /// FIXME: This routine should be used very, very rarely, in cases where we 161 /// need to synthesize a nested-name-specifier. Most code should instead use 162 /// \c Adopt() with a proper \c NestedNameSpecifierLoc. 163 void MakeTrivial(ASTContext &Context, NestedNameSpecifier *Qualifier, 164 SourceRange R); 165 166 /// \brief Adopt an existing nested-name-specifier (with source-range 167 /// information). 168 void Adopt(NestedNameSpecifierLoc Other); 169 170 /// \brief Retrieve a nested-name-specifier with location information, copied 171 /// into the given AST context. 172 /// 173 /// \param Context The context into which this nested-name-specifier will be 174 /// copied. 175 NestedNameSpecifierLoc getWithLocInContext(ASTContext &Context) const; 176 177 /// \brief Retrieve the location of the name in the last qualifier 178 /// in this nested name specifier. 179 /// 180 /// For example, the location of \c bar 181 /// in 182 /// \verbatim 183 /// \::foo::bar<0>:: 184 /// ^~~ 185 /// \endverbatim 186 SourceLocation getLastQualifierNameLoc() const; 187 188 /// No scope specifier. isEmpty()189 bool isEmpty() const { return !Range.isValid(); } 190 /// A scope specifier is present, but may be valid or invalid. isNotEmpty()191 bool isNotEmpty() const { return !isEmpty(); } 192 193 /// An error occurred during parsing of the scope specifier. isInvalid()194 bool isInvalid() const { return isNotEmpty() && getScopeRep() == nullptr; } 195 /// A scope specifier is present, and it refers to a real scope. isValid()196 bool isValid() const { return isNotEmpty() && getScopeRep() != nullptr; } 197 198 /// \brief Indicate that this nested-name-specifier is invalid. SetInvalid(SourceRange R)199 void SetInvalid(SourceRange R) { 200 assert(R.isValid() && "Must have a valid source range"); 201 if (Range.getBegin().isInvalid()) 202 Range.setBegin(R.getBegin()); 203 Range.setEnd(R.getEnd()); 204 Builder.Clear(); 205 } 206 207 /// Deprecated. Some call sites intend isNotEmpty() while others intend 208 /// isValid(). isSet()209 bool isSet() const { return getScopeRep() != nullptr; } 210 clear()211 void clear() { 212 Range = SourceRange(); 213 Builder.Clear(); 214 } 215 216 /// \brief Retrieve the data associated with the source-location information. location_data()217 char *location_data() const { return Builder.getBuffer().first; } 218 219 /// \brief Retrieve the size of the data associated with source-location 220 /// information. location_size()221 unsigned location_size() const { return Builder.getBuffer().second; } 222 }; 223 224 /// \brief Captures information about "declaration specifiers". 225 /// 226 /// "Declaration specifiers" encompasses storage-class-specifiers, 227 /// type-specifiers, type-qualifiers, and function-specifiers. 228 class DeclSpec { 229 public: 230 /// \brief storage-class-specifier 231 /// \note The order of these enumerators is important for diagnostics. 232 enum SCS { 233 SCS_unspecified = 0, 234 SCS_typedef, 235 SCS_extern, 236 SCS_static, 237 SCS_auto, 238 SCS_register, 239 SCS_private_extern, 240 SCS_mutable 241 }; 242 243 // Import thread storage class specifier enumeration and constants. 244 // These can be combined with SCS_extern and SCS_static. 245 typedef ThreadStorageClassSpecifier TSCS; 246 static const TSCS TSCS_unspecified = clang::TSCS_unspecified; 247 static const TSCS TSCS___thread = clang::TSCS___thread; 248 static const TSCS TSCS_thread_local = clang::TSCS_thread_local; 249 static const TSCS TSCS__Thread_local = clang::TSCS__Thread_local; 250 251 // Import type specifier width enumeration and constants. 252 typedef TypeSpecifierWidth TSW; 253 static const TSW TSW_unspecified = clang::TSW_unspecified; 254 static const TSW TSW_short = clang::TSW_short; 255 static const TSW TSW_long = clang::TSW_long; 256 static const TSW TSW_longlong = clang::TSW_longlong; 257 258 enum TSC { 259 TSC_unspecified, 260 TSC_imaginary, 261 TSC_complex 262 }; 263 264 // Import type specifier sign enumeration and constants. 265 typedef TypeSpecifierSign TSS; 266 static const TSS TSS_unspecified = clang::TSS_unspecified; 267 static const TSS TSS_signed = clang::TSS_signed; 268 static const TSS TSS_unsigned = clang::TSS_unsigned; 269 270 // Import type specifier type enumeration and constants. 271 typedef TypeSpecifierType TST; 272 static const TST TST_unspecified = clang::TST_unspecified; 273 static const TST TST_void = clang::TST_void; 274 static const TST TST_char = clang::TST_char; 275 static const TST TST_wchar = clang::TST_wchar; 276 static const TST TST_char16 = clang::TST_char16; 277 static const TST TST_char32 = clang::TST_char32; 278 static const TST TST_int = clang::TST_int; 279 static const TST TST_int128 = clang::TST_int128; 280 static const TST TST_half = clang::TST_half; 281 static const TST TST_float = clang::TST_float; 282 static const TST TST_double = clang::TST_double; 283 static const TST TST_bool = clang::TST_bool; 284 static const TST TST_decimal32 = clang::TST_decimal32; 285 static const TST TST_decimal64 = clang::TST_decimal64; 286 static const TST TST_decimal128 = clang::TST_decimal128; 287 static const TST TST_enum = clang::TST_enum; 288 static const TST TST_union = clang::TST_union; 289 static const TST TST_struct = clang::TST_struct; 290 static const TST TST_interface = clang::TST_interface; 291 static const TST TST_class = clang::TST_class; 292 static const TST TST_typename = clang::TST_typename; 293 static const TST TST_typeofType = clang::TST_typeofType; 294 static const TST TST_typeofExpr = clang::TST_typeofExpr; 295 static const TST TST_decltype = clang::TST_decltype; 296 static const TST TST_decltype_auto = clang::TST_decltype_auto; 297 static const TST TST_underlyingType = clang::TST_underlyingType; 298 static const TST TST_auto = clang::TST_auto; 299 static const TST TST_auto_type = clang::TST_auto_type; 300 static const TST TST_unknown_anytype = clang::TST_unknown_anytype; 301 static const TST TST_atomic = clang::TST_atomic; 302 static const TST TST_error = clang::TST_error; 303 304 // type-qualifiers 305 enum TQ { // NOTE: These flags must be kept in sync with Qualifiers::TQ. 306 TQ_unspecified = 0, 307 TQ_const = 1, 308 TQ_restrict = 2, 309 TQ_volatile = 4, 310 // This has no corresponding Qualifiers::TQ value, because it's not treated 311 // as a qualifier in our type system. 312 TQ_atomic = 8 313 }; 314 315 /// ParsedSpecifiers - Flags to query which specifiers were applied. This is 316 /// returned by getParsedSpecifiers. 317 enum ParsedSpecifiers { 318 PQ_None = 0, 319 PQ_StorageClassSpecifier = 1, 320 PQ_TypeSpecifier = 2, 321 PQ_TypeQualifier = 4, 322 PQ_FunctionSpecifier = 8 323 }; 324 325 private: 326 // storage-class-specifier 327 /*SCS*/unsigned StorageClassSpec : 3; 328 /*TSCS*/unsigned ThreadStorageClassSpec : 2; 329 unsigned SCS_extern_in_linkage_spec : 1; 330 331 // type-specifier 332 /*TSW*/unsigned TypeSpecWidth : 2; 333 /*TSC*/unsigned TypeSpecComplex : 2; 334 /*TSS*/unsigned TypeSpecSign : 2; 335 /*TST*/unsigned TypeSpecType : 6; 336 unsigned TypeAltiVecVector : 1; 337 unsigned TypeAltiVecPixel : 1; 338 unsigned TypeAltiVecBool : 1; 339 unsigned TypeSpecOwned : 1; 340 341 // type-qualifiers 342 unsigned TypeQualifiers : 4; // Bitwise OR of TQ. 343 344 // function-specifier 345 unsigned FS_inline_specified : 1; 346 unsigned FS_forceinline_specified: 1; 347 unsigned FS_virtual_specified : 1; 348 unsigned FS_explicit_specified : 1; 349 unsigned FS_noreturn_specified : 1; 350 351 // friend-specifier 352 unsigned Friend_specified : 1; 353 354 // constexpr-specifier 355 unsigned Constexpr_specified : 1; 356 357 // concept-specifier 358 unsigned Concept_specified : 1; 359 360 union { 361 UnionParsedType TypeRep; 362 Decl *DeclRep; 363 Expr *ExprRep; 364 }; 365 366 // attributes. 367 ParsedAttributes Attrs; 368 369 // Scope specifier for the type spec, if applicable. 370 CXXScopeSpec TypeScope; 371 372 // SourceLocation info. These are null if the item wasn't specified or if 373 // the setting was synthesized. 374 SourceRange Range; 375 376 SourceLocation StorageClassSpecLoc, ThreadStorageClassSpecLoc; 377 SourceLocation TSWLoc, TSCLoc, TSSLoc, TSTLoc, AltiVecLoc; 378 /// TSTNameLoc - If TypeSpecType is any of class, enum, struct, union, 379 /// typename, then this is the location of the named type (if present); 380 /// otherwise, it is the same as TSTLoc. Hence, the pair TSTLoc and 381 /// TSTNameLoc provides source range info for tag types. 382 SourceLocation TSTNameLoc; 383 SourceRange TypeofParensRange; 384 SourceLocation TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc; 385 SourceLocation FS_inlineLoc, FS_virtualLoc, FS_explicitLoc, FS_noreturnLoc; 386 SourceLocation FS_forceinlineLoc; 387 SourceLocation FriendLoc, ModulePrivateLoc, ConstexprLoc, ConceptLoc; 388 389 WrittenBuiltinSpecs writtenBS; 390 void SaveWrittenBuiltinSpecs(); 391 392 ObjCDeclSpec *ObjCQualifiers; 393 isTypeRep(TST T)394 static bool isTypeRep(TST T) { 395 return (T == TST_typename || T == TST_typeofType || 396 T == TST_underlyingType || T == TST_atomic); 397 } isExprRep(TST T)398 static bool isExprRep(TST T) { 399 return (T == TST_typeofExpr || T == TST_decltype); 400 } 401 402 DeclSpec(const DeclSpec &) = delete; 403 void operator=(const DeclSpec &) = delete; 404 public: isDeclRep(TST T)405 static bool isDeclRep(TST T) { 406 return (T == TST_enum || T == TST_struct || 407 T == TST_interface || T == TST_union || 408 T == TST_class); 409 } 410 DeclSpec(AttributeFactory & attrFactory)411 DeclSpec(AttributeFactory &attrFactory) 412 : StorageClassSpec(SCS_unspecified), 413 ThreadStorageClassSpec(TSCS_unspecified), 414 SCS_extern_in_linkage_spec(false), 415 TypeSpecWidth(TSW_unspecified), 416 TypeSpecComplex(TSC_unspecified), 417 TypeSpecSign(TSS_unspecified), 418 TypeSpecType(TST_unspecified), 419 TypeAltiVecVector(false), 420 TypeAltiVecPixel(false), 421 TypeAltiVecBool(false), 422 TypeSpecOwned(false), 423 TypeQualifiers(TQ_unspecified), 424 FS_inline_specified(false), 425 FS_forceinline_specified(false), 426 FS_virtual_specified(false), 427 FS_explicit_specified(false), 428 FS_noreturn_specified(false), 429 Friend_specified(false), 430 Constexpr_specified(false), 431 Concept_specified(false), 432 Attrs(attrFactory), 433 writtenBS(), 434 ObjCQualifiers(nullptr) { 435 } 436 437 // storage-class-specifier getStorageClassSpec()438 SCS getStorageClassSpec() const { return (SCS)StorageClassSpec; } getThreadStorageClassSpec()439 TSCS getThreadStorageClassSpec() const { 440 return (TSCS)ThreadStorageClassSpec; 441 } isExternInLinkageSpec()442 bool isExternInLinkageSpec() const { return SCS_extern_in_linkage_spec; } setExternInLinkageSpec(bool Value)443 void setExternInLinkageSpec(bool Value) { 444 SCS_extern_in_linkage_spec = Value; 445 } 446 getStorageClassSpecLoc()447 SourceLocation getStorageClassSpecLoc() const { return StorageClassSpecLoc; } getThreadStorageClassSpecLoc()448 SourceLocation getThreadStorageClassSpecLoc() const { 449 return ThreadStorageClassSpecLoc; 450 } 451 ClearStorageClassSpecs()452 void ClearStorageClassSpecs() { 453 StorageClassSpec = DeclSpec::SCS_unspecified; 454 ThreadStorageClassSpec = DeclSpec::TSCS_unspecified; 455 SCS_extern_in_linkage_spec = false; 456 StorageClassSpecLoc = SourceLocation(); 457 ThreadStorageClassSpecLoc = SourceLocation(); 458 } 459 ClearTypeSpecType()460 void ClearTypeSpecType() { 461 TypeSpecType = DeclSpec::TST_unspecified; 462 TypeSpecOwned = false; 463 TSTLoc = SourceLocation(); 464 } 465 466 // type-specifier getTypeSpecWidth()467 TSW getTypeSpecWidth() const { return (TSW)TypeSpecWidth; } getTypeSpecComplex()468 TSC getTypeSpecComplex() const { return (TSC)TypeSpecComplex; } getTypeSpecSign()469 TSS getTypeSpecSign() const { return (TSS)TypeSpecSign; } getTypeSpecType()470 TST getTypeSpecType() const { return (TST)TypeSpecType; } isTypeAltiVecVector()471 bool isTypeAltiVecVector() const { return TypeAltiVecVector; } isTypeAltiVecPixel()472 bool isTypeAltiVecPixel() const { return TypeAltiVecPixel; } isTypeAltiVecBool()473 bool isTypeAltiVecBool() const { return TypeAltiVecBool; } isTypeSpecOwned()474 bool isTypeSpecOwned() const { return TypeSpecOwned; } isTypeRep()475 bool isTypeRep() const { return isTypeRep((TST) TypeSpecType); } 476 getRepAsType()477 ParsedType getRepAsType() const { 478 assert(isTypeRep((TST) TypeSpecType) && "DeclSpec does not store a type"); 479 return TypeRep; 480 } getRepAsDecl()481 Decl *getRepAsDecl() const { 482 assert(isDeclRep((TST) TypeSpecType) && "DeclSpec does not store a decl"); 483 return DeclRep; 484 } getRepAsExpr()485 Expr *getRepAsExpr() const { 486 assert(isExprRep((TST) TypeSpecType) && "DeclSpec does not store an expr"); 487 return ExprRep; 488 } getTypeSpecScope()489 CXXScopeSpec &getTypeSpecScope() { return TypeScope; } getTypeSpecScope()490 const CXXScopeSpec &getTypeSpecScope() const { return TypeScope; } 491 getSourceRange()492 SourceRange getSourceRange() const LLVM_READONLY { return Range; } getLocStart()493 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } getLocEnd()494 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 495 getTypeSpecWidthLoc()496 SourceLocation getTypeSpecWidthLoc() const { return TSWLoc; } getTypeSpecComplexLoc()497 SourceLocation getTypeSpecComplexLoc() const { return TSCLoc; } getTypeSpecSignLoc()498 SourceLocation getTypeSpecSignLoc() const { return TSSLoc; } getTypeSpecTypeLoc()499 SourceLocation getTypeSpecTypeLoc() const { return TSTLoc; } getAltiVecLoc()500 SourceLocation getAltiVecLoc() const { return AltiVecLoc; } 501 getTypeSpecTypeNameLoc()502 SourceLocation getTypeSpecTypeNameLoc() const { 503 assert(isDeclRep((TST) TypeSpecType) || TypeSpecType == TST_typename); 504 return TSTNameLoc; 505 } 506 getTypeofParensRange()507 SourceRange getTypeofParensRange() const { return TypeofParensRange; } setTypeofParensRange(SourceRange range)508 void setTypeofParensRange(SourceRange range) { TypeofParensRange = range; } 509 containsPlaceholderType()510 bool containsPlaceholderType() const { 511 return (TypeSpecType == TST_auto || TypeSpecType == TST_auto_type || 512 TypeSpecType == TST_decltype_auto); 513 } 514 515 bool hasTagDefinition() const; 516 517 /// \brief Turn a type-specifier-type into a string like "_Bool" or "union". 518 static const char *getSpecifierName(DeclSpec::TST T, 519 const PrintingPolicy &Policy); 520 static const char *getSpecifierName(DeclSpec::TQ Q); 521 static const char *getSpecifierName(DeclSpec::TSS S); 522 static const char *getSpecifierName(DeclSpec::TSC C); 523 static const char *getSpecifierName(DeclSpec::TSW W); 524 static const char *getSpecifierName(DeclSpec::SCS S); 525 static const char *getSpecifierName(DeclSpec::TSCS S); 526 527 // type-qualifiers 528 529 /// getTypeQualifiers - Return a set of TQs. getTypeQualifiers()530 unsigned getTypeQualifiers() const { return TypeQualifiers; } getConstSpecLoc()531 SourceLocation getConstSpecLoc() const { return TQ_constLoc; } getRestrictSpecLoc()532 SourceLocation getRestrictSpecLoc() const { return TQ_restrictLoc; } getVolatileSpecLoc()533 SourceLocation getVolatileSpecLoc() const { return TQ_volatileLoc; } getAtomicSpecLoc()534 SourceLocation getAtomicSpecLoc() const { return TQ_atomicLoc; } 535 536 /// \brief Clear out all of the type qualifiers. ClearTypeQualifiers()537 void ClearTypeQualifiers() { 538 TypeQualifiers = 0; 539 TQ_constLoc = SourceLocation(); 540 TQ_restrictLoc = SourceLocation(); 541 TQ_volatileLoc = SourceLocation(); 542 TQ_atomicLoc = SourceLocation(); 543 } 544 545 // function-specifier isInlineSpecified()546 bool isInlineSpecified() const { 547 return FS_inline_specified | FS_forceinline_specified; 548 } getInlineSpecLoc()549 SourceLocation getInlineSpecLoc() const { 550 return FS_inline_specified ? FS_inlineLoc : FS_forceinlineLoc; 551 } 552 isVirtualSpecified()553 bool isVirtualSpecified() const { return FS_virtual_specified; } getVirtualSpecLoc()554 SourceLocation getVirtualSpecLoc() const { return FS_virtualLoc; } 555 isExplicitSpecified()556 bool isExplicitSpecified() const { return FS_explicit_specified; } getExplicitSpecLoc()557 SourceLocation getExplicitSpecLoc() const { return FS_explicitLoc; } 558 isNoreturnSpecified()559 bool isNoreturnSpecified() const { return FS_noreturn_specified; } getNoreturnSpecLoc()560 SourceLocation getNoreturnSpecLoc() const { return FS_noreturnLoc; } 561 ClearFunctionSpecs()562 void ClearFunctionSpecs() { 563 FS_inline_specified = false; 564 FS_inlineLoc = SourceLocation(); 565 FS_forceinline_specified = false; 566 FS_forceinlineLoc = SourceLocation(); 567 FS_virtual_specified = false; 568 FS_virtualLoc = SourceLocation(); 569 FS_explicit_specified = false; 570 FS_explicitLoc = SourceLocation(); 571 FS_noreturn_specified = false; 572 FS_noreturnLoc = SourceLocation(); 573 } 574 575 /// \brief Return true if any type-specifier has been found. hasTypeSpecifier()576 bool hasTypeSpecifier() const { 577 return getTypeSpecType() != DeclSpec::TST_unspecified || 578 getTypeSpecWidth() != DeclSpec::TSW_unspecified || 579 getTypeSpecComplex() != DeclSpec::TSC_unspecified || 580 getTypeSpecSign() != DeclSpec::TSS_unspecified; 581 } 582 583 /// \brief Return a bitmask of which flavors of specifiers this 584 /// DeclSpec includes. 585 unsigned getParsedSpecifiers() const; 586 587 /// isEmpty - Return true if this declaration specifier is completely empty: 588 /// no tokens were parsed in the production of it. isEmpty()589 bool isEmpty() const { 590 return getParsedSpecifiers() == DeclSpec::PQ_None; 591 } 592 SetRangeStart(SourceLocation Loc)593 void SetRangeStart(SourceLocation Loc) { Range.setBegin(Loc); } SetRangeEnd(SourceLocation Loc)594 void SetRangeEnd(SourceLocation Loc) { Range.setEnd(Loc); } 595 596 /// These methods set the specified attribute of the DeclSpec and 597 /// return false if there was no error. If an error occurs (for 598 /// example, if we tried to set "auto" on a spec with "extern" 599 /// already set), they return true and set PrevSpec and DiagID 600 /// such that 601 /// Diag(Loc, DiagID) << PrevSpec; 602 /// will yield a useful result. 603 /// 604 /// TODO: use a more general approach that still allows these 605 /// diagnostics to be ignored when desired. 606 bool SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, 607 const char *&PrevSpec, unsigned &DiagID, 608 const PrintingPolicy &Policy); 609 bool SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc, 610 const char *&PrevSpec, unsigned &DiagID); 611 bool SetTypeSpecWidth(TSW W, SourceLocation Loc, const char *&PrevSpec, 612 unsigned &DiagID, const PrintingPolicy &Policy); 613 bool SetTypeSpecComplex(TSC C, SourceLocation Loc, const char *&PrevSpec, 614 unsigned &DiagID); 615 bool SetTypeSpecSign(TSS S, SourceLocation Loc, const char *&PrevSpec, 616 unsigned &DiagID); 617 bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, 618 unsigned &DiagID, const PrintingPolicy &Policy); 619 bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, 620 unsigned &DiagID, ParsedType Rep, 621 const PrintingPolicy &Policy); 622 bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, 623 unsigned &DiagID, Decl *Rep, bool Owned, 624 const PrintingPolicy &Policy); 625 bool SetTypeSpecType(TST T, SourceLocation TagKwLoc, 626 SourceLocation TagNameLoc, const char *&PrevSpec, 627 unsigned &DiagID, ParsedType Rep, 628 const PrintingPolicy &Policy); 629 bool SetTypeSpecType(TST T, SourceLocation TagKwLoc, 630 SourceLocation TagNameLoc, const char *&PrevSpec, 631 unsigned &DiagID, Decl *Rep, bool Owned, 632 const PrintingPolicy &Policy); 633 634 bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, 635 unsigned &DiagID, Expr *Rep, 636 const PrintingPolicy &policy); 637 bool SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc, 638 const char *&PrevSpec, unsigned &DiagID, 639 const PrintingPolicy &Policy); 640 bool SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc, 641 const char *&PrevSpec, unsigned &DiagID, 642 const PrintingPolicy &Policy); 643 bool SetTypeAltiVecBool(bool isAltiVecBool, SourceLocation Loc, 644 const char *&PrevSpec, unsigned &DiagID, 645 const PrintingPolicy &Policy); 646 bool SetTypeSpecError(); UpdateDeclRep(Decl * Rep)647 void UpdateDeclRep(Decl *Rep) { 648 assert(isDeclRep((TST) TypeSpecType)); 649 DeclRep = Rep; 650 } UpdateTypeRep(ParsedType Rep)651 void UpdateTypeRep(ParsedType Rep) { 652 assert(isTypeRep((TST) TypeSpecType)); 653 TypeRep = Rep; 654 } UpdateExprRep(Expr * Rep)655 void UpdateExprRep(Expr *Rep) { 656 assert(isExprRep((TST) TypeSpecType)); 657 ExprRep = Rep; 658 } 659 660 bool SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec, 661 unsigned &DiagID, const LangOptions &Lang); 662 663 bool setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec, 664 unsigned &DiagID); 665 bool setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec, 666 unsigned &DiagID); 667 bool setFunctionSpecVirtual(SourceLocation Loc, const char *&PrevSpec, 668 unsigned &DiagID); 669 bool setFunctionSpecExplicit(SourceLocation Loc, const char *&PrevSpec, 670 unsigned &DiagID); 671 bool setFunctionSpecNoreturn(SourceLocation Loc, const char *&PrevSpec, 672 unsigned &DiagID); 673 674 bool SetFriendSpec(SourceLocation Loc, const char *&PrevSpec, 675 unsigned &DiagID); 676 bool setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec, 677 unsigned &DiagID); 678 bool SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec, 679 unsigned &DiagID); 680 bool SetConceptSpec(SourceLocation Loc, const char *&PrevSpec, 681 unsigned &DiagID); 682 isFriendSpecified()683 bool isFriendSpecified() const { return Friend_specified; } getFriendSpecLoc()684 SourceLocation getFriendSpecLoc() const { return FriendLoc; } 685 isModulePrivateSpecified()686 bool isModulePrivateSpecified() const { return ModulePrivateLoc.isValid(); } getModulePrivateSpecLoc()687 SourceLocation getModulePrivateSpecLoc() const { return ModulePrivateLoc; } 688 isConstexprSpecified()689 bool isConstexprSpecified() const { return Constexpr_specified; } getConstexprSpecLoc()690 SourceLocation getConstexprSpecLoc() const { return ConstexprLoc; } 691 isConceptSpecified()692 bool isConceptSpecified() const { return Concept_specified; } getConceptSpecLoc()693 SourceLocation getConceptSpecLoc() const { return ConceptLoc; } 694 ClearConstexprSpec()695 void ClearConstexprSpec() { 696 Constexpr_specified = false; 697 ConstexprLoc = SourceLocation(); 698 } 699 ClearConceptSpec()700 void ClearConceptSpec() { 701 Concept_specified = false; 702 ConceptLoc = SourceLocation(); 703 } 704 getAttributePool()705 AttributePool &getAttributePool() const { 706 return Attrs.getPool(); 707 } 708 709 /// \brief Concatenates two attribute lists. 710 /// 711 /// The GCC attribute syntax allows for the following: 712 /// 713 /// \code 714 /// short __attribute__(( unused, deprecated )) 715 /// int __attribute__(( may_alias, aligned(16) )) var; 716 /// \endcode 717 /// 718 /// This declares 4 attributes using 2 lists. The following syntax is 719 /// also allowed and equivalent to the previous declaration. 720 /// 721 /// \code 722 /// short __attribute__((unused)) __attribute__((deprecated)) 723 /// int __attribute__((may_alias)) __attribute__((aligned(16))) var; 724 /// \endcode 725 /// addAttributes(AttributeList * AL)726 void addAttributes(AttributeList *AL) { 727 Attrs.addAll(AL); 728 } 729 hasAttributes()730 bool hasAttributes() const { return !Attrs.empty(); } 731 getAttributes()732 ParsedAttributes &getAttributes() { return Attrs; } getAttributes()733 const ParsedAttributes &getAttributes() const { return Attrs; } 734 takeAttributesFrom(ParsedAttributes & attrs)735 void takeAttributesFrom(ParsedAttributes &attrs) { 736 Attrs.takeAllFrom(attrs); 737 } 738 739 /// Finish - This does final analysis of the declspec, issuing diagnostics for 740 /// things like "_Imaginary" (lacking an FP type). After calling this method, 741 /// DeclSpec is guaranteed self-consistent, even if an error occurred. 742 void Finish(Sema &S, const PrintingPolicy &Policy); 743 getWrittenBuiltinSpecs()744 const WrittenBuiltinSpecs& getWrittenBuiltinSpecs() const { 745 return writtenBS; 746 } 747 getObjCQualifiers()748 ObjCDeclSpec *getObjCQualifiers() const { return ObjCQualifiers; } setObjCQualifiers(ObjCDeclSpec * quals)749 void setObjCQualifiers(ObjCDeclSpec *quals) { ObjCQualifiers = quals; } 750 751 /// \brief Checks if this DeclSpec can stand alone, without a Declarator. 752 /// 753 /// Only tag declspecs can stand alone. 754 bool isMissingDeclaratorOk(); 755 }; 756 757 /// \brief Captures information about "declaration specifiers" specific to 758 /// Objective-C. 759 class ObjCDeclSpec { 760 public: 761 /// ObjCDeclQualifier - Qualifier used on types in method 762 /// declarations. Not all combinations are sensible. Parameters 763 /// can be one of { in, out, inout } with one of { bycopy, byref }. 764 /// Returns can either be { oneway } or not. 765 /// 766 /// This should be kept in sync with Decl::ObjCDeclQualifier. 767 enum ObjCDeclQualifier { 768 DQ_None = 0x0, 769 DQ_In = 0x1, 770 DQ_Inout = 0x2, 771 DQ_Out = 0x4, 772 DQ_Bycopy = 0x8, 773 DQ_Byref = 0x10, 774 DQ_Oneway = 0x20, 775 DQ_CSNullability = 0x40 776 }; 777 778 /// PropertyAttributeKind - list of property attributes. 779 enum ObjCPropertyAttributeKind { 780 DQ_PR_noattr = 0x0, 781 DQ_PR_readonly = 0x01, 782 DQ_PR_getter = 0x02, 783 DQ_PR_assign = 0x04, 784 DQ_PR_readwrite = 0x08, 785 DQ_PR_retain = 0x10, 786 DQ_PR_copy = 0x20, 787 DQ_PR_nonatomic = 0x40, 788 DQ_PR_setter = 0x80, 789 DQ_PR_atomic = 0x100, 790 DQ_PR_weak = 0x200, 791 DQ_PR_strong = 0x400, 792 DQ_PR_unsafe_unretained = 0x800, 793 DQ_PR_nullability = 0x1000, 794 DQ_PR_null_resettable = 0x2000 795 }; 796 ObjCDeclSpec()797 ObjCDeclSpec() 798 : objcDeclQualifier(DQ_None), PropertyAttributes(DQ_PR_noattr), 799 Nullability(0), GetterName(nullptr), SetterName(nullptr) { } 800 getObjCDeclQualifier()801 ObjCDeclQualifier getObjCDeclQualifier() const { return objcDeclQualifier; } setObjCDeclQualifier(ObjCDeclQualifier DQVal)802 void setObjCDeclQualifier(ObjCDeclQualifier DQVal) { 803 objcDeclQualifier = (ObjCDeclQualifier) (objcDeclQualifier | DQVal); 804 } clearObjCDeclQualifier(ObjCDeclQualifier DQVal)805 void clearObjCDeclQualifier(ObjCDeclQualifier DQVal) { 806 objcDeclQualifier = (ObjCDeclQualifier) (objcDeclQualifier & ~DQVal); 807 } 808 getPropertyAttributes()809 ObjCPropertyAttributeKind getPropertyAttributes() const { 810 return ObjCPropertyAttributeKind(PropertyAttributes); 811 } setPropertyAttributes(ObjCPropertyAttributeKind PRVal)812 void setPropertyAttributes(ObjCPropertyAttributeKind PRVal) { 813 PropertyAttributes = 814 (ObjCPropertyAttributeKind)(PropertyAttributes | PRVal); 815 } 816 getNullability()817 NullabilityKind getNullability() const { 818 assert(((getObjCDeclQualifier() & DQ_CSNullability) || 819 (getPropertyAttributes() & DQ_PR_nullability)) && 820 "Objective-C declspec doesn't have nullability"); 821 return static_cast<NullabilityKind>(Nullability); 822 } 823 getNullabilityLoc()824 SourceLocation getNullabilityLoc() const { 825 assert(((getObjCDeclQualifier() & DQ_CSNullability) || 826 (getPropertyAttributes() & DQ_PR_nullability)) && 827 "Objective-C declspec doesn't have nullability"); 828 return NullabilityLoc; 829 } 830 setNullability(SourceLocation loc,NullabilityKind kind)831 void setNullability(SourceLocation loc, NullabilityKind kind) { 832 assert(((getObjCDeclQualifier() & DQ_CSNullability) || 833 (getPropertyAttributes() & DQ_PR_nullability)) && 834 "Set the nullability declspec or property attribute first"); 835 Nullability = static_cast<unsigned>(kind); 836 NullabilityLoc = loc; 837 } 838 getGetterName()839 const IdentifierInfo *getGetterName() const { return GetterName; } getGetterName()840 IdentifierInfo *getGetterName() { return GetterName; } setGetterName(IdentifierInfo * name)841 void setGetterName(IdentifierInfo *name) { GetterName = name; } 842 getSetterName()843 const IdentifierInfo *getSetterName() const { return SetterName; } getSetterName()844 IdentifierInfo *getSetterName() { return SetterName; } setSetterName(IdentifierInfo * name)845 void setSetterName(IdentifierInfo *name) { SetterName = name; } 846 847 private: 848 // FIXME: These two are unrelated and mutually exclusive. So perhaps 849 // we can put them in a union to reflect their mutual exclusivity 850 // (space saving is negligible). 851 ObjCDeclQualifier objcDeclQualifier : 7; 852 853 // NOTE: VC++ treats enums as signed, avoid using ObjCPropertyAttributeKind 854 unsigned PropertyAttributes : 14; 855 856 unsigned Nullability : 2; 857 858 SourceLocation NullabilityLoc; 859 860 IdentifierInfo *GetterName; // getter name or NULL if no getter 861 IdentifierInfo *SetterName; // setter name or NULL if no setter 862 }; 863 864 /// \brief Represents a C++ unqualified-id that has been parsed. 865 class UnqualifiedId { 866 private: 867 UnqualifiedId(const UnqualifiedId &Other) = delete; 868 const UnqualifiedId &operator=(const UnqualifiedId &) = delete; 869 870 public: 871 /// \brief Describes the kind of unqualified-id parsed. 872 enum IdKind { 873 /// \brief An identifier. 874 IK_Identifier, 875 /// \brief An overloaded operator name, e.g., operator+. 876 IK_OperatorFunctionId, 877 /// \brief A conversion function name, e.g., operator int. 878 IK_ConversionFunctionId, 879 /// \brief A user-defined literal name, e.g., operator "" _i. 880 IK_LiteralOperatorId, 881 /// \brief A constructor name. 882 IK_ConstructorName, 883 /// \brief A constructor named via a template-id. 884 IK_ConstructorTemplateId, 885 /// \brief A destructor name. 886 IK_DestructorName, 887 /// \brief A template-id, e.g., f<int>. 888 IK_TemplateId, 889 /// \brief An implicit 'self' parameter 890 IK_ImplicitSelfParam 891 } Kind; 892 893 struct OFI { 894 /// \brief The kind of overloaded operator. 895 OverloadedOperatorKind Operator; 896 897 /// \brief The source locations of the individual tokens that name 898 /// the operator, e.g., the "new", "[", and "]" tokens in 899 /// operator new []. 900 /// 901 /// Different operators have different numbers of tokens in their name, 902 /// up to three. Any remaining source locations in this array will be 903 /// set to an invalid value for operators with fewer than three tokens. 904 unsigned SymbolLocations[3]; 905 }; 906 907 /// \brief Anonymous union that holds extra data associated with the 908 /// parsed unqualified-id. 909 union { 910 /// \brief When Kind == IK_Identifier, the parsed identifier, or when Kind 911 /// == IK_UserLiteralId, the identifier suffix. 912 IdentifierInfo *Identifier; 913 914 /// \brief When Kind == IK_OperatorFunctionId, the overloaded operator 915 /// that we parsed. 916 struct OFI OperatorFunctionId; 917 918 /// \brief When Kind == IK_ConversionFunctionId, the type that the 919 /// conversion function names. 920 UnionParsedType ConversionFunctionId; 921 922 /// \brief When Kind == IK_ConstructorName, the class-name of the type 923 /// whose constructor is being referenced. 924 UnionParsedType ConstructorName; 925 926 /// \brief When Kind == IK_DestructorName, the type referred to by the 927 /// class-name. 928 UnionParsedType DestructorName; 929 930 /// \brief When Kind == IK_TemplateId or IK_ConstructorTemplateId, 931 /// the template-id annotation that contains the template name and 932 /// template arguments. 933 TemplateIdAnnotation *TemplateId; 934 }; 935 936 /// \brief The location of the first token that describes this unqualified-id, 937 /// which will be the location of the identifier, "operator" keyword, 938 /// tilde (for a destructor), or the template name of a template-id. 939 SourceLocation StartLocation; 940 941 /// \brief The location of the last token that describes this unqualified-id. 942 SourceLocation EndLocation; 943 UnqualifiedId()944 UnqualifiedId() : Kind(IK_Identifier), Identifier(nullptr) { } 945 946 /// \brief Clear out this unqualified-id, setting it to default (invalid) 947 /// state. clear()948 void clear() { 949 Kind = IK_Identifier; 950 Identifier = nullptr; 951 StartLocation = SourceLocation(); 952 EndLocation = SourceLocation(); 953 } 954 955 /// \brief Determine whether this unqualified-id refers to a valid name. isValid()956 bool isValid() const { return StartLocation.isValid(); } 957 958 /// \brief Determine whether this unqualified-id refers to an invalid name. isInvalid()959 bool isInvalid() const { return !isValid(); } 960 961 /// \brief Determine what kind of name we have. getKind()962 IdKind getKind() const { return Kind; } setKind(IdKind kind)963 void setKind(IdKind kind) { Kind = kind; } 964 965 /// \brief Specify that this unqualified-id was parsed as an identifier. 966 /// 967 /// \param Id the parsed identifier. 968 /// \param IdLoc the location of the parsed identifier. setIdentifier(const IdentifierInfo * Id,SourceLocation IdLoc)969 void setIdentifier(const IdentifierInfo *Id, SourceLocation IdLoc) { 970 Kind = IK_Identifier; 971 Identifier = const_cast<IdentifierInfo *>(Id); 972 StartLocation = EndLocation = IdLoc; 973 } 974 975 /// \brief Specify that this unqualified-id was parsed as an 976 /// operator-function-id. 977 /// 978 /// \param OperatorLoc the location of the 'operator' keyword. 979 /// 980 /// \param Op the overloaded operator. 981 /// 982 /// \param SymbolLocations the locations of the individual operator symbols 983 /// in the operator. 984 void setOperatorFunctionId(SourceLocation OperatorLoc, 985 OverloadedOperatorKind Op, 986 SourceLocation SymbolLocations[3]); 987 988 /// \brief Specify that this unqualified-id was parsed as a 989 /// conversion-function-id. 990 /// 991 /// \param OperatorLoc the location of the 'operator' keyword. 992 /// 993 /// \param Ty the type to which this conversion function is converting. 994 /// 995 /// \param EndLoc the location of the last token that makes up the type name. setConversionFunctionId(SourceLocation OperatorLoc,ParsedType Ty,SourceLocation EndLoc)996 void setConversionFunctionId(SourceLocation OperatorLoc, 997 ParsedType Ty, 998 SourceLocation EndLoc) { 999 Kind = IK_ConversionFunctionId; 1000 StartLocation = OperatorLoc; 1001 EndLocation = EndLoc; 1002 ConversionFunctionId = Ty; 1003 } 1004 1005 /// \brief Specific that this unqualified-id was parsed as a 1006 /// literal-operator-id. 1007 /// 1008 /// \param Id the parsed identifier. 1009 /// 1010 /// \param OpLoc the location of the 'operator' keyword. 1011 /// 1012 /// \param IdLoc the location of the identifier. setLiteralOperatorId(const IdentifierInfo * Id,SourceLocation OpLoc,SourceLocation IdLoc)1013 void setLiteralOperatorId(const IdentifierInfo *Id, SourceLocation OpLoc, 1014 SourceLocation IdLoc) { 1015 Kind = IK_LiteralOperatorId; 1016 Identifier = const_cast<IdentifierInfo *>(Id); 1017 StartLocation = OpLoc; 1018 EndLocation = IdLoc; 1019 } 1020 1021 /// \brief Specify that this unqualified-id was parsed as a constructor name. 1022 /// 1023 /// \param ClassType the class type referred to by the constructor name. 1024 /// 1025 /// \param ClassNameLoc the location of the class name. 1026 /// 1027 /// \param EndLoc the location of the last token that makes up the type name. setConstructorName(ParsedType ClassType,SourceLocation ClassNameLoc,SourceLocation EndLoc)1028 void setConstructorName(ParsedType ClassType, 1029 SourceLocation ClassNameLoc, 1030 SourceLocation EndLoc) { 1031 Kind = IK_ConstructorName; 1032 StartLocation = ClassNameLoc; 1033 EndLocation = EndLoc; 1034 ConstructorName = ClassType; 1035 } 1036 1037 /// \brief Specify that this unqualified-id was parsed as a 1038 /// template-id that names a constructor. 1039 /// 1040 /// \param TemplateId the template-id annotation that describes the parsed 1041 /// template-id. This UnqualifiedId instance will take ownership of the 1042 /// \p TemplateId and will free it on destruction. 1043 void setConstructorTemplateId(TemplateIdAnnotation *TemplateId); 1044 1045 /// \brief Specify that this unqualified-id was parsed as a destructor name. 1046 /// 1047 /// \param TildeLoc the location of the '~' that introduces the destructor 1048 /// name. 1049 /// 1050 /// \param ClassType the name of the class referred to by the destructor name. setDestructorName(SourceLocation TildeLoc,ParsedType ClassType,SourceLocation EndLoc)1051 void setDestructorName(SourceLocation TildeLoc, 1052 ParsedType ClassType, 1053 SourceLocation EndLoc) { 1054 Kind = IK_DestructorName; 1055 StartLocation = TildeLoc; 1056 EndLocation = EndLoc; 1057 DestructorName = ClassType; 1058 } 1059 1060 /// \brief Specify that this unqualified-id was parsed as a template-id. 1061 /// 1062 /// \param TemplateId the template-id annotation that describes the parsed 1063 /// template-id. This UnqualifiedId instance will take ownership of the 1064 /// \p TemplateId and will free it on destruction. 1065 void setTemplateId(TemplateIdAnnotation *TemplateId); 1066 1067 /// \brief Return the source range that covers this unqualified-id. getSourceRange()1068 SourceRange getSourceRange() const LLVM_READONLY { 1069 return SourceRange(StartLocation, EndLocation); 1070 } getLocStart()1071 SourceLocation getLocStart() const LLVM_READONLY { return StartLocation; } getLocEnd()1072 SourceLocation getLocEnd() const LLVM_READONLY { return EndLocation; } 1073 }; 1074 1075 /// \brief A set of tokens that has been cached for later parsing. 1076 typedef SmallVector<Token, 4> CachedTokens; 1077 1078 /// \brief One instance of this struct is used for each type in a 1079 /// declarator that is parsed. 1080 /// 1081 /// This is intended to be a small value object. 1082 struct DeclaratorChunk { 1083 enum { 1084 Pointer, Reference, Array, Function, BlockPointer, MemberPointer, Paren 1085 } Kind; 1086 1087 /// Loc - The place where this type was defined. 1088 SourceLocation Loc; 1089 /// EndLoc - If valid, the place where this chunck ends. 1090 SourceLocation EndLoc; 1091 getSourceRangeDeclaratorChunk1092 SourceRange getSourceRange() const { 1093 if (EndLoc.isInvalid()) 1094 return SourceRange(Loc, Loc); 1095 return SourceRange(Loc, EndLoc); 1096 } 1097 1098 struct TypeInfoCommon { 1099 AttributeList *AttrList; 1100 }; 1101 1102 struct PointerTypeInfo : TypeInfoCommon { 1103 /// The type qualifiers: const/volatile/restrict/atomic. 1104 unsigned TypeQuals : 4; 1105 1106 /// The location of the const-qualifier, if any. 1107 unsigned ConstQualLoc; 1108 1109 /// The location of the volatile-qualifier, if any. 1110 unsigned VolatileQualLoc; 1111 1112 /// The location of the restrict-qualifier, if any. 1113 unsigned RestrictQualLoc; 1114 1115 /// The location of the _Atomic-qualifier, if any. 1116 unsigned AtomicQualLoc; 1117 destroyDeclaratorChunk::PointerTypeInfo1118 void destroy() { 1119 } 1120 }; 1121 1122 struct ReferenceTypeInfo : TypeInfoCommon { 1123 /// The type qualifier: restrict. [GNU] C++ extension 1124 bool HasRestrict : 1; 1125 /// True if this is an lvalue reference, false if it's an rvalue reference. 1126 bool LValueRef : 1; destroyDeclaratorChunk::ReferenceTypeInfo1127 void destroy() { 1128 } 1129 }; 1130 1131 struct ArrayTypeInfo : TypeInfoCommon { 1132 /// The type qualifiers for the array: const/volatile/restrict/_Atomic. 1133 unsigned TypeQuals : 4; 1134 1135 /// True if this dimension included the 'static' keyword. 1136 bool hasStatic : 1; 1137 1138 /// True if this dimension was [*]. In this case, NumElts is null. 1139 bool isStar : 1; 1140 1141 /// This is the size of the array, or null if [] or [*] was specified. 1142 /// Since the parser is multi-purpose, and we don't want to impose a root 1143 /// expression class on all clients, NumElts is untyped. 1144 Expr *NumElts; 1145 destroyDeclaratorChunk::ArrayTypeInfo1146 void destroy() {} 1147 }; 1148 1149 /// ParamInfo - An array of paraminfo objects is allocated whenever a function 1150 /// declarator is parsed. There are two interesting styles of parameters 1151 /// here: 1152 /// K&R-style identifier lists and parameter type lists. K&R-style identifier 1153 /// lists will have information about the identifier, but no type information. 1154 /// Parameter type lists will have type info (if the actions module provides 1155 /// it), but may have null identifier info: e.g. for 'void foo(int X, int)'. 1156 struct ParamInfo { 1157 IdentifierInfo *Ident; 1158 SourceLocation IdentLoc; 1159 Decl *Param; 1160 1161 /// DefaultArgTokens - When the parameter's default argument 1162 /// cannot be parsed immediately (because it occurs within the 1163 /// declaration of a member function), it will be stored here as a 1164 /// sequence of tokens to be parsed once the class definition is 1165 /// complete. Non-NULL indicates that there is a default argument. 1166 CachedTokens *DefaultArgTokens; 1167 ParamInfoDeclaratorChunk::ParamInfo1168 ParamInfo() {} 1169 ParamInfo(IdentifierInfo *ident, SourceLocation iloc, 1170 Decl *param, 1171 CachedTokens *DefArgTokens = nullptr) IdentDeclaratorChunk::ParamInfo1172 : Ident(ident), IdentLoc(iloc), Param(param), 1173 DefaultArgTokens(DefArgTokens) {} 1174 }; 1175 1176 struct TypeAndRange { 1177 ParsedType Ty; 1178 SourceRange Range; 1179 }; 1180 1181 struct FunctionTypeInfo : TypeInfoCommon { 1182 /// hasPrototype - This is true if the function had at least one typed 1183 /// parameter. If the function is () or (a,b,c), then it has no prototype, 1184 /// and is treated as a K&R-style function. 1185 unsigned hasPrototype : 1; 1186 1187 /// isVariadic - If this function has a prototype, and if that 1188 /// proto ends with ',...)', this is true. When true, EllipsisLoc 1189 /// contains the location of the ellipsis. 1190 unsigned isVariadic : 1; 1191 1192 /// Can this declaration be a constructor-style initializer? 1193 unsigned isAmbiguous : 1; 1194 1195 /// \brief Whether the ref-qualifier (if any) is an lvalue reference. 1196 /// Otherwise, it's an rvalue reference. 1197 unsigned RefQualifierIsLValueRef : 1; 1198 1199 /// The type qualifiers: const/volatile/restrict. 1200 /// The qualifier bitmask values are the same as in QualType. 1201 unsigned TypeQuals : 3; 1202 1203 /// ExceptionSpecType - An ExceptionSpecificationType value. 1204 unsigned ExceptionSpecType : 4; 1205 1206 /// DeleteParams - If this is true, we need to delete[] Params. 1207 unsigned DeleteParams : 1; 1208 1209 /// HasTrailingReturnType - If this is true, a trailing return type was 1210 /// specified. 1211 unsigned HasTrailingReturnType : 1; 1212 1213 /// The location of the left parenthesis in the source. 1214 unsigned LParenLoc; 1215 1216 /// When isVariadic is true, the location of the ellipsis in the source. 1217 unsigned EllipsisLoc; 1218 1219 /// The location of the right parenthesis in the source. 1220 unsigned RParenLoc; 1221 1222 /// NumParams - This is the number of formal parameters specified by the 1223 /// declarator. 1224 unsigned NumParams; 1225 1226 /// NumExceptions - This is the number of types in the dynamic-exception- 1227 /// decl, if the function has one. 1228 unsigned NumExceptions; 1229 1230 /// \brief The location of the ref-qualifier, if any. 1231 /// 1232 /// If this is an invalid location, there is no ref-qualifier. 1233 unsigned RefQualifierLoc; 1234 1235 /// \brief The location of the const-qualifier, if any. 1236 /// 1237 /// If this is an invalid location, there is no const-qualifier. 1238 unsigned ConstQualifierLoc; 1239 1240 /// \brief The location of the volatile-qualifier, if any. 1241 /// 1242 /// If this is an invalid location, there is no volatile-qualifier. 1243 unsigned VolatileQualifierLoc; 1244 1245 /// \brief The location of the restrict-qualifier, if any. 1246 /// 1247 /// If this is an invalid location, there is no restrict-qualifier. 1248 unsigned RestrictQualifierLoc; 1249 1250 /// \brief The location of the 'mutable' qualifer in a lambda-declarator, if 1251 /// any. 1252 unsigned MutableLoc; 1253 1254 /// \brief The beginning location of the exception specification, if any. 1255 unsigned ExceptionSpecLocBeg; 1256 1257 /// \brief The end location of the exception specification, if any. 1258 unsigned ExceptionSpecLocEnd; 1259 1260 /// Params - This is a pointer to a new[]'d array of ParamInfo objects that 1261 /// describe the parameters specified by this function declarator. null if 1262 /// there are no parameters specified. 1263 ParamInfo *Params; 1264 1265 union { 1266 /// \brief Pointer to a new[]'d array of TypeAndRange objects that 1267 /// contain the types in the function's dynamic exception specification 1268 /// and their locations, if there is one. 1269 TypeAndRange *Exceptions; 1270 1271 /// \brief Pointer to the expression in the noexcept-specifier of this 1272 /// function, if it has one. 1273 Expr *NoexceptExpr; 1274 1275 /// \brief Pointer to the cached tokens for an exception-specification 1276 /// that has not yet been parsed. 1277 CachedTokens *ExceptionSpecTokens; 1278 }; 1279 1280 /// \brief If HasTrailingReturnType is true, this is the trailing return 1281 /// type specified. 1282 UnionParsedType TrailingReturnType; 1283 1284 /// \brief Reset the parameter list to having zero parameters. 1285 /// 1286 /// This is used in various places for error recovery. freeParamsDeclaratorChunk::FunctionTypeInfo1287 void freeParams() { 1288 for (unsigned I = 0; I < NumParams; ++I) { 1289 delete Params[I].DefaultArgTokens; 1290 Params[I].DefaultArgTokens = nullptr; 1291 } 1292 if (DeleteParams) { 1293 delete[] Params; 1294 DeleteParams = false; 1295 } 1296 NumParams = 0; 1297 } 1298 destroyDeclaratorChunk::FunctionTypeInfo1299 void destroy() { 1300 if (DeleteParams) 1301 delete[] Params; 1302 if (getExceptionSpecType() == EST_Dynamic) 1303 delete[] Exceptions; 1304 else if (getExceptionSpecType() == EST_Unparsed) 1305 delete ExceptionSpecTokens; 1306 } 1307 1308 /// isKNRPrototype - Return true if this is a K&R style identifier list, 1309 /// like "void foo(a,b,c)". In a function definition, this will be followed 1310 /// by the parameter type definitions. isKNRPrototypeDeclaratorChunk::FunctionTypeInfo1311 bool isKNRPrototype() const { return !hasPrototype && NumParams != 0; } 1312 getLParenLocDeclaratorChunk::FunctionTypeInfo1313 SourceLocation getLParenLoc() const { 1314 return SourceLocation::getFromRawEncoding(LParenLoc); 1315 } 1316 getEllipsisLocDeclaratorChunk::FunctionTypeInfo1317 SourceLocation getEllipsisLoc() const { 1318 return SourceLocation::getFromRawEncoding(EllipsisLoc); 1319 } 1320 getRParenLocDeclaratorChunk::FunctionTypeInfo1321 SourceLocation getRParenLoc() const { 1322 return SourceLocation::getFromRawEncoding(RParenLoc); 1323 } 1324 getExceptionSpecLocBegDeclaratorChunk::FunctionTypeInfo1325 SourceLocation getExceptionSpecLocBeg() const { 1326 return SourceLocation::getFromRawEncoding(ExceptionSpecLocBeg); 1327 } 1328 getExceptionSpecLocEndDeclaratorChunk::FunctionTypeInfo1329 SourceLocation getExceptionSpecLocEnd() const { 1330 return SourceLocation::getFromRawEncoding(ExceptionSpecLocEnd); 1331 } 1332 getExceptionSpecRangeDeclaratorChunk::FunctionTypeInfo1333 SourceRange getExceptionSpecRange() const { 1334 return SourceRange(getExceptionSpecLocBeg(), getExceptionSpecLocEnd()); 1335 } 1336 1337 /// \brief Retrieve the location of the ref-qualifier, if any. getRefQualifierLocDeclaratorChunk::FunctionTypeInfo1338 SourceLocation getRefQualifierLoc() const { 1339 return SourceLocation::getFromRawEncoding(RefQualifierLoc); 1340 } 1341 1342 /// \brief Retrieve the location of the 'const' qualifier, if any. getConstQualifierLocDeclaratorChunk::FunctionTypeInfo1343 SourceLocation getConstQualifierLoc() const { 1344 return SourceLocation::getFromRawEncoding(ConstQualifierLoc); 1345 } 1346 1347 /// \brief Retrieve the location of the 'volatile' qualifier, if any. getVolatileQualifierLocDeclaratorChunk::FunctionTypeInfo1348 SourceLocation getVolatileQualifierLoc() const { 1349 return SourceLocation::getFromRawEncoding(VolatileQualifierLoc); 1350 } 1351 1352 /// \brief Retrieve the location of the 'restrict' qualifier, if any. getRestrictQualifierLocDeclaratorChunk::FunctionTypeInfo1353 SourceLocation getRestrictQualifierLoc() const { 1354 return SourceLocation::getFromRawEncoding(RestrictQualifierLoc); 1355 } 1356 1357 /// \brief Retrieve the location of the 'mutable' qualifier, if any. getMutableLocDeclaratorChunk::FunctionTypeInfo1358 SourceLocation getMutableLoc() const { 1359 return SourceLocation::getFromRawEncoding(MutableLoc); 1360 } 1361 1362 /// \brief Determine whether this function declaration contains a 1363 /// ref-qualifier. hasRefQualifierDeclaratorChunk::FunctionTypeInfo1364 bool hasRefQualifier() const { return getRefQualifierLoc().isValid(); } 1365 1366 /// \brief Determine whether this lambda-declarator contains a 'mutable' 1367 /// qualifier. hasMutableQualifierDeclaratorChunk::FunctionTypeInfo1368 bool hasMutableQualifier() const { return getMutableLoc().isValid(); } 1369 1370 /// \brief Get the type of exception specification this function has. getExceptionSpecTypeDeclaratorChunk::FunctionTypeInfo1371 ExceptionSpecificationType getExceptionSpecType() const { 1372 return static_cast<ExceptionSpecificationType>(ExceptionSpecType); 1373 } 1374 1375 /// \brief Determine whether this function declarator had a 1376 /// trailing-return-type. hasTrailingReturnTypeDeclaratorChunk::FunctionTypeInfo1377 bool hasTrailingReturnType() const { return HasTrailingReturnType; } 1378 1379 /// \brief Get the trailing-return-type for this function declarator. getTrailingReturnTypeDeclaratorChunk::FunctionTypeInfo1380 ParsedType getTrailingReturnType() const { return TrailingReturnType; } 1381 }; 1382 1383 struct BlockPointerTypeInfo : TypeInfoCommon { 1384 /// For now, sema will catch these as invalid. 1385 /// The type qualifiers: const/volatile/restrict/_Atomic. 1386 unsigned TypeQuals : 4; 1387 destroyDeclaratorChunk::BlockPointerTypeInfo1388 void destroy() { 1389 } 1390 }; 1391 1392 struct MemberPointerTypeInfo : TypeInfoCommon { 1393 /// The type qualifiers: const/volatile/restrict/_Atomic. 1394 unsigned TypeQuals : 4; 1395 // CXXScopeSpec has a constructor, so it can't be a direct member. 1396 // So we need some pointer-aligned storage and a bit of trickery. 1397 union { 1398 void *Aligner; 1399 char Mem[sizeof(CXXScopeSpec)]; 1400 } ScopeMem; ScopeDeclaratorChunk::MemberPointerTypeInfo1401 CXXScopeSpec &Scope() { 1402 return *reinterpret_cast<CXXScopeSpec*>(ScopeMem.Mem); 1403 } ScopeDeclaratorChunk::MemberPointerTypeInfo1404 const CXXScopeSpec &Scope() const { 1405 return *reinterpret_cast<const CXXScopeSpec*>(ScopeMem.Mem); 1406 } destroyDeclaratorChunk::MemberPointerTypeInfo1407 void destroy() { 1408 Scope().~CXXScopeSpec(); 1409 } 1410 }; 1411 1412 union { 1413 TypeInfoCommon Common; 1414 PointerTypeInfo Ptr; 1415 ReferenceTypeInfo Ref; 1416 ArrayTypeInfo Arr; 1417 FunctionTypeInfo Fun; 1418 BlockPointerTypeInfo Cls; 1419 MemberPointerTypeInfo Mem; 1420 }; 1421 destroyDeclaratorChunk1422 void destroy() { 1423 switch (Kind) { 1424 case DeclaratorChunk::Function: return Fun.destroy(); 1425 case DeclaratorChunk::Pointer: return Ptr.destroy(); 1426 case DeclaratorChunk::BlockPointer: return Cls.destroy(); 1427 case DeclaratorChunk::Reference: return Ref.destroy(); 1428 case DeclaratorChunk::Array: return Arr.destroy(); 1429 case DeclaratorChunk::MemberPointer: return Mem.destroy(); 1430 case DeclaratorChunk::Paren: return; 1431 } 1432 } 1433 1434 /// \brief If there are attributes applied to this declaratorchunk, return 1435 /// them. getAttrsDeclaratorChunk1436 const AttributeList *getAttrs() const { 1437 return Common.AttrList; 1438 } 1439 getAttrListRefDeclaratorChunk1440 AttributeList *&getAttrListRef() { 1441 return Common.AttrList; 1442 } 1443 1444 /// \brief Return a DeclaratorChunk for a pointer. getPointerDeclaratorChunk1445 static DeclaratorChunk getPointer(unsigned TypeQuals, SourceLocation Loc, 1446 SourceLocation ConstQualLoc, 1447 SourceLocation VolatileQualLoc, 1448 SourceLocation RestrictQualLoc, 1449 SourceLocation AtomicQualLoc) { 1450 DeclaratorChunk I; 1451 I.Kind = Pointer; 1452 I.Loc = Loc; 1453 I.Ptr.TypeQuals = TypeQuals; 1454 I.Ptr.ConstQualLoc = ConstQualLoc.getRawEncoding(); 1455 I.Ptr.VolatileQualLoc = VolatileQualLoc.getRawEncoding(); 1456 I.Ptr.RestrictQualLoc = RestrictQualLoc.getRawEncoding(); 1457 I.Ptr.AtomicQualLoc = AtomicQualLoc.getRawEncoding(); 1458 I.Ptr.AttrList = nullptr; 1459 return I; 1460 } 1461 1462 /// \brief Return a DeclaratorChunk for a reference. getReferenceDeclaratorChunk1463 static DeclaratorChunk getReference(unsigned TypeQuals, SourceLocation Loc, 1464 bool lvalue) { 1465 DeclaratorChunk I; 1466 I.Kind = Reference; 1467 I.Loc = Loc; 1468 I.Ref.HasRestrict = (TypeQuals & DeclSpec::TQ_restrict) != 0; 1469 I.Ref.LValueRef = lvalue; 1470 I.Ref.AttrList = nullptr; 1471 return I; 1472 } 1473 1474 /// \brief Return a DeclaratorChunk for an array. getArrayDeclaratorChunk1475 static DeclaratorChunk getArray(unsigned TypeQuals, 1476 bool isStatic, bool isStar, Expr *NumElts, 1477 SourceLocation LBLoc, SourceLocation RBLoc) { 1478 DeclaratorChunk I; 1479 I.Kind = Array; 1480 I.Loc = LBLoc; 1481 I.EndLoc = RBLoc; 1482 I.Arr.AttrList = nullptr; 1483 I.Arr.TypeQuals = TypeQuals; 1484 I.Arr.hasStatic = isStatic; 1485 I.Arr.isStar = isStar; 1486 I.Arr.NumElts = NumElts; 1487 return I; 1488 } 1489 1490 /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function. 1491 /// "TheDeclarator" is the declarator that this will be added to. 1492 static DeclaratorChunk getFunction(bool HasProto, 1493 bool IsAmbiguous, 1494 SourceLocation LParenLoc, 1495 ParamInfo *Params, unsigned NumParams, 1496 SourceLocation EllipsisLoc, 1497 SourceLocation RParenLoc, 1498 unsigned TypeQuals, 1499 bool RefQualifierIsLvalueRef, 1500 SourceLocation RefQualifierLoc, 1501 SourceLocation ConstQualifierLoc, 1502 SourceLocation VolatileQualifierLoc, 1503 SourceLocation RestrictQualifierLoc, 1504 SourceLocation MutableLoc, 1505 ExceptionSpecificationType ESpecType, 1506 SourceRange ESpecRange, 1507 ParsedType *Exceptions, 1508 SourceRange *ExceptionRanges, 1509 unsigned NumExceptions, 1510 Expr *NoexceptExpr, 1511 CachedTokens *ExceptionSpecTokens, 1512 SourceLocation LocalRangeBegin, 1513 SourceLocation LocalRangeEnd, 1514 Declarator &TheDeclarator, 1515 TypeResult TrailingReturnType = 1516 TypeResult()); 1517 1518 /// \brief Return a DeclaratorChunk for a block. getBlockPointerDeclaratorChunk1519 static DeclaratorChunk getBlockPointer(unsigned TypeQuals, 1520 SourceLocation Loc) { 1521 DeclaratorChunk I; 1522 I.Kind = BlockPointer; 1523 I.Loc = Loc; 1524 I.Cls.TypeQuals = TypeQuals; 1525 I.Cls.AttrList = nullptr; 1526 return I; 1527 } 1528 getMemberPointerDeclaratorChunk1529 static DeclaratorChunk getMemberPointer(const CXXScopeSpec &SS, 1530 unsigned TypeQuals, 1531 SourceLocation Loc) { 1532 DeclaratorChunk I; 1533 I.Kind = MemberPointer; 1534 I.Loc = SS.getBeginLoc(); 1535 I.EndLoc = Loc; 1536 I.Mem.TypeQuals = TypeQuals; 1537 I.Mem.AttrList = nullptr; 1538 new (I.Mem.ScopeMem.Mem) CXXScopeSpec(SS); 1539 return I; 1540 } 1541 1542 /// \brief Return a DeclaratorChunk for a paren. getParenDeclaratorChunk1543 static DeclaratorChunk getParen(SourceLocation LParenLoc, 1544 SourceLocation RParenLoc) { 1545 DeclaratorChunk I; 1546 I.Kind = Paren; 1547 I.Loc = LParenLoc; 1548 I.EndLoc = RParenLoc; 1549 I.Common.AttrList = nullptr; 1550 return I; 1551 } 1552 isParenDeclaratorChunk1553 bool isParen() const { 1554 return Kind == Paren; 1555 } 1556 }; 1557 1558 /// \brief Described the kind of function definition (if any) provided for 1559 /// a function. 1560 enum FunctionDefinitionKind { 1561 FDK_Declaration, 1562 FDK_Definition, 1563 FDK_Defaulted, 1564 FDK_Deleted 1565 }; 1566 1567 /// \brief Information about one declarator, including the parsed type 1568 /// information and the identifier. 1569 /// 1570 /// When the declarator is fully formed, this is turned into the appropriate 1571 /// Decl object. 1572 /// 1573 /// Declarators come in two types: normal declarators and abstract declarators. 1574 /// Abstract declarators are used when parsing types, and don't have an 1575 /// identifier. Normal declarators do have ID's. 1576 /// 1577 /// Instances of this class should be a transient object that lives on the 1578 /// stack, not objects that are allocated in large quantities on the heap. 1579 class Declarator { 1580 public: 1581 enum TheContext { 1582 FileContext, // File scope declaration. 1583 PrototypeContext, // Within a function prototype. 1584 ObjCResultContext, // An ObjC method result type. 1585 ObjCParameterContext,// An ObjC method parameter type. 1586 KNRTypeListContext, // K&R type definition list for formals. 1587 TypeNameContext, // Abstract declarator for types. 1588 MemberContext, // Struct/Union field. 1589 BlockContext, // Declaration within a block in a function. 1590 ForContext, // Declaration within first part of a for loop. 1591 ConditionContext, // Condition declaration in a C++ if/switch/while/for. 1592 TemplateParamContext,// Within a template parameter list. 1593 CXXNewContext, // C++ new-expression. 1594 CXXCatchContext, // C++ catch exception-declaration 1595 ObjCCatchContext, // Objective-C catch exception-declaration 1596 BlockLiteralContext, // Block literal declarator. 1597 LambdaExprContext, // Lambda-expression declarator. 1598 LambdaExprParameterContext, // Lambda-expression parameter declarator. 1599 ConversionIdContext, // C++ conversion-type-id. 1600 TrailingReturnContext, // C++11 trailing-type-specifier. 1601 TemplateTypeArgContext, // Template type argument. 1602 AliasDeclContext, // C++11 alias-declaration. 1603 AliasTemplateContext // C++11 alias-declaration template. 1604 }; 1605 1606 private: 1607 const DeclSpec &DS; 1608 CXXScopeSpec SS; 1609 UnqualifiedId Name; 1610 SourceRange Range; 1611 1612 /// \brief Where we are parsing this declarator. 1613 TheContext Context; 1614 1615 /// DeclTypeInfo - This holds each type that the declarator includes as it is 1616 /// parsed. This is pushed from the identifier out, which means that element 1617 /// #0 will be the most closely bound to the identifier, and 1618 /// DeclTypeInfo.back() will be the least closely bound. 1619 SmallVector<DeclaratorChunk, 8> DeclTypeInfo; 1620 1621 /// InvalidType - Set by Sema::GetTypeForDeclarator(). 1622 bool InvalidType : 1; 1623 1624 /// GroupingParens - Set by Parser::ParseParenDeclarator(). 1625 bool GroupingParens : 1; 1626 1627 /// FunctionDefinition - Is this Declarator for a function or member 1628 /// definition and, if so, what kind? 1629 /// 1630 /// Actually a FunctionDefinitionKind. 1631 unsigned FunctionDefinition : 2; 1632 1633 /// \brief Is this Declarator a redeclaration? 1634 bool Redeclaration : 1; 1635 1636 /// Attrs - Attributes. 1637 ParsedAttributes Attrs; 1638 1639 /// \brief The asm label, if specified. 1640 Expr *AsmLabel; 1641 1642 /// InlineParams - This is a local array used for the first function decl 1643 /// chunk to avoid going to the heap for the common case when we have one 1644 /// function chunk in the declarator. 1645 DeclaratorChunk::ParamInfo InlineParams[16]; 1646 bool InlineParamsUsed; 1647 1648 /// \brief true if the declaration is preceded by \c __extension__. 1649 unsigned Extension : 1; 1650 1651 /// Indicates whether this is an Objective-C instance variable. 1652 unsigned ObjCIvar : 1; 1653 1654 /// Indicates whether this is an Objective-C 'weak' property. 1655 unsigned ObjCWeakProperty : 1; 1656 1657 /// \brief If this is the second or subsequent declarator in this declaration, 1658 /// the location of the comma before this declarator. 1659 SourceLocation CommaLoc; 1660 1661 /// \brief If provided, the source location of the ellipsis used to describe 1662 /// this declarator as a parameter pack. 1663 SourceLocation EllipsisLoc; 1664 1665 friend struct DeclaratorChunk; 1666 1667 public: Declarator(const DeclSpec & ds,TheContext C)1668 Declarator(const DeclSpec &ds, TheContext C) 1669 : DS(ds), Range(ds.getSourceRange()), Context(C), 1670 InvalidType(DS.getTypeSpecType() == DeclSpec::TST_error), 1671 GroupingParens(false), FunctionDefinition(FDK_Declaration), 1672 Redeclaration(false), 1673 Attrs(ds.getAttributePool().getFactory()), AsmLabel(nullptr), 1674 InlineParamsUsed(false), Extension(false), ObjCIvar(false), 1675 ObjCWeakProperty(false) { 1676 } 1677 ~Declarator()1678 ~Declarator() { 1679 clear(); 1680 } 1681 /// getDeclSpec - Return the declaration-specifier that this declarator was 1682 /// declared with. getDeclSpec()1683 const DeclSpec &getDeclSpec() const { return DS; } 1684 1685 /// getMutableDeclSpec - Return a non-const version of the DeclSpec. This 1686 /// should be used with extreme care: declspecs can often be shared between 1687 /// multiple declarators, so mutating the DeclSpec affects all of the 1688 /// Declarators. This should only be done when the declspec is known to not 1689 /// be shared or when in error recovery etc. getMutableDeclSpec()1690 DeclSpec &getMutableDeclSpec() { return const_cast<DeclSpec &>(DS); } 1691 getAttributePool()1692 AttributePool &getAttributePool() const { 1693 return Attrs.getPool(); 1694 } 1695 1696 /// getCXXScopeSpec - Return the C++ scope specifier (global scope or 1697 /// nested-name-specifier) that is part of the declarator-id. getCXXScopeSpec()1698 const CXXScopeSpec &getCXXScopeSpec() const { return SS; } getCXXScopeSpec()1699 CXXScopeSpec &getCXXScopeSpec() { return SS; } 1700 1701 /// \brief Retrieve the name specified by this declarator. getName()1702 UnqualifiedId &getName() { return Name; } 1703 getContext()1704 TheContext getContext() const { return Context; } 1705 isPrototypeContext()1706 bool isPrototypeContext() const { 1707 return (Context == PrototypeContext || 1708 Context == ObjCParameterContext || 1709 Context == ObjCResultContext || 1710 Context == LambdaExprParameterContext); 1711 } 1712 1713 /// \brief Get the source range that spans this declarator. getSourceRange()1714 SourceRange getSourceRange() const LLVM_READONLY { return Range; } getLocStart()1715 SourceLocation getLocStart() const LLVM_READONLY { return Range.getBegin(); } getLocEnd()1716 SourceLocation getLocEnd() const LLVM_READONLY { return Range.getEnd(); } 1717 SetSourceRange(SourceRange R)1718 void SetSourceRange(SourceRange R) { Range = R; } 1719 /// SetRangeBegin - Set the start of the source range to Loc, unless it's 1720 /// invalid. SetRangeBegin(SourceLocation Loc)1721 void SetRangeBegin(SourceLocation Loc) { 1722 if (!Loc.isInvalid()) 1723 Range.setBegin(Loc); 1724 } 1725 /// SetRangeEnd - Set the end of the source range to Loc, unless it's invalid. SetRangeEnd(SourceLocation Loc)1726 void SetRangeEnd(SourceLocation Loc) { 1727 if (!Loc.isInvalid()) 1728 Range.setEnd(Loc); 1729 } 1730 /// ExtendWithDeclSpec - Extend the declarator source range to include the 1731 /// given declspec, unless its location is invalid. Adopts the range start if 1732 /// the current range start is invalid. ExtendWithDeclSpec(const DeclSpec & DS)1733 void ExtendWithDeclSpec(const DeclSpec &DS) { 1734 SourceRange SR = DS.getSourceRange(); 1735 if (Range.getBegin().isInvalid()) 1736 Range.setBegin(SR.getBegin()); 1737 if (!SR.getEnd().isInvalid()) 1738 Range.setEnd(SR.getEnd()); 1739 } 1740 1741 /// \brief Reset the contents of this Declarator. clear()1742 void clear() { 1743 SS.clear(); 1744 Name.clear(); 1745 Range = DS.getSourceRange(); 1746 1747 for (unsigned i = 0, e = DeclTypeInfo.size(); i != e; ++i) 1748 DeclTypeInfo[i].destroy(); 1749 DeclTypeInfo.clear(); 1750 Attrs.clear(); 1751 AsmLabel = nullptr; 1752 InlineParamsUsed = false; 1753 ObjCIvar = false; 1754 ObjCWeakProperty = false; 1755 CommaLoc = SourceLocation(); 1756 EllipsisLoc = SourceLocation(); 1757 } 1758 1759 /// mayOmitIdentifier - Return true if the identifier is either optional or 1760 /// not allowed. This is true for typenames, prototypes, and template 1761 /// parameter lists. mayOmitIdentifier()1762 bool mayOmitIdentifier() const { 1763 switch (Context) { 1764 case FileContext: 1765 case KNRTypeListContext: 1766 case MemberContext: 1767 case BlockContext: 1768 case ForContext: 1769 case ConditionContext: 1770 return false; 1771 1772 case TypeNameContext: 1773 case AliasDeclContext: 1774 case AliasTemplateContext: 1775 case PrototypeContext: 1776 case LambdaExprParameterContext: 1777 case ObjCParameterContext: 1778 case ObjCResultContext: 1779 case TemplateParamContext: 1780 case CXXNewContext: 1781 case CXXCatchContext: 1782 case ObjCCatchContext: 1783 case BlockLiteralContext: 1784 case LambdaExprContext: 1785 case ConversionIdContext: 1786 case TemplateTypeArgContext: 1787 case TrailingReturnContext: 1788 return true; 1789 } 1790 llvm_unreachable("unknown context kind!"); 1791 } 1792 1793 /// mayHaveIdentifier - Return true if the identifier is either optional or 1794 /// required. This is true for normal declarators and prototypes, but not 1795 /// typenames. mayHaveIdentifier()1796 bool mayHaveIdentifier() const { 1797 switch (Context) { 1798 case FileContext: 1799 case KNRTypeListContext: 1800 case MemberContext: 1801 case BlockContext: 1802 case ForContext: 1803 case ConditionContext: 1804 case PrototypeContext: 1805 case LambdaExprParameterContext: 1806 case TemplateParamContext: 1807 case CXXCatchContext: 1808 case ObjCCatchContext: 1809 return true; 1810 1811 case TypeNameContext: 1812 case CXXNewContext: 1813 case AliasDeclContext: 1814 case AliasTemplateContext: 1815 case ObjCParameterContext: 1816 case ObjCResultContext: 1817 case BlockLiteralContext: 1818 case LambdaExprContext: 1819 case ConversionIdContext: 1820 case TemplateTypeArgContext: 1821 case TrailingReturnContext: 1822 return false; 1823 } 1824 llvm_unreachable("unknown context kind!"); 1825 } 1826 1827 /// diagnoseIdentifier - Return true if the identifier is prohibited and 1828 /// should be diagnosed (because it cannot be anything else). diagnoseIdentifier()1829 bool diagnoseIdentifier() const { 1830 switch (Context) { 1831 case FileContext: 1832 case KNRTypeListContext: 1833 case MemberContext: 1834 case BlockContext: 1835 case ForContext: 1836 case ConditionContext: 1837 case PrototypeContext: 1838 case LambdaExprParameterContext: 1839 case TemplateParamContext: 1840 case CXXCatchContext: 1841 case ObjCCatchContext: 1842 case TypeNameContext: 1843 case ConversionIdContext: 1844 case ObjCParameterContext: 1845 case ObjCResultContext: 1846 case BlockLiteralContext: 1847 case CXXNewContext: 1848 case LambdaExprContext: 1849 return false; 1850 1851 case AliasDeclContext: 1852 case AliasTemplateContext: 1853 case TemplateTypeArgContext: 1854 case TrailingReturnContext: 1855 return true; 1856 } 1857 llvm_unreachable("unknown context kind!"); 1858 } 1859 1860 /// mayBeFollowedByCXXDirectInit - Return true if the declarator can be 1861 /// followed by a C++ direct initializer, e.g. "int x(1);". mayBeFollowedByCXXDirectInit()1862 bool mayBeFollowedByCXXDirectInit() const { 1863 if (hasGroupingParens()) return false; 1864 1865 if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) 1866 return false; 1867 1868 if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_extern && 1869 Context != FileContext) 1870 return false; 1871 1872 // Special names can't have direct initializers. 1873 if (Name.getKind() != UnqualifiedId::IK_Identifier) 1874 return false; 1875 1876 switch (Context) { 1877 case FileContext: 1878 case BlockContext: 1879 case ForContext: 1880 return true; 1881 1882 case ConditionContext: 1883 // This may not be followed by a direct initializer, but it can't be a 1884 // function declaration either, and we'd prefer to perform a tentative 1885 // parse in order to produce the right diagnostic. 1886 return true; 1887 1888 case KNRTypeListContext: 1889 case MemberContext: 1890 case PrototypeContext: 1891 case LambdaExprParameterContext: 1892 case ObjCParameterContext: 1893 case ObjCResultContext: 1894 case TemplateParamContext: 1895 case CXXCatchContext: 1896 case ObjCCatchContext: 1897 case TypeNameContext: 1898 case CXXNewContext: 1899 case AliasDeclContext: 1900 case AliasTemplateContext: 1901 case BlockLiteralContext: 1902 case LambdaExprContext: 1903 case ConversionIdContext: 1904 case TemplateTypeArgContext: 1905 case TrailingReturnContext: 1906 return false; 1907 } 1908 llvm_unreachable("unknown context kind!"); 1909 } 1910 1911 /// isPastIdentifier - Return true if we have parsed beyond the point where 1912 /// the isPastIdentifier()1913 bool isPastIdentifier() const { return Name.isValid(); } 1914 1915 /// hasName - Whether this declarator has a name, which might be an 1916 /// identifier (accessible via getIdentifier()) or some kind of 1917 /// special C++ name (constructor, destructor, etc.). hasName()1918 bool hasName() const { 1919 return Name.getKind() != UnqualifiedId::IK_Identifier || Name.Identifier; 1920 } 1921 getIdentifier()1922 IdentifierInfo *getIdentifier() const { 1923 if (Name.getKind() == UnqualifiedId::IK_Identifier) 1924 return Name.Identifier; 1925 1926 return nullptr; 1927 } getIdentifierLoc()1928 SourceLocation getIdentifierLoc() const { return Name.StartLocation; } 1929 1930 /// \brief Set the name of this declarator to be the given identifier. SetIdentifier(IdentifierInfo * Id,SourceLocation IdLoc)1931 void SetIdentifier(IdentifierInfo *Id, SourceLocation IdLoc) { 1932 Name.setIdentifier(Id, IdLoc); 1933 } 1934 1935 /// AddTypeInfo - Add a chunk to this declarator. Also extend the range to 1936 /// EndLoc, which should be the last token of the chunk. AddTypeInfo(const DeclaratorChunk & TI,ParsedAttributes & attrs,SourceLocation EndLoc)1937 void AddTypeInfo(const DeclaratorChunk &TI, 1938 ParsedAttributes &attrs, 1939 SourceLocation EndLoc) { 1940 DeclTypeInfo.push_back(TI); 1941 DeclTypeInfo.back().getAttrListRef() = attrs.getList(); 1942 getAttributePool().takeAllFrom(attrs.getPool()); 1943 1944 if (!EndLoc.isInvalid()) 1945 SetRangeEnd(EndLoc); 1946 } 1947 1948 /// \brief Add a new innermost chunk to this declarator. AddInnermostTypeInfo(const DeclaratorChunk & TI)1949 void AddInnermostTypeInfo(const DeclaratorChunk &TI) { 1950 DeclTypeInfo.insert(DeclTypeInfo.begin(), TI); 1951 } 1952 1953 /// \brief Return the number of types applied to this declarator. getNumTypeObjects()1954 unsigned getNumTypeObjects() const { return DeclTypeInfo.size(); } 1955 1956 /// Return the specified TypeInfo from this declarator. TypeInfo #0 is 1957 /// closest to the identifier. getTypeObject(unsigned i)1958 const DeclaratorChunk &getTypeObject(unsigned i) const { 1959 assert(i < DeclTypeInfo.size() && "Invalid type chunk"); 1960 return DeclTypeInfo[i]; 1961 } getTypeObject(unsigned i)1962 DeclaratorChunk &getTypeObject(unsigned i) { 1963 assert(i < DeclTypeInfo.size() && "Invalid type chunk"); 1964 return DeclTypeInfo[i]; 1965 } 1966 1967 typedef SmallVectorImpl<DeclaratorChunk>::const_iterator type_object_iterator; 1968 typedef llvm::iterator_range<type_object_iterator> type_object_range; 1969 1970 /// Returns the range of type objects, from the identifier outwards. type_objects()1971 type_object_range type_objects() const { 1972 return type_object_range(DeclTypeInfo.begin(), DeclTypeInfo.end()); 1973 } 1974 DropFirstTypeObject()1975 void DropFirstTypeObject() { 1976 assert(!DeclTypeInfo.empty() && "No type chunks to drop."); 1977 DeclTypeInfo.front().destroy(); 1978 DeclTypeInfo.erase(DeclTypeInfo.begin()); 1979 } 1980 1981 /// Return the innermost (closest to the declarator) chunk of this 1982 /// declarator that is not a parens chunk, or null if there are no 1983 /// non-parens chunks. getInnermostNonParenChunk()1984 const DeclaratorChunk *getInnermostNonParenChunk() const { 1985 for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) { 1986 if (!DeclTypeInfo[i].isParen()) 1987 return &DeclTypeInfo[i]; 1988 } 1989 return nullptr; 1990 } 1991 1992 /// Return the outermost (furthest from the declarator) chunk of 1993 /// this declarator that is not a parens chunk, or null if there are 1994 /// no non-parens chunks. getOutermostNonParenChunk()1995 const DeclaratorChunk *getOutermostNonParenChunk() const { 1996 for (unsigned i = DeclTypeInfo.size(), i_end = 0; i != i_end; --i) { 1997 if (!DeclTypeInfo[i-1].isParen()) 1998 return &DeclTypeInfo[i-1]; 1999 } 2000 return nullptr; 2001 } 2002 2003 /// isArrayOfUnknownBound - This method returns true if the declarator 2004 /// is a declarator for an array of unknown bound (looking through 2005 /// parentheses). isArrayOfUnknownBound()2006 bool isArrayOfUnknownBound() const { 2007 const DeclaratorChunk *chunk = getInnermostNonParenChunk(); 2008 return (chunk && chunk->Kind == DeclaratorChunk::Array && 2009 !chunk->Arr.NumElts); 2010 } 2011 2012 /// isFunctionDeclarator - This method returns true if the declarator 2013 /// is a function declarator (looking through parentheses). 2014 /// If true is returned, then the reference type parameter idx is 2015 /// assigned with the index of the declaration chunk. isFunctionDeclarator(unsigned & idx)2016 bool isFunctionDeclarator(unsigned& idx) const { 2017 for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) { 2018 switch (DeclTypeInfo[i].Kind) { 2019 case DeclaratorChunk::Function: 2020 idx = i; 2021 return true; 2022 case DeclaratorChunk::Paren: 2023 continue; 2024 case DeclaratorChunk::Pointer: 2025 case DeclaratorChunk::Reference: 2026 case DeclaratorChunk::Array: 2027 case DeclaratorChunk::BlockPointer: 2028 case DeclaratorChunk::MemberPointer: 2029 return false; 2030 } 2031 llvm_unreachable("Invalid type chunk"); 2032 } 2033 return false; 2034 } 2035 2036 /// isFunctionDeclarator - Once this declarator is fully parsed and formed, 2037 /// this method returns true if the identifier is a function declarator 2038 /// (looking through parentheses). isFunctionDeclarator()2039 bool isFunctionDeclarator() const { 2040 unsigned index; 2041 return isFunctionDeclarator(index); 2042 } 2043 2044 /// getFunctionTypeInfo - Retrieves the function type info object 2045 /// (looking through parentheses). getFunctionTypeInfo()2046 DeclaratorChunk::FunctionTypeInfo &getFunctionTypeInfo() { 2047 assert(isFunctionDeclarator() && "Not a function declarator!"); 2048 unsigned index = 0; 2049 isFunctionDeclarator(index); 2050 return DeclTypeInfo[index].Fun; 2051 } 2052 2053 /// getFunctionTypeInfo - Retrieves the function type info object 2054 /// (looking through parentheses). getFunctionTypeInfo()2055 const DeclaratorChunk::FunctionTypeInfo &getFunctionTypeInfo() const { 2056 return const_cast<Declarator*>(this)->getFunctionTypeInfo(); 2057 } 2058 2059 /// \brief Determine whether the declaration that will be produced from 2060 /// this declaration will be a function. 2061 /// 2062 /// A declaration can declare a function even if the declarator itself 2063 /// isn't a function declarator, if the type specifier refers to a function 2064 /// type. This routine checks for both cases. 2065 bool isDeclarationOfFunction() const; 2066 2067 /// \brief Return true if this declaration appears in a context where a 2068 /// function declarator would be a function declaration. isFunctionDeclarationContext()2069 bool isFunctionDeclarationContext() const { 2070 if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_typedef) 2071 return false; 2072 2073 switch (Context) { 2074 case FileContext: 2075 case MemberContext: 2076 case BlockContext: 2077 return true; 2078 2079 case ForContext: 2080 case ConditionContext: 2081 case KNRTypeListContext: 2082 case TypeNameContext: 2083 case AliasDeclContext: 2084 case AliasTemplateContext: 2085 case PrototypeContext: 2086 case LambdaExprParameterContext: 2087 case ObjCParameterContext: 2088 case ObjCResultContext: 2089 case TemplateParamContext: 2090 case CXXNewContext: 2091 case CXXCatchContext: 2092 case ObjCCatchContext: 2093 case BlockLiteralContext: 2094 case LambdaExprContext: 2095 case ConversionIdContext: 2096 case TemplateTypeArgContext: 2097 case TrailingReturnContext: 2098 return false; 2099 } 2100 llvm_unreachable("unknown context kind!"); 2101 } 2102 2103 /// \brief Return true if a function declarator at this position would be a 2104 /// function declaration. isFunctionDeclaratorAFunctionDeclaration()2105 bool isFunctionDeclaratorAFunctionDeclaration() const { 2106 if (!isFunctionDeclarationContext()) 2107 return false; 2108 2109 for (unsigned I = 0, N = getNumTypeObjects(); I != N; ++I) 2110 if (getTypeObject(I).Kind != DeclaratorChunk::Paren) 2111 return false; 2112 2113 return true; 2114 } 2115 2116 /// takeAttributes - Takes attributes from the given parsed-attributes 2117 /// set and add them to this declarator. 2118 /// 2119 /// These examples both add 3 attributes to "var": 2120 /// short int var __attribute__((aligned(16),common,deprecated)); 2121 /// short int x, __attribute__((aligned(16)) var 2122 /// __attribute__((common,deprecated)); 2123 /// 2124 /// Also extends the range of the declarator. takeAttributes(ParsedAttributes & attrs,SourceLocation lastLoc)2125 void takeAttributes(ParsedAttributes &attrs, SourceLocation lastLoc) { 2126 Attrs.takeAllFrom(attrs); 2127 2128 if (!lastLoc.isInvalid()) 2129 SetRangeEnd(lastLoc); 2130 } 2131 getAttributes()2132 const AttributeList *getAttributes() const { return Attrs.getList(); } getAttributes()2133 AttributeList *getAttributes() { return Attrs.getList(); } 2134 getAttrListRef()2135 AttributeList *&getAttrListRef() { return Attrs.getListRef(); } 2136 2137 /// hasAttributes - do we contain any attributes? hasAttributes()2138 bool hasAttributes() const { 2139 if (getAttributes() || getDeclSpec().hasAttributes()) return true; 2140 for (unsigned i = 0, e = getNumTypeObjects(); i != e; ++i) 2141 if (getTypeObject(i).getAttrs()) 2142 return true; 2143 return false; 2144 } 2145 2146 /// \brief Return a source range list of C++11 attributes associated 2147 /// with the declarator. getCXX11AttributeRanges(SmallVectorImpl<SourceRange> & Ranges)2148 void getCXX11AttributeRanges(SmallVectorImpl<SourceRange> &Ranges) { 2149 AttributeList *AttrList = Attrs.getList(); 2150 while (AttrList) { 2151 if (AttrList->isCXX11Attribute()) 2152 Ranges.push_back(AttrList->getRange()); 2153 AttrList = AttrList->getNext(); 2154 } 2155 } 2156 setAsmLabel(Expr * E)2157 void setAsmLabel(Expr *E) { AsmLabel = E; } getAsmLabel()2158 Expr *getAsmLabel() const { return AsmLabel; } 2159 2160 void setExtension(bool Val = true) { Extension = Val; } getExtension()2161 bool getExtension() const { return Extension; } 2162 2163 void setObjCIvar(bool Val = true) { ObjCIvar = Val; } isObjCIvar()2164 bool isObjCIvar() const { return ObjCIvar; } 2165 2166 void setObjCWeakProperty(bool Val = true) { ObjCWeakProperty = Val; } isObjCWeakProperty()2167 bool isObjCWeakProperty() const { return ObjCWeakProperty; } 2168 2169 void setInvalidType(bool Val = true) { InvalidType = Val; } isInvalidType()2170 bool isInvalidType() const { 2171 return InvalidType || DS.getTypeSpecType() == DeclSpec::TST_error; 2172 } 2173 setGroupingParens(bool flag)2174 void setGroupingParens(bool flag) { GroupingParens = flag; } hasGroupingParens()2175 bool hasGroupingParens() const { return GroupingParens; } 2176 isFirstDeclarator()2177 bool isFirstDeclarator() const { return !CommaLoc.isValid(); } getCommaLoc()2178 SourceLocation getCommaLoc() const { return CommaLoc; } setCommaLoc(SourceLocation CL)2179 void setCommaLoc(SourceLocation CL) { CommaLoc = CL; } 2180 hasEllipsis()2181 bool hasEllipsis() const { return EllipsisLoc.isValid(); } getEllipsisLoc()2182 SourceLocation getEllipsisLoc() const { return EllipsisLoc; } setEllipsisLoc(SourceLocation EL)2183 void setEllipsisLoc(SourceLocation EL) { EllipsisLoc = EL; } 2184 setFunctionDefinitionKind(FunctionDefinitionKind Val)2185 void setFunctionDefinitionKind(FunctionDefinitionKind Val) { 2186 FunctionDefinition = Val; 2187 } 2188 isFunctionDefinition()2189 bool isFunctionDefinition() const { 2190 return getFunctionDefinitionKind() != FDK_Declaration; 2191 } 2192 getFunctionDefinitionKind()2193 FunctionDefinitionKind getFunctionDefinitionKind() const { 2194 return (FunctionDefinitionKind)FunctionDefinition; 2195 } 2196 2197 /// Returns true if this declares a real member and not a friend. isFirstDeclarationOfMember()2198 bool isFirstDeclarationOfMember() { 2199 return getContext() == MemberContext && !getDeclSpec().isFriendSpecified(); 2200 } 2201 2202 /// Returns true if this declares a static member. This cannot be called on a 2203 /// declarator outside of a MemberContext because we won't know until 2204 /// redeclaration time if the decl is static. 2205 bool isStaticMember(); 2206 2207 /// Returns true if this declares a constructor or a destructor. 2208 bool isCtorOrDtor(); 2209 setRedeclaration(bool Val)2210 void setRedeclaration(bool Val) { Redeclaration = Val; } isRedeclaration()2211 bool isRedeclaration() const { return Redeclaration; } 2212 }; 2213 2214 /// \brief This little struct is used to capture information about 2215 /// structure field declarators, which is basically just a bitfield size. 2216 struct FieldDeclarator { 2217 Declarator D; 2218 Expr *BitfieldSize; FieldDeclaratorFieldDeclarator2219 explicit FieldDeclarator(const DeclSpec &DS) 2220 : D(DS, Declarator::MemberContext), BitfieldSize(nullptr) { } 2221 }; 2222 2223 /// \brief Represents a C++11 virt-specifier-seq. 2224 class VirtSpecifiers { 2225 public: 2226 enum Specifier { 2227 VS_None = 0, 2228 VS_Override = 1, 2229 VS_Final = 2, 2230 VS_Sealed = 4 2231 }; 2232 VirtSpecifiers()2233 VirtSpecifiers() : Specifiers(0), LastSpecifier(VS_None) { } 2234 2235 bool SetSpecifier(Specifier VS, SourceLocation Loc, 2236 const char *&PrevSpec); 2237 isUnset()2238 bool isUnset() const { return Specifiers == 0; } 2239 isOverrideSpecified()2240 bool isOverrideSpecified() const { return Specifiers & VS_Override; } getOverrideLoc()2241 SourceLocation getOverrideLoc() const { return VS_overrideLoc; } 2242 isFinalSpecified()2243 bool isFinalSpecified() const { return Specifiers & (VS_Final | VS_Sealed); } isFinalSpelledSealed()2244 bool isFinalSpelledSealed() const { return Specifiers & VS_Sealed; } getFinalLoc()2245 SourceLocation getFinalLoc() const { return VS_finalLoc; } 2246 clear()2247 void clear() { Specifiers = 0; } 2248 2249 static const char *getSpecifierName(Specifier VS); 2250 getFirstLocation()2251 SourceLocation getFirstLocation() const { return FirstLocation; } getLastLocation()2252 SourceLocation getLastLocation() const { return LastLocation; } getLastSpecifier()2253 Specifier getLastSpecifier() const { return LastSpecifier; } 2254 2255 private: 2256 unsigned Specifiers; 2257 Specifier LastSpecifier; 2258 2259 SourceLocation VS_overrideLoc, VS_finalLoc; 2260 SourceLocation FirstLocation; 2261 SourceLocation LastLocation; 2262 }; 2263 2264 enum class LambdaCaptureInitKind { 2265 NoInit, //!< [a] 2266 CopyInit, //!< [a = b], [a = {b}] 2267 DirectInit, //!< [a(b)] 2268 ListInit //!< [a{b}] 2269 }; 2270 2271 /// \brief Represents a complete lambda introducer. 2272 struct LambdaIntroducer { 2273 /// \brief An individual capture in a lambda introducer. 2274 struct LambdaCapture { 2275 LambdaCaptureKind Kind; 2276 SourceLocation Loc; 2277 IdentifierInfo *Id; 2278 SourceLocation EllipsisLoc; 2279 LambdaCaptureInitKind InitKind; 2280 ExprResult Init; 2281 ParsedType InitCaptureType; LambdaCaptureLambdaIntroducer::LambdaCapture2282 LambdaCapture(LambdaCaptureKind Kind, SourceLocation Loc, 2283 IdentifierInfo *Id, SourceLocation EllipsisLoc, 2284 LambdaCaptureInitKind InitKind, ExprResult Init, 2285 ParsedType InitCaptureType) 2286 : Kind(Kind), Loc(Loc), Id(Id), EllipsisLoc(EllipsisLoc), 2287 InitKind(InitKind), Init(Init), InitCaptureType(InitCaptureType) {} 2288 }; 2289 2290 SourceRange Range; 2291 SourceLocation DefaultLoc; 2292 LambdaCaptureDefault Default; 2293 SmallVector<LambdaCapture, 4> Captures; 2294 LambdaIntroducerLambdaIntroducer2295 LambdaIntroducer() 2296 : Default(LCD_None) {} 2297 2298 /// \brief Append a capture in a lambda introducer. addCaptureLambdaIntroducer2299 void addCapture(LambdaCaptureKind Kind, 2300 SourceLocation Loc, 2301 IdentifierInfo* Id, 2302 SourceLocation EllipsisLoc, 2303 LambdaCaptureInitKind InitKind, 2304 ExprResult Init, 2305 ParsedType InitCaptureType) { 2306 Captures.push_back(LambdaCapture(Kind, Loc, Id, EllipsisLoc, InitKind, Init, 2307 InitCaptureType)); 2308 } 2309 }; 2310 2311 } // end namespace clang 2312 2313 #endif 2314