1 //===--- SemaDeclSpec.cpp - Declaration Specifier Semantic Analysis -------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements semantic analysis for declaration specifiers.
12 //===----------------------------------------------------------------------===//
14 #include "clang/Sema/DeclSpec.h"
15 #include "clang/AST/ASTContext.h"
16 #include "clang/AST/DeclCXX.h"
17 #include "clang/AST/Expr.h"
18 #include "clang/AST/NestedNameSpecifier.h"
19 #include "clang/AST/TypeLoc.h"
20 #include "clang/Basic/LangOptions.h"
21 #include "clang/Basic/TargetInfo.h"
22 #include "clang/Lex/Preprocessor.h"
23 #include "clang/Parse/ParseDiagnostic.h" // FIXME: remove this back-dependency!
24 #include "clang/Sema/LocInfoType.h"
25 #include "clang/Sema/ParsedTemplate.h"
26 #include "clang/Sema/Sema.h"
27 #include "clang/Sema/SemaDiagnostic.h"
28 #include "llvm/ADT/STLExtras.h"
29 #include "llvm/ADT/SmallString.h"
30 #include "llvm/Support/ErrorHandling.h"
32 using namespace clang;
35 static DiagnosticBuilder Diag(DiagnosticsEngine &D, SourceLocation Loc,
37 return D.Report(Loc, DiagID);
41 void UnqualifiedId::setTemplateId(TemplateIdAnnotation *TemplateId) {
42 assert(TemplateId && "NULL template-id annotation?");
44 this->TemplateId = TemplateId;
45 StartLocation = TemplateId->TemplateNameLoc;
46 EndLocation = TemplateId->RAngleLoc;
49 void UnqualifiedId::setConstructorTemplateId(TemplateIdAnnotation *TemplateId) {
50 assert(TemplateId && "NULL template-id annotation?");
51 Kind = IK_ConstructorTemplateId;
52 this->TemplateId = TemplateId;
53 StartLocation = TemplateId->TemplateNameLoc;
54 EndLocation = TemplateId->RAngleLoc;
57 void CXXScopeSpec::Extend(ASTContext &Context, SourceLocation TemplateKWLoc,
58 TypeLoc TL, SourceLocation ColonColonLoc) {
59 Builder.Extend(Context, TemplateKWLoc, TL, ColonColonLoc);
60 if (Range.getBegin().isInvalid())
61 Range.setBegin(TL.getBeginLoc());
62 Range.setEnd(ColonColonLoc);
64 assert(Range == Builder.getSourceRange() &&
65 "NestedNameSpecifierLoc range computation incorrect");
68 void CXXScopeSpec::Extend(ASTContext &Context, IdentifierInfo *Identifier,
69 SourceLocation IdentifierLoc,
70 SourceLocation ColonColonLoc) {
71 Builder.Extend(Context, Identifier, IdentifierLoc, ColonColonLoc);
73 if (Range.getBegin().isInvalid())
74 Range.setBegin(IdentifierLoc);
75 Range.setEnd(ColonColonLoc);
77 assert(Range == Builder.getSourceRange() &&
78 "NestedNameSpecifierLoc range computation incorrect");
81 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceDecl *Namespace,
82 SourceLocation NamespaceLoc,
83 SourceLocation ColonColonLoc) {
84 Builder.Extend(Context, Namespace, NamespaceLoc, ColonColonLoc);
86 if (Range.getBegin().isInvalid())
87 Range.setBegin(NamespaceLoc);
88 Range.setEnd(ColonColonLoc);
90 assert(Range == Builder.getSourceRange() &&
91 "NestedNameSpecifierLoc range computation incorrect");
94 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
95 SourceLocation AliasLoc,
96 SourceLocation ColonColonLoc) {
97 Builder.Extend(Context, Alias, AliasLoc, ColonColonLoc);
99 if (Range.getBegin().isInvalid())
100 Range.setBegin(AliasLoc);
101 Range.setEnd(ColonColonLoc);
103 assert(Range == Builder.getSourceRange() &&
104 "NestedNameSpecifierLoc range computation incorrect");
107 void CXXScopeSpec::MakeGlobal(ASTContext &Context,
108 SourceLocation ColonColonLoc) {
109 Builder.MakeGlobal(Context, ColonColonLoc);
111 Range = SourceRange(ColonColonLoc);
113 assert(Range == Builder.getSourceRange() &&
114 "NestedNameSpecifierLoc range computation incorrect");
117 void CXXScopeSpec::MakeSuper(ASTContext &Context, CXXRecordDecl *RD,
118 SourceLocation SuperLoc,
119 SourceLocation ColonColonLoc) {
120 Builder.MakeSuper(Context, RD, SuperLoc, ColonColonLoc);
122 Range.setBegin(SuperLoc);
123 Range.setEnd(ColonColonLoc);
125 assert(Range == Builder.getSourceRange() &&
126 "NestedNameSpecifierLoc range computation incorrect");
129 void CXXScopeSpec::MakeTrivial(ASTContext &Context,
130 NestedNameSpecifier *Qualifier, SourceRange R) {
131 Builder.MakeTrivial(Context, Qualifier, R);
135 void CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) {
137 Range = SourceRange();
142 Range = Other.getSourceRange();
143 Builder.Adopt(Other);
146 SourceLocation CXXScopeSpec::getLastQualifierNameLoc() const {
147 if (!Builder.getRepresentation())
148 return SourceLocation();
149 return Builder.getTemporary().getLocalBeginLoc();
152 NestedNameSpecifierLoc
153 CXXScopeSpec::getWithLocInContext(ASTContext &Context) const {
154 if (!Builder.getRepresentation())
155 return NestedNameSpecifierLoc();
157 return Builder.getWithLocInContext(Context);
160 /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
161 /// "TheDeclarator" is the declarator that this will be added to.
162 DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto,
164 SourceLocation LParenLoc,
167 SourceLocation EllipsisLoc,
168 SourceLocation RParenLoc,
170 bool RefQualifierIsLvalueRef,
171 SourceLocation RefQualifierLoc,
172 SourceLocation ConstQualifierLoc,
174 VolatileQualifierLoc,
176 RestrictQualifierLoc,
177 SourceLocation MutableLoc,
178 ExceptionSpecificationType
180 SourceLocation ESpecLoc,
181 ParsedType *Exceptions,
182 SourceRange *ExceptionRanges,
183 unsigned NumExceptions,
185 CachedTokens *ExceptionSpecTokens,
186 SourceLocation LocalRangeBegin,
187 SourceLocation LocalRangeEnd,
188 Declarator &TheDeclarator,
189 TypeResult TrailingReturnType) {
190 assert(!(TypeQuals & DeclSpec::TQ_atomic) &&
191 "function cannot have _Atomic qualifier");
195 I.Loc = LocalRangeBegin;
196 I.EndLoc = LocalRangeEnd;
197 I.Fun.AttrList = nullptr;
198 I.Fun.hasPrototype = hasProto;
199 I.Fun.isVariadic = EllipsisLoc.isValid();
200 I.Fun.isAmbiguous = isAmbiguous;
201 I.Fun.LParenLoc = LParenLoc.getRawEncoding();
202 I.Fun.EllipsisLoc = EllipsisLoc.getRawEncoding();
203 I.Fun.RParenLoc = RParenLoc.getRawEncoding();
204 I.Fun.DeleteParams = false;
205 I.Fun.TypeQuals = TypeQuals;
206 I.Fun.NumParams = NumParams;
207 I.Fun.Params = nullptr;
208 I.Fun.RefQualifierIsLValueRef = RefQualifierIsLvalueRef;
209 I.Fun.RefQualifierLoc = RefQualifierLoc.getRawEncoding();
210 I.Fun.ConstQualifierLoc = ConstQualifierLoc.getRawEncoding();
211 I.Fun.VolatileQualifierLoc = VolatileQualifierLoc.getRawEncoding();
212 I.Fun.RestrictQualifierLoc = RestrictQualifierLoc.getRawEncoding();
213 I.Fun.MutableLoc = MutableLoc.getRawEncoding();
214 I.Fun.ExceptionSpecType = ESpecType;
215 I.Fun.ExceptionSpecLoc = ESpecLoc.getRawEncoding();
216 I.Fun.NumExceptions = 0;
217 I.Fun.Exceptions = nullptr;
218 I.Fun.NoexceptExpr = nullptr;
219 I.Fun.HasTrailingReturnType = TrailingReturnType.isUsable() ||
220 TrailingReturnType.isInvalid();
221 I.Fun.TrailingReturnType = TrailingReturnType.get();
223 assert(I.Fun.TypeQuals == TypeQuals && "bitfield overflow");
224 assert(I.Fun.ExceptionSpecType == ESpecType && "bitfield overflow");
226 // new[] a parameter array if needed.
228 // If the 'InlineParams' in Declarator is unused and big enough, put our
229 // parameter list there (in an effort to avoid new/delete traffic). If it
230 // is already used (consider a function returning a function pointer) or too
231 // small (function with too many parameters), go to the heap.
232 if (!TheDeclarator.InlineParamsUsed &&
233 NumParams <= llvm::array_lengthof(TheDeclarator.InlineParams)) {
234 I.Fun.Params = TheDeclarator.InlineParams;
235 I.Fun.DeleteParams = false;
236 TheDeclarator.InlineParamsUsed = true;
238 I.Fun.Params = new DeclaratorChunk::ParamInfo[NumParams];
239 I.Fun.DeleteParams = true;
241 memcpy(I.Fun.Params, Params, sizeof(Params[0]) * NumParams);
244 // Check what exception specification information we should actually store.
246 default: break; // By default, save nothing.
248 // new[] an exception array if needed
250 I.Fun.NumExceptions = NumExceptions;
251 I.Fun.Exceptions = new DeclaratorChunk::TypeAndRange[NumExceptions];
252 for (unsigned i = 0; i != NumExceptions; ++i) {
253 I.Fun.Exceptions[i].Ty = Exceptions[i];
254 I.Fun.Exceptions[i].Range = ExceptionRanges[i];
259 case EST_ComputedNoexcept:
260 I.Fun.NoexceptExpr = NoexceptExpr;
264 I.Fun.ExceptionSpecTokens = ExceptionSpecTokens;
270 bool Declarator::isDeclarationOfFunction() const {
271 for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) {
272 switch (DeclTypeInfo[i].Kind) {
273 case DeclaratorChunk::Function:
275 case DeclaratorChunk::Paren:
277 case DeclaratorChunk::Pointer:
278 case DeclaratorChunk::Reference:
279 case DeclaratorChunk::Array:
280 case DeclaratorChunk::BlockPointer:
281 case DeclaratorChunk::MemberPointer:
284 llvm_unreachable("Invalid type chunk");
287 switch (DS.getTypeSpecType()) {
308 case TST_unknown_anytype:
309 case TST_unspecified:
314 case TST_decltype_auto:
315 // This must have an initializer, so can't be a function declaration,
316 // even if the initializer has function type.
321 if (Expr *E = DS.getRepAsExpr())
322 return E->getType()->isFunctionType();
325 case TST_underlyingType:
327 case TST_typeofType: {
328 QualType QT = DS.getRepAsType().get();
332 if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT))
338 return QT->isFunctionType();
342 llvm_unreachable("Invalid TypeSpecType!");
345 bool Declarator::isStaticMember() {
346 assert(getContext() == MemberContext);
347 return getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
348 (getName().Kind == UnqualifiedId::IK_OperatorFunctionId &&
349 CXXMethodDecl::isStaticOverloadedOperator(
350 getName().OperatorFunctionId.Operator));
353 bool DeclSpec::hasTagDefinition() const {
356 return cast<TagDecl>(getRepAsDecl())->isCompleteDefinition();
359 /// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
360 /// declaration specifier includes.
362 unsigned DeclSpec::getParsedSpecifiers() const {
364 if (StorageClassSpec != SCS_unspecified ||
365 ThreadStorageClassSpec != TSCS_unspecified)
366 Res |= PQ_StorageClassSpecifier;
368 if (TypeQualifiers != TQ_unspecified)
369 Res |= PQ_TypeQualifier;
371 if (hasTypeSpecifier())
372 Res |= PQ_TypeSpecifier;
374 if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified ||
375 FS_noreturn_specified || FS_forceinline_specified)
376 Res |= PQ_FunctionSpecifier;
380 template <class T> static bool BadSpecifier(T TNew, T TPrev,
381 const char *&PrevSpec,
383 bool IsExtension = true) {
384 PrevSpec = DeclSpec::getSpecifierName(TPrev);
386 DiagID = diag::err_invalid_decl_spec_combination;
388 DiagID = IsExtension ? diag::ext_duplicate_declspec :
389 diag::warn_duplicate_declspec;
393 const char *DeclSpec::getSpecifierName(DeclSpec::SCS S) {
395 case DeclSpec::SCS_unspecified: return "unspecified";
396 case DeclSpec::SCS_typedef: return "typedef";
397 case DeclSpec::SCS_extern: return "extern";
398 case DeclSpec::SCS_static: return "static";
399 case DeclSpec::SCS_auto: return "auto";
400 case DeclSpec::SCS_register: return "register";
401 case DeclSpec::SCS_private_extern: return "__private_extern__";
402 case DeclSpec::SCS_mutable: return "mutable";
404 llvm_unreachable("Unknown typespec!");
407 const char *DeclSpec::getSpecifierName(DeclSpec::TSCS S) {
409 case DeclSpec::TSCS_unspecified: return "unspecified";
410 case DeclSpec::TSCS___thread: return "__thread";
411 case DeclSpec::TSCS_thread_local: return "thread_local";
412 case DeclSpec::TSCS__Thread_local: return "_Thread_local";
414 llvm_unreachable("Unknown typespec!");
417 const char *DeclSpec::getSpecifierName(TSW W) {
419 case TSW_unspecified: return "unspecified";
420 case TSW_short: return "short";
421 case TSW_long: return "long";
422 case TSW_longlong: return "long long";
424 llvm_unreachable("Unknown typespec!");
427 const char *DeclSpec::getSpecifierName(TSC C) {
429 case TSC_unspecified: return "unspecified";
430 case TSC_imaginary: return "imaginary";
431 case TSC_complex: return "complex";
433 llvm_unreachable("Unknown typespec!");
437 const char *DeclSpec::getSpecifierName(TSS S) {
439 case TSS_unspecified: return "unspecified";
440 case TSS_signed: return "signed";
441 case TSS_unsigned: return "unsigned";
443 llvm_unreachable("Unknown typespec!");
446 const char *DeclSpec::getSpecifierName(DeclSpec::TST T,
447 const PrintingPolicy &Policy) {
449 case DeclSpec::TST_unspecified: return "unspecified";
450 case DeclSpec::TST_void: return "void";
451 case DeclSpec::TST_char: return "char";
452 case DeclSpec::TST_wchar: return Policy.MSWChar ? "__wchar_t" : "wchar_t";
453 case DeclSpec::TST_char16: return "char16_t";
454 case DeclSpec::TST_char32: return "char32_t";
455 case DeclSpec::TST_int: return "int";
456 case DeclSpec::TST_int128: return "__int128";
457 case DeclSpec::TST_half: return "half";
458 case DeclSpec::TST_float: return "float";
459 case DeclSpec::TST_double: return "double";
460 case DeclSpec::TST_bool: return Policy.Bool ? "bool" : "_Bool";
461 case DeclSpec::TST_decimal32: return "_Decimal32";
462 case DeclSpec::TST_decimal64: return "_Decimal64";
463 case DeclSpec::TST_decimal128: return "_Decimal128";
464 case DeclSpec::TST_enum: return "enum";
465 case DeclSpec::TST_class: return "class";
466 case DeclSpec::TST_union: return "union";
467 case DeclSpec::TST_struct: return "struct";
468 case DeclSpec::TST_interface: return "__interface";
469 case DeclSpec::TST_typename: return "type-name";
470 case DeclSpec::TST_typeofType:
471 case DeclSpec::TST_typeofExpr: return "typeof";
472 case DeclSpec::TST_auto: return "auto";
473 case DeclSpec::TST_decltype: return "(decltype)";
474 case DeclSpec::TST_decltype_auto: return "decltype(auto)";
475 case DeclSpec::TST_underlyingType: return "__underlying_type";
476 case DeclSpec::TST_unknown_anytype: return "__unknown_anytype";
477 case DeclSpec::TST_atomic: return "_Atomic";
478 case DeclSpec::TST_error: return "(error)";
480 llvm_unreachable("Unknown typespec!");
483 const char *DeclSpec::getSpecifierName(TQ T) {
485 case DeclSpec::TQ_unspecified: return "unspecified";
486 case DeclSpec::TQ_const: return "const";
487 case DeclSpec::TQ_restrict: return "restrict";
488 case DeclSpec::TQ_volatile: return "volatile";
489 case DeclSpec::TQ_atomic: return "_Atomic";
491 llvm_unreachable("Unknown typespec!");
494 bool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc,
495 const char *&PrevSpec,
497 const PrintingPolicy &Policy) {
498 // OpenCL v1.1 s6.8g: "The extern, static, auto and register storage-class
499 // specifiers are not supported.
500 // It seems sensible to prohibit private_extern too
501 // The cl_clang_storage_class_specifiers extension enables support for
502 // these storage-class specifiers.
503 // OpenCL v1.2 s6.8 changes this to "The auto and register storage-class
504 // specifiers are not supported."
505 if (S.getLangOpts().OpenCL &&
506 !S.getOpenCLOptions().cl_clang_storage_class_specifiers) {
509 case SCS_private_extern:
511 if (S.getLangOpts().OpenCLVersion < 120) {
512 DiagID = diag::err_opencl_unknown_type_specifier;
513 PrevSpec = getSpecifierName(SC);
519 DiagID = diag::err_opencl_unknown_type_specifier;
520 PrevSpec = getSpecifierName(SC);
527 if (StorageClassSpec != SCS_unspecified) {
528 // Maybe this is an attempt to use C++11 'auto' outside of C++11 mode.
529 bool isInvalid = true;
530 if (TypeSpecType == TST_unspecified && S.getLangOpts().CPlusPlus) {
532 return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID, Policy);
533 if (StorageClassSpec == SCS_auto) {
534 isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc,
535 PrevSpec, DiagID, Policy);
536 assert(!isInvalid && "auto SCS -> TST recovery failed");
540 // Changing storage class is allowed only if the previous one
541 // was the 'extern' that is part of a linkage specification and
542 // the new storage class is 'typedef'.
544 !(SCS_extern_in_linkage_spec &&
545 StorageClassSpec == SCS_extern &&
547 return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID);
549 StorageClassSpec = SC;
550 StorageClassSpecLoc = Loc;
551 assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield");
555 bool DeclSpec::SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc,
556 const char *&PrevSpec,
558 if (ThreadStorageClassSpec != TSCS_unspecified)
559 return BadSpecifier(TSC, (TSCS)ThreadStorageClassSpec, PrevSpec, DiagID);
561 ThreadStorageClassSpec = TSC;
562 ThreadStorageClassSpecLoc = Loc;
566 /// These methods set the specified attribute of the DeclSpec, but return true
567 /// and ignore the request if invalid (e.g. "extern" then "auto" is
569 bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc,
570 const char *&PrevSpec,
572 const PrintingPolicy &Policy) {
573 // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that
574 // for 'long long' we will keep the source location of the first 'long'.
575 if (TypeSpecWidth == TSW_unspecified)
577 // Allow turning long -> long long.
578 else if (W != TSW_longlong || TypeSpecWidth != TSW_long)
579 return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID);
584 bool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc,
585 const char *&PrevSpec,
587 if (TypeSpecComplex != TSC_unspecified)
588 return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID);
594 bool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc,
595 const char *&PrevSpec,
597 if (TypeSpecSign != TSS_unspecified)
598 return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID);
604 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
605 const char *&PrevSpec,
608 const PrintingPolicy &Policy) {
609 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Policy);
612 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
613 SourceLocation TagNameLoc,
614 const char *&PrevSpec,
617 const PrintingPolicy &Policy) {
618 assert(isTypeRep(T) && "T does not store a type");
619 assert(Rep && "no type provided!");
620 if (TypeSpecType != TST_unspecified) {
621 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
622 DiagID = diag::err_invalid_decl_spec_combination;
628 TSTNameLoc = TagNameLoc;
629 TypeSpecOwned = false;
633 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
634 const char *&PrevSpec,
637 const PrintingPolicy &Policy) {
638 assert(isExprRep(T) && "T does not store an expr");
639 assert(Rep && "no expression provided!");
640 if (TypeSpecType != TST_unspecified) {
641 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
642 DiagID = diag::err_invalid_decl_spec_combination;
649 TypeSpecOwned = false;
653 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
654 const char *&PrevSpec,
656 Decl *Rep, bool Owned,
657 const PrintingPolicy &Policy) {
658 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned, Policy);
661 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
662 SourceLocation TagNameLoc,
663 const char *&PrevSpec,
665 Decl *Rep, bool Owned,
666 const PrintingPolicy &Policy) {
667 assert(isDeclRep(T) && "T does not store a decl");
668 // Unlike the other cases, we don't assert that we actually get a decl.
670 if (TypeSpecType != TST_unspecified) {
671 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
672 DiagID = diag::err_invalid_decl_spec_combination;
678 TSTNameLoc = TagNameLoc;
679 TypeSpecOwned = Owned && Rep != nullptr;
683 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
684 const char *&PrevSpec,
686 const PrintingPolicy &Policy) {
687 assert(!isDeclRep(T) && !isTypeRep(T) && !isExprRep(T) &&
688 "rep required for these type-spec kinds!");
689 if (TypeSpecType != TST_unspecified) {
690 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
691 DiagID = diag::err_invalid_decl_spec_combination;
696 if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) {
697 TypeAltiVecBool = true;
701 TypeSpecOwned = false;
705 bool DeclSpec::SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc,
706 const char *&PrevSpec, unsigned &DiagID,
707 const PrintingPolicy &Policy) {
708 if (TypeSpecType != TST_unspecified) {
709 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
710 DiagID = diag::err_invalid_vector_decl_spec_combination;
713 TypeAltiVecVector = isAltiVecVector;
718 bool DeclSpec::SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc,
719 const char *&PrevSpec, unsigned &DiagID,
720 const PrintingPolicy &Policy) {
721 if (!TypeAltiVecVector || TypeAltiVecPixel ||
722 (TypeSpecType != TST_unspecified)) {
723 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
724 DiagID = diag::err_invalid_pixel_decl_spec_combination;
727 TypeAltiVecPixel = isAltiVecPixel;
733 bool DeclSpec::SetTypeAltiVecBool(bool isAltiVecBool, SourceLocation Loc,
734 const char *&PrevSpec, unsigned &DiagID,
735 const PrintingPolicy &Policy) {
736 if (!TypeAltiVecVector || TypeAltiVecBool ||
737 (TypeSpecType != TST_unspecified)) {
738 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
739 DiagID = diag::err_invalid_vector_bool_decl_spec;
742 TypeAltiVecBool = isAltiVecBool;
748 bool DeclSpec::SetTypeSpecError() {
749 TypeSpecType = TST_error;
750 TypeSpecOwned = false;
751 TSTLoc = SourceLocation();
752 TSTNameLoc = SourceLocation();
756 bool DeclSpec::SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec,
757 unsigned &DiagID, const LangOptions &Lang) {
758 // Duplicates are permitted in C99 onwards, but are not permitted in C89 or
759 // C++. However, since this is likely not what the user intended, we will
760 // always warn. We do not need to set the qualifier's location since we
762 if (TypeQualifiers & T) {
763 bool IsExtension = true;
766 return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension);
771 case TQ_unspecified: break;
772 case TQ_const: TQ_constLoc = Loc; return false;
773 case TQ_restrict: TQ_restrictLoc = Loc; return false;
774 case TQ_volatile: TQ_volatileLoc = Loc; return false;
775 case TQ_atomic: TQ_atomicLoc = Loc; return false;
778 llvm_unreachable("Unknown type qualifier!");
781 bool DeclSpec::setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec,
783 // 'inline inline' is ok. However, since this is likely not what the user
784 // intended, we will always warn, similar to duplicates of type qualifiers.
785 if (FS_inline_specified) {
786 DiagID = diag::warn_duplicate_declspec;
790 FS_inline_specified = true;
795 bool DeclSpec::setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec,
797 if (FS_forceinline_specified) {
798 DiagID = diag::warn_duplicate_declspec;
799 PrevSpec = "__forceinline";
802 FS_forceinline_specified = true;
803 FS_forceinlineLoc = Loc;
807 bool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc,
808 const char *&PrevSpec,
810 // 'virtual virtual' is ok, but warn as this is likely not what the user
812 if (FS_virtual_specified) {
813 DiagID = diag::warn_duplicate_declspec;
814 PrevSpec = "virtual";
817 FS_virtual_specified = true;
822 bool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc,
823 const char *&PrevSpec,
825 // 'explicit explicit' is ok, but warn as this is likely not what the user
827 if (FS_explicit_specified) {
828 DiagID = diag::warn_duplicate_declspec;
829 PrevSpec = "explicit";
832 FS_explicit_specified = true;
833 FS_explicitLoc = Loc;
837 bool DeclSpec::setFunctionSpecNoreturn(SourceLocation Loc,
838 const char *&PrevSpec,
840 // '_Noreturn _Noreturn' is ok, but warn as this is likely not what the user
842 if (FS_noreturn_specified) {
843 DiagID = diag::warn_duplicate_declspec;
844 PrevSpec = "_Noreturn";
847 FS_noreturn_specified = true;
848 FS_noreturnLoc = Loc;
852 bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
854 if (Friend_specified) {
856 // Keep the later location, so that we can later diagnose ill-formed
857 // declarations like 'friend class X friend;'. Per [class.friend]p3,
858 // 'friend' must be the first token in a friend declaration that is
859 // not a function declaration.
861 DiagID = diag::warn_duplicate_declspec;
865 Friend_specified = true;
870 bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
872 if (isModulePrivateSpecified()) {
873 PrevSpec = "__module_private__";
874 DiagID = diag::ext_duplicate_declspec;
878 ModulePrivateLoc = Loc;
882 bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
884 // 'constexpr constexpr' is ok, but warn as this is likely not what the user
886 if (Constexpr_specified) {
887 DiagID = diag::warn_duplicate_declspec;
888 PrevSpec = "constexpr";
891 Constexpr_specified = true;
896 bool DeclSpec::SetConceptSpec(SourceLocation Loc, const char *&PrevSpec,
898 if (Concept_specified) {
899 DiagID = diag::ext_duplicate_declspec;
900 PrevSpec = "concept";
903 Concept_specified = true;
908 void DeclSpec::SaveWrittenBuiltinSpecs() {
909 writtenBS.Sign = getTypeSpecSign();
910 writtenBS.Width = getTypeSpecWidth();
911 writtenBS.Type = getTypeSpecType();
912 // Search the list of attributes for the presence of a mode attribute.
913 writtenBS.ModeAttr = false;
914 AttributeList* attrs = getAttributes().getList();
916 if (attrs->getKind() == AttributeList::AT_Mode) {
917 writtenBS.ModeAttr = true;
920 attrs = attrs->getNext();
924 /// Finish - This does final analysis of the declspec, rejecting things like
925 /// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or
926 /// diag::NUM_DIAGNOSTICS if there is no error. After calling this method,
927 /// DeclSpec is guaranteed self-consistent, even if an error occurred.
928 void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP, const PrintingPolicy &Policy) {
929 // Before possibly changing their values, save specs as written.
930 SaveWrittenBuiltinSpecs();
932 // Check the type specifier components first.
934 // If decltype(auto) is used, no other type specifiers are permitted.
935 if (TypeSpecType == TST_decltype_auto &&
936 (TypeSpecWidth != TSW_unspecified ||
937 TypeSpecComplex != TSC_unspecified ||
938 TypeSpecSign != TSS_unspecified ||
939 TypeAltiVecVector || TypeAltiVecPixel || TypeAltiVecBool ||
941 const unsigned NumLocs = 8;
942 SourceLocation ExtraLocs[NumLocs] = {
943 TSWLoc, TSCLoc, TSSLoc, AltiVecLoc,
944 TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc
946 FixItHint Hints[NumLocs];
947 SourceLocation FirstLoc;
948 for (unsigned I = 0; I != NumLocs; ++I) {
949 if (!ExtraLocs[I].isInvalid()) {
950 if (FirstLoc.isInvalid() ||
951 PP.getSourceManager().isBeforeInTranslationUnit(ExtraLocs[I],
953 FirstLoc = ExtraLocs[I];
954 Hints[I] = FixItHint::CreateRemoval(ExtraLocs[I]);
957 TypeSpecWidth = TSW_unspecified;
958 TypeSpecComplex = TSC_unspecified;
959 TypeSpecSign = TSS_unspecified;
960 TypeAltiVecVector = TypeAltiVecPixel = TypeAltiVecBool = false;
962 Diag(D, TSTLoc, diag::err_decltype_auto_cannot_be_combined)
963 << Hints[0] << Hints[1] << Hints[2] << Hints[3]
964 << Hints[4] << Hints[5] << Hints[6] << Hints[7];
967 // Validate and finalize AltiVec vector declspec.
968 if (TypeAltiVecVector) {
969 if (TypeAltiVecBool) {
970 // Sign specifiers are not allowed with vector bool. (PIM 2.1)
971 if (TypeSpecSign != TSS_unspecified) {
972 Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec)
973 << getSpecifierName((TSS)TypeSpecSign);
976 // Only char/int are valid with vector bool. (PIM 2.1)
977 if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) &&
978 (TypeSpecType != TST_int)) || TypeAltiVecPixel) {
979 Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec)
980 << (TypeAltiVecPixel ? "__pixel" :
981 getSpecifierName((TST)TypeSpecType, Policy));
984 // Only 'short' and 'long long' are valid with vector bool. (PIM 2.1)
985 if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short) &&
986 (TypeSpecWidth != TSW_longlong))
987 Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec)
988 << getSpecifierName((TSW)TypeSpecWidth);
990 // vector bool long long requires VSX support or ZVector.
991 if ((TypeSpecWidth == TSW_longlong) &&
992 (!PP.getTargetInfo().hasFeature("vsx")) &&
993 (!PP.getTargetInfo().hasFeature("power8-vector")) &&
994 !PP.getLangOpts().ZVector)
995 Diag(D, TSTLoc, diag::err_invalid_vector_long_long_decl_spec);
997 // Elements of vector bool are interpreted as unsigned. (PIM 2.1)
998 if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) ||
999 (TypeSpecWidth != TSW_unspecified))
1000 TypeSpecSign = TSS_unsigned;
1001 } else if (TypeSpecType == TST_double) {
1002 // vector long double and vector long long double are never allowed.
1003 // vector double is OK for Power7 and later, and ZVector.
1004 if (TypeSpecWidth == TSW_long || TypeSpecWidth == TSW_longlong)
1005 Diag(D, TSWLoc, diag::err_invalid_vector_long_double_decl_spec);
1006 else if (!PP.getTargetInfo().hasFeature("vsx") &&
1007 !PP.getLangOpts().ZVector)
1008 Diag(D, TSTLoc, diag::err_invalid_vector_double_decl_spec);
1009 } else if (TypeSpecType == TST_float) {
1010 // vector float is unsupported for ZVector.
1011 if (PP.getLangOpts().ZVector)
1012 Diag(D, TSTLoc, diag::err_invalid_vector_float_decl_spec);
1013 } else if (TypeSpecWidth == TSW_long) {
1014 // vector long is unsupported for ZVector and deprecated for AltiVec.
1015 if (PP.getLangOpts().ZVector)
1016 Diag(D, TSWLoc, diag::err_invalid_vector_long_decl_spec);
1018 Diag(D, TSWLoc, diag::warn_vector_long_decl_spec_combination)
1019 << getSpecifierName((TST)TypeSpecType, Policy);
1022 if (TypeAltiVecPixel) {
1023 //TODO: perform validation
1024 TypeSpecType = TST_int;
1025 TypeSpecSign = TSS_unsigned;
1026 TypeSpecWidth = TSW_short;
1027 TypeSpecOwned = false;
1031 // signed/unsigned are only valid with int/char/wchar_t.
1032 if (TypeSpecSign != TSS_unspecified) {
1033 if (TypeSpecType == TST_unspecified)
1034 TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int.
1035 else if (TypeSpecType != TST_int && TypeSpecType != TST_int128 &&
1036 TypeSpecType != TST_char && TypeSpecType != TST_wchar) {
1037 Diag(D, TSSLoc, diag::err_invalid_sign_spec)
1038 << getSpecifierName((TST)TypeSpecType, Policy);
1039 // signed double -> double.
1040 TypeSpecSign = TSS_unspecified;
1044 // Validate the width of the type.
1045 switch (TypeSpecWidth) {
1046 case TSW_unspecified: break;
1047 case TSW_short: // short int
1048 case TSW_longlong: // long long int
1049 if (TypeSpecType == TST_unspecified)
1050 TypeSpecType = TST_int; // short -> short int, long long -> long long int.
1051 else if (TypeSpecType != TST_int) {
1053 TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec
1054 : diag::err_invalid_longlong_spec)
1055 << getSpecifierName((TST)TypeSpecType, Policy);
1056 TypeSpecType = TST_int;
1057 TypeSpecOwned = false;
1060 case TSW_long: // long double, long int
1061 if (TypeSpecType == TST_unspecified)
1062 TypeSpecType = TST_int; // long -> long int.
1063 else if (TypeSpecType != TST_int && TypeSpecType != TST_double) {
1064 Diag(D, TSWLoc, diag::err_invalid_long_spec)
1065 << getSpecifierName((TST)TypeSpecType, Policy);
1066 TypeSpecType = TST_int;
1067 TypeSpecOwned = false;
1072 // TODO: if the implementation does not implement _Complex or _Imaginary,
1073 // disallow their use. Need information about the backend.
1074 if (TypeSpecComplex != TSC_unspecified) {
1075 if (TypeSpecType == TST_unspecified) {
1076 Diag(D, TSCLoc, diag::ext_plain_complex)
1077 << FixItHint::CreateInsertion(
1078 PP.getLocForEndOfToken(getTypeSpecComplexLoc()),
1080 TypeSpecType = TST_double; // _Complex -> _Complex double.
1081 } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) {
1082 // Note that this intentionally doesn't include _Complex _Bool.
1083 if (!PP.getLangOpts().CPlusPlus)
1084 Diag(D, TSTLoc, diag::ext_integer_complex);
1085 } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) {
1086 Diag(D, TSCLoc, diag::err_invalid_complex_spec)
1087 << getSpecifierName((TST)TypeSpecType, Policy);
1088 TypeSpecComplex = TSC_unspecified;
1092 // C11 6.7.1/3, C++11 [dcl.stc]p1, GNU TLS: __thread, thread_local and
1093 // _Thread_local can only appear with the 'static' and 'extern' storage class
1094 // specifiers. We also allow __private_extern__ as an extension.
1095 if (ThreadStorageClassSpec != TSCS_unspecified) {
1096 switch (StorageClassSpec) {
1097 case SCS_unspecified:
1099 case SCS_private_extern:
1103 if (PP.getSourceManager().isBeforeInTranslationUnit(
1104 getThreadStorageClassSpecLoc(), getStorageClassSpecLoc()))
1105 Diag(D, getStorageClassSpecLoc(),
1106 diag::err_invalid_decl_spec_combination)
1107 << DeclSpec::getSpecifierName(getThreadStorageClassSpec())
1108 << SourceRange(getThreadStorageClassSpecLoc());
1110 Diag(D, getThreadStorageClassSpecLoc(),
1111 diag::err_invalid_decl_spec_combination)
1112 << DeclSpec::getSpecifierName(getStorageClassSpec())
1113 << SourceRange(getStorageClassSpecLoc());
1114 // Discard the thread storage class specifier to recover.
1115 ThreadStorageClassSpec = TSCS_unspecified;
1116 ThreadStorageClassSpecLoc = SourceLocation();
1120 // If no type specifier was provided and we're parsing a language where
1121 // the type specifier is not optional, but we got 'auto' as a storage
1122 // class specifier, then assume this is an attempt to use C++0x's 'auto'
1124 if (PP.getLangOpts().CPlusPlus &&
1125 TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) {
1126 TypeSpecType = TST_auto;
1127 StorageClassSpec = SCS_unspecified;
1128 TSTLoc = TSTNameLoc = StorageClassSpecLoc;
1129 StorageClassSpecLoc = SourceLocation();
1131 // Diagnose if we've recovered from an ill-formed 'auto' storage class
1132 // specifier in a pre-C++11 dialect of C++.
1133 if (!PP.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto)
1134 Diag(D, TSTLoc, diag::ext_auto_type_specifier);
1135 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus11 &&
1136 StorageClassSpec == SCS_auto)
1137 Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class)
1138 << FixItHint::CreateRemoval(StorageClassSpecLoc);
1139 if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32)
1140 Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type)
1141 << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t");
1142 if (Constexpr_specified)
1143 Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr);
1145 // C++ [class.friend]p6:
1146 // No storage-class-specifier shall appear in the decl-specifier-seq
1147 // of a friend declaration.
1148 if (isFriendSpecified() &&
1149 (getStorageClassSpec() || getThreadStorageClassSpec())) {
1150 SmallString<32> SpecName;
1151 SourceLocation SCLoc;
1152 FixItHint StorageHint, ThreadHint;
1154 if (DeclSpec::SCS SC = getStorageClassSpec()) {
1155 SpecName = getSpecifierName(SC);
1156 SCLoc = getStorageClassSpecLoc();
1157 StorageHint = FixItHint::CreateRemoval(SCLoc);
1160 if (DeclSpec::TSCS TSC = getThreadStorageClassSpec()) {
1161 if (!SpecName.empty()) SpecName += " ";
1162 SpecName += getSpecifierName(TSC);
1163 SCLoc = getThreadStorageClassSpecLoc();
1164 ThreadHint = FixItHint::CreateRemoval(SCLoc);
1167 Diag(D, SCLoc, diag::err_friend_decl_spec)
1168 << SpecName << StorageHint << ThreadHint;
1170 ClearStorageClassSpecs();
1173 // C++11 [dcl.fct.spec]p5:
1174 // The virtual specifier shall be used only in the initial
1175 // declaration of a non-static class member function;
1176 // C++11 [dcl.fct.spec]p6:
1177 // The explicit specifier shall be used only in the declaration of
1178 // a constructor or conversion function within its class
1180 if (isFriendSpecified() && (isVirtualSpecified() || isExplicitSpecified())) {
1182 SourceLocation SCLoc;
1184 if (isVirtualSpecified()) {
1185 Keyword = "virtual";
1186 SCLoc = getVirtualSpecLoc();
1188 Keyword = "explicit";
1189 SCLoc = getExplicitSpecLoc();
1192 FixItHint Hint = FixItHint::CreateRemoval(SCLoc);
1193 Diag(D, SCLoc, diag::err_friend_decl_spec)
1196 FS_virtual_specified = FS_explicit_specified = false;
1197 FS_virtualLoc = FS_explicitLoc = SourceLocation();
1200 assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType));
1202 // Okay, now we can infer the real type.
1204 // TODO: return "auto function" and other bad things based on the real type.
1206 // 'data definition has no type or storage class'?
1209 bool DeclSpec::isMissingDeclaratorOk() {
1210 TST tst = getTypeSpecType();
1211 return isDeclRep(tst) && getRepAsDecl() != nullptr &&
1212 StorageClassSpec != DeclSpec::SCS_typedef;
1215 void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc,
1216 OverloadedOperatorKind Op,
1217 SourceLocation SymbolLocations[3]) {
1218 Kind = IK_OperatorFunctionId;
1219 StartLocation = OperatorLoc;
1220 EndLocation = OperatorLoc;
1221 OperatorFunctionId.Operator = Op;
1222 for (unsigned I = 0; I != 3; ++I) {
1223 OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding();
1225 if (SymbolLocations[I].isValid())
1226 EndLocation = SymbolLocations[I];
1230 bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc,
1231 const char *&PrevSpec) {
1232 if (!FirstLocation.isValid())
1233 FirstLocation = Loc;
1237 if (Specifiers & VS) {
1238 PrevSpec = getSpecifierName(VS);
1245 default: llvm_unreachable("Unknown specifier!");
1246 case VS_Override: VS_overrideLoc = Loc; break;
1248 case VS_Final: VS_finalLoc = Loc; break;
1254 const char *VirtSpecifiers::getSpecifierName(Specifier VS) {
1256 default: llvm_unreachable("Unknown specifier");
1257 case VS_Override: return "override";
1258 case VS_Final: return "final";
1259 case VS_Sealed: return "sealed";