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