DeclSpec.cpp revision e6b9d802fb7b16d93474c4f1c179ab36202e8a8b
1//===--- SemaDeclSpec.cpp - Declaration Specifier Semantic Analysis -------===// 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// This file implements semantic analysis for declaration specifiers. 11// 12//===----------------------------------------------------------------------===// 13 14#include "clang/Sema/DeclSpec.h" 15#include "clang/AST/ASTContext.h" 16#include "clang/AST/Expr.h" 17#include "clang/AST/NestedNameSpecifier.h" 18#include "clang/AST/TypeLoc.h" 19#include "clang/Basic/LangOptions.h" 20#include "clang/Lex/Preprocessor.h" 21#include "clang/Parse/ParseDiagnostic.h" // FIXME: remove this back-dependency! 22#include "clang/Sema/LocInfoType.h" 23#include "clang/Sema/ParsedTemplate.h" 24#include "clang/Sema/Sema.h" 25#include "clang/Sema/SemaDiagnostic.h" 26#include "llvm/ADT/STLExtras.h" 27#include "llvm/Support/ErrorHandling.h" 28#include <cstring> 29using namespace clang; 30 31 32static DiagnosticBuilder Diag(DiagnosticsEngine &D, SourceLocation Loc, 33 unsigned DiagID) { 34 return D.Report(Loc, DiagID); 35} 36 37 38void UnqualifiedId::setTemplateId(TemplateIdAnnotation *TemplateId) { 39 assert(TemplateId && "NULL template-id annotation?"); 40 Kind = IK_TemplateId; 41 this->TemplateId = TemplateId; 42 StartLocation = TemplateId->TemplateNameLoc; 43 EndLocation = TemplateId->RAngleLoc; 44} 45 46void UnqualifiedId::setConstructorTemplateId(TemplateIdAnnotation *TemplateId) { 47 assert(TemplateId && "NULL template-id annotation?"); 48 Kind = IK_ConstructorTemplateId; 49 this->TemplateId = TemplateId; 50 StartLocation = TemplateId->TemplateNameLoc; 51 EndLocation = TemplateId->RAngleLoc; 52} 53 54void CXXScopeSpec::Extend(ASTContext &Context, SourceLocation TemplateKWLoc, 55 TypeLoc TL, SourceLocation ColonColonLoc) { 56 Builder.Extend(Context, TemplateKWLoc, TL, ColonColonLoc); 57 if (Range.getBegin().isInvalid()) 58 Range.setBegin(TL.getBeginLoc()); 59 Range.setEnd(ColonColonLoc); 60 61 assert(Range == Builder.getSourceRange() && 62 "NestedNameSpecifierLoc range computation incorrect"); 63} 64 65void CXXScopeSpec::Extend(ASTContext &Context, IdentifierInfo *Identifier, 66 SourceLocation IdentifierLoc, 67 SourceLocation ColonColonLoc) { 68 Builder.Extend(Context, Identifier, IdentifierLoc, ColonColonLoc); 69 70 if (Range.getBegin().isInvalid()) 71 Range.setBegin(IdentifierLoc); 72 Range.setEnd(ColonColonLoc); 73 74 assert(Range == Builder.getSourceRange() && 75 "NestedNameSpecifierLoc range computation incorrect"); 76} 77 78void CXXScopeSpec::Extend(ASTContext &Context, NamespaceDecl *Namespace, 79 SourceLocation NamespaceLoc, 80 SourceLocation ColonColonLoc) { 81 Builder.Extend(Context, Namespace, NamespaceLoc, ColonColonLoc); 82 83 if (Range.getBegin().isInvalid()) 84 Range.setBegin(NamespaceLoc); 85 Range.setEnd(ColonColonLoc); 86 87 assert(Range == Builder.getSourceRange() && 88 "NestedNameSpecifierLoc range computation incorrect"); 89} 90 91void CXXScopeSpec::Extend(ASTContext &Context, NamespaceAliasDecl *Alias, 92 SourceLocation AliasLoc, 93 SourceLocation ColonColonLoc) { 94 Builder.Extend(Context, Alias, AliasLoc, ColonColonLoc); 95 96 if (Range.getBegin().isInvalid()) 97 Range.setBegin(AliasLoc); 98 Range.setEnd(ColonColonLoc); 99 100 assert(Range == Builder.getSourceRange() && 101 "NestedNameSpecifierLoc range computation incorrect"); 102} 103 104void CXXScopeSpec::MakeGlobal(ASTContext &Context, 105 SourceLocation ColonColonLoc) { 106 Builder.MakeGlobal(Context, ColonColonLoc); 107 108 Range = SourceRange(ColonColonLoc); 109 110 assert(Range == Builder.getSourceRange() && 111 "NestedNameSpecifierLoc range computation incorrect"); 112} 113 114void CXXScopeSpec::MakeTrivial(ASTContext &Context, 115 NestedNameSpecifier *Qualifier, SourceRange R) { 116 Builder.MakeTrivial(Context, Qualifier, R); 117 Range = R; 118} 119 120void CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) { 121 if (!Other) { 122 Range = SourceRange(); 123 Builder.Clear(); 124 return; 125 } 126 127 Range = Other.getSourceRange(); 128 Builder.Adopt(Other); 129} 130 131SourceLocation CXXScopeSpec::getLastQualifierNameLoc() const { 132 if (!Builder.getRepresentation()) 133 return SourceLocation(); 134 return Builder.getTemporary().getLocalBeginLoc(); 135} 136 137NestedNameSpecifierLoc 138CXXScopeSpec::getWithLocInContext(ASTContext &Context) const { 139 if (!Builder.getRepresentation()) 140 return NestedNameSpecifierLoc(); 141 142 return Builder.getWithLocInContext(Context); 143} 144 145/// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function. 146/// "TheDeclarator" is the declarator that this will be added to. 147DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, 148 bool isAmbiguous, 149 SourceLocation LParenLoc, 150 ParamInfo *ArgInfo, 151 unsigned NumArgs, 152 SourceLocation EllipsisLoc, 153 SourceLocation RParenLoc, 154 unsigned TypeQuals, 155 bool RefQualifierIsLvalueRef, 156 SourceLocation RefQualifierLoc, 157 SourceLocation ConstQualifierLoc, 158 SourceLocation 159 VolatileQualifierLoc, 160 SourceLocation MutableLoc, 161 ExceptionSpecificationType 162 ESpecType, 163 SourceLocation ESpecLoc, 164 ParsedType *Exceptions, 165 SourceRange *ExceptionRanges, 166 unsigned NumExceptions, 167 Expr *NoexceptExpr, 168 SourceLocation LocalRangeBegin, 169 SourceLocation LocalRangeEnd, 170 Declarator &TheDeclarator, 171 TypeResult TrailingReturnType) { 172 DeclaratorChunk I; 173 I.Kind = Function; 174 I.Loc = LocalRangeBegin; 175 I.EndLoc = LocalRangeEnd; 176 I.Fun.AttrList = 0; 177 I.Fun.hasPrototype = hasProto; 178 I.Fun.isVariadic = EllipsisLoc.isValid(); 179 I.Fun.isAmbiguous = isAmbiguous; 180 I.Fun.LParenLoc = LParenLoc.getRawEncoding(); 181 I.Fun.EllipsisLoc = EllipsisLoc.getRawEncoding(); 182 I.Fun.RParenLoc = RParenLoc.getRawEncoding(); 183 I.Fun.DeleteArgInfo = false; 184 I.Fun.TypeQuals = TypeQuals; 185 I.Fun.NumArgs = NumArgs; 186 I.Fun.ArgInfo = 0; 187 I.Fun.RefQualifierIsLValueRef = RefQualifierIsLvalueRef; 188 I.Fun.RefQualifierLoc = RefQualifierLoc.getRawEncoding(); 189 I.Fun.ConstQualifierLoc = ConstQualifierLoc.getRawEncoding(); 190 I.Fun.VolatileQualifierLoc = VolatileQualifierLoc.getRawEncoding(); 191 I.Fun.MutableLoc = MutableLoc.getRawEncoding(); 192 I.Fun.ExceptionSpecType = ESpecType; 193 I.Fun.ExceptionSpecLoc = ESpecLoc.getRawEncoding(); 194 I.Fun.NumExceptions = 0; 195 I.Fun.Exceptions = 0; 196 I.Fun.NoexceptExpr = 0; 197 I.Fun.HasTrailingReturnType = TrailingReturnType.isUsable() || 198 TrailingReturnType.isInvalid(); 199 I.Fun.TrailingReturnType = TrailingReturnType.get(); 200 201 // new[] an argument array if needed. 202 if (NumArgs) { 203 // If the 'InlineParams' in Declarator is unused and big enough, put our 204 // parameter list there (in an effort to avoid new/delete traffic). If it 205 // is already used (consider a function returning a function pointer) or too 206 // small (function taking too many arguments), go to the heap. 207 if (!TheDeclarator.InlineParamsUsed && 208 NumArgs <= llvm::array_lengthof(TheDeclarator.InlineParams)) { 209 I.Fun.ArgInfo = TheDeclarator.InlineParams; 210 I.Fun.DeleteArgInfo = false; 211 TheDeclarator.InlineParamsUsed = true; 212 } else { 213 I.Fun.ArgInfo = new DeclaratorChunk::ParamInfo[NumArgs]; 214 I.Fun.DeleteArgInfo = true; 215 } 216 memcpy(I.Fun.ArgInfo, ArgInfo, sizeof(ArgInfo[0])*NumArgs); 217 } 218 219 // Check what exception specification information we should actually store. 220 switch (ESpecType) { 221 default: break; // By default, save nothing. 222 case EST_Dynamic: 223 // new[] an exception array if needed 224 if (NumExceptions) { 225 I.Fun.NumExceptions = NumExceptions; 226 I.Fun.Exceptions = new DeclaratorChunk::TypeAndRange[NumExceptions]; 227 for (unsigned i = 0; i != NumExceptions; ++i) { 228 I.Fun.Exceptions[i].Ty = Exceptions[i]; 229 I.Fun.Exceptions[i].Range = ExceptionRanges[i]; 230 } 231 } 232 break; 233 234 case EST_ComputedNoexcept: 235 I.Fun.NoexceptExpr = NoexceptExpr; 236 break; 237 } 238 return I; 239} 240 241bool Declarator::isDeclarationOfFunction() const { 242 for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) { 243 switch (DeclTypeInfo[i].Kind) { 244 case DeclaratorChunk::Function: 245 return true; 246 case DeclaratorChunk::Paren: 247 continue; 248 case DeclaratorChunk::Pointer: 249 case DeclaratorChunk::Reference: 250 case DeclaratorChunk::Array: 251 case DeclaratorChunk::BlockPointer: 252 case DeclaratorChunk::MemberPointer: 253 return false; 254 } 255 llvm_unreachable("Invalid type chunk"); 256 } 257 258 switch (DS.getTypeSpecType()) { 259 case TST_atomic: 260 case TST_auto: 261 case TST_bool: 262 case TST_char: 263 case TST_char16: 264 case TST_char32: 265 case TST_class: 266 case TST_decimal128: 267 case TST_decimal32: 268 case TST_decimal64: 269 case TST_double: 270 case TST_enum: 271 case TST_error: 272 case TST_float: 273 case TST_half: 274 case TST_int: 275 case TST_int128: 276 case TST_struct: 277 case TST_interface: 278 case TST_union: 279 case TST_unknown_anytype: 280 case TST_unspecified: 281 case TST_void: 282 case TST_wchar: 283 case TST_image1d_t: 284 case TST_image1d_array_t: 285 case TST_image1d_buffer_t: 286 case TST_image2d_t: 287 case TST_image2d_array_t: 288 case TST_image3d_t: 289 case TST_event_t: 290 return false; 291 292 case TST_decltype: 293 case TST_typeofExpr: 294 if (Expr *E = DS.getRepAsExpr()) 295 return E->getType()->isFunctionType(); 296 return false; 297 298 case TST_underlyingType: 299 case TST_typename: 300 case TST_typeofType: { 301 QualType QT = DS.getRepAsType().get(); 302 if (QT.isNull()) 303 return false; 304 305 if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) 306 QT = LIT->getType(); 307 308 if (QT.isNull()) 309 return false; 310 311 return QT->isFunctionType(); 312 } 313 } 314 315 llvm_unreachable("Invalid TypeSpecType!"); 316} 317 318/// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this 319/// declaration specifier includes. 320/// 321unsigned DeclSpec::getParsedSpecifiers() const { 322 unsigned Res = 0; 323 if (StorageClassSpec != SCS_unspecified || 324 SCS_thread_specified) 325 Res |= PQ_StorageClassSpecifier; 326 327 if (TypeQualifiers != TQ_unspecified) 328 Res |= PQ_TypeQualifier; 329 330 if (hasTypeSpecifier()) 331 Res |= PQ_TypeSpecifier; 332 333 if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified || 334 FS_noreturn_specified) 335 Res |= PQ_FunctionSpecifier; 336 return Res; 337} 338 339template <class T> static bool BadSpecifier(T TNew, T TPrev, 340 const char *&PrevSpec, 341 unsigned &DiagID, 342 bool IsExtension = true) { 343 PrevSpec = DeclSpec::getSpecifierName(TPrev); 344 if (TNew != TPrev) 345 DiagID = diag::err_invalid_decl_spec_combination; 346 else 347 DiagID = IsExtension ? diag::ext_duplicate_declspec : 348 diag::warn_duplicate_declspec; 349 return true; 350} 351 352const char *DeclSpec::getSpecifierName(DeclSpec::SCS S) { 353 switch (S) { 354 case DeclSpec::SCS_unspecified: return "unspecified"; 355 case DeclSpec::SCS_typedef: return "typedef"; 356 case DeclSpec::SCS_extern: return "extern"; 357 case DeclSpec::SCS_static: return "static"; 358 case DeclSpec::SCS_auto: return "auto"; 359 case DeclSpec::SCS_register: return "register"; 360 case DeclSpec::SCS_private_extern: return "__private_extern__"; 361 case DeclSpec::SCS_mutable: return "mutable"; 362 } 363 llvm_unreachable("Unknown typespec!"); 364} 365 366const char *DeclSpec::getSpecifierName(TSW W) { 367 switch (W) { 368 case TSW_unspecified: return "unspecified"; 369 case TSW_short: return "short"; 370 case TSW_long: return "long"; 371 case TSW_longlong: return "long long"; 372 } 373 llvm_unreachable("Unknown typespec!"); 374} 375 376const char *DeclSpec::getSpecifierName(TSC C) { 377 switch (C) { 378 case TSC_unspecified: return "unspecified"; 379 case TSC_imaginary: return "imaginary"; 380 case TSC_complex: return "complex"; 381 } 382 llvm_unreachable("Unknown typespec!"); 383} 384 385 386const char *DeclSpec::getSpecifierName(TSS S) { 387 switch (S) { 388 case TSS_unspecified: return "unspecified"; 389 case TSS_signed: return "signed"; 390 case TSS_unsigned: return "unsigned"; 391 } 392 llvm_unreachable("Unknown typespec!"); 393} 394 395const char *DeclSpec::getSpecifierName(DeclSpec::TST T) { 396 switch (T) { 397 case DeclSpec::TST_unspecified: return "unspecified"; 398 case DeclSpec::TST_void: return "void"; 399 case DeclSpec::TST_char: return "char"; 400 case DeclSpec::TST_wchar: return "wchar_t"; 401 case DeclSpec::TST_char16: return "char16_t"; 402 case DeclSpec::TST_char32: return "char32_t"; 403 case DeclSpec::TST_int: return "int"; 404 case DeclSpec::TST_int128: return "__int128"; 405 case DeclSpec::TST_half: return "half"; 406 case DeclSpec::TST_float: return "float"; 407 case DeclSpec::TST_double: return "double"; 408 case DeclSpec::TST_bool: return "_Bool"; 409 case DeclSpec::TST_decimal32: return "_Decimal32"; 410 case DeclSpec::TST_decimal64: return "_Decimal64"; 411 case DeclSpec::TST_decimal128: return "_Decimal128"; 412 case DeclSpec::TST_enum: return "enum"; 413 case DeclSpec::TST_class: return "class"; 414 case DeclSpec::TST_union: return "union"; 415 case DeclSpec::TST_struct: return "struct"; 416 case DeclSpec::TST_interface: return "__interface"; 417 case DeclSpec::TST_typename: return "type-name"; 418 case DeclSpec::TST_typeofType: 419 case DeclSpec::TST_typeofExpr: return "typeof"; 420 case DeclSpec::TST_auto: return "auto"; 421 case DeclSpec::TST_decltype: return "(decltype)"; 422 case DeclSpec::TST_underlyingType: return "__underlying_type"; 423 case DeclSpec::TST_unknown_anytype: return "__unknown_anytype"; 424 case DeclSpec::TST_atomic: return "_Atomic"; 425 case DeclSpec::TST_image1d_t: return "image1d_t"; 426 case DeclSpec::TST_image1d_array_t: return "image1d_array_t"; 427 case DeclSpec::TST_image1d_buffer_t: return "image1d_buffer_t"; 428 case DeclSpec::TST_image2d_t: return "image2d_t"; 429 case DeclSpec::TST_image2d_array_t: return "image2d_array_t"; 430 case DeclSpec::TST_image3d_t: return "image3d_t"; 431 case DeclSpec::TST_event_t: return "event_t"; 432 case DeclSpec::TST_error: return "(error)"; 433 } 434 llvm_unreachable("Unknown typespec!"); 435} 436 437const char *DeclSpec::getSpecifierName(TQ T) { 438 switch (T) { 439 case DeclSpec::TQ_unspecified: return "unspecified"; 440 case DeclSpec::TQ_const: return "const"; 441 case DeclSpec::TQ_restrict: return "restrict"; 442 case DeclSpec::TQ_volatile: return "volatile"; 443 } 444 llvm_unreachable("Unknown typespec!"); 445} 446 447bool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, 448 const char *&PrevSpec, 449 unsigned &DiagID) { 450 // OpenCL v1.1 s6.8g: "The extern, static, auto and register storage-class 451 // specifiers are not supported. 452 // It seems sensible to prohibit private_extern too 453 // The cl_clang_storage_class_specifiers extension enables support for 454 // these storage-class specifiers. 455 // OpenCL v1.2 s6.8 changes this to "The auto and register storage-class 456 // specifiers are not supported." 457 if (S.getLangOpts().OpenCL && 458 !S.getOpenCLOptions().cl_clang_storage_class_specifiers) { 459 switch (SC) { 460 case SCS_extern: 461 case SCS_private_extern: 462 case SCS_static: 463 if (S.getLangOpts().OpenCLVersion < 120) { 464 DiagID = diag::err_not_opencl_storage_class_specifier; 465 PrevSpec = getSpecifierName(SC); 466 return true; 467 } 468 break; 469 case SCS_auto: 470 case SCS_register: 471 DiagID = diag::err_not_opencl_storage_class_specifier; 472 PrevSpec = getSpecifierName(SC); 473 return true; 474 default: 475 break; 476 } 477 } 478 479 if (StorageClassSpec != SCS_unspecified) { 480 // Maybe this is an attempt to use C++0x 'auto' outside of C++0x mode. 481 bool isInvalid = true; 482 if (TypeSpecType == TST_unspecified && S.getLangOpts().CPlusPlus) { 483 if (SC == SCS_auto) 484 return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID); 485 if (StorageClassSpec == SCS_auto) { 486 isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc, 487 PrevSpec, DiagID); 488 assert(!isInvalid && "auto SCS -> TST recovery failed"); 489 } 490 } 491 492 // Changing storage class is allowed only if the previous one 493 // was the 'extern' that is part of a linkage specification and 494 // the new storage class is 'typedef'. 495 if (isInvalid && 496 !(SCS_extern_in_linkage_spec && 497 StorageClassSpec == SCS_extern && 498 SC == SCS_typedef)) 499 return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID); 500 } 501 StorageClassSpec = SC; 502 StorageClassSpecLoc = Loc; 503 assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield"); 504 return false; 505} 506 507bool DeclSpec::SetStorageClassSpecThread(SourceLocation Loc, 508 const char *&PrevSpec, 509 unsigned &DiagID) { 510 if (SCS_thread_specified) { 511 PrevSpec = "__thread"; 512 DiagID = diag::ext_duplicate_declspec; 513 return true; 514 } 515 SCS_thread_specified = true; 516 SCS_threadLoc = Loc; 517 return false; 518} 519 520/// These methods set the specified attribute of the DeclSpec, but return true 521/// and ignore the request if invalid (e.g. "extern" then "auto" is 522/// specified). 523bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc, 524 const char *&PrevSpec, 525 unsigned &DiagID) { 526 // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that 527 // for 'long long' we will keep the source location of the first 'long'. 528 if (TypeSpecWidth == TSW_unspecified) 529 TSWLoc = Loc; 530 // Allow turning long -> long long. 531 else if (W != TSW_longlong || TypeSpecWidth != TSW_long) 532 return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID); 533 TypeSpecWidth = W; 534 if (TypeAltiVecVector && !TypeAltiVecBool && 535 ((TypeSpecWidth == TSW_long) || (TypeSpecWidth == TSW_longlong))) { 536 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 537 DiagID = diag::warn_vector_long_decl_spec_combination; 538 return true; 539 } 540 return false; 541} 542 543bool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc, 544 const char *&PrevSpec, 545 unsigned &DiagID) { 546 if (TypeSpecComplex != TSC_unspecified) 547 return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID); 548 TypeSpecComplex = C; 549 TSCLoc = Loc; 550 return false; 551} 552 553bool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc, 554 const char *&PrevSpec, 555 unsigned &DiagID) { 556 if (TypeSpecSign != TSS_unspecified) 557 return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID); 558 TypeSpecSign = S; 559 TSSLoc = Loc; 560 return false; 561} 562 563bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 564 const char *&PrevSpec, 565 unsigned &DiagID, 566 ParsedType Rep) { 567 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep); 568} 569 570bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc, 571 SourceLocation TagNameLoc, 572 const char *&PrevSpec, 573 unsigned &DiagID, 574 ParsedType Rep) { 575 assert(isTypeRep(T) && "T does not store a type"); 576 assert(Rep && "no type provided!"); 577 if (TypeSpecType != TST_unspecified) { 578 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 579 DiagID = diag::err_invalid_decl_spec_combination; 580 return true; 581 } 582 TypeSpecType = T; 583 TypeRep = Rep; 584 TSTLoc = TagKwLoc; 585 TSTNameLoc = TagNameLoc; 586 TypeSpecOwned = false; 587 return false; 588} 589 590bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 591 const char *&PrevSpec, 592 unsigned &DiagID, 593 Expr *Rep) { 594 assert(isExprRep(T) && "T does not store an expr"); 595 assert(Rep && "no expression provided!"); 596 if (TypeSpecType != TST_unspecified) { 597 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 598 DiagID = diag::err_invalid_decl_spec_combination; 599 return true; 600 } 601 TypeSpecType = T; 602 ExprRep = Rep; 603 TSTLoc = Loc; 604 TSTNameLoc = Loc; 605 TypeSpecOwned = false; 606 return false; 607} 608 609bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 610 const char *&PrevSpec, 611 unsigned &DiagID, 612 Decl *Rep, bool Owned) { 613 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned); 614} 615 616bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc, 617 SourceLocation TagNameLoc, 618 const char *&PrevSpec, 619 unsigned &DiagID, 620 Decl *Rep, bool Owned) { 621 assert(isDeclRep(T) && "T does not store a decl"); 622 // Unlike the other cases, we don't assert that we actually get a decl. 623 624 if (TypeSpecType != TST_unspecified) { 625 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 626 DiagID = diag::err_invalid_decl_spec_combination; 627 return true; 628 } 629 TypeSpecType = T; 630 DeclRep = Rep; 631 TSTLoc = TagKwLoc; 632 TSTNameLoc = TagNameLoc; 633 TypeSpecOwned = Owned; 634 return false; 635} 636 637bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 638 const char *&PrevSpec, 639 unsigned &DiagID) { 640 assert(!isDeclRep(T) && !isTypeRep(T) && !isExprRep(T) && 641 "rep required for these type-spec kinds!"); 642 if (TypeSpecType != TST_unspecified) { 643 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 644 DiagID = diag::err_invalid_decl_spec_combination; 645 return true; 646 } 647 TSTLoc = Loc; 648 TSTNameLoc = Loc; 649 if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) { 650 TypeAltiVecBool = true; 651 return false; 652 } 653 TypeSpecType = T; 654 TypeSpecOwned = false; 655 if (TypeAltiVecVector && !TypeAltiVecBool && (TypeSpecType == TST_double)) { 656 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 657 DiagID = diag::err_invalid_vector_decl_spec; 658 return true; 659 } 660 return false; 661} 662 663bool DeclSpec::SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc, 664 const char *&PrevSpec, unsigned &DiagID) { 665 if (TypeSpecType != TST_unspecified) { 666 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 667 DiagID = diag::err_invalid_vector_decl_spec_combination; 668 return true; 669 } 670 TypeAltiVecVector = isAltiVecVector; 671 AltiVecLoc = Loc; 672 return false; 673} 674 675bool DeclSpec::SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc, 676 const char *&PrevSpec, unsigned &DiagID) { 677 if (!TypeAltiVecVector || TypeAltiVecPixel || 678 (TypeSpecType != TST_unspecified)) { 679 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 680 DiagID = diag::err_invalid_pixel_decl_spec_combination; 681 return true; 682 } 683 TypeAltiVecPixel = isAltiVecPixel; 684 TSTLoc = Loc; 685 TSTNameLoc = Loc; 686 return false; 687} 688 689bool DeclSpec::SetTypeSpecError() { 690 TypeSpecType = TST_error; 691 TypeSpecOwned = false; 692 TSTLoc = SourceLocation(); 693 TSTNameLoc = SourceLocation(); 694 return false; 695} 696 697bool DeclSpec::SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec, 698 unsigned &DiagID, const LangOptions &Lang) { 699 // Duplicates are permitted in C99, but are not permitted in C++. However, 700 // since this is likely not what the user intended, we will always warn. We 701 // do not need to set the qualifier's location since we already have it. 702 if (TypeQualifiers & T) { 703 bool IsExtension = true; 704 if (Lang.C99) 705 IsExtension = false; 706 return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension); 707 } 708 TypeQualifiers |= T; 709 710 switch (T) { 711 default: llvm_unreachable("Unknown type qualifier!"); 712 case TQ_const: TQ_constLoc = Loc; break; 713 case TQ_restrict: TQ_restrictLoc = Loc; break; 714 case TQ_volatile: TQ_volatileLoc = Loc; break; 715 } 716 return false; 717} 718 719bool DeclSpec::setFunctionSpecInline(SourceLocation Loc) { 720 // 'inline inline' is ok. 721 FS_inline_specified = true; 722 FS_inlineLoc = Loc; 723 return false; 724} 725 726bool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc) { 727 // 'virtual virtual' is ok. 728 FS_virtual_specified = true; 729 FS_virtualLoc = Loc; 730 return false; 731} 732 733bool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc) { 734 // 'explicit explicit' is ok. 735 FS_explicit_specified = true; 736 FS_explicitLoc = Loc; 737 return false; 738} 739 740bool DeclSpec::setFunctionSpecNoreturn(SourceLocation Loc) { 741 // '_Noreturn _Noreturn' is ok. 742 FS_noreturn_specified = true; 743 FS_noreturnLoc = Loc; 744 return false; 745} 746 747bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec, 748 unsigned &DiagID) { 749 if (Friend_specified) { 750 PrevSpec = "friend"; 751 DiagID = diag::ext_duplicate_declspec; 752 return true; 753 } 754 755 Friend_specified = true; 756 FriendLoc = Loc; 757 return false; 758} 759 760bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec, 761 unsigned &DiagID) { 762 if (isModulePrivateSpecified()) { 763 PrevSpec = "__module_private__"; 764 DiagID = diag::ext_duplicate_declspec; 765 return true; 766 } 767 768 ModulePrivateLoc = Loc; 769 return false; 770} 771 772bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec, 773 unsigned &DiagID) { 774 // 'constexpr constexpr' is ok. 775 Constexpr_specified = true; 776 ConstexprLoc = Loc; 777 return false; 778} 779 780void DeclSpec::setProtocolQualifiers(Decl * const *Protos, 781 unsigned NP, 782 SourceLocation *ProtoLocs, 783 SourceLocation LAngleLoc) { 784 if (NP == 0) return; 785 Decl **ProtoQuals = new Decl*[NP]; 786 memcpy(ProtoQuals, Protos, sizeof(Decl*)*NP); 787 ProtocolQualifiers = ProtoQuals; 788 ProtocolLocs = new SourceLocation[NP]; 789 memcpy(ProtocolLocs, ProtoLocs, sizeof(SourceLocation)*NP); 790 NumProtocolQualifiers = NP; 791 ProtocolLAngleLoc = LAngleLoc; 792} 793 794void DeclSpec::SaveWrittenBuiltinSpecs() { 795 writtenBS.Sign = getTypeSpecSign(); 796 writtenBS.Width = getTypeSpecWidth(); 797 writtenBS.Type = getTypeSpecType(); 798 // Search the list of attributes for the presence of a mode attribute. 799 writtenBS.ModeAttr = false; 800 AttributeList* attrs = getAttributes().getList(); 801 while (attrs) { 802 if (attrs->getKind() == AttributeList::AT_Mode) { 803 writtenBS.ModeAttr = true; 804 break; 805 } 806 attrs = attrs->getNext(); 807 } 808} 809 810void DeclSpec::SaveStorageSpecifierAsWritten() { 811 if (SCS_extern_in_linkage_spec && StorageClassSpec == SCS_extern) 812 // If 'extern' is part of a linkage specification, 813 // then it is not a storage class "as written". 814 StorageClassSpecAsWritten = SCS_unspecified; 815 else 816 StorageClassSpecAsWritten = StorageClassSpec; 817} 818 819/// Finish - This does final analysis of the declspec, rejecting things like 820/// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or 821/// diag::NUM_DIAGNOSTICS if there is no error. After calling this method, 822/// DeclSpec is guaranteed self-consistent, even if an error occurred. 823void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP) { 824 // Before possibly changing their values, save specs as written. 825 SaveWrittenBuiltinSpecs(); 826 SaveStorageSpecifierAsWritten(); 827 828 // Check the type specifier components first. 829 830 // Validate and finalize AltiVec vector declspec. 831 if (TypeAltiVecVector) { 832 if (TypeAltiVecBool) { 833 // Sign specifiers are not allowed with vector bool. (PIM 2.1) 834 if (TypeSpecSign != TSS_unspecified) { 835 Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec) 836 << getSpecifierName((TSS)TypeSpecSign); 837 } 838 839 // Only char/int are valid with vector bool. (PIM 2.1) 840 if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) && 841 (TypeSpecType != TST_int)) || TypeAltiVecPixel) { 842 Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec) 843 << (TypeAltiVecPixel ? "__pixel" : 844 getSpecifierName((TST)TypeSpecType)); 845 } 846 847 // Only 'short' is valid with vector bool. (PIM 2.1) 848 if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short)) 849 Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec) 850 << getSpecifierName((TSW)TypeSpecWidth); 851 852 // Elements of vector bool are interpreted as unsigned. (PIM 2.1) 853 if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) || 854 (TypeSpecWidth != TSW_unspecified)) 855 TypeSpecSign = TSS_unsigned; 856 } 857 858 if (TypeAltiVecPixel) { 859 //TODO: perform validation 860 TypeSpecType = TST_int; 861 TypeSpecSign = TSS_unsigned; 862 TypeSpecWidth = TSW_short; 863 TypeSpecOwned = false; 864 } 865 } 866 867 // signed/unsigned are only valid with int/char/wchar_t. 868 if (TypeSpecSign != TSS_unspecified) { 869 if (TypeSpecType == TST_unspecified) 870 TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int. 871 else if (TypeSpecType != TST_int && TypeSpecType != TST_int128 && 872 TypeSpecType != TST_char && TypeSpecType != TST_wchar) { 873 Diag(D, TSSLoc, diag::err_invalid_sign_spec) 874 << getSpecifierName((TST)TypeSpecType); 875 // signed double -> double. 876 TypeSpecSign = TSS_unspecified; 877 } 878 } 879 880 // Validate the width of the type. 881 switch (TypeSpecWidth) { 882 case TSW_unspecified: break; 883 case TSW_short: // short int 884 case TSW_longlong: // long long int 885 if (TypeSpecType == TST_unspecified) 886 TypeSpecType = TST_int; // short -> short int, long long -> long long int. 887 else if (TypeSpecType != TST_int) { 888 Diag(D, TSWLoc, 889 TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec 890 : diag::err_invalid_longlong_spec) 891 << getSpecifierName((TST)TypeSpecType); 892 TypeSpecType = TST_int; 893 TypeSpecOwned = false; 894 } 895 break; 896 case TSW_long: // long double, long int 897 if (TypeSpecType == TST_unspecified) 898 TypeSpecType = TST_int; // long -> long int. 899 else if (TypeSpecType != TST_int && TypeSpecType != TST_double) { 900 Diag(D, TSWLoc, diag::err_invalid_long_spec) 901 << getSpecifierName((TST)TypeSpecType); 902 TypeSpecType = TST_int; 903 TypeSpecOwned = false; 904 } 905 break; 906 } 907 908 // TODO: if the implementation does not implement _Complex or _Imaginary, 909 // disallow their use. Need information about the backend. 910 if (TypeSpecComplex != TSC_unspecified) { 911 if (TypeSpecType == TST_unspecified) { 912 Diag(D, TSCLoc, diag::ext_plain_complex) 913 << FixItHint::CreateInsertion( 914 PP.getLocForEndOfToken(getTypeSpecComplexLoc()), 915 " double"); 916 TypeSpecType = TST_double; // _Complex -> _Complex double. 917 } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) { 918 // Note that this intentionally doesn't include _Complex _Bool. 919 if (!PP.getLangOpts().CPlusPlus) 920 Diag(D, TSTLoc, diag::ext_integer_complex); 921 } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) { 922 Diag(D, TSCLoc, diag::err_invalid_complex_spec) 923 << getSpecifierName((TST)TypeSpecType); 924 TypeSpecComplex = TSC_unspecified; 925 } 926 } 927 928 // If no type specifier was provided and we're parsing a language where 929 // the type specifier is not optional, but we got 'auto' as a storage 930 // class specifier, then assume this is an attempt to use C++0x's 'auto' 931 // type specifier. 932 // FIXME: Does Microsoft really support implicit int in C++? 933 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().MicrosoftExt && 934 TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) { 935 TypeSpecType = TST_auto; 936 StorageClassSpec = StorageClassSpecAsWritten = SCS_unspecified; 937 TSTLoc = TSTNameLoc = StorageClassSpecLoc; 938 StorageClassSpecLoc = SourceLocation(); 939 } 940 // Diagnose if we've recovered from an ill-formed 'auto' storage class 941 // specifier in a pre-C++0x dialect of C++. 942 if (!PP.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto) 943 Diag(D, TSTLoc, diag::ext_auto_type_specifier); 944 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus11 && 945 StorageClassSpec == SCS_auto) 946 Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class) 947 << FixItHint::CreateRemoval(StorageClassSpecLoc); 948 if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32) 949 Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type) 950 << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t"); 951 if (Constexpr_specified) 952 Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr); 953 954 // C++ [class.friend]p6: 955 // No storage-class-specifier shall appear in the decl-specifier-seq 956 // of a friend declaration. 957 if (isFriendSpecified() && getStorageClassSpec()) { 958 DeclSpec::SCS SC = getStorageClassSpec(); 959 const char *SpecName = getSpecifierName(SC); 960 961 SourceLocation SCLoc = getStorageClassSpecLoc(); 962 SourceLocation SCEndLoc = SCLoc.getLocWithOffset(strlen(SpecName)); 963 964 Diag(D, SCLoc, diag::err_friend_storage_spec) 965 << SpecName 966 << FixItHint::CreateRemoval(SourceRange(SCLoc, SCEndLoc)); 967 968 ClearStorageClassSpecs(); 969 } 970 971 assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType)); 972 973 // Okay, now we can infer the real type. 974 975 // TODO: return "auto function" and other bad things based on the real type. 976 977 // 'data definition has no type or storage class'? 978} 979 980bool DeclSpec::isMissingDeclaratorOk() { 981 TST tst = getTypeSpecType(); 982 return isDeclRep(tst) && getRepAsDecl() != 0 && 983 StorageClassSpec != DeclSpec::SCS_typedef; 984} 985 986void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc, 987 OverloadedOperatorKind Op, 988 SourceLocation SymbolLocations[3]) { 989 Kind = IK_OperatorFunctionId; 990 StartLocation = OperatorLoc; 991 EndLocation = OperatorLoc; 992 OperatorFunctionId.Operator = Op; 993 for (unsigned I = 0; I != 3; ++I) { 994 OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding(); 995 996 if (SymbolLocations[I].isValid()) 997 EndLocation = SymbolLocations[I]; 998 } 999} 1000 1001bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc, 1002 const char *&PrevSpec) { 1003 LastLocation = Loc; 1004 1005 if (Specifiers & VS) { 1006 PrevSpec = getSpecifierName(VS); 1007 return true; 1008 } 1009 1010 Specifiers |= VS; 1011 1012 switch (VS) { 1013 default: llvm_unreachable("Unknown specifier!"); 1014 case VS_Override: VS_overrideLoc = Loc; break; 1015 case VS_Final: VS_finalLoc = Loc; break; 1016 } 1017 1018 return false; 1019} 1020 1021const char *VirtSpecifiers::getSpecifierName(Specifier VS) { 1022 switch (VS) { 1023 default: llvm_unreachable("Unknown specifier"); 1024 case VS_Override: return "override"; 1025 case VS_Final: return "final"; 1026 } 1027} 1028