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/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"
31 #include <cstring>
32 using namespace clang;
33
34
Diag(DiagnosticsEngine & D,SourceLocation Loc,unsigned DiagID)35 static DiagnosticBuilder Diag(DiagnosticsEngine &D, SourceLocation Loc,
36 unsigned DiagID) {
37 return D.Report(Loc, DiagID);
38 }
39
40
setTemplateId(TemplateIdAnnotation * TemplateId)41 void UnqualifiedId::setTemplateId(TemplateIdAnnotation *TemplateId) {
42 assert(TemplateId && "NULL template-id annotation?");
43 Kind = IK_TemplateId;
44 this->TemplateId = TemplateId;
45 StartLocation = TemplateId->TemplateNameLoc;
46 EndLocation = TemplateId->RAngleLoc;
47 }
48
setConstructorTemplateId(TemplateIdAnnotation * TemplateId)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;
55 }
56
Extend(ASTContext & Context,SourceLocation TemplateKWLoc,TypeLoc TL,SourceLocation ColonColonLoc)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);
63
64 assert(Range == Builder.getSourceRange() &&
65 "NestedNameSpecifierLoc range computation incorrect");
66 }
67
Extend(ASTContext & Context,IdentifierInfo * Identifier,SourceLocation IdentifierLoc,SourceLocation ColonColonLoc)68 void CXXScopeSpec::Extend(ASTContext &Context, IdentifierInfo *Identifier,
69 SourceLocation IdentifierLoc,
70 SourceLocation ColonColonLoc) {
71 Builder.Extend(Context, Identifier, IdentifierLoc, ColonColonLoc);
72
73 if (Range.getBegin().isInvalid())
74 Range.setBegin(IdentifierLoc);
75 Range.setEnd(ColonColonLoc);
76
77 assert(Range == Builder.getSourceRange() &&
78 "NestedNameSpecifierLoc range computation incorrect");
79 }
80
Extend(ASTContext & Context,NamespaceDecl * Namespace,SourceLocation NamespaceLoc,SourceLocation ColonColonLoc)81 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceDecl *Namespace,
82 SourceLocation NamespaceLoc,
83 SourceLocation ColonColonLoc) {
84 Builder.Extend(Context, Namespace, NamespaceLoc, ColonColonLoc);
85
86 if (Range.getBegin().isInvalid())
87 Range.setBegin(NamespaceLoc);
88 Range.setEnd(ColonColonLoc);
89
90 assert(Range == Builder.getSourceRange() &&
91 "NestedNameSpecifierLoc range computation incorrect");
92 }
93
Extend(ASTContext & Context,NamespaceAliasDecl * Alias,SourceLocation AliasLoc,SourceLocation ColonColonLoc)94 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
95 SourceLocation AliasLoc,
96 SourceLocation ColonColonLoc) {
97 Builder.Extend(Context, Alias, AliasLoc, ColonColonLoc);
98
99 if (Range.getBegin().isInvalid())
100 Range.setBegin(AliasLoc);
101 Range.setEnd(ColonColonLoc);
102
103 assert(Range == Builder.getSourceRange() &&
104 "NestedNameSpecifierLoc range computation incorrect");
105 }
106
MakeGlobal(ASTContext & Context,SourceLocation ColonColonLoc)107 void CXXScopeSpec::MakeGlobal(ASTContext &Context,
108 SourceLocation ColonColonLoc) {
109 Builder.MakeGlobal(Context, ColonColonLoc);
110
111 Range = SourceRange(ColonColonLoc);
112
113 assert(Range == Builder.getSourceRange() &&
114 "NestedNameSpecifierLoc range computation incorrect");
115 }
116
MakeSuper(ASTContext & Context,CXXRecordDecl * RD,SourceLocation SuperLoc,SourceLocation ColonColonLoc)117 void CXXScopeSpec::MakeSuper(ASTContext &Context, CXXRecordDecl *RD,
118 SourceLocation SuperLoc,
119 SourceLocation ColonColonLoc) {
120 Builder.MakeSuper(Context, RD, SuperLoc, ColonColonLoc);
121
122 Range.setBegin(SuperLoc);
123 Range.setEnd(ColonColonLoc);
124
125 assert(Range == Builder.getSourceRange() &&
126 "NestedNameSpecifierLoc range computation incorrect");
127 }
128
MakeTrivial(ASTContext & Context,NestedNameSpecifier * Qualifier,SourceRange R)129 void CXXScopeSpec::MakeTrivial(ASTContext &Context,
130 NestedNameSpecifier *Qualifier, SourceRange R) {
131 Builder.MakeTrivial(Context, Qualifier, R);
132 Range = R;
133 }
134
Adopt(NestedNameSpecifierLoc Other)135 void CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) {
136 if (!Other) {
137 Range = SourceRange();
138 Builder.Clear();
139 return;
140 }
141
142 Range = Other.getSourceRange();
143 Builder.Adopt(Other);
144 }
145
getLastQualifierNameLoc() const146 SourceLocation CXXScopeSpec::getLastQualifierNameLoc() const {
147 if (!Builder.getRepresentation())
148 return SourceLocation();
149 return Builder.getTemporary().getLocalBeginLoc();
150 }
151
152 NestedNameSpecifierLoc
getWithLocInContext(ASTContext & Context) const153 CXXScopeSpec::getWithLocInContext(ASTContext &Context) const {
154 if (!Builder.getRepresentation())
155 return NestedNameSpecifierLoc();
156
157 return Builder.getWithLocInContext(Context);
158 }
159
160 /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
161 /// "TheDeclarator" is the declarator that this will be added to.
getFunction(bool hasProto,bool isAmbiguous,SourceLocation LParenLoc,ParamInfo * Params,unsigned NumParams,SourceLocation EllipsisLoc,SourceLocation RParenLoc,unsigned TypeQuals,bool RefQualifierIsLvalueRef,SourceLocation RefQualifierLoc,SourceLocation ConstQualifierLoc,SourceLocation VolatileQualifierLoc,SourceLocation RestrictQualifierLoc,SourceLocation MutableLoc,ExceptionSpecificationType ESpecType,SourceLocation ESpecLoc,ParsedType * Exceptions,SourceRange * ExceptionRanges,unsigned NumExceptions,Expr * NoexceptExpr,CachedTokens * ExceptionSpecTokens,SourceLocation LocalRangeBegin,SourceLocation LocalRangeEnd,Declarator & TheDeclarator,TypeResult TrailingReturnType)162 DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto,
163 bool isAmbiguous,
164 SourceLocation LParenLoc,
165 ParamInfo *Params,
166 unsigned NumParams,
167 SourceLocation EllipsisLoc,
168 SourceLocation RParenLoc,
169 unsigned TypeQuals,
170 bool RefQualifierIsLvalueRef,
171 SourceLocation RefQualifierLoc,
172 SourceLocation ConstQualifierLoc,
173 SourceLocation
174 VolatileQualifierLoc,
175 SourceLocation
176 RestrictQualifierLoc,
177 SourceLocation MutableLoc,
178 ExceptionSpecificationType
179 ESpecType,
180 SourceLocation ESpecLoc,
181 ParsedType *Exceptions,
182 SourceRange *ExceptionRanges,
183 unsigned NumExceptions,
184 Expr *NoexceptExpr,
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");
192
193 DeclaratorChunk I;
194 I.Kind = Function;
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();
222
223 assert(I.Fun.TypeQuals == TypeQuals && "bitfield overflow");
224 assert(I.Fun.ExceptionSpecType == ESpecType && "bitfield overflow");
225
226 // new[] a parameter array if needed.
227 if (NumParams) {
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;
237 } else {
238 I.Fun.Params = new DeclaratorChunk::ParamInfo[NumParams];
239 I.Fun.DeleteParams = true;
240 }
241 memcpy(I.Fun.Params, Params, sizeof(Params[0]) * NumParams);
242 }
243
244 // Check what exception specification information we should actually store.
245 switch (ESpecType) {
246 default: break; // By default, save nothing.
247 case EST_Dynamic:
248 // new[] an exception array if needed
249 if (NumExceptions) {
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];
255 }
256 }
257 break;
258
259 case EST_ComputedNoexcept:
260 I.Fun.NoexceptExpr = NoexceptExpr;
261 break;
262
263 case EST_Unparsed:
264 I.Fun.ExceptionSpecTokens = ExceptionSpecTokens;
265 break;
266 }
267 return I;
268 }
269
isDeclarationOfFunction() const270 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:
274 return true;
275 case DeclaratorChunk::Paren:
276 continue;
277 case DeclaratorChunk::Pointer:
278 case DeclaratorChunk::Reference:
279 case DeclaratorChunk::Array:
280 case DeclaratorChunk::BlockPointer:
281 case DeclaratorChunk::MemberPointer:
282 return false;
283 }
284 llvm_unreachable("Invalid type chunk");
285 }
286
287 switch (DS.getTypeSpecType()) {
288 case TST_atomic:
289 case TST_auto:
290 case TST_bool:
291 case TST_char:
292 case TST_char16:
293 case TST_char32:
294 case TST_class:
295 case TST_decimal128:
296 case TST_decimal32:
297 case TST_decimal64:
298 case TST_double:
299 case TST_enum:
300 case TST_error:
301 case TST_float:
302 case TST_half:
303 case TST_int:
304 case TST_int128:
305 case TST_struct:
306 case TST_interface:
307 case TST_union:
308 case TST_unknown_anytype:
309 case TST_unspecified:
310 case TST_void:
311 case TST_wchar:
312 return false;
313
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.
317 return false;
318
319 case TST_decltype:
320 case TST_typeofExpr:
321 if (Expr *E = DS.getRepAsExpr())
322 return E->getType()->isFunctionType();
323 return false;
324
325 case TST_underlyingType:
326 case TST_typename:
327 case TST_typeofType: {
328 QualType QT = DS.getRepAsType().get();
329 if (QT.isNull())
330 return false;
331
332 if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT))
333 QT = LIT->getType();
334
335 if (QT.isNull())
336 return false;
337
338 return QT->isFunctionType();
339 }
340 }
341
342 llvm_unreachable("Invalid TypeSpecType!");
343 }
344
isStaticMember()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));
351 }
352
hasTagDefinition() const353 bool DeclSpec::hasTagDefinition() const {
354 if (!TypeSpecOwned)
355 return false;
356 return cast<TagDecl>(getRepAsDecl())->isCompleteDefinition();
357 }
358
359 /// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
360 /// declaration specifier includes.
361 ///
getParsedSpecifiers() const362 unsigned DeclSpec::getParsedSpecifiers() const {
363 unsigned Res = 0;
364 if (StorageClassSpec != SCS_unspecified ||
365 ThreadStorageClassSpec != TSCS_unspecified)
366 Res |= PQ_StorageClassSpecifier;
367
368 if (TypeQualifiers != TQ_unspecified)
369 Res |= PQ_TypeQualifier;
370
371 if (hasTypeSpecifier())
372 Res |= PQ_TypeSpecifier;
373
374 if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified ||
375 FS_noreturn_specified || FS_forceinline_specified)
376 Res |= PQ_FunctionSpecifier;
377 return Res;
378 }
379
BadSpecifier(T TNew,T TPrev,const char * & PrevSpec,unsigned & DiagID,bool IsExtension=true)380 template <class T> static bool BadSpecifier(T TNew, T TPrev,
381 const char *&PrevSpec,
382 unsigned &DiagID,
383 bool IsExtension = true) {
384 PrevSpec = DeclSpec::getSpecifierName(TPrev);
385 if (TNew != TPrev)
386 DiagID = diag::err_invalid_decl_spec_combination;
387 else
388 DiagID = IsExtension ? diag::ext_duplicate_declspec :
389 diag::warn_duplicate_declspec;
390 return true;
391 }
392
getSpecifierName(DeclSpec::SCS S)393 const char *DeclSpec::getSpecifierName(DeclSpec::SCS S) {
394 switch (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";
403 }
404 llvm_unreachable("Unknown typespec!");
405 }
406
getSpecifierName(DeclSpec::TSCS S)407 const char *DeclSpec::getSpecifierName(DeclSpec::TSCS S) {
408 switch (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";
413 }
414 llvm_unreachable("Unknown typespec!");
415 }
416
getSpecifierName(TSW W)417 const char *DeclSpec::getSpecifierName(TSW W) {
418 switch (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";
423 }
424 llvm_unreachable("Unknown typespec!");
425 }
426
getSpecifierName(TSC C)427 const char *DeclSpec::getSpecifierName(TSC C) {
428 switch (C) {
429 case TSC_unspecified: return "unspecified";
430 case TSC_imaginary: return "imaginary";
431 case TSC_complex: return "complex";
432 }
433 llvm_unreachable("Unknown typespec!");
434 }
435
436
getSpecifierName(TSS S)437 const char *DeclSpec::getSpecifierName(TSS S) {
438 switch (S) {
439 case TSS_unspecified: return "unspecified";
440 case TSS_signed: return "signed";
441 case TSS_unsigned: return "unsigned";
442 }
443 llvm_unreachable("Unknown typespec!");
444 }
445
getSpecifierName(DeclSpec::TST T,const PrintingPolicy & Policy)446 const char *DeclSpec::getSpecifierName(DeclSpec::TST T,
447 const PrintingPolicy &Policy) {
448 switch (T) {
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)";
479 }
480 llvm_unreachable("Unknown typespec!");
481 }
482
getSpecifierName(TQ T)483 const char *DeclSpec::getSpecifierName(TQ T) {
484 switch (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";
490 }
491 llvm_unreachable("Unknown typespec!");
492 }
493
SetStorageClassSpec(Sema & S,SCS SC,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)494 bool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc,
495 const char *&PrevSpec,
496 unsigned &DiagID,
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) {
507 switch (SC) {
508 case SCS_extern:
509 case SCS_private_extern:
510 case SCS_static:
511 if (S.getLangOpts().OpenCLVersion < 120) {
512 DiagID = diag::err_opencl_unknown_type_specifier;
513 PrevSpec = getSpecifierName(SC);
514 return true;
515 }
516 break;
517 case SCS_auto:
518 case SCS_register:
519 DiagID = diag::err_opencl_unknown_type_specifier;
520 PrevSpec = getSpecifierName(SC);
521 return true;
522 default:
523 break;
524 }
525 }
526
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) {
531 if (SC == SCS_auto)
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");
537 }
538 }
539
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'.
543 if (isInvalid &&
544 !(SCS_extern_in_linkage_spec &&
545 StorageClassSpec == SCS_extern &&
546 SC == SCS_typedef))
547 return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID);
548 }
549 StorageClassSpec = SC;
550 StorageClassSpecLoc = Loc;
551 assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield");
552 return false;
553 }
554
SetStorageClassSpecThread(TSCS TSC,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)555 bool DeclSpec::SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc,
556 const char *&PrevSpec,
557 unsigned &DiagID) {
558 if (ThreadStorageClassSpec != TSCS_unspecified)
559 return BadSpecifier(TSC, (TSCS)ThreadStorageClassSpec, PrevSpec, DiagID);
560
561 ThreadStorageClassSpec = TSC;
562 ThreadStorageClassSpecLoc = Loc;
563 return false;
564 }
565
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
568 /// specified).
SetTypeSpecWidth(TSW W,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)569 bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc,
570 const char *&PrevSpec,
571 unsigned &DiagID,
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)
576 TSWLoc = Loc;
577 // Allow turning long -> long long.
578 else if (W != TSW_longlong || TypeSpecWidth != TSW_long)
579 return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID);
580 TypeSpecWidth = W;
581 return false;
582 }
583
SetTypeSpecComplex(TSC C,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)584 bool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc,
585 const char *&PrevSpec,
586 unsigned &DiagID) {
587 if (TypeSpecComplex != TSC_unspecified)
588 return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID);
589 TypeSpecComplex = C;
590 TSCLoc = Loc;
591 return false;
592 }
593
SetTypeSpecSign(TSS S,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)594 bool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc,
595 const char *&PrevSpec,
596 unsigned &DiagID) {
597 if (TypeSpecSign != TSS_unspecified)
598 return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID);
599 TypeSpecSign = S;
600 TSSLoc = Loc;
601 return false;
602 }
603
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,ParsedType Rep,const PrintingPolicy & Policy)604 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
605 const char *&PrevSpec,
606 unsigned &DiagID,
607 ParsedType Rep,
608 const PrintingPolicy &Policy) {
609 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Policy);
610 }
611
SetTypeSpecType(TST T,SourceLocation TagKwLoc,SourceLocation TagNameLoc,const char * & PrevSpec,unsigned & DiagID,ParsedType Rep,const PrintingPolicy & Policy)612 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
613 SourceLocation TagNameLoc,
614 const char *&PrevSpec,
615 unsigned &DiagID,
616 ParsedType Rep,
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;
623 return true;
624 }
625 TypeSpecType = T;
626 TypeRep = Rep;
627 TSTLoc = TagKwLoc;
628 TSTNameLoc = TagNameLoc;
629 TypeSpecOwned = false;
630 return false;
631 }
632
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,Expr * Rep,const PrintingPolicy & Policy)633 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
634 const char *&PrevSpec,
635 unsigned &DiagID,
636 Expr *Rep,
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;
643 return true;
644 }
645 TypeSpecType = T;
646 ExprRep = Rep;
647 TSTLoc = Loc;
648 TSTNameLoc = Loc;
649 TypeSpecOwned = false;
650 return false;
651 }
652
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,Decl * Rep,bool Owned,const PrintingPolicy & Policy)653 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
654 const char *&PrevSpec,
655 unsigned &DiagID,
656 Decl *Rep, bool Owned,
657 const PrintingPolicy &Policy) {
658 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned, Policy);
659 }
660
SetTypeSpecType(TST T,SourceLocation TagKwLoc,SourceLocation TagNameLoc,const char * & PrevSpec,unsigned & DiagID,Decl * Rep,bool Owned,const PrintingPolicy & Policy)661 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
662 SourceLocation TagNameLoc,
663 const char *&PrevSpec,
664 unsigned &DiagID,
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.
669
670 if (TypeSpecType != TST_unspecified) {
671 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
672 DiagID = diag::err_invalid_decl_spec_combination;
673 return true;
674 }
675 TypeSpecType = T;
676 DeclRep = Rep;
677 TSTLoc = TagKwLoc;
678 TSTNameLoc = TagNameLoc;
679 TypeSpecOwned = Owned && Rep != nullptr;
680 return false;
681 }
682
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)683 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
684 const char *&PrevSpec,
685 unsigned &DiagID,
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;
692 return true;
693 }
694 TSTLoc = Loc;
695 TSTNameLoc = Loc;
696 if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) {
697 TypeAltiVecBool = true;
698 return false;
699 }
700 TypeSpecType = T;
701 TypeSpecOwned = false;
702 return false;
703 }
704
SetTypeAltiVecVector(bool isAltiVecVector,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)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;
711 return true;
712 }
713 TypeAltiVecVector = isAltiVecVector;
714 AltiVecLoc = Loc;
715 return false;
716 }
717
SetTypeAltiVecPixel(bool isAltiVecPixel,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)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;
725 return true;
726 }
727 TypeAltiVecPixel = isAltiVecPixel;
728 TSTLoc = Loc;
729 TSTNameLoc = Loc;
730 return false;
731 }
732
SetTypeAltiVecBool(bool isAltiVecBool,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)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;
740 return true;
741 }
742 TypeAltiVecBool = isAltiVecBool;
743 TSTLoc = Loc;
744 TSTNameLoc = Loc;
745 return false;
746 }
747
SetTypeSpecError()748 bool DeclSpec::SetTypeSpecError() {
749 TypeSpecType = TST_error;
750 TypeSpecOwned = false;
751 TSTLoc = SourceLocation();
752 TSTNameLoc = SourceLocation();
753 return false;
754 }
755
SetTypeQual(TQ T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const LangOptions & Lang)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
761 // already have it.
762 if (TypeQualifiers & T) {
763 bool IsExtension = true;
764 if (Lang.C99)
765 IsExtension = false;
766 return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension);
767 }
768 TypeQualifiers |= T;
769
770 switch (T) {
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;
776 }
777
778 llvm_unreachable("Unknown type qualifier!");
779 }
780
setFunctionSpecInline(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)781 bool DeclSpec::setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec,
782 unsigned &DiagID) {
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;
787 PrevSpec = "inline";
788 return true;
789 }
790 FS_inline_specified = true;
791 FS_inlineLoc = Loc;
792 return false;
793 }
794
setFunctionSpecForceInline(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)795 bool DeclSpec::setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec,
796 unsigned &DiagID) {
797 if (FS_forceinline_specified) {
798 DiagID = diag::warn_duplicate_declspec;
799 PrevSpec = "__forceinline";
800 return true;
801 }
802 FS_forceinline_specified = true;
803 FS_forceinlineLoc = Loc;
804 return false;
805 }
806
setFunctionSpecVirtual(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)807 bool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc,
808 const char *&PrevSpec,
809 unsigned &DiagID) {
810 // 'virtual virtual' is ok, but warn as this is likely not what the user
811 // intended.
812 if (FS_virtual_specified) {
813 DiagID = diag::warn_duplicate_declspec;
814 PrevSpec = "virtual";
815 return true;
816 }
817 FS_virtual_specified = true;
818 FS_virtualLoc = Loc;
819 return false;
820 }
821
setFunctionSpecExplicit(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)822 bool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc,
823 const char *&PrevSpec,
824 unsigned &DiagID) {
825 // 'explicit explicit' is ok, but warn as this is likely not what the user
826 // intended.
827 if (FS_explicit_specified) {
828 DiagID = diag::warn_duplicate_declspec;
829 PrevSpec = "explicit";
830 return true;
831 }
832 FS_explicit_specified = true;
833 FS_explicitLoc = Loc;
834 return false;
835 }
836
setFunctionSpecNoreturn(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)837 bool DeclSpec::setFunctionSpecNoreturn(SourceLocation Loc,
838 const char *&PrevSpec,
839 unsigned &DiagID) {
840 // '_Noreturn _Noreturn' is ok, but warn as this is likely not what the user
841 // intended.
842 if (FS_noreturn_specified) {
843 DiagID = diag::warn_duplicate_declspec;
844 PrevSpec = "_Noreturn";
845 return true;
846 }
847 FS_noreturn_specified = true;
848 FS_noreturnLoc = Loc;
849 return false;
850 }
851
SetFriendSpec(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)852 bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
853 unsigned &DiagID) {
854 if (Friend_specified) {
855 PrevSpec = "friend";
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.
860 FriendLoc = Loc;
861 DiagID = diag::warn_duplicate_declspec;
862 return true;
863 }
864
865 Friend_specified = true;
866 FriendLoc = Loc;
867 return false;
868 }
869
setModulePrivateSpec(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)870 bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
871 unsigned &DiagID) {
872 if (isModulePrivateSpecified()) {
873 PrevSpec = "__module_private__";
874 DiagID = diag::ext_duplicate_declspec;
875 return true;
876 }
877
878 ModulePrivateLoc = Loc;
879 return false;
880 }
881
SetConstexprSpec(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)882 bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
883 unsigned &DiagID) {
884 // 'constexpr constexpr' is ok, but warn as this is likely not what the user
885 // intended.
886 if (Constexpr_specified) {
887 DiagID = diag::warn_duplicate_declspec;
888 PrevSpec = "constexpr";
889 return true;
890 }
891 Constexpr_specified = true;
892 ConstexprLoc = Loc;
893 return false;
894 }
895
setProtocolQualifiers(Decl * const * Protos,unsigned NP,SourceLocation * ProtoLocs,SourceLocation LAngleLoc)896 void DeclSpec::setProtocolQualifiers(Decl * const *Protos,
897 unsigned NP,
898 SourceLocation *ProtoLocs,
899 SourceLocation LAngleLoc) {
900 if (NP == 0) return;
901 Decl **ProtoQuals = new Decl*[NP];
902 memcpy(ProtoQuals, Protos, sizeof(Decl*)*NP);
903 ProtocolQualifiers = ProtoQuals;
904 ProtocolLocs = new SourceLocation[NP];
905 memcpy(ProtocolLocs, ProtoLocs, sizeof(SourceLocation)*NP);
906 NumProtocolQualifiers = NP;
907 ProtocolLAngleLoc = LAngleLoc;
908 }
909
SaveWrittenBuiltinSpecs()910 void DeclSpec::SaveWrittenBuiltinSpecs() {
911 writtenBS.Sign = getTypeSpecSign();
912 writtenBS.Width = getTypeSpecWidth();
913 writtenBS.Type = getTypeSpecType();
914 // Search the list of attributes for the presence of a mode attribute.
915 writtenBS.ModeAttr = false;
916 AttributeList* attrs = getAttributes().getList();
917 while (attrs) {
918 if (attrs->getKind() == AttributeList::AT_Mode) {
919 writtenBS.ModeAttr = true;
920 break;
921 }
922 attrs = attrs->getNext();
923 }
924 }
925
926 /// Finish - This does final analysis of the declspec, rejecting things like
927 /// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or
928 /// diag::NUM_DIAGNOSTICS if there is no error. After calling this method,
929 /// DeclSpec is guaranteed self-consistent, even if an error occurred.
Finish(DiagnosticsEngine & D,Preprocessor & PP,const PrintingPolicy & Policy)930 void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP, const PrintingPolicy &Policy) {
931 // Before possibly changing their values, save specs as written.
932 SaveWrittenBuiltinSpecs();
933
934 // Check the type specifier components first.
935
936 // If decltype(auto) is used, no other type specifiers are permitted.
937 if (TypeSpecType == TST_decltype_auto &&
938 (TypeSpecWidth != TSW_unspecified ||
939 TypeSpecComplex != TSC_unspecified ||
940 TypeSpecSign != TSS_unspecified ||
941 TypeAltiVecVector || TypeAltiVecPixel || TypeAltiVecBool ||
942 TypeQualifiers)) {
943 const unsigned NumLocs = 8;
944 SourceLocation ExtraLocs[NumLocs] = {
945 TSWLoc, TSCLoc, TSSLoc, AltiVecLoc,
946 TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc
947 };
948 FixItHint Hints[NumLocs];
949 SourceLocation FirstLoc;
950 for (unsigned I = 0; I != NumLocs; ++I) {
951 if (!ExtraLocs[I].isInvalid()) {
952 if (FirstLoc.isInvalid() ||
953 PP.getSourceManager().isBeforeInTranslationUnit(ExtraLocs[I],
954 FirstLoc))
955 FirstLoc = ExtraLocs[I];
956 Hints[I] = FixItHint::CreateRemoval(ExtraLocs[I]);
957 }
958 }
959 TypeSpecWidth = TSW_unspecified;
960 TypeSpecComplex = TSC_unspecified;
961 TypeSpecSign = TSS_unspecified;
962 TypeAltiVecVector = TypeAltiVecPixel = TypeAltiVecBool = false;
963 TypeQualifiers = 0;
964 Diag(D, TSTLoc, diag::err_decltype_auto_cannot_be_combined)
965 << Hints[0] << Hints[1] << Hints[2] << Hints[3]
966 << Hints[4] << Hints[5] << Hints[6] << Hints[7];
967 }
968
969 // Validate and finalize AltiVec vector declspec.
970 if (TypeAltiVecVector) {
971 if (TypeAltiVecBool) {
972 // Sign specifiers are not allowed with vector bool. (PIM 2.1)
973 if (TypeSpecSign != TSS_unspecified) {
974 Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec)
975 << getSpecifierName((TSS)TypeSpecSign);
976 }
977
978 // Only char/int are valid with vector bool. (PIM 2.1)
979 if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) &&
980 (TypeSpecType != TST_int)) || TypeAltiVecPixel) {
981 Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec)
982 << (TypeAltiVecPixel ? "__pixel" :
983 getSpecifierName((TST)TypeSpecType, Policy));
984 }
985
986 // Only 'short' and 'long long' are valid with vector bool. (PIM 2.1)
987 if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short) &&
988 (TypeSpecWidth != TSW_longlong))
989 Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec)
990 << getSpecifierName((TSW)TypeSpecWidth);
991
992 // vector bool long long requires VSX support.
993 if ((TypeSpecWidth == TSW_longlong) &&
994 (!PP.getTargetInfo().hasFeature("vsx")) &&
995 (!PP.getTargetInfo().hasFeature("power8-vector")))
996 Diag(D, TSTLoc, diag::err_invalid_vector_long_long_decl_spec);
997
998 // Elements of vector bool are interpreted as unsigned. (PIM 2.1)
999 if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) ||
1000 (TypeSpecWidth != TSW_unspecified))
1001 TypeSpecSign = TSS_unsigned;
1002 } else if (TypeSpecType == TST_double) {
1003 // vector long double and vector long long double are never allowed.
1004 // vector double is OK for Power7 and later.
1005 if (TypeSpecWidth == TSW_long || TypeSpecWidth == TSW_longlong)
1006 Diag(D, TSWLoc, diag::err_invalid_vector_long_double_decl_spec);
1007 else if (!PP.getTargetInfo().hasFeature("vsx"))
1008 Diag(D, TSTLoc, diag::err_invalid_vector_double_decl_spec);
1009 } else if (TypeSpecWidth == TSW_long) {
1010 Diag(D, TSWLoc, diag::warn_vector_long_decl_spec_combination)
1011 << getSpecifierName((TST)TypeSpecType, Policy);
1012 }
1013
1014 if (TypeAltiVecPixel) {
1015 //TODO: perform validation
1016 TypeSpecType = TST_int;
1017 TypeSpecSign = TSS_unsigned;
1018 TypeSpecWidth = TSW_short;
1019 TypeSpecOwned = false;
1020 }
1021 }
1022
1023 // signed/unsigned are only valid with int/char/wchar_t.
1024 if (TypeSpecSign != TSS_unspecified) {
1025 if (TypeSpecType == TST_unspecified)
1026 TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int.
1027 else if (TypeSpecType != TST_int && TypeSpecType != TST_int128 &&
1028 TypeSpecType != TST_char && TypeSpecType != TST_wchar) {
1029 Diag(D, TSSLoc, diag::err_invalid_sign_spec)
1030 << getSpecifierName((TST)TypeSpecType, Policy);
1031 // signed double -> double.
1032 TypeSpecSign = TSS_unspecified;
1033 }
1034 }
1035
1036 // Validate the width of the type.
1037 switch (TypeSpecWidth) {
1038 case TSW_unspecified: break;
1039 case TSW_short: // short int
1040 case TSW_longlong: // long long int
1041 if (TypeSpecType == TST_unspecified)
1042 TypeSpecType = TST_int; // short -> short int, long long -> long long int.
1043 else if (TypeSpecType != TST_int) {
1044 Diag(D, TSWLoc,
1045 TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec
1046 : diag::err_invalid_longlong_spec)
1047 << getSpecifierName((TST)TypeSpecType, Policy);
1048 TypeSpecType = TST_int;
1049 TypeSpecOwned = false;
1050 }
1051 break;
1052 case TSW_long: // long double, long int
1053 if (TypeSpecType == TST_unspecified)
1054 TypeSpecType = TST_int; // long -> long int.
1055 else if (TypeSpecType != TST_int && TypeSpecType != TST_double) {
1056 Diag(D, TSWLoc, diag::err_invalid_long_spec)
1057 << getSpecifierName((TST)TypeSpecType, Policy);
1058 TypeSpecType = TST_int;
1059 TypeSpecOwned = false;
1060 }
1061 break;
1062 }
1063
1064 // TODO: if the implementation does not implement _Complex or _Imaginary,
1065 // disallow their use. Need information about the backend.
1066 if (TypeSpecComplex != TSC_unspecified) {
1067 if (TypeSpecType == TST_unspecified) {
1068 Diag(D, TSCLoc, diag::ext_plain_complex)
1069 << FixItHint::CreateInsertion(
1070 PP.getLocForEndOfToken(getTypeSpecComplexLoc()),
1071 " double");
1072 TypeSpecType = TST_double; // _Complex -> _Complex double.
1073 } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) {
1074 // Note that this intentionally doesn't include _Complex _Bool.
1075 if (!PP.getLangOpts().CPlusPlus)
1076 Diag(D, TSTLoc, diag::ext_integer_complex);
1077 } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) {
1078 Diag(D, TSCLoc, diag::err_invalid_complex_spec)
1079 << getSpecifierName((TST)TypeSpecType, Policy);
1080 TypeSpecComplex = TSC_unspecified;
1081 }
1082 }
1083
1084 // C11 6.7.1/3, C++11 [dcl.stc]p1, GNU TLS: __thread, thread_local and
1085 // _Thread_local can only appear with the 'static' and 'extern' storage class
1086 // specifiers. We also allow __private_extern__ as an extension.
1087 if (ThreadStorageClassSpec != TSCS_unspecified) {
1088 switch (StorageClassSpec) {
1089 case SCS_unspecified:
1090 case SCS_extern:
1091 case SCS_private_extern:
1092 case SCS_static:
1093 break;
1094 default:
1095 if (PP.getSourceManager().isBeforeInTranslationUnit(
1096 getThreadStorageClassSpecLoc(), getStorageClassSpecLoc()))
1097 Diag(D, getStorageClassSpecLoc(),
1098 diag::err_invalid_decl_spec_combination)
1099 << DeclSpec::getSpecifierName(getThreadStorageClassSpec())
1100 << SourceRange(getThreadStorageClassSpecLoc());
1101 else
1102 Diag(D, getThreadStorageClassSpecLoc(),
1103 diag::err_invalid_decl_spec_combination)
1104 << DeclSpec::getSpecifierName(getStorageClassSpec())
1105 << SourceRange(getStorageClassSpecLoc());
1106 // Discard the thread storage class specifier to recover.
1107 ThreadStorageClassSpec = TSCS_unspecified;
1108 ThreadStorageClassSpecLoc = SourceLocation();
1109 }
1110 }
1111
1112 // If no type specifier was provided and we're parsing a language where
1113 // the type specifier is not optional, but we got 'auto' as a storage
1114 // class specifier, then assume this is an attempt to use C++0x's 'auto'
1115 // type specifier.
1116 if (PP.getLangOpts().CPlusPlus &&
1117 TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) {
1118 TypeSpecType = TST_auto;
1119 StorageClassSpec = SCS_unspecified;
1120 TSTLoc = TSTNameLoc = StorageClassSpecLoc;
1121 StorageClassSpecLoc = SourceLocation();
1122 }
1123 // Diagnose if we've recovered from an ill-formed 'auto' storage class
1124 // specifier in a pre-C++11 dialect of C++.
1125 if (!PP.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto)
1126 Diag(D, TSTLoc, diag::ext_auto_type_specifier);
1127 if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus11 &&
1128 StorageClassSpec == SCS_auto)
1129 Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class)
1130 << FixItHint::CreateRemoval(StorageClassSpecLoc);
1131 if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32)
1132 Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type)
1133 << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t");
1134 if (Constexpr_specified)
1135 Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr);
1136
1137 // C++ [class.friend]p6:
1138 // No storage-class-specifier shall appear in the decl-specifier-seq
1139 // of a friend declaration.
1140 if (isFriendSpecified() &&
1141 (getStorageClassSpec() || getThreadStorageClassSpec())) {
1142 SmallString<32> SpecName;
1143 SourceLocation SCLoc;
1144 FixItHint StorageHint, ThreadHint;
1145
1146 if (DeclSpec::SCS SC = getStorageClassSpec()) {
1147 SpecName = getSpecifierName(SC);
1148 SCLoc = getStorageClassSpecLoc();
1149 StorageHint = FixItHint::CreateRemoval(SCLoc);
1150 }
1151
1152 if (DeclSpec::TSCS TSC = getThreadStorageClassSpec()) {
1153 if (!SpecName.empty()) SpecName += " ";
1154 SpecName += getSpecifierName(TSC);
1155 SCLoc = getThreadStorageClassSpecLoc();
1156 ThreadHint = FixItHint::CreateRemoval(SCLoc);
1157 }
1158
1159 Diag(D, SCLoc, diag::err_friend_decl_spec)
1160 << SpecName << StorageHint << ThreadHint;
1161
1162 ClearStorageClassSpecs();
1163 }
1164
1165 // C++11 [dcl.fct.spec]p5:
1166 // The virtual specifier shall be used only in the initial
1167 // declaration of a non-static class member function;
1168 // C++11 [dcl.fct.spec]p6:
1169 // The explicit specifier shall be used only in the declaration of
1170 // a constructor or conversion function within its class
1171 // definition;
1172 if (isFriendSpecified() && (isVirtualSpecified() || isExplicitSpecified())) {
1173 StringRef Keyword;
1174 SourceLocation SCLoc;
1175
1176 if (isVirtualSpecified()) {
1177 Keyword = "virtual";
1178 SCLoc = getVirtualSpecLoc();
1179 } else {
1180 Keyword = "explicit";
1181 SCLoc = getExplicitSpecLoc();
1182 }
1183
1184 FixItHint Hint = FixItHint::CreateRemoval(SCLoc);
1185 Diag(D, SCLoc, diag::err_friend_decl_spec)
1186 << Keyword << Hint;
1187
1188 FS_virtual_specified = FS_explicit_specified = false;
1189 FS_virtualLoc = FS_explicitLoc = SourceLocation();
1190 }
1191
1192 assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType));
1193
1194 // Okay, now we can infer the real type.
1195
1196 // TODO: return "auto function" and other bad things based on the real type.
1197
1198 // 'data definition has no type or storage class'?
1199 }
1200
isMissingDeclaratorOk()1201 bool DeclSpec::isMissingDeclaratorOk() {
1202 TST tst = getTypeSpecType();
1203 return isDeclRep(tst) && getRepAsDecl() != nullptr &&
1204 StorageClassSpec != DeclSpec::SCS_typedef;
1205 }
1206
setOperatorFunctionId(SourceLocation OperatorLoc,OverloadedOperatorKind Op,SourceLocation SymbolLocations[3])1207 void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc,
1208 OverloadedOperatorKind Op,
1209 SourceLocation SymbolLocations[3]) {
1210 Kind = IK_OperatorFunctionId;
1211 StartLocation = OperatorLoc;
1212 EndLocation = OperatorLoc;
1213 OperatorFunctionId.Operator = Op;
1214 for (unsigned I = 0; I != 3; ++I) {
1215 OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding();
1216
1217 if (SymbolLocations[I].isValid())
1218 EndLocation = SymbolLocations[I];
1219 }
1220 }
1221
SetSpecifier(Specifier VS,SourceLocation Loc,const char * & PrevSpec)1222 bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc,
1223 const char *&PrevSpec) {
1224 if (!FirstLocation.isValid())
1225 FirstLocation = Loc;
1226 LastLocation = Loc;
1227 LastSpecifier = VS;
1228
1229 if (Specifiers & VS) {
1230 PrevSpec = getSpecifierName(VS);
1231 return true;
1232 }
1233
1234 Specifiers |= VS;
1235
1236 switch (VS) {
1237 default: llvm_unreachable("Unknown specifier!");
1238 case VS_Override: VS_overrideLoc = Loc; break;
1239 case VS_Sealed:
1240 case VS_Final: VS_finalLoc = Loc; break;
1241 }
1242
1243 return false;
1244 }
1245
getSpecifierName(Specifier VS)1246 const char *VirtSpecifiers::getSpecifierName(Specifier VS) {
1247 switch (VS) {
1248 default: llvm_unreachable("Unknown specifier");
1249 case VS_Override: return "override";
1250 case VS_Final: return "final";
1251 case VS_Sealed: return "sealed";
1252 }
1253 }
1254