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