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