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/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"
29 using namespace clang;
32 static DiagnosticBuilder Diag(DiagnosticsEngine &D, SourceLocation Loc,
34 return D.Report(Loc, DiagID);
38 void UnqualifiedId::setTemplateId(TemplateIdAnnotation *TemplateId) {
39 assert(TemplateId && "NULL template-id annotation?");
41 this->TemplateId = TemplateId;
42 StartLocation = TemplateId->TemplateNameLoc;
43 EndLocation = TemplateId->RAngleLoc;
46 void 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;
54 void 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);
61 assert(Range == Builder.getSourceRange() &&
62 "NestedNameSpecifierLoc range computation incorrect");
65 void CXXScopeSpec::Extend(ASTContext &Context, IdentifierInfo *Identifier,
66 SourceLocation IdentifierLoc,
67 SourceLocation ColonColonLoc) {
68 Builder.Extend(Context, Identifier, IdentifierLoc, ColonColonLoc);
70 if (Range.getBegin().isInvalid())
71 Range.setBegin(IdentifierLoc);
72 Range.setEnd(ColonColonLoc);
74 assert(Range == Builder.getSourceRange() &&
75 "NestedNameSpecifierLoc range computation incorrect");
78 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceDecl *Namespace,
79 SourceLocation NamespaceLoc,
80 SourceLocation ColonColonLoc) {
81 Builder.Extend(Context, Namespace, NamespaceLoc, ColonColonLoc);
83 if (Range.getBegin().isInvalid())
84 Range.setBegin(NamespaceLoc);
85 Range.setEnd(ColonColonLoc);
87 assert(Range == Builder.getSourceRange() &&
88 "NestedNameSpecifierLoc range computation incorrect");
91 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
92 SourceLocation AliasLoc,
93 SourceLocation ColonColonLoc) {
94 Builder.Extend(Context, Alias, AliasLoc, ColonColonLoc);
96 if (Range.getBegin().isInvalid())
97 Range.setBegin(AliasLoc);
98 Range.setEnd(ColonColonLoc);
100 assert(Range == Builder.getSourceRange() &&
101 "NestedNameSpecifierLoc range computation incorrect");
104 void CXXScopeSpec::MakeGlobal(ASTContext &Context,
105 SourceLocation ColonColonLoc) {
106 Builder.MakeGlobal(Context, ColonColonLoc);
108 Range = SourceRange(ColonColonLoc);
110 assert(Range == Builder.getSourceRange() &&
111 "NestedNameSpecifierLoc range computation incorrect");
114 void CXXScopeSpec::MakeTrivial(ASTContext &Context,
115 NestedNameSpecifier *Qualifier, SourceRange R) {
116 Builder.MakeTrivial(Context, Qualifier, R);
120 void CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) {
122 Range = SourceRange();
127 Range = Other.getSourceRange();
128 Builder.Adopt(Other);
131 SourceLocation CXXScopeSpec::getLastQualifierNameLoc() const {
132 if (!Builder.getRepresentation())
133 return SourceLocation();
134 return Builder.getTemporary().getLocalBeginLoc();
137 NestedNameSpecifierLoc
138 CXXScopeSpec::getWithLocInContext(ASTContext &Context) const {
139 if (!Builder.getRepresentation())
140 return NestedNameSpecifierLoc();
142 return Builder.getWithLocInContext(Context);
145 /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
146 /// "TheDeclarator" is the declarator that this will be added to.
147 DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto,
149 SourceLocation LParenLoc,
152 SourceLocation EllipsisLoc,
153 SourceLocation RParenLoc,
155 bool RefQualifierIsLvalueRef,
156 SourceLocation RefQualifierLoc,
157 SourceLocation ConstQualifierLoc,
159 VolatileQualifierLoc,
160 SourceLocation MutableLoc,
161 ExceptionSpecificationType
163 SourceLocation ESpecLoc,
164 ParsedType *Exceptions,
165 SourceRange *ExceptionRanges,
166 unsigned NumExceptions,
168 SourceLocation LocalRangeBegin,
169 SourceLocation LocalRangeEnd,
170 Declarator &TheDeclarator,
171 TypeResult TrailingReturnType) {
172 assert(!(TypeQuals & DeclSpec::TQ_atomic) &&
173 "function cannot have _Atomic qualifier");
177 I.Loc = LocalRangeBegin;
178 I.EndLoc = LocalRangeEnd;
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;
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();
204 // new[] an argument array if needed.
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;
216 I.Fun.ArgInfo = new DeclaratorChunk::ParamInfo[NumArgs];
217 I.Fun.DeleteArgInfo = true;
219 memcpy(I.Fun.ArgInfo, ArgInfo, sizeof(ArgInfo[0])*NumArgs);
222 // Check what exception specification information we should actually store.
224 default: break; // By default, save nothing.
226 // new[] an exception array if needed
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];
237 case EST_ComputedNoexcept:
238 I.Fun.NoexceptExpr = NoexceptExpr;
244 bool 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:
249 case DeclaratorChunk::Paren:
251 case DeclaratorChunk::Pointer:
252 case DeclaratorChunk::Reference:
253 case DeclaratorChunk::Array:
254 case DeclaratorChunk::BlockPointer:
255 case DeclaratorChunk::MemberPointer:
258 llvm_unreachable("Invalid type chunk");
261 switch (DS.getTypeSpecType()) {
282 case TST_unknown_anytype:
283 case TST_unspecified:
287 case TST_image1d_array_t:
288 case TST_image1d_buffer_t:
290 case TST_image2d_array_t:
298 if (Expr *E = DS.getRepAsExpr())
299 return E->getType()->isFunctionType();
302 case TST_underlyingType:
304 case TST_typeofType: {
305 QualType QT = DS.getRepAsType().get();
309 if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT))
315 return QT->isFunctionType();
319 llvm_unreachable("Invalid TypeSpecType!");
322 /// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
323 /// declaration specifier includes.
325 unsigned DeclSpec::getParsedSpecifiers() const {
327 if (StorageClassSpec != SCS_unspecified ||
328 SCS_thread_specified)
329 Res |= PQ_StorageClassSpecifier;
331 if (TypeQualifiers != TQ_unspecified)
332 Res |= PQ_TypeQualifier;
334 if (hasTypeSpecifier())
335 Res |= PQ_TypeSpecifier;
337 if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified ||
338 FS_noreturn_specified)
339 Res |= PQ_FunctionSpecifier;
343 template <class T> static bool BadSpecifier(T TNew, T TPrev,
344 const char *&PrevSpec,
346 bool IsExtension = true) {
347 PrevSpec = DeclSpec::getSpecifierName(TPrev);
349 DiagID = diag::err_invalid_decl_spec_combination;
351 DiagID = IsExtension ? diag::ext_duplicate_declspec :
352 diag::warn_duplicate_declspec;
356 const char *DeclSpec::getSpecifierName(DeclSpec::SCS 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";
367 llvm_unreachable("Unknown typespec!");
370 const char *DeclSpec::getSpecifierName(TSW 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";
377 llvm_unreachable("Unknown typespec!");
380 const char *DeclSpec::getSpecifierName(TSC C) {
382 case TSC_unspecified: return "unspecified";
383 case TSC_imaginary: return "imaginary";
384 case TSC_complex: return "complex";
386 llvm_unreachable("Unknown typespec!");
390 const char *DeclSpec::getSpecifierName(TSS S) {
392 case TSS_unspecified: return "unspecified";
393 case TSS_signed: return "signed";
394 case TSS_unsigned: return "unsigned";
396 llvm_unreachable("Unknown typespec!");
399 const char *DeclSpec::getSpecifierName(DeclSpec::TST 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)";
439 llvm_unreachable("Unknown typespec!");
442 const char *DeclSpec::getSpecifierName(TQ 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";
450 llvm_unreachable("Unknown typespec!");
453 bool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc,
454 const char *&PrevSpec,
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) {
467 case SCS_private_extern:
469 if (S.getLangOpts().OpenCLVersion < 120) {
470 DiagID = diag::err_not_opencl_storage_class_specifier;
471 PrevSpec = getSpecifierName(SC);
477 DiagID = diag::err_not_opencl_storage_class_specifier;
478 PrevSpec = getSpecifierName(SC);
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) {
490 return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID);
491 if (StorageClassSpec == SCS_auto) {
492 isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc,
494 assert(!isInvalid && "auto SCS -> TST recovery failed");
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'.
502 !(SCS_extern_in_linkage_spec &&
503 StorageClassSpec == SCS_extern &&
505 return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID);
507 StorageClassSpec = SC;
508 StorageClassSpecLoc = Loc;
509 assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield");
513 bool DeclSpec::SetStorageClassSpecThread(SourceLocation Loc,
514 const char *&PrevSpec,
516 if (SCS_thread_specified) {
517 PrevSpec = "__thread";
518 DiagID = diag::ext_duplicate_declspec;
521 SCS_thread_specified = true;
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
529 bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc,
530 const char *&PrevSpec,
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)
536 // Allow turning long -> long long.
537 else if (W != TSW_longlong || TypeSpecWidth != TSW_long)
538 return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID);
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;
549 bool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc,
550 const char *&PrevSpec,
552 if (TypeSpecComplex != TSC_unspecified)
553 return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID);
559 bool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc,
560 const char *&PrevSpec,
562 if (TypeSpecSign != TSS_unspecified)
563 return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID);
569 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
570 const char *&PrevSpec,
573 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep);
576 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
577 SourceLocation TagNameLoc,
578 const char *&PrevSpec,
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;
591 TSTNameLoc = TagNameLoc;
592 TypeSpecOwned = false;
596 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
597 const char *&PrevSpec,
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;
611 TypeSpecOwned = false;
615 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
616 const char *&PrevSpec,
618 Decl *Rep, bool Owned) {
619 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned);
622 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
623 SourceLocation TagNameLoc,
624 const char *&PrevSpec,
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.
630 if (TypeSpecType != TST_unspecified) {
631 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
632 DiagID = diag::err_invalid_decl_spec_combination;
638 TSTNameLoc = TagNameLoc;
639 TypeSpecOwned = Owned;
643 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
644 const char *&PrevSpec,
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;
655 if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) {
656 TypeAltiVecBool = true;
660 TypeSpecOwned = false;
661 if (TypeAltiVecVector && !TypeAltiVecBool && (TypeSpecType == TST_double)) {
662 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
663 DiagID = diag::err_invalid_vector_decl_spec;
669 bool 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;
676 TypeAltiVecVector = isAltiVecVector;
681 bool 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;
689 TypeAltiVecPixel = isAltiVecPixel;
695 bool DeclSpec::SetTypeSpecError() {
696 TypeSpecType = TST_error;
697 TypeSpecOwned = false;
698 TSTLoc = SourceLocation();
699 TSTNameLoc = SourceLocation();
703 bool 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;
712 return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension);
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;
724 llvm_unreachable("Unknown type qualifier!");
727 bool DeclSpec::setFunctionSpecInline(SourceLocation Loc) {
728 // 'inline inline' is ok.
729 FS_inline_specified = true;
734 bool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc) {
735 // 'virtual virtual' is ok.
736 FS_virtual_specified = true;
741 bool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc) {
742 // 'explicit explicit' is ok.
743 FS_explicit_specified = true;
744 FS_explicitLoc = Loc;
748 bool DeclSpec::setFunctionSpecNoreturn(SourceLocation Loc) {
749 // '_Noreturn _Noreturn' is ok.
750 FS_noreturn_specified = true;
751 FS_noreturnLoc = Loc;
755 bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
757 if (Friend_specified) {
759 DiagID = diag::ext_duplicate_declspec;
763 Friend_specified = true;
768 bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
770 if (isModulePrivateSpecified()) {
771 PrevSpec = "__module_private__";
772 DiagID = diag::ext_duplicate_declspec;
776 ModulePrivateLoc = Loc;
780 bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
782 // 'constexpr constexpr' is ok.
783 Constexpr_specified = true;
788 void DeclSpec::setProtocolQualifiers(Decl * const *Protos,
790 SourceLocation *ProtoLocs,
791 SourceLocation LAngleLoc) {
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;
802 void 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();
810 if (attrs->getKind() == AttributeList::AT_Mode) {
811 writtenBS.ModeAttr = true;
814 attrs = attrs->getNext();
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.
822 void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP) {
823 // Before possibly changing their values, save specs as written.
824 SaveWrittenBuiltinSpecs();
826 // Check the type specifier components first.
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);
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));
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);
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;
856 if (TypeAltiVecPixel) {
857 //TODO: perform validation
858 TypeSpecType = TST_int;
859 TypeSpecSign = TSS_unsigned;
860 TypeSpecWidth = TSW_short;
861 TypeSpecOwned = false;
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;
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) {
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;
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;
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()),
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;
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'
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();
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);
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);
959 SourceLocation SCLoc = getStorageClassSpecLoc();
960 SourceLocation SCEndLoc = SCLoc.getLocWithOffset(strlen(SpecName));
962 Diag(D, SCLoc, diag::err_friend_storage_spec)
964 << FixItHint::CreateRemoval(SourceRange(SCLoc, SCEndLoc));
966 ClearStorageClassSpecs();
969 assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType));
971 // Okay, now we can infer the real type.
973 // TODO: return "auto function" and other bad things based on the real type.
975 // 'data definition has no type or storage class'?
978 bool DeclSpec::isMissingDeclaratorOk() {
979 TST tst = getTypeSpecType();
980 return isDeclRep(tst) && getRepAsDecl() != 0 &&
981 StorageClassSpec != DeclSpec::SCS_typedef;
984 void 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();
994 if (SymbolLocations[I].isValid())
995 EndLocation = SymbolLocations[I];
999 bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc,
1000 const char *&PrevSpec) {
1003 if (Specifiers & VS) {
1004 PrevSpec = getSpecifierName(VS);
1011 default: llvm_unreachable("Unknown specifier!");
1012 case VS_Override: VS_overrideLoc = Loc; break;
1013 case VS_Final: VS_finalLoc = Loc; break;
1019 const char *VirtSpecifiers::getSpecifierName(Specifier VS) {
1021 default: llvm_unreachable("Unknown specifier");
1022 case VS_Override: return "override";
1023 case VS_Final: return "final";