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