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