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