1 //===--- DeclSpec.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/TypeLoc.h"
19 #include "clang/Basic/LangOptions.h"
20 #include "clang/Basic/TargetInfo.h"
21 #include "clang/Sema/LocInfoType.h"
22 #include "clang/Sema/ParsedTemplate.h"
23 #include "clang/Sema/Sema.h"
24 #include "clang/Sema/SemaDiagnostic.h"
25 #include "llvm/ADT/STLExtras.h"
26 #include "llvm/ADT/SmallString.h"
27 #include <cstring>
28 using namespace clang;
29
30
setTemplateId(TemplateIdAnnotation * TemplateId)31 void UnqualifiedId::setTemplateId(TemplateIdAnnotation *TemplateId) {
32 assert(TemplateId && "NULL template-id annotation?");
33 Kind = IK_TemplateId;
34 this->TemplateId = TemplateId;
35 StartLocation = TemplateId->TemplateNameLoc;
36 EndLocation = TemplateId->RAngleLoc;
37 }
38
setConstructorTemplateId(TemplateIdAnnotation * TemplateId)39 void UnqualifiedId::setConstructorTemplateId(TemplateIdAnnotation *TemplateId) {
40 assert(TemplateId && "NULL template-id annotation?");
41 Kind = IK_ConstructorTemplateId;
42 this->TemplateId = TemplateId;
43 StartLocation = TemplateId->TemplateNameLoc;
44 EndLocation = TemplateId->RAngleLoc;
45 }
46
Extend(ASTContext & Context,SourceLocation TemplateKWLoc,TypeLoc TL,SourceLocation ColonColonLoc)47 void CXXScopeSpec::Extend(ASTContext &Context, SourceLocation TemplateKWLoc,
48 TypeLoc TL, SourceLocation ColonColonLoc) {
49 Builder.Extend(Context, TemplateKWLoc, TL, ColonColonLoc);
50 if (Range.getBegin().isInvalid())
51 Range.setBegin(TL.getBeginLoc());
52 Range.setEnd(ColonColonLoc);
53
54 assert(Range == Builder.getSourceRange() &&
55 "NestedNameSpecifierLoc range computation incorrect");
56 }
57
Extend(ASTContext & Context,IdentifierInfo * Identifier,SourceLocation IdentifierLoc,SourceLocation ColonColonLoc)58 void CXXScopeSpec::Extend(ASTContext &Context, IdentifierInfo *Identifier,
59 SourceLocation IdentifierLoc,
60 SourceLocation ColonColonLoc) {
61 Builder.Extend(Context, Identifier, IdentifierLoc, ColonColonLoc);
62
63 if (Range.getBegin().isInvalid())
64 Range.setBegin(IdentifierLoc);
65 Range.setEnd(ColonColonLoc);
66
67 assert(Range == Builder.getSourceRange() &&
68 "NestedNameSpecifierLoc range computation incorrect");
69 }
70
Extend(ASTContext & Context,NamespaceDecl * Namespace,SourceLocation NamespaceLoc,SourceLocation ColonColonLoc)71 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceDecl *Namespace,
72 SourceLocation NamespaceLoc,
73 SourceLocation ColonColonLoc) {
74 Builder.Extend(Context, Namespace, NamespaceLoc, ColonColonLoc);
75
76 if (Range.getBegin().isInvalid())
77 Range.setBegin(NamespaceLoc);
78 Range.setEnd(ColonColonLoc);
79
80 assert(Range == Builder.getSourceRange() &&
81 "NestedNameSpecifierLoc range computation incorrect");
82 }
83
Extend(ASTContext & Context,NamespaceAliasDecl * Alias,SourceLocation AliasLoc,SourceLocation ColonColonLoc)84 void CXXScopeSpec::Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
85 SourceLocation AliasLoc,
86 SourceLocation ColonColonLoc) {
87 Builder.Extend(Context, Alias, AliasLoc, ColonColonLoc);
88
89 if (Range.getBegin().isInvalid())
90 Range.setBegin(AliasLoc);
91 Range.setEnd(ColonColonLoc);
92
93 assert(Range == Builder.getSourceRange() &&
94 "NestedNameSpecifierLoc range computation incorrect");
95 }
96
MakeGlobal(ASTContext & Context,SourceLocation ColonColonLoc)97 void CXXScopeSpec::MakeGlobal(ASTContext &Context,
98 SourceLocation ColonColonLoc) {
99 Builder.MakeGlobal(Context, ColonColonLoc);
100
101 Range = SourceRange(ColonColonLoc);
102
103 assert(Range == Builder.getSourceRange() &&
104 "NestedNameSpecifierLoc range computation incorrect");
105 }
106
MakeSuper(ASTContext & Context,CXXRecordDecl * RD,SourceLocation SuperLoc,SourceLocation ColonColonLoc)107 void CXXScopeSpec::MakeSuper(ASTContext &Context, CXXRecordDecl *RD,
108 SourceLocation SuperLoc,
109 SourceLocation ColonColonLoc) {
110 Builder.MakeSuper(Context, RD, SuperLoc, ColonColonLoc);
111
112 Range.setBegin(SuperLoc);
113 Range.setEnd(ColonColonLoc);
114
115 assert(Range == Builder.getSourceRange() &&
116 "NestedNameSpecifierLoc range computation incorrect");
117 }
118
MakeTrivial(ASTContext & Context,NestedNameSpecifier * Qualifier,SourceRange R)119 void CXXScopeSpec::MakeTrivial(ASTContext &Context,
120 NestedNameSpecifier *Qualifier, SourceRange R) {
121 Builder.MakeTrivial(Context, Qualifier, R);
122 Range = R;
123 }
124
Adopt(NestedNameSpecifierLoc Other)125 void CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) {
126 if (!Other) {
127 Range = SourceRange();
128 Builder.Clear();
129 return;
130 }
131
132 Range = Other.getSourceRange();
133 Builder.Adopt(Other);
134 }
135
getLastQualifierNameLoc() const136 SourceLocation CXXScopeSpec::getLastQualifierNameLoc() const {
137 if (!Builder.getRepresentation())
138 return SourceLocation();
139 return Builder.getTemporary().getLocalBeginLoc();
140 }
141
142 NestedNameSpecifierLoc
getWithLocInContext(ASTContext & Context) const143 CXXScopeSpec::getWithLocInContext(ASTContext &Context) const {
144 if (!Builder.getRepresentation())
145 return NestedNameSpecifierLoc();
146
147 return Builder.getWithLocInContext(Context);
148 }
149
150 /// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
151 /// "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,SourceRange ESpecRange,ParsedType * Exceptions,SourceRange * ExceptionRanges,unsigned NumExceptions,Expr * NoexceptExpr,CachedTokens * ExceptionSpecTokens,SourceLocation LocalRangeBegin,SourceLocation LocalRangeEnd,Declarator & TheDeclarator,TypeResult TrailingReturnType)152 DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto,
153 bool isAmbiguous,
154 SourceLocation LParenLoc,
155 ParamInfo *Params,
156 unsigned NumParams,
157 SourceLocation EllipsisLoc,
158 SourceLocation RParenLoc,
159 unsigned TypeQuals,
160 bool RefQualifierIsLvalueRef,
161 SourceLocation RefQualifierLoc,
162 SourceLocation ConstQualifierLoc,
163 SourceLocation
164 VolatileQualifierLoc,
165 SourceLocation
166 RestrictQualifierLoc,
167 SourceLocation MutableLoc,
168 ExceptionSpecificationType
169 ESpecType,
170 SourceRange ESpecRange,
171 ParsedType *Exceptions,
172 SourceRange *ExceptionRanges,
173 unsigned NumExceptions,
174 Expr *NoexceptExpr,
175 CachedTokens *ExceptionSpecTokens,
176 SourceLocation LocalRangeBegin,
177 SourceLocation LocalRangeEnd,
178 Declarator &TheDeclarator,
179 TypeResult TrailingReturnType) {
180 assert(!(TypeQuals & DeclSpec::TQ_atomic) &&
181 "function cannot have _Atomic qualifier");
182
183 DeclaratorChunk I;
184 I.Kind = Function;
185 I.Loc = LocalRangeBegin;
186 I.EndLoc = LocalRangeEnd;
187 I.Fun.AttrList = nullptr;
188 I.Fun.hasPrototype = hasProto;
189 I.Fun.isVariadic = EllipsisLoc.isValid();
190 I.Fun.isAmbiguous = isAmbiguous;
191 I.Fun.LParenLoc = LParenLoc.getRawEncoding();
192 I.Fun.EllipsisLoc = EllipsisLoc.getRawEncoding();
193 I.Fun.RParenLoc = RParenLoc.getRawEncoding();
194 I.Fun.DeleteParams = false;
195 I.Fun.TypeQuals = TypeQuals;
196 I.Fun.NumParams = NumParams;
197 I.Fun.Params = nullptr;
198 I.Fun.RefQualifierIsLValueRef = RefQualifierIsLvalueRef;
199 I.Fun.RefQualifierLoc = RefQualifierLoc.getRawEncoding();
200 I.Fun.ConstQualifierLoc = ConstQualifierLoc.getRawEncoding();
201 I.Fun.VolatileQualifierLoc = VolatileQualifierLoc.getRawEncoding();
202 I.Fun.RestrictQualifierLoc = RestrictQualifierLoc.getRawEncoding();
203 I.Fun.MutableLoc = MutableLoc.getRawEncoding();
204 I.Fun.ExceptionSpecType = ESpecType;
205 I.Fun.ExceptionSpecLocBeg = ESpecRange.getBegin().getRawEncoding();
206 I.Fun.ExceptionSpecLocEnd = ESpecRange.getEnd().getRawEncoding();
207 I.Fun.NumExceptions = 0;
208 I.Fun.Exceptions = nullptr;
209 I.Fun.NoexceptExpr = nullptr;
210 I.Fun.HasTrailingReturnType = TrailingReturnType.isUsable() ||
211 TrailingReturnType.isInvalid();
212 I.Fun.TrailingReturnType = TrailingReturnType.get();
213
214 assert(I.Fun.TypeQuals == TypeQuals && "bitfield overflow");
215 assert(I.Fun.ExceptionSpecType == ESpecType && "bitfield overflow");
216
217 // new[] a parameter array if needed.
218 if (NumParams) {
219 // If the 'InlineParams' in Declarator is unused and big enough, put our
220 // parameter list there (in an effort to avoid new/delete traffic). If it
221 // is already used (consider a function returning a function pointer) or too
222 // small (function with too many parameters), go to the heap.
223 if (!TheDeclarator.InlineParamsUsed &&
224 NumParams <= llvm::array_lengthof(TheDeclarator.InlineParams)) {
225 I.Fun.Params = TheDeclarator.InlineParams;
226 I.Fun.DeleteParams = false;
227 TheDeclarator.InlineParamsUsed = true;
228 } else {
229 I.Fun.Params = new DeclaratorChunk::ParamInfo[NumParams];
230 I.Fun.DeleteParams = true;
231 }
232 memcpy(I.Fun.Params, Params, sizeof(Params[0]) * NumParams);
233 }
234
235 // Check what exception specification information we should actually store.
236 switch (ESpecType) {
237 default: break; // By default, save nothing.
238 case EST_Dynamic:
239 // new[] an exception array if needed
240 if (NumExceptions) {
241 I.Fun.NumExceptions = NumExceptions;
242 I.Fun.Exceptions = new DeclaratorChunk::TypeAndRange[NumExceptions];
243 for (unsigned i = 0; i != NumExceptions; ++i) {
244 I.Fun.Exceptions[i].Ty = Exceptions[i];
245 I.Fun.Exceptions[i].Range = ExceptionRanges[i];
246 }
247 }
248 break;
249
250 case EST_ComputedNoexcept:
251 I.Fun.NoexceptExpr = NoexceptExpr;
252 break;
253
254 case EST_Unparsed:
255 I.Fun.ExceptionSpecTokens = ExceptionSpecTokens;
256 break;
257 }
258 return I;
259 }
260
isDeclarationOfFunction() const261 bool Declarator::isDeclarationOfFunction() const {
262 for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) {
263 switch (DeclTypeInfo[i].Kind) {
264 case DeclaratorChunk::Function:
265 return true;
266 case DeclaratorChunk::Paren:
267 continue;
268 case DeclaratorChunk::Pointer:
269 case DeclaratorChunk::Reference:
270 case DeclaratorChunk::Array:
271 case DeclaratorChunk::BlockPointer:
272 case DeclaratorChunk::MemberPointer:
273 return false;
274 }
275 llvm_unreachable("Invalid type chunk");
276 }
277
278 switch (DS.getTypeSpecType()) {
279 case TST_atomic:
280 case TST_auto:
281 case TST_auto_type:
282 case TST_bool:
283 case TST_char:
284 case TST_char16:
285 case TST_char32:
286 case TST_class:
287 case TST_decimal128:
288 case TST_decimal32:
289 case TST_decimal64:
290 case TST_double:
291 case TST_enum:
292 case TST_error:
293 case TST_float:
294 case TST_half:
295 case TST_int:
296 case TST_int128:
297 case TST_struct:
298 case TST_interface:
299 case TST_union:
300 case TST_unknown_anytype:
301 case TST_unspecified:
302 case TST_void:
303 case TST_wchar:
304 return false;
305
306 case TST_decltype_auto:
307 // This must have an initializer, so can't be a function declaration,
308 // even if the initializer has function type.
309 return false;
310
311 case TST_decltype:
312 case TST_typeofExpr:
313 if (Expr *E = DS.getRepAsExpr())
314 return E->getType()->isFunctionType();
315 return false;
316
317 case TST_underlyingType:
318 case TST_typename:
319 case TST_typeofType: {
320 QualType QT = DS.getRepAsType().get();
321 if (QT.isNull())
322 return false;
323
324 if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT))
325 QT = LIT->getType();
326
327 if (QT.isNull())
328 return false;
329
330 return QT->isFunctionType();
331 }
332 }
333
334 llvm_unreachable("Invalid TypeSpecType!");
335 }
336
isStaticMember()337 bool Declarator::isStaticMember() {
338 assert(getContext() == MemberContext);
339 return getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
340 (getName().Kind == UnqualifiedId::IK_OperatorFunctionId &&
341 CXXMethodDecl::isStaticOverloadedOperator(
342 getName().OperatorFunctionId.Operator));
343 }
344
isCtorOrDtor()345 bool Declarator::isCtorOrDtor() {
346 return (getName().getKind() == UnqualifiedId::IK_ConstructorName) ||
347 (getName().getKind() == UnqualifiedId::IK_DestructorName);
348 }
349
hasTagDefinition() const350 bool DeclSpec::hasTagDefinition() const {
351 if (!TypeSpecOwned)
352 return false;
353 return cast<TagDecl>(getRepAsDecl())->isCompleteDefinition();
354 }
355
356 /// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
357 /// declaration specifier includes.
358 ///
getParsedSpecifiers() const359 unsigned DeclSpec::getParsedSpecifiers() const {
360 unsigned Res = 0;
361 if (StorageClassSpec != SCS_unspecified ||
362 ThreadStorageClassSpec != TSCS_unspecified)
363 Res |= PQ_StorageClassSpecifier;
364
365 if (TypeQualifiers != TQ_unspecified)
366 Res |= PQ_TypeQualifier;
367
368 if (hasTypeSpecifier())
369 Res |= PQ_TypeSpecifier;
370
371 if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified ||
372 FS_noreturn_specified || FS_forceinline_specified)
373 Res |= PQ_FunctionSpecifier;
374 return Res;
375 }
376
BadSpecifier(T TNew,T TPrev,const char * & PrevSpec,unsigned & DiagID,bool IsExtension=true)377 template <class T> static bool BadSpecifier(T TNew, T TPrev,
378 const char *&PrevSpec,
379 unsigned &DiagID,
380 bool IsExtension = true) {
381 PrevSpec = DeclSpec::getSpecifierName(TPrev);
382 if (TNew != TPrev)
383 DiagID = diag::err_invalid_decl_spec_combination;
384 else
385 DiagID = IsExtension ? diag::ext_duplicate_declspec :
386 diag::warn_duplicate_declspec;
387 return true;
388 }
389
getSpecifierName(DeclSpec::SCS S)390 const char *DeclSpec::getSpecifierName(DeclSpec::SCS S) {
391 switch (S) {
392 case DeclSpec::SCS_unspecified: return "unspecified";
393 case DeclSpec::SCS_typedef: return "typedef";
394 case DeclSpec::SCS_extern: return "extern";
395 case DeclSpec::SCS_static: return "static";
396 case DeclSpec::SCS_auto: return "auto";
397 case DeclSpec::SCS_register: return "register";
398 case DeclSpec::SCS_private_extern: return "__private_extern__";
399 case DeclSpec::SCS_mutable: return "mutable";
400 }
401 llvm_unreachable("Unknown typespec!");
402 }
403
getSpecifierName(DeclSpec::TSCS S)404 const char *DeclSpec::getSpecifierName(DeclSpec::TSCS S) {
405 switch (S) {
406 case DeclSpec::TSCS_unspecified: return "unspecified";
407 case DeclSpec::TSCS___thread: return "__thread";
408 case DeclSpec::TSCS_thread_local: return "thread_local";
409 case DeclSpec::TSCS__Thread_local: return "_Thread_local";
410 }
411 llvm_unreachable("Unknown typespec!");
412 }
413
getSpecifierName(TSW W)414 const char *DeclSpec::getSpecifierName(TSW W) {
415 switch (W) {
416 case TSW_unspecified: return "unspecified";
417 case TSW_short: return "short";
418 case TSW_long: return "long";
419 case TSW_longlong: return "long long";
420 }
421 llvm_unreachable("Unknown typespec!");
422 }
423
getSpecifierName(TSC C)424 const char *DeclSpec::getSpecifierName(TSC C) {
425 switch (C) {
426 case TSC_unspecified: return "unspecified";
427 case TSC_imaginary: return "imaginary";
428 case TSC_complex: return "complex";
429 }
430 llvm_unreachable("Unknown typespec!");
431 }
432
433
getSpecifierName(TSS S)434 const char *DeclSpec::getSpecifierName(TSS S) {
435 switch (S) {
436 case TSS_unspecified: return "unspecified";
437 case TSS_signed: return "signed";
438 case TSS_unsigned: return "unsigned";
439 }
440 llvm_unreachable("Unknown typespec!");
441 }
442
getSpecifierName(DeclSpec::TST T,const PrintingPolicy & Policy)443 const char *DeclSpec::getSpecifierName(DeclSpec::TST T,
444 const PrintingPolicy &Policy) {
445 switch (T) {
446 case DeclSpec::TST_unspecified: return "unspecified";
447 case DeclSpec::TST_void: return "void";
448 case DeclSpec::TST_char: return "char";
449 case DeclSpec::TST_wchar: return Policy.MSWChar ? "__wchar_t" : "wchar_t";
450 case DeclSpec::TST_char16: return "char16_t";
451 case DeclSpec::TST_char32: return "char32_t";
452 case DeclSpec::TST_int: return "int";
453 case DeclSpec::TST_int128: return "__int128";
454 case DeclSpec::TST_half: return "half";
455 case DeclSpec::TST_float: return "float";
456 case DeclSpec::TST_double: return "double";
457 case DeclSpec::TST_bool: return Policy.Bool ? "bool" : "_Bool";
458 case DeclSpec::TST_decimal32: return "_Decimal32";
459 case DeclSpec::TST_decimal64: return "_Decimal64";
460 case DeclSpec::TST_decimal128: return "_Decimal128";
461 case DeclSpec::TST_enum: return "enum";
462 case DeclSpec::TST_class: return "class";
463 case DeclSpec::TST_union: return "union";
464 case DeclSpec::TST_struct: return "struct";
465 case DeclSpec::TST_interface: return "__interface";
466 case DeclSpec::TST_typename: return "type-name";
467 case DeclSpec::TST_typeofType:
468 case DeclSpec::TST_typeofExpr: return "typeof";
469 case DeclSpec::TST_auto: return "auto";
470 case DeclSpec::TST_auto_type: return "__auto_type";
471 case DeclSpec::TST_decltype: return "(decltype)";
472 case DeclSpec::TST_decltype_auto: return "decltype(auto)";
473 case DeclSpec::TST_underlyingType: return "__underlying_type";
474 case DeclSpec::TST_unknown_anytype: return "__unknown_anytype";
475 case DeclSpec::TST_atomic: return "_Atomic";
476 case DeclSpec::TST_error: return "(error)";
477 }
478 llvm_unreachable("Unknown typespec!");
479 }
480
getSpecifierName(TQ T)481 const char *DeclSpec::getSpecifierName(TQ T) {
482 switch (T) {
483 case DeclSpec::TQ_unspecified: return "unspecified";
484 case DeclSpec::TQ_const: return "const";
485 case DeclSpec::TQ_restrict: return "restrict";
486 case DeclSpec::TQ_volatile: return "volatile";
487 case DeclSpec::TQ_atomic: return "_Atomic";
488 }
489 llvm_unreachable("Unknown typespec!");
490 }
491
SetStorageClassSpec(Sema & S,SCS SC,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)492 bool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc,
493 const char *&PrevSpec,
494 unsigned &DiagID,
495 const PrintingPolicy &Policy) {
496 // OpenCL v1.1 s6.8g: "The extern, static, auto and register storage-class
497 // specifiers are not supported.
498 // It seems sensible to prohibit private_extern too
499 // The cl_clang_storage_class_specifiers extension enables support for
500 // these storage-class specifiers.
501 // OpenCL v1.2 s6.8 changes this to "The auto and register storage-class
502 // specifiers are not supported."
503 if (S.getLangOpts().OpenCL &&
504 !S.getOpenCLOptions().cl_clang_storage_class_specifiers) {
505 switch (SC) {
506 case SCS_extern:
507 case SCS_private_extern:
508 case SCS_static:
509 if (S.getLangOpts().OpenCLVersion < 120) {
510 DiagID = diag::err_opencl_unknown_type_specifier;
511 PrevSpec = getSpecifierName(SC);
512 return true;
513 }
514 break;
515 case SCS_auto:
516 case SCS_register:
517 DiagID = diag::err_opencl_unknown_type_specifier;
518 PrevSpec = getSpecifierName(SC);
519 return true;
520 default:
521 break;
522 }
523 }
524
525 if (StorageClassSpec != SCS_unspecified) {
526 // Maybe this is an attempt to use C++11 'auto' outside of C++11 mode.
527 bool isInvalid = true;
528 if (TypeSpecType == TST_unspecified && S.getLangOpts().CPlusPlus) {
529 if (SC == SCS_auto)
530 return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID, Policy);
531 if (StorageClassSpec == SCS_auto) {
532 isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc,
533 PrevSpec, DiagID, Policy);
534 assert(!isInvalid && "auto SCS -> TST recovery failed");
535 }
536 }
537
538 // Changing storage class is allowed only if the previous one
539 // was the 'extern' that is part of a linkage specification and
540 // the new storage class is 'typedef'.
541 if (isInvalid &&
542 !(SCS_extern_in_linkage_spec &&
543 StorageClassSpec == SCS_extern &&
544 SC == SCS_typedef))
545 return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID);
546 }
547 StorageClassSpec = SC;
548 StorageClassSpecLoc = Loc;
549 assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield");
550 return false;
551 }
552
SetStorageClassSpecThread(TSCS TSC,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)553 bool DeclSpec::SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc,
554 const char *&PrevSpec,
555 unsigned &DiagID) {
556 if (ThreadStorageClassSpec != TSCS_unspecified)
557 return BadSpecifier(TSC, (TSCS)ThreadStorageClassSpec, PrevSpec, DiagID);
558
559 ThreadStorageClassSpec = TSC;
560 ThreadStorageClassSpecLoc = Loc;
561 return false;
562 }
563
564 /// These methods set the specified attribute of the DeclSpec, but return true
565 /// and ignore the request if invalid (e.g. "extern" then "auto" is
566 /// specified).
SetTypeSpecWidth(TSW W,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)567 bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc,
568 const char *&PrevSpec,
569 unsigned &DiagID,
570 const PrintingPolicy &Policy) {
571 // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that
572 // for 'long long' we will keep the source location of the first 'long'.
573 if (TypeSpecWidth == TSW_unspecified)
574 TSWLoc = Loc;
575 // Allow turning long -> long long.
576 else if (W != TSW_longlong || TypeSpecWidth != TSW_long)
577 return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID);
578 TypeSpecWidth = W;
579 return false;
580 }
581
SetTypeSpecComplex(TSC C,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)582 bool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc,
583 const char *&PrevSpec,
584 unsigned &DiagID) {
585 if (TypeSpecComplex != TSC_unspecified)
586 return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID);
587 TypeSpecComplex = C;
588 TSCLoc = Loc;
589 return false;
590 }
591
SetTypeSpecSign(TSS S,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)592 bool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc,
593 const char *&PrevSpec,
594 unsigned &DiagID) {
595 if (TypeSpecSign != TSS_unspecified)
596 return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID);
597 TypeSpecSign = S;
598 TSSLoc = Loc;
599 return false;
600 }
601
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,ParsedType Rep,const PrintingPolicy & Policy)602 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
603 const char *&PrevSpec,
604 unsigned &DiagID,
605 ParsedType Rep,
606 const PrintingPolicy &Policy) {
607 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Policy);
608 }
609
SetTypeSpecType(TST T,SourceLocation TagKwLoc,SourceLocation TagNameLoc,const char * & PrevSpec,unsigned & DiagID,ParsedType Rep,const PrintingPolicy & Policy)610 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
611 SourceLocation TagNameLoc,
612 const char *&PrevSpec,
613 unsigned &DiagID,
614 ParsedType Rep,
615 const PrintingPolicy &Policy) {
616 assert(isTypeRep(T) && "T does not store a type");
617 assert(Rep && "no type provided!");
618 if (TypeSpecType != TST_unspecified) {
619 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
620 DiagID = diag::err_invalid_decl_spec_combination;
621 return true;
622 }
623 TypeSpecType = T;
624 TypeRep = Rep;
625 TSTLoc = TagKwLoc;
626 TSTNameLoc = TagNameLoc;
627 TypeSpecOwned = false;
628 return false;
629 }
630
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,Expr * Rep,const PrintingPolicy & Policy)631 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
632 const char *&PrevSpec,
633 unsigned &DiagID,
634 Expr *Rep,
635 const PrintingPolicy &Policy) {
636 assert(isExprRep(T) && "T does not store an expr");
637 assert(Rep && "no expression provided!");
638 if (TypeSpecType != TST_unspecified) {
639 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
640 DiagID = diag::err_invalid_decl_spec_combination;
641 return true;
642 }
643 TypeSpecType = T;
644 ExprRep = Rep;
645 TSTLoc = Loc;
646 TSTNameLoc = Loc;
647 TypeSpecOwned = false;
648 return false;
649 }
650
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,Decl * Rep,bool Owned,const PrintingPolicy & Policy)651 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
652 const char *&PrevSpec,
653 unsigned &DiagID,
654 Decl *Rep, bool Owned,
655 const PrintingPolicy &Policy) {
656 return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned, Policy);
657 }
658
SetTypeSpecType(TST T,SourceLocation TagKwLoc,SourceLocation TagNameLoc,const char * & PrevSpec,unsigned & DiagID,Decl * Rep,bool Owned,const PrintingPolicy & Policy)659 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
660 SourceLocation TagNameLoc,
661 const char *&PrevSpec,
662 unsigned &DiagID,
663 Decl *Rep, bool Owned,
664 const PrintingPolicy &Policy) {
665 assert(isDeclRep(T) && "T does not store a decl");
666 // Unlike the other cases, we don't assert that we actually get a decl.
667
668 if (TypeSpecType != TST_unspecified) {
669 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
670 DiagID = diag::err_invalid_decl_spec_combination;
671 return true;
672 }
673 TypeSpecType = T;
674 DeclRep = Rep;
675 TSTLoc = TagKwLoc;
676 TSTNameLoc = TagNameLoc;
677 TypeSpecOwned = Owned && Rep != nullptr;
678 return false;
679 }
680
SetTypeSpecType(TST T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)681 bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
682 const char *&PrevSpec,
683 unsigned &DiagID,
684 const PrintingPolicy &Policy) {
685 assert(!isDeclRep(T) && !isTypeRep(T) && !isExprRep(T) &&
686 "rep required for these type-spec kinds!");
687 if (TypeSpecType != TST_unspecified) {
688 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
689 DiagID = diag::err_invalid_decl_spec_combination;
690 return true;
691 }
692 TSTLoc = Loc;
693 TSTNameLoc = Loc;
694 if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) {
695 TypeAltiVecBool = true;
696 return false;
697 }
698 TypeSpecType = T;
699 TypeSpecOwned = false;
700 return false;
701 }
702
SetTypeAltiVecVector(bool isAltiVecVector,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)703 bool DeclSpec::SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc,
704 const char *&PrevSpec, unsigned &DiagID,
705 const PrintingPolicy &Policy) {
706 if (TypeSpecType != TST_unspecified) {
707 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
708 DiagID = diag::err_invalid_vector_decl_spec_combination;
709 return true;
710 }
711 TypeAltiVecVector = isAltiVecVector;
712 AltiVecLoc = Loc;
713 return false;
714 }
715
SetTypeAltiVecPixel(bool isAltiVecPixel,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)716 bool DeclSpec::SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc,
717 const char *&PrevSpec, unsigned &DiagID,
718 const PrintingPolicy &Policy) {
719 if (!TypeAltiVecVector || TypeAltiVecPixel ||
720 (TypeSpecType != TST_unspecified)) {
721 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
722 DiagID = diag::err_invalid_pixel_decl_spec_combination;
723 return true;
724 }
725 TypeAltiVecPixel = isAltiVecPixel;
726 TSTLoc = Loc;
727 TSTNameLoc = Loc;
728 return false;
729 }
730
SetTypeAltiVecBool(bool isAltiVecBool,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const PrintingPolicy & Policy)731 bool DeclSpec::SetTypeAltiVecBool(bool isAltiVecBool, SourceLocation Loc,
732 const char *&PrevSpec, unsigned &DiagID,
733 const PrintingPolicy &Policy) {
734 if (!TypeAltiVecVector || TypeAltiVecBool ||
735 (TypeSpecType != TST_unspecified)) {
736 PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
737 DiagID = diag::err_invalid_vector_bool_decl_spec;
738 return true;
739 }
740 TypeAltiVecBool = isAltiVecBool;
741 TSTLoc = Loc;
742 TSTNameLoc = Loc;
743 return false;
744 }
745
SetTypeSpecError()746 bool DeclSpec::SetTypeSpecError() {
747 TypeSpecType = TST_error;
748 TypeSpecOwned = false;
749 TSTLoc = SourceLocation();
750 TSTNameLoc = SourceLocation();
751 return false;
752 }
753
SetTypeQual(TQ T,SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID,const LangOptions & Lang)754 bool DeclSpec::SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec,
755 unsigned &DiagID, const LangOptions &Lang) {
756 // Duplicates are permitted in C99 onwards, but are not permitted in C89 or
757 // C++. However, since this is likely not what the user intended, we will
758 // always warn. We do not need to set the qualifier's location since we
759 // already have it.
760 if (TypeQualifiers & T) {
761 bool IsExtension = true;
762 if (Lang.C99)
763 IsExtension = false;
764 return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension);
765 }
766 TypeQualifiers |= T;
767
768 switch (T) {
769 case TQ_unspecified: break;
770 case TQ_const: TQ_constLoc = Loc; return false;
771 case TQ_restrict: TQ_restrictLoc = Loc; return false;
772 case TQ_volatile: TQ_volatileLoc = Loc; return false;
773 case TQ_atomic: TQ_atomicLoc = Loc; return false;
774 }
775
776 llvm_unreachable("Unknown type qualifier!");
777 }
778
setFunctionSpecInline(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)779 bool DeclSpec::setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec,
780 unsigned &DiagID) {
781 // 'inline inline' is ok. However, since this is likely not what the user
782 // intended, we will always warn, similar to duplicates of type qualifiers.
783 if (FS_inline_specified) {
784 DiagID = diag::warn_duplicate_declspec;
785 PrevSpec = "inline";
786 return true;
787 }
788 FS_inline_specified = true;
789 FS_inlineLoc = Loc;
790 return false;
791 }
792
setFunctionSpecForceInline(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)793 bool DeclSpec::setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec,
794 unsigned &DiagID) {
795 if (FS_forceinline_specified) {
796 DiagID = diag::warn_duplicate_declspec;
797 PrevSpec = "__forceinline";
798 return true;
799 }
800 FS_forceinline_specified = true;
801 FS_forceinlineLoc = Loc;
802 return false;
803 }
804
setFunctionSpecVirtual(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)805 bool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc,
806 const char *&PrevSpec,
807 unsigned &DiagID) {
808 // 'virtual virtual' is ok, but warn as this is likely not what the user
809 // intended.
810 if (FS_virtual_specified) {
811 DiagID = diag::warn_duplicate_declspec;
812 PrevSpec = "virtual";
813 return true;
814 }
815 FS_virtual_specified = true;
816 FS_virtualLoc = Loc;
817 return false;
818 }
819
setFunctionSpecExplicit(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)820 bool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc,
821 const char *&PrevSpec,
822 unsigned &DiagID) {
823 // 'explicit explicit' is ok, but warn as this is likely not what the user
824 // intended.
825 if (FS_explicit_specified) {
826 DiagID = diag::warn_duplicate_declspec;
827 PrevSpec = "explicit";
828 return true;
829 }
830 FS_explicit_specified = true;
831 FS_explicitLoc = Loc;
832 return false;
833 }
834
setFunctionSpecNoreturn(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)835 bool DeclSpec::setFunctionSpecNoreturn(SourceLocation Loc,
836 const char *&PrevSpec,
837 unsigned &DiagID) {
838 // '_Noreturn _Noreturn' is ok, but warn as this is likely not what the user
839 // intended.
840 if (FS_noreturn_specified) {
841 DiagID = diag::warn_duplicate_declspec;
842 PrevSpec = "_Noreturn";
843 return true;
844 }
845 FS_noreturn_specified = true;
846 FS_noreturnLoc = Loc;
847 return false;
848 }
849
SetFriendSpec(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)850 bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
851 unsigned &DiagID) {
852 if (Friend_specified) {
853 PrevSpec = "friend";
854 // Keep the later location, so that we can later diagnose ill-formed
855 // declarations like 'friend class X friend;'. Per [class.friend]p3,
856 // 'friend' must be the first token in a friend declaration that is
857 // not a function declaration.
858 FriendLoc = Loc;
859 DiagID = diag::warn_duplicate_declspec;
860 return true;
861 }
862
863 Friend_specified = true;
864 FriendLoc = Loc;
865 return false;
866 }
867
setModulePrivateSpec(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)868 bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
869 unsigned &DiagID) {
870 if (isModulePrivateSpecified()) {
871 PrevSpec = "__module_private__";
872 DiagID = diag::ext_duplicate_declspec;
873 return true;
874 }
875
876 ModulePrivateLoc = Loc;
877 return false;
878 }
879
SetConstexprSpec(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)880 bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
881 unsigned &DiagID) {
882 // 'constexpr constexpr' is ok, but warn as this is likely not what the user
883 // intended.
884 if (Constexpr_specified) {
885 DiagID = diag::warn_duplicate_declspec;
886 PrevSpec = "constexpr";
887 return true;
888 }
889 Constexpr_specified = true;
890 ConstexprLoc = Loc;
891 return false;
892 }
893
SetConceptSpec(SourceLocation Loc,const char * & PrevSpec,unsigned & DiagID)894 bool DeclSpec::SetConceptSpec(SourceLocation Loc, const char *&PrevSpec,
895 unsigned &DiagID) {
896 if (Concept_specified) {
897 DiagID = diag::ext_duplicate_declspec;
898 PrevSpec = "concept";
899 return true;
900 }
901 Concept_specified = true;
902 ConceptLoc = Loc;
903 return false;
904 }
905
SaveWrittenBuiltinSpecs()906 void DeclSpec::SaveWrittenBuiltinSpecs() {
907 writtenBS.Sign = getTypeSpecSign();
908 writtenBS.Width = getTypeSpecWidth();
909 writtenBS.Type = getTypeSpecType();
910 // Search the list of attributes for the presence of a mode attribute.
911 writtenBS.ModeAttr = false;
912 AttributeList* attrs = getAttributes().getList();
913 while (attrs) {
914 if (attrs->getKind() == AttributeList::AT_Mode) {
915 writtenBS.ModeAttr = true;
916 break;
917 }
918 attrs = attrs->getNext();
919 }
920 }
921
922 /// Finish - This does final analysis of the declspec, rejecting things like
923 /// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or
924 /// diag::NUM_DIAGNOSTICS if there is no error. After calling this method,
925 /// DeclSpec is guaranteed self-consistent, even if an error occurred.
Finish(Sema & S,const PrintingPolicy & Policy)926 void DeclSpec::Finish(Sema &S, const PrintingPolicy &Policy) {
927 // Before possibly changing their values, save specs as written.
928 SaveWrittenBuiltinSpecs();
929
930 // Check the type specifier components first.
931
932 // If decltype(auto) is used, no other type specifiers are permitted.
933 if (TypeSpecType == TST_decltype_auto &&
934 (TypeSpecWidth != TSW_unspecified ||
935 TypeSpecComplex != TSC_unspecified ||
936 TypeSpecSign != TSS_unspecified ||
937 TypeAltiVecVector || TypeAltiVecPixel || TypeAltiVecBool ||
938 TypeQualifiers)) {
939 const unsigned NumLocs = 8;
940 SourceLocation ExtraLocs[NumLocs] = {
941 TSWLoc, TSCLoc, TSSLoc, AltiVecLoc,
942 TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc
943 };
944 FixItHint Hints[NumLocs];
945 SourceLocation FirstLoc;
946 for (unsigned I = 0; I != NumLocs; ++I) {
947 if (ExtraLocs[I].isValid()) {
948 if (FirstLoc.isInvalid() ||
949 S.getSourceManager().isBeforeInTranslationUnit(ExtraLocs[I],
950 FirstLoc))
951 FirstLoc = ExtraLocs[I];
952 Hints[I] = FixItHint::CreateRemoval(ExtraLocs[I]);
953 }
954 }
955 TypeSpecWidth = TSW_unspecified;
956 TypeSpecComplex = TSC_unspecified;
957 TypeSpecSign = TSS_unspecified;
958 TypeAltiVecVector = TypeAltiVecPixel = TypeAltiVecBool = false;
959 TypeQualifiers = 0;
960 S.Diag(TSTLoc, diag::err_decltype_auto_cannot_be_combined)
961 << Hints[0] << Hints[1] << Hints[2] << Hints[3]
962 << Hints[4] << Hints[5] << Hints[6] << Hints[7];
963 }
964
965 // Validate and finalize AltiVec vector declspec.
966 if (TypeAltiVecVector) {
967 if (TypeAltiVecBool) {
968 // Sign specifiers are not allowed with vector bool. (PIM 2.1)
969 if (TypeSpecSign != TSS_unspecified) {
970 S.Diag(TSSLoc, diag::err_invalid_vector_bool_decl_spec)
971 << getSpecifierName((TSS)TypeSpecSign);
972 }
973
974 // Only char/int are valid with vector bool. (PIM 2.1)
975 if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) &&
976 (TypeSpecType != TST_int)) || TypeAltiVecPixel) {
977 S.Diag(TSTLoc, diag::err_invalid_vector_bool_decl_spec)
978 << (TypeAltiVecPixel ? "__pixel" :
979 getSpecifierName((TST)TypeSpecType, Policy));
980 }
981
982 // Only 'short' and 'long long' are valid with vector bool. (PIM 2.1)
983 if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short) &&
984 (TypeSpecWidth != TSW_longlong))
985 S.Diag(TSWLoc, diag::err_invalid_vector_bool_decl_spec)
986 << getSpecifierName((TSW)TypeSpecWidth);
987
988 // vector bool long long requires VSX support or ZVector.
989 if ((TypeSpecWidth == TSW_longlong) &&
990 (!S.Context.getTargetInfo().hasFeature("vsx")) &&
991 (!S.Context.getTargetInfo().hasFeature("power8-vector")) &&
992 !S.getLangOpts().ZVector)
993 S.Diag(TSTLoc, diag::err_invalid_vector_long_long_decl_spec);
994
995 // Elements of vector bool are interpreted as unsigned. (PIM 2.1)
996 if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) ||
997 (TypeSpecWidth != TSW_unspecified))
998 TypeSpecSign = TSS_unsigned;
999 } else if (TypeSpecType == TST_double) {
1000 // vector long double and vector long long double are never allowed.
1001 // vector double is OK for Power7 and later, and ZVector.
1002 if (TypeSpecWidth == TSW_long || TypeSpecWidth == TSW_longlong)
1003 S.Diag(TSWLoc, diag::err_invalid_vector_long_double_decl_spec);
1004 else if (!S.Context.getTargetInfo().hasFeature("vsx") &&
1005 !S.getLangOpts().ZVector)
1006 S.Diag(TSTLoc, diag::err_invalid_vector_double_decl_spec);
1007 } else if (TypeSpecType == TST_float) {
1008 // vector float is unsupported for ZVector.
1009 if (S.getLangOpts().ZVector)
1010 S.Diag(TSTLoc, diag::err_invalid_vector_float_decl_spec);
1011 } else if (TypeSpecWidth == TSW_long) {
1012 // vector long is unsupported for ZVector and deprecated for AltiVec.
1013 if (S.getLangOpts().ZVector)
1014 S.Diag(TSWLoc, diag::err_invalid_vector_long_decl_spec);
1015 else
1016 S.Diag(TSWLoc, diag::warn_vector_long_decl_spec_combination)
1017 << getSpecifierName((TST)TypeSpecType, Policy);
1018 }
1019
1020 if (TypeAltiVecPixel) {
1021 //TODO: perform validation
1022 TypeSpecType = TST_int;
1023 TypeSpecSign = TSS_unsigned;
1024 TypeSpecWidth = TSW_short;
1025 TypeSpecOwned = false;
1026 }
1027 }
1028
1029 // signed/unsigned are only valid with int/char/wchar_t.
1030 if (TypeSpecSign != TSS_unspecified) {
1031 if (TypeSpecType == TST_unspecified)
1032 TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int.
1033 else if (TypeSpecType != TST_int && TypeSpecType != TST_int128 &&
1034 TypeSpecType != TST_char && TypeSpecType != TST_wchar) {
1035 S.Diag(TSSLoc, diag::err_invalid_sign_spec)
1036 << getSpecifierName((TST)TypeSpecType, Policy);
1037 // signed double -> double.
1038 TypeSpecSign = TSS_unspecified;
1039 }
1040 }
1041
1042 // Validate the width of the type.
1043 switch (TypeSpecWidth) {
1044 case TSW_unspecified: break;
1045 case TSW_short: // short int
1046 case TSW_longlong: // long long int
1047 if (TypeSpecType == TST_unspecified)
1048 TypeSpecType = TST_int; // short -> short int, long long -> long long int.
1049 else if (TypeSpecType != TST_int) {
1050 S.Diag(TSWLoc, diag::err_invalid_width_spec) << (int)TypeSpecWidth
1051 << getSpecifierName((TST)TypeSpecType, Policy);
1052 TypeSpecType = TST_int;
1053 TypeSpecOwned = false;
1054 }
1055 break;
1056 case TSW_long: // long double, long int
1057 if (TypeSpecType == TST_unspecified)
1058 TypeSpecType = TST_int; // long -> long int.
1059 else if (TypeSpecType != TST_int && TypeSpecType != TST_double) {
1060 S.Diag(TSWLoc, diag::err_invalid_width_spec) << (int)TypeSpecWidth
1061 << getSpecifierName((TST)TypeSpecType, Policy);
1062 TypeSpecType = TST_int;
1063 TypeSpecOwned = false;
1064 }
1065 break;
1066 }
1067
1068 // TODO: if the implementation does not implement _Complex or _Imaginary,
1069 // disallow their use. Need information about the backend.
1070 if (TypeSpecComplex != TSC_unspecified) {
1071 if (TypeSpecType == TST_unspecified) {
1072 S.Diag(TSCLoc, diag::ext_plain_complex)
1073 << FixItHint::CreateInsertion(
1074 S.getLocForEndOfToken(getTypeSpecComplexLoc()),
1075 " double");
1076 TypeSpecType = TST_double; // _Complex -> _Complex double.
1077 } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) {
1078 // Note that this intentionally doesn't include _Complex _Bool.
1079 if (!S.getLangOpts().CPlusPlus)
1080 S.Diag(TSTLoc, diag::ext_integer_complex);
1081 } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) {
1082 S.Diag(TSCLoc, diag::err_invalid_complex_spec)
1083 << getSpecifierName((TST)TypeSpecType, Policy);
1084 TypeSpecComplex = TSC_unspecified;
1085 }
1086 }
1087
1088 // C11 6.7.1/3, C++11 [dcl.stc]p1, GNU TLS: __thread, thread_local and
1089 // _Thread_local can only appear with the 'static' and 'extern' storage class
1090 // specifiers. We also allow __private_extern__ as an extension.
1091 if (ThreadStorageClassSpec != TSCS_unspecified) {
1092 switch (StorageClassSpec) {
1093 case SCS_unspecified:
1094 case SCS_extern:
1095 case SCS_private_extern:
1096 case SCS_static:
1097 break;
1098 default:
1099 if (S.getSourceManager().isBeforeInTranslationUnit(
1100 getThreadStorageClassSpecLoc(), getStorageClassSpecLoc()))
1101 S.Diag(getStorageClassSpecLoc(),
1102 diag::err_invalid_decl_spec_combination)
1103 << DeclSpec::getSpecifierName(getThreadStorageClassSpec())
1104 << SourceRange(getThreadStorageClassSpecLoc());
1105 else
1106 S.Diag(getThreadStorageClassSpecLoc(),
1107 diag::err_invalid_decl_spec_combination)
1108 << DeclSpec::getSpecifierName(getStorageClassSpec())
1109 << SourceRange(getStorageClassSpecLoc());
1110 // Discard the thread storage class specifier to recover.
1111 ThreadStorageClassSpec = TSCS_unspecified;
1112 ThreadStorageClassSpecLoc = SourceLocation();
1113 }
1114 }
1115
1116 // If no type specifier was provided and we're parsing a language where
1117 // the type specifier is not optional, but we got 'auto' as a storage
1118 // class specifier, then assume this is an attempt to use C++0x's 'auto'
1119 // type specifier.
1120 if (S.getLangOpts().CPlusPlus &&
1121 TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) {
1122 TypeSpecType = TST_auto;
1123 StorageClassSpec = SCS_unspecified;
1124 TSTLoc = TSTNameLoc = StorageClassSpecLoc;
1125 StorageClassSpecLoc = SourceLocation();
1126 }
1127 // Diagnose if we've recovered from an ill-formed 'auto' storage class
1128 // specifier in a pre-C++11 dialect of C++.
1129 if (!S.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto)
1130 S.Diag(TSTLoc, diag::ext_auto_type_specifier);
1131 if (S.getLangOpts().CPlusPlus && !S.getLangOpts().CPlusPlus11 &&
1132 StorageClassSpec == SCS_auto)
1133 S.Diag(StorageClassSpecLoc, diag::warn_auto_storage_class)
1134 << FixItHint::CreateRemoval(StorageClassSpecLoc);
1135 if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32)
1136 S.Diag(TSTLoc, diag::warn_cxx98_compat_unicode_type)
1137 << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t");
1138 if (Constexpr_specified)
1139 S.Diag(ConstexprLoc, diag::warn_cxx98_compat_constexpr);
1140
1141 // C++ [class.friend]p6:
1142 // No storage-class-specifier shall appear in the decl-specifier-seq
1143 // of a friend declaration.
1144 if (isFriendSpecified() &&
1145 (getStorageClassSpec() || getThreadStorageClassSpec())) {
1146 SmallString<32> SpecName;
1147 SourceLocation SCLoc;
1148 FixItHint StorageHint, ThreadHint;
1149
1150 if (DeclSpec::SCS SC = getStorageClassSpec()) {
1151 SpecName = getSpecifierName(SC);
1152 SCLoc = getStorageClassSpecLoc();
1153 StorageHint = FixItHint::CreateRemoval(SCLoc);
1154 }
1155
1156 if (DeclSpec::TSCS TSC = getThreadStorageClassSpec()) {
1157 if (!SpecName.empty()) SpecName += " ";
1158 SpecName += getSpecifierName(TSC);
1159 SCLoc = getThreadStorageClassSpecLoc();
1160 ThreadHint = FixItHint::CreateRemoval(SCLoc);
1161 }
1162
1163 S.Diag(SCLoc, diag::err_friend_decl_spec)
1164 << SpecName << StorageHint << ThreadHint;
1165
1166 ClearStorageClassSpecs();
1167 }
1168
1169 // C++11 [dcl.fct.spec]p5:
1170 // The virtual specifier shall be used only in the initial
1171 // declaration of a non-static class member function;
1172 // C++11 [dcl.fct.spec]p6:
1173 // The explicit specifier shall be used only in the declaration of
1174 // a constructor or conversion function within its class
1175 // definition;
1176 if (isFriendSpecified() && (isVirtualSpecified() || isExplicitSpecified())) {
1177 StringRef Keyword;
1178 SourceLocation SCLoc;
1179
1180 if (isVirtualSpecified()) {
1181 Keyword = "virtual";
1182 SCLoc = getVirtualSpecLoc();
1183 } else {
1184 Keyword = "explicit";
1185 SCLoc = getExplicitSpecLoc();
1186 }
1187
1188 FixItHint Hint = FixItHint::CreateRemoval(SCLoc);
1189 S.Diag(SCLoc, diag::err_friend_decl_spec)
1190 << Keyword << Hint;
1191
1192 FS_virtual_specified = FS_explicit_specified = false;
1193 FS_virtualLoc = FS_explicitLoc = SourceLocation();
1194 }
1195
1196 assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType));
1197
1198 // Okay, now we can infer the real type.
1199
1200 // TODO: return "auto function" and other bad things based on the real type.
1201
1202 // 'data definition has no type or storage class'?
1203 }
1204
isMissingDeclaratorOk()1205 bool DeclSpec::isMissingDeclaratorOk() {
1206 TST tst = getTypeSpecType();
1207 return isDeclRep(tst) && getRepAsDecl() != nullptr &&
1208 StorageClassSpec != DeclSpec::SCS_typedef;
1209 }
1210
setOperatorFunctionId(SourceLocation OperatorLoc,OverloadedOperatorKind Op,SourceLocation SymbolLocations[3])1211 void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc,
1212 OverloadedOperatorKind Op,
1213 SourceLocation SymbolLocations[3]) {
1214 Kind = IK_OperatorFunctionId;
1215 StartLocation = OperatorLoc;
1216 EndLocation = OperatorLoc;
1217 OperatorFunctionId.Operator = Op;
1218 for (unsigned I = 0; I != 3; ++I) {
1219 OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding();
1220
1221 if (SymbolLocations[I].isValid())
1222 EndLocation = SymbolLocations[I];
1223 }
1224 }
1225
SetSpecifier(Specifier VS,SourceLocation Loc,const char * & PrevSpec)1226 bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc,
1227 const char *&PrevSpec) {
1228 if (!FirstLocation.isValid())
1229 FirstLocation = Loc;
1230 LastLocation = Loc;
1231 LastSpecifier = VS;
1232
1233 if (Specifiers & VS) {
1234 PrevSpec = getSpecifierName(VS);
1235 return true;
1236 }
1237
1238 Specifiers |= VS;
1239
1240 switch (VS) {
1241 default: llvm_unreachable("Unknown specifier!");
1242 case VS_Override: VS_overrideLoc = Loc; break;
1243 case VS_Sealed:
1244 case VS_Final: VS_finalLoc = Loc; break;
1245 }
1246
1247 return false;
1248 }
1249
getSpecifierName(Specifier VS)1250 const char *VirtSpecifiers::getSpecifierName(Specifier VS) {
1251 switch (VS) {
1252 default: llvm_unreachable("Unknown specifier");
1253 case VS_Override: return "override";
1254 case VS_Final: return "final";
1255 case VS_Sealed: return "sealed";
1256 }
1257 }
1258