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