DeclSpec.cpp revision 67a0f6ef5ae38e1abddb278544e18aede6ea7833
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 return false; 290 291 case TST_decltype: 292 case TST_typeofExpr: 293 if (Expr *E = DS.getRepAsExpr()) 294 return E->getType()->isFunctionType(); 295 return false; 296 297 case TST_underlyingType: 298 case TST_typename: 299 case TST_typeofType: { 300 QualType QT = DS.getRepAsType().get(); 301 if (QT.isNull()) 302 return false; 303 304 if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) 305 QT = LIT->getType(); 306 307 if (QT.isNull()) 308 return false; 309 310 return QT->isFunctionType(); 311 } 312 } 313 314 llvm_unreachable("Invalid TypeSpecType!"); 315} 316 317/// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this 318/// declaration specifier includes. 319/// 320unsigned DeclSpec::getParsedSpecifiers() const { 321 unsigned Res = 0; 322 if (StorageClassSpec != SCS_unspecified || 323 SCS_thread_specified) 324 Res |= PQ_StorageClassSpecifier; 325 326 if (TypeQualifiers != TQ_unspecified) 327 Res |= PQ_TypeQualifier; 328 329 if (hasTypeSpecifier()) 330 Res |= PQ_TypeSpecifier; 331 332 if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified) 333 Res |= PQ_FunctionSpecifier; 334 return Res; 335} 336 337template <class T> static bool BadSpecifier(T TNew, T TPrev, 338 const char *&PrevSpec, 339 unsigned &DiagID, 340 bool IsExtension = true) { 341 PrevSpec = DeclSpec::getSpecifierName(TPrev); 342 if (TNew != TPrev) 343 DiagID = diag::err_invalid_decl_spec_combination; 344 else 345 DiagID = IsExtension ? diag::ext_duplicate_declspec : 346 diag::warn_duplicate_declspec; 347 return true; 348} 349 350const char *DeclSpec::getSpecifierName(DeclSpec::SCS S) { 351 switch (S) { 352 case DeclSpec::SCS_unspecified: return "unspecified"; 353 case DeclSpec::SCS_typedef: return "typedef"; 354 case DeclSpec::SCS_extern: return "extern"; 355 case DeclSpec::SCS_static: return "static"; 356 case DeclSpec::SCS_auto: return "auto"; 357 case DeclSpec::SCS_register: return "register"; 358 case DeclSpec::SCS_private_extern: return "__private_extern__"; 359 case DeclSpec::SCS_mutable: return "mutable"; 360 } 361 llvm_unreachable("Unknown typespec!"); 362} 363 364const char *DeclSpec::getSpecifierName(TSW W) { 365 switch (W) { 366 case TSW_unspecified: return "unspecified"; 367 case TSW_short: return "short"; 368 case TSW_long: return "long"; 369 case TSW_longlong: return "long long"; 370 } 371 llvm_unreachable("Unknown typespec!"); 372} 373 374const char *DeclSpec::getSpecifierName(TSC C) { 375 switch (C) { 376 case TSC_unspecified: return "unspecified"; 377 case TSC_imaginary: return "imaginary"; 378 case TSC_complex: return "complex"; 379 } 380 llvm_unreachable("Unknown typespec!"); 381} 382 383 384const char *DeclSpec::getSpecifierName(TSS S) { 385 switch (S) { 386 case TSS_unspecified: return "unspecified"; 387 case TSS_signed: return "signed"; 388 case TSS_unsigned: return "unsigned"; 389 } 390 llvm_unreachable("Unknown typespec!"); 391} 392 393const char *DeclSpec::getSpecifierName(DeclSpec::TST T) { 394 switch (T) { 395 case DeclSpec::TST_unspecified: return "unspecified"; 396 case DeclSpec::TST_void: return "void"; 397 case DeclSpec::TST_char: return "char"; 398 case DeclSpec::TST_wchar: return "wchar_t"; 399 case DeclSpec::TST_char16: return "char16_t"; 400 case DeclSpec::TST_char32: return "char32_t"; 401 case DeclSpec::TST_int: return "int"; 402 case DeclSpec::TST_int128: return "__int128"; 403 case DeclSpec::TST_half: return "half"; 404 case DeclSpec::TST_float: return "float"; 405 case DeclSpec::TST_double: return "double"; 406 case DeclSpec::TST_bool: return "_Bool"; 407 case DeclSpec::TST_decimal32: return "_Decimal32"; 408 case DeclSpec::TST_decimal64: return "_Decimal64"; 409 case DeclSpec::TST_decimal128: return "_Decimal128"; 410 case DeclSpec::TST_enum: return "enum"; 411 case DeclSpec::TST_class: return "class"; 412 case DeclSpec::TST_union: return "union"; 413 case DeclSpec::TST_struct: return "struct"; 414 case DeclSpec::TST_interface: return "__interface"; 415 case DeclSpec::TST_typename: return "type-name"; 416 case DeclSpec::TST_typeofType: 417 case DeclSpec::TST_typeofExpr: return "typeof"; 418 case DeclSpec::TST_auto: return "auto"; 419 case DeclSpec::TST_decltype: return "(decltype)"; 420 case DeclSpec::TST_underlyingType: return "__underlying_type"; 421 case DeclSpec::TST_unknown_anytype: return "__unknown_anytype"; 422 case DeclSpec::TST_atomic: return "_Atomic"; 423 case DeclSpec::TST_image1d_t: return "image1d_t"; 424 case DeclSpec::TST_image1d_array_t: return "image1d_array_t"; 425 case DeclSpec::TST_image1d_buffer_t: return "image1d_buffer_t"; 426 case DeclSpec::TST_image2d_t: return "image2d_t"; 427 case DeclSpec::TST_image2d_array_t: return "image2d_array_t"; 428 case DeclSpec::TST_image3d_t: return "image3d_t"; 429 case DeclSpec::TST_error: return "(error)"; 430 } 431 llvm_unreachable("Unknown typespec!"); 432} 433 434const char *DeclSpec::getSpecifierName(TQ T) { 435 switch (T) { 436 case DeclSpec::TQ_unspecified: return "unspecified"; 437 case DeclSpec::TQ_const: return "const"; 438 case DeclSpec::TQ_restrict: return "restrict"; 439 case DeclSpec::TQ_volatile: return "volatile"; 440 } 441 llvm_unreachable("Unknown typespec!"); 442} 443 444bool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, 445 const char *&PrevSpec, 446 unsigned &DiagID) { 447 // OpenCL v1.1 s6.8g: "The extern, static, auto and register storage-class 448 // specifiers are not supported. 449 // It seems sensible to prohibit private_extern too 450 // The cl_clang_storage_class_specifiers extension enables support for 451 // these storage-class specifiers. 452 // OpenCL v1.2 s6.8 changes this to "The auto and register storage-class 453 // specifiers are not supported." 454 if (S.getLangOpts().OpenCL && 455 !S.getOpenCLOptions().cl_clang_storage_class_specifiers) { 456 switch (SC) { 457 case SCS_extern: 458 case SCS_private_extern: 459 case SCS_static: 460 if (S.getLangOpts().OpenCLVersion < 120) { 461 DiagID = diag::err_not_opencl_storage_class_specifier; 462 PrevSpec = getSpecifierName(SC); 463 return true; 464 } 465 break; 466 case SCS_auto: 467 case SCS_register: 468 DiagID = diag::err_not_opencl_storage_class_specifier; 469 PrevSpec = getSpecifierName(SC); 470 return true; 471 default: 472 break; 473 } 474 } 475 476 if (StorageClassSpec != SCS_unspecified) { 477 // Maybe this is an attempt to use C++0x 'auto' outside of C++0x mode. 478 bool isInvalid = true; 479 if (TypeSpecType == TST_unspecified && S.getLangOpts().CPlusPlus) { 480 if (SC == SCS_auto) 481 return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID); 482 if (StorageClassSpec == SCS_auto) { 483 isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc, 484 PrevSpec, DiagID); 485 assert(!isInvalid && "auto SCS -> TST recovery failed"); 486 } 487 } 488 489 // Changing storage class is allowed only if the previous one 490 // was the 'extern' that is part of a linkage specification and 491 // the new storage class is 'typedef'. 492 if (isInvalid && 493 !(SCS_extern_in_linkage_spec && 494 StorageClassSpec == SCS_extern && 495 SC == SCS_typedef)) 496 return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID); 497 } 498 StorageClassSpec = SC; 499 StorageClassSpecLoc = Loc; 500 assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield"); 501 return false; 502} 503 504bool DeclSpec::SetStorageClassSpecThread(SourceLocation Loc, 505 const char *&PrevSpec, 506 unsigned &DiagID) { 507 if (SCS_thread_specified) { 508 PrevSpec = "__thread"; 509 DiagID = diag::ext_duplicate_declspec; 510 return true; 511 } 512 SCS_thread_specified = true; 513 SCS_threadLoc = Loc; 514 return false; 515} 516 517/// These methods set the specified attribute of the DeclSpec, but return true 518/// and ignore the request if invalid (e.g. "extern" then "auto" is 519/// specified). 520bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc, 521 const char *&PrevSpec, 522 unsigned &DiagID) { 523 // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that 524 // for 'long long' we will keep the source location of the first 'long'. 525 if (TypeSpecWidth == TSW_unspecified) 526 TSWLoc = Loc; 527 // Allow turning long -> long long. 528 else if (W != TSW_longlong || TypeSpecWidth != TSW_long) 529 return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID); 530 TypeSpecWidth = W; 531 if (TypeAltiVecVector && !TypeAltiVecBool && 532 ((TypeSpecWidth == TSW_long) || (TypeSpecWidth == TSW_longlong))) { 533 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 534 DiagID = diag::warn_vector_long_decl_spec_combination; 535 return true; 536 } 537 return false; 538} 539 540bool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc, 541 const char *&PrevSpec, 542 unsigned &DiagID) { 543 if (TypeSpecComplex != TSC_unspecified) 544 return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID); 545 TypeSpecComplex = C; 546 TSCLoc = Loc; 547 return false; 548} 549 550bool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc, 551 const char *&PrevSpec, 552 unsigned &DiagID) { 553 if (TypeSpecSign != TSS_unspecified) 554 return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID); 555 TypeSpecSign = S; 556 TSSLoc = Loc; 557 return false; 558} 559 560bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 561 const char *&PrevSpec, 562 unsigned &DiagID, 563 ParsedType Rep) { 564 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep); 565} 566 567bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc, 568 SourceLocation TagNameLoc, 569 const char *&PrevSpec, 570 unsigned &DiagID, 571 ParsedType Rep) { 572 assert(isTypeRep(T) && "T does not store a type"); 573 assert(Rep && "no type provided!"); 574 if (TypeSpecType != TST_unspecified) { 575 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 576 DiagID = diag::err_invalid_decl_spec_combination; 577 return true; 578 } 579 TypeSpecType = T; 580 TypeRep = Rep; 581 TSTLoc = TagKwLoc; 582 TSTNameLoc = TagNameLoc; 583 TypeSpecOwned = false; 584 return false; 585} 586 587bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 588 const char *&PrevSpec, 589 unsigned &DiagID, 590 Expr *Rep) { 591 assert(isExprRep(T) && "T does not store an expr"); 592 assert(Rep && "no expression provided!"); 593 if (TypeSpecType != TST_unspecified) { 594 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 595 DiagID = diag::err_invalid_decl_spec_combination; 596 return true; 597 } 598 TypeSpecType = T; 599 ExprRep = Rep; 600 TSTLoc = Loc; 601 TSTNameLoc = Loc; 602 TypeSpecOwned = false; 603 return false; 604} 605 606bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 607 const char *&PrevSpec, 608 unsigned &DiagID, 609 Decl *Rep, bool Owned) { 610 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned); 611} 612 613bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc, 614 SourceLocation TagNameLoc, 615 const char *&PrevSpec, 616 unsigned &DiagID, 617 Decl *Rep, bool Owned) { 618 assert(isDeclRep(T) && "T does not store a decl"); 619 // Unlike the other cases, we don't assert that we actually get a decl. 620 621 if (TypeSpecType != TST_unspecified) { 622 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 623 DiagID = diag::err_invalid_decl_spec_combination; 624 return true; 625 } 626 TypeSpecType = T; 627 DeclRep = Rep; 628 TSTLoc = TagKwLoc; 629 TSTNameLoc = TagNameLoc; 630 TypeSpecOwned = Owned; 631 return false; 632} 633 634bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 635 const char *&PrevSpec, 636 unsigned &DiagID) { 637 assert(!isDeclRep(T) && !isTypeRep(T) && !isExprRep(T) && 638 "rep required for these type-spec kinds!"); 639 if (TypeSpecType != TST_unspecified) { 640 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 641 DiagID = diag::err_invalid_decl_spec_combination; 642 return true; 643 } 644 TSTLoc = Loc; 645 TSTNameLoc = Loc; 646 if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) { 647 TypeAltiVecBool = true; 648 return false; 649 } 650 TypeSpecType = T; 651 TypeSpecOwned = false; 652 if (TypeAltiVecVector && !TypeAltiVecBool && (TypeSpecType == TST_double)) { 653 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 654 DiagID = diag::err_invalid_vector_decl_spec; 655 return true; 656 } 657 return false; 658} 659 660bool DeclSpec::SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc, 661 const char *&PrevSpec, unsigned &DiagID) { 662 if (TypeSpecType != TST_unspecified) { 663 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 664 DiagID = diag::err_invalid_vector_decl_spec_combination; 665 return true; 666 } 667 TypeAltiVecVector = isAltiVecVector; 668 AltiVecLoc = Loc; 669 return false; 670} 671 672bool DeclSpec::SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc, 673 const char *&PrevSpec, unsigned &DiagID) { 674 if (!TypeAltiVecVector || TypeAltiVecPixel || 675 (TypeSpecType != TST_unspecified)) { 676 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 677 DiagID = diag::err_invalid_pixel_decl_spec_combination; 678 return true; 679 } 680 TypeAltiVecPixel = isAltiVecPixel; 681 TSTLoc = Loc; 682 TSTNameLoc = Loc; 683 return false; 684} 685 686bool DeclSpec::SetTypeSpecError() { 687 TypeSpecType = TST_error; 688 TypeSpecOwned = false; 689 TSTLoc = SourceLocation(); 690 TSTNameLoc = SourceLocation(); 691 return false; 692} 693 694bool DeclSpec::SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec, 695 unsigned &DiagID, const LangOptions &Lang) { 696 // Duplicates are permitted in C99, but are not permitted in C++. However, 697 // since this is likely not what the user intended, we will always warn. We 698 // do not need to set the qualifier's location since we already have it. 699 if (TypeQualifiers & T) { 700 bool IsExtension = true; 701 if (Lang.C99) 702 IsExtension = false; 703 return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension); 704 } 705 TypeQualifiers |= T; 706 707 switch (T) { 708 default: llvm_unreachable("Unknown type qualifier!"); 709 case TQ_const: TQ_constLoc = Loc; break; 710 case TQ_restrict: TQ_restrictLoc = Loc; break; 711 case TQ_volatile: TQ_volatileLoc = Loc; break; 712 } 713 return false; 714} 715 716bool DeclSpec::setFunctionSpecInline(SourceLocation Loc) { 717 // 'inline inline' is ok. 718 FS_inline_specified = true; 719 FS_inlineLoc = Loc; 720 return false; 721} 722 723bool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc) { 724 // 'virtual virtual' is ok. 725 FS_virtual_specified = true; 726 FS_virtualLoc = Loc; 727 return false; 728} 729 730bool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc) { 731 // 'explicit explicit' is ok. 732 FS_explicit_specified = true; 733 FS_explicitLoc = Loc; 734 return false; 735} 736 737bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec, 738 unsigned &DiagID) { 739 if (Friend_specified) { 740 PrevSpec = "friend"; 741 DiagID = diag::ext_duplicate_declspec; 742 return true; 743 } 744 745 Friend_specified = true; 746 FriendLoc = Loc; 747 return false; 748} 749 750bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec, 751 unsigned &DiagID) { 752 if (isModulePrivateSpecified()) { 753 PrevSpec = "__module_private__"; 754 DiagID = diag::ext_duplicate_declspec; 755 return true; 756 } 757 758 ModulePrivateLoc = Loc; 759 return false; 760} 761 762bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec, 763 unsigned &DiagID) { 764 // 'constexpr constexpr' is ok. 765 Constexpr_specified = true; 766 ConstexprLoc = Loc; 767 return false; 768} 769 770void DeclSpec::setProtocolQualifiers(Decl * const *Protos, 771 unsigned NP, 772 SourceLocation *ProtoLocs, 773 SourceLocation LAngleLoc) { 774 if (NP == 0) return; 775 ProtocolQualifiers = new Decl*[NP]; 776 ProtocolLocs = new SourceLocation[NP]; 777 memcpy((void*)ProtocolQualifiers, Protos, sizeof(Decl*)*NP); 778 memcpy(ProtocolLocs, ProtoLocs, sizeof(SourceLocation)*NP); 779 NumProtocolQualifiers = NP; 780 ProtocolLAngleLoc = LAngleLoc; 781} 782 783void DeclSpec::SaveWrittenBuiltinSpecs() { 784 writtenBS.Sign = getTypeSpecSign(); 785 writtenBS.Width = getTypeSpecWidth(); 786 writtenBS.Type = getTypeSpecType(); 787 // Search the list of attributes for the presence of a mode attribute. 788 writtenBS.ModeAttr = false; 789 AttributeList* attrs = getAttributes().getList(); 790 while (attrs) { 791 if (attrs->getKind() == AttributeList::AT_Mode) { 792 writtenBS.ModeAttr = true; 793 break; 794 } 795 attrs = attrs->getNext(); 796 } 797} 798 799void DeclSpec::SaveStorageSpecifierAsWritten() { 800 if (SCS_extern_in_linkage_spec && StorageClassSpec == SCS_extern) 801 // If 'extern' is part of a linkage specification, 802 // then it is not a storage class "as written". 803 StorageClassSpecAsWritten = SCS_unspecified; 804 else 805 StorageClassSpecAsWritten = StorageClassSpec; 806} 807 808/// Finish - This does final analysis of the declspec, rejecting things like 809/// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or 810/// diag::NUM_DIAGNOSTICS if there is no error. After calling this method, 811/// DeclSpec is guaranteed self-consistent, even if an error occurred. 812void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP) { 813 // Before possibly changing their values, save specs as written. 814 SaveWrittenBuiltinSpecs(); 815 SaveStorageSpecifierAsWritten(); 816 817 // Check the type specifier components first. 818 819 // Validate and finalize AltiVec vector declspec. 820 if (TypeAltiVecVector) { 821 if (TypeAltiVecBool) { 822 // Sign specifiers are not allowed with vector bool. (PIM 2.1) 823 if (TypeSpecSign != TSS_unspecified) { 824 Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec) 825 << getSpecifierName((TSS)TypeSpecSign); 826 } 827 828 // Only char/int are valid with vector bool. (PIM 2.1) 829 if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) && 830 (TypeSpecType != TST_int)) || TypeAltiVecPixel) { 831 Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec) 832 << (TypeAltiVecPixel ? "__pixel" : 833 getSpecifierName((TST)TypeSpecType)); 834 } 835 836 // Only 'short' is valid with vector bool. (PIM 2.1) 837 if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short)) 838 Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec) 839 << getSpecifierName((TSW)TypeSpecWidth); 840 841 // Elements of vector bool are interpreted as unsigned. (PIM 2.1) 842 if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) || 843 (TypeSpecWidth != TSW_unspecified)) 844 TypeSpecSign = TSS_unsigned; 845 } 846 847 if (TypeAltiVecPixel) { 848 //TODO: perform validation 849 TypeSpecType = TST_int; 850 TypeSpecSign = TSS_unsigned; 851 TypeSpecWidth = TSW_short; 852 TypeSpecOwned = false; 853 } 854 } 855 856 // signed/unsigned are only valid with int/char/wchar_t. 857 if (TypeSpecSign != TSS_unspecified) { 858 if (TypeSpecType == TST_unspecified) 859 TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int. 860 else if (TypeSpecType != TST_int && TypeSpecType != TST_int128 && 861 TypeSpecType != TST_char && TypeSpecType != TST_wchar) { 862 Diag(D, TSSLoc, diag::err_invalid_sign_spec) 863 << getSpecifierName((TST)TypeSpecType); 864 // signed double -> double. 865 TypeSpecSign = TSS_unspecified; 866 } 867 } 868 869 // Validate the width of the type. 870 switch (TypeSpecWidth) { 871 case TSW_unspecified: break; 872 case TSW_short: // short int 873 case TSW_longlong: // long long int 874 if (TypeSpecType == TST_unspecified) 875 TypeSpecType = TST_int; // short -> short int, long long -> long long int. 876 else if (TypeSpecType != TST_int) { 877 Diag(D, TSWLoc, 878 TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec 879 : diag::err_invalid_longlong_spec) 880 << getSpecifierName((TST)TypeSpecType); 881 TypeSpecType = TST_int; 882 TypeSpecOwned = false; 883 } 884 break; 885 case TSW_long: // long double, long int 886 if (TypeSpecType == TST_unspecified) 887 TypeSpecType = TST_int; // long -> long int. 888 else if (TypeSpecType != TST_int && TypeSpecType != TST_double) { 889 Diag(D, TSWLoc, diag::err_invalid_long_spec) 890 << getSpecifierName((TST)TypeSpecType); 891 TypeSpecType = TST_int; 892 TypeSpecOwned = false; 893 } 894 break; 895 } 896 897 // TODO: if the implementation does not implement _Complex or _Imaginary, 898 // disallow their use. Need information about the backend. 899 if (TypeSpecComplex != TSC_unspecified) { 900 if (TypeSpecType == TST_unspecified) { 901 Diag(D, TSCLoc, diag::ext_plain_complex) 902 << FixItHint::CreateInsertion( 903 PP.getLocForEndOfToken(getTypeSpecComplexLoc()), 904 " double"); 905 TypeSpecType = TST_double; // _Complex -> _Complex double. 906 } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) { 907 // Note that this intentionally doesn't include _Complex _Bool. 908 if (!PP.getLangOpts().CPlusPlus) 909 Diag(D, TSTLoc, diag::ext_integer_complex); 910 } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) { 911 Diag(D, TSCLoc, diag::err_invalid_complex_spec) 912 << getSpecifierName((TST)TypeSpecType); 913 TypeSpecComplex = TSC_unspecified; 914 } 915 } 916 917 // If no type specifier was provided and we're parsing a language where 918 // the type specifier is not optional, but we got 'auto' as a storage 919 // class specifier, then assume this is an attempt to use C++0x's 'auto' 920 // type specifier. 921 // FIXME: Does Microsoft really support implicit int in C++? 922 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().MicrosoftExt && 923 TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) { 924 TypeSpecType = TST_auto; 925 StorageClassSpec = StorageClassSpecAsWritten = SCS_unspecified; 926 TSTLoc = TSTNameLoc = StorageClassSpecLoc; 927 StorageClassSpecLoc = SourceLocation(); 928 } 929 // Diagnose if we've recovered from an ill-formed 'auto' storage class 930 // specifier in a pre-C++0x dialect of C++. 931 if (!PP.getLangOpts().CPlusPlus0x && TypeSpecType == TST_auto) 932 Diag(D, TSTLoc, diag::ext_auto_type_specifier); 933 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus0x && 934 StorageClassSpec == SCS_auto) 935 Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class) 936 << FixItHint::CreateRemoval(StorageClassSpecLoc); 937 if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32) 938 Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type) 939 << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t"); 940 if (Constexpr_specified) 941 Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr); 942 943 // C++ [class.friend]p6: 944 // No storage-class-specifier shall appear in the decl-specifier-seq 945 // of a friend declaration. 946 if (isFriendSpecified() && getStorageClassSpec()) { 947 DeclSpec::SCS SC = getStorageClassSpec(); 948 const char *SpecName = getSpecifierName(SC); 949 950 SourceLocation SCLoc = getStorageClassSpecLoc(); 951 SourceLocation SCEndLoc = SCLoc.getLocWithOffset(strlen(SpecName)); 952 953 Diag(D, SCLoc, diag::err_friend_storage_spec) 954 << SpecName 955 << FixItHint::CreateRemoval(SourceRange(SCLoc, SCEndLoc)); 956 957 ClearStorageClassSpecs(); 958 } 959 960 assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType)); 961 962 // Okay, now we can infer the real type. 963 964 // TODO: return "auto function" and other bad things based on the real type. 965 966 // 'data definition has no type or storage class'? 967} 968 969bool DeclSpec::isMissingDeclaratorOk() { 970 TST tst = getTypeSpecType(); 971 return isDeclRep(tst) && getRepAsDecl() != 0 && 972 StorageClassSpec != DeclSpec::SCS_typedef; 973} 974 975void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc, 976 OverloadedOperatorKind Op, 977 SourceLocation SymbolLocations[3]) { 978 Kind = IK_OperatorFunctionId; 979 StartLocation = OperatorLoc; 980 EndLocation = OperatorLoc; 981 OperatorFunctionId.Operator = Op; 982 for (unsigned I = 0; I != 3; ++I) { 983 OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding(); 984 985 if (SymbolLocations[I].isValid()) 986 EndLocation = SymbolLocations[I]; 987 } 988} 989 990bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc, 991 const char *&PrevSpec) { 992 LastLocation = Loc; 993 994 if (Specifiers & VS) { 995 PrevSpec = getSpecifierName(VS); 996 return true; 997 } 998 999 Specifiers |= VS; 1000 1001 switch (VS) { 1002 default: llvm_unreachable("Unknown specifier!"); 1003 case VS_Override: VS_overrideLoc = Loc; break; 1004 case VS_Final: VS_finalLoc = Loc; break; 1005 } 1006 1007 return false; 1008} 1009 1010const char *VirtSpecifiers::getSpecifierName(Specifier VS) { 1011 switch (VS) { 1012 default: llvm_unreachable("Unknown specifier"); 1013 case VS_Override: return "override"; 1014 case VS_Final: return "final"; 1015 } 1016} 1017