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