DeclSpec.cpp revision 4cf4a5e96ab0babd13774b17112e7c1d83042ea7
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 818void DeclSpec::SaveStorageSpecifierAsWritten() { 819 if (SCS_extern_in_linkage_spec && StorageClassSpec == SCS_extern) 820 // If 'extern' is part of a linkage specification, 821 // then it is not a storage class "as written". 822 StorageClassSpecAsWritten = SCS_unspecified; 823 else 824 StorageClassSpecAsWritten = StorageClassSpec; 825} 826 827/// Finish - This does final analysis of the declspec, rejecting things like 828/// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or 829/// diag::NUM_DIAGNOSTICS if there is no error. After calling this method, 830/// DeclSpec is guaranteed self-consistent, even if an error occurred. 831void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP) { 832 // Before possibly changing their values, save specs as written. 833 SaveWrittenBuiltinSpecs(); 834 SaveStorageSpecifierAsWritten(); 835 836 // Check the type specifier components first. 837 838 // Validate and finalize AltiVec vector declspec. 839 if (TypeAltiVecVector) { 840 if (TypeAltiVecBool) { 841 // Sign specifiers are not allowed with vector bool. (PIM 2.1) 842 if (TypeSpecSign != TSS_unspecified) { 843 Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec) 844 << getSpecifierName((TSS)TypeSpecSign); 845 } 846 847 // Only char/int are valid with vector bool. (PIM 2.1) 848 if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) && 849 (TypeSpecType != TST_int)) || TypeAltiVecPixel) { 850 Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec) 851 << (TypeAltiVecPixel ? "__pixel" : 852 getSpecifierName((TST)TypeSpecType)); 853 } 854 855 // Only 'short' is valid with vector bool. (PIM 2.1) 856 if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short)) 857 Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec) 858 << getSpecifierName((TSW)TypeSpecWidth); 859 860 // Elements of vector bool are interpreted as unsigned. (PIM 2.1) 861 if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) || 862 (TypeSpecWidth != TSW_unspecified)) 863 TypeSpecSign = TSS_unsigned; 864 } 865 866 if (TypeAltiVecPixel) { 867 //TODO: perform validation 868 TypeSpecType = TST_int; 869 TypeSpecSign = TSS_unsigned; 870 TypeSpecWidth = TSW_short; 871 TypeSpecOwned = false; 872 } 873 } 874 875 // signed/unsigned are only valid with int/char/wchar_t. 876 if (TypeSpecSign != TSS_unspecified) { 877 if (TypeSpecType == TST_unspecified) 878 TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int. 879 else if (TypeSpecType != TST_int && TypeSpecType != TST_int128 && 880 TypeSpecType != TST_char && TypeSpecType != TST_wchar) { 881 Diag(D, TSSLoc, diag::err_invalid_sign_spec) 882 << getSpecifierName((TST)TypeSpecType); 883 // signed double -> double. 884 TypeSpecSign = TSS_unspecified; 885 } 886 } 887 888 // Validate the width of the type. 889 switch (TypeSpecWidth) { 890 case TSW_unspecified: break; 891 case TSW_short: // short int 892 case TSW_longlong: // long long int 893 if (TypeSpecType == TST_unspecified) 894 TypeSpecType = TST_int; // short -> short int, long long -> long long int. 895 else if (TypeSpecType != TST_int) { 896 Diag(D, TSWLoc, 897 TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec 898 : diag::err_invalid_longlong_spec) 899 << getSpecifierName((TST)TypeSpecType); 900 TypeSpecType = TST_int; 901 TypeSpecOwned = false; 902 } 903 break; 904 case TSW_long: // long double, long int 905 if (TypeSpecType == TST_unspecified) 906 TypeSpecType = TST_int; // long -> long int. 907 else if (TypeSpecType != TST_int && TypeSpecType != TST_double) { 908 Diag(D, TSWLoc, diag::err_invalid_long_spec) 909 << getSpecifierName((TST)TypeSpecType); 910 TypeSpecType = TST_int; 911 TypeSpecOwned = false; 912 } 913 break; 914 } 915 916 // TODO: if the implementation does not implement _Complex or _Imaginary, 917 // disallow their use. Need information about the backend. 918 if (TypeSpecComplex != TSC_unspecified) { 919 if (TypeSpecType == TST_unspecified) { 920 Diag(D, TSCLoc, diag::ext_plain_complex) 921 << FixItHint::CreateInsertion( 922 PP.getLocForEndOfToken(getTypeSpecComplexLoc()), 923 " double"); 924 TypeSpecType = TST_double; // _Complex -> _Complex double. 925 } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) { 926 // Note that this intentionally doesn't include _Complex _Bool. 927 if (!PP.getLangOpts().CPlusPlus) 928 Diag(D, TSTLoc, diag::ext_integer_complex); 929 } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) { 930 Diag(D, TSCLoc, diag::err_invalid_complex_spec) 931 << getSpecifierName((TST)TypeSpecType); 932 TypeSpecComplex = TSC_unspecified; 933 } 934 } 935 936 // If no type specifier was provided and we're parsing a language where 937 // the type specifier is not optional, but we got 'auto' as a storage 938 // class specifier, then assume this is an attempt to use C++0x's 'auto' 939 // type specifier. 940 // FIXME: Does Microsoft really support implicit int in C++? 941 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().MicrosoftExt && 942 TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) { 943 TypeSpecType = TST_auto; 944 StorageClassSpec = StorageClassSpecAsWritten = SCS_unspecified; 945 TSTLoc = TSTNameLoc = StorageClassSpecLoc; 946 StorageClassSpecLoc = SourceLocation(); 947 } 948 // Diagnose if we've recovered from an ill-formed 'auto' storage class 949 // specifier in a pre-C++0x dialect of C++. 950 if (!PP.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto) 951 Diag(D, TSTLoc, diag::ext_auto_type_specifier); 952 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus11 && 953 StorageClassSpec == SCS_auto) 954 Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class) 955 << FixItHint::CreateRemoval(StorageClassSpecLoc); 956 if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32) 957 Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type) 958 << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t"); 959 if (Constexpr_specified) 960 Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr); 961 962 // C++ [class.friend]p6: 963 // No storage-class-specifier shall appear in the decl-specifier-seq 964 // of a friend declaration. 965 if (isFriendSpecified() && getStorageClassSpec()) { 966 DeclSpec::SCS SC = getStorageClassSpec(); 967 const char *SpecName = getSpecifierName(SC); 968 969 SourceLocation SCLoc = getStorageClassSpecLoc(); 970 SourceLocation SCEndLoc = SCLoc.getLocWithOffset(strlen(SpecName)); 971 972 Diag(D, SCLoc, diag::err_friend_storage_spec) 973 << SpecName 974 << FixItHint::CreateRemoval(SourceRange(SCLoc, SCEndLoc)); 975 976 ClearStorageClassSpecs(); 977 } 978 979 assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType)); 980 981 // Okay, now we can infer the real type. 982 983 // TODO: return "auto function" and other bad things based on the real type. 984 985 // 'data definition has no type or storage class'? 986} 987 988bool DeclSpec::isMissingDeclaratorOk() { 989 TST tst = getTypeSpecType(); 990 return isDeclRep(tst) && getRepAsDecl() != 0 && 991 StorageClassSpec != DeclSpec::SCS_typedef; 992} 993 994void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc, 995 OverloadedOperatorKind Op, 996 SourceLocation SymbolLocations[3]) { 997 Kind = IK_OperatorFunctionId; 998 StartLocation = OperatorLoc; 999 EndLocation = OperatorLoc; 1000 OperatorFunctionId.Operator = Op; 1001 for (unsigned I = 0; I != 3; ++I) { 1002 OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding(); 1003 1004 if (SymbolLocations[I].isValid()) 1005 EndLocation = SymbolLocations[I]; 1006 } 1007} 1008 1009bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc, 1010 const char *&PrevSpec) { 1011 LastLocation = Loc; 1012 1013 if (Specifiers & VS) { 1014 PrevSpec = getSpecifierName(VS); 1015 return true; 1016 } 1017 1018 Specifiers |= VS; 1019 1020 switch (VS) { 1021 default: llvm_unreachable("Unknown specifier!"); 1022 case VS_Override: VS_overrideLoc = Loc; break; 1023 case VS_Final: VS_finalLoc = Loc; break; 1024 } 1025 1026 return false; 1027} 1028 1029const char *VirtSpecifiers::getSpecifierName(Specifier VS) { 1030 switch (VS) { 1031 default: llvm_unreachable("Unknown specifier"); 1032 case VS_Override: return "override"; 1033 case VS_Final: return "final"; 1034 } 1035} 1036