DeclSpec.cpp revision 6666ed4ed2e2bc13da5ac5d0a4947019137d45be
1//===--- SemaDeclSpec.cpp - Declaration Specifier Semantic Analysis -------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10//  This file implements semantic analysis for declaration specifiers.
11//
12//===----------------------------------------------------------------------===//
13
14#include "clang/Parse/ParseDiagnostic.h" // FIXME: remove this back-dependency!
15#include "clang/Sema/DeclSpec.h"
16#include "clang/Sema/LocInfoType.h"
17#include "clang/Sema/ParsedTemplate.h"
18#include "clang/Sema/SemaDiagnostic.h"
19#include "clang/Sema/Sema.h"
20#include "clang/AST/ASTContext.h"
21#include "clang/AST/Expr.h"
22#include "clang/AST/NestedNameSpecifier.h"
23#include "clang/AST/TypeLoc.h"
24#include "clang/Lex/Preprocessor.h"
25#include "clang/Basic/LangOptions.h"
26#include "llvm/ADT/STLExtras.h"
27#include "llvm/Support/ErrorHandling.h"
28#include <cstring>
29using namespace clang;
30
31
32static DiagnosticBuilder Diag(DiagnosticsEngine &D, SourceLocation Loc,
33                              unsigned DiagID) {
34  return D.Report(Loc, DiagID);
35}
36
37
38void UnqualifiedId::setTemplateId(TemplateIdAnnotation *TemplateId) {
39  assert(TemplateId && "NULL template-id annotation?");
40  Kind = IK_TemplateId;
41  this->TemplateId = TemplateId;
42  StartLocation = TemplateId->TemplateNameLoc;
43  EndLocation = TemplateId->RAngleLoc;
44}
45
46void UnqualifiedId::setConstructorTemplateId(TemplateIdAnnotation *TemplateId) {
47  assert(TemplateId && "NULL template-id annotation?");
48  Kind = IK_ConstructorTemplateId;
49  this->TemplateId = TemplateId;
50  StartLocation = TemplateId->TemplateNameLoc;
51  EndLocation = TemplateId->RAngleLoc;
52}
53
54void CXXScopeSpec::Extend(ASTContext &Context, SourceLocation TemplateKWLoc,
55                          TypeLoc TL, SourceLocation ColonColonLoc) {
56  Builder.Extend(Context, TemplateKWLoc, TL, ColonColonLoc);
57  if (Range.getBegin().isInvalid())
58    Range.setBegin(TL.getBeginLoc());
59  Range.setEnd(ColonColonLoc);
60
61  assert(Range == Builder.getSourceRange() &&
62         "NestedNameSpecifierLoc range computation incorrect");
63}
64
65void CXXScopeSpec::Extend(ASTContext &Context, IdentifierInfo *Identifier,
66                          SourceLocation IdentifierLoc,
67                          SourceLocation ColonColonLoc) {
68  Builder.Extend(Context, Identifier, IdentifierLoc, ColonColonLoc);
69
70  if (Range.getBegin().isInvalid())
71    Range.setBegin(IdentifierLoc);
72  Range.setEnd(ColonColonLoc);
73
74  assert(Range == Builder.getSourceRange() &&
75         "NestedNameSpecifierLoc range computation incorrect");
76}
77
78void CXXScopeSpec::Extend(ASTContext &Context, NamespaceDecl *Namespace,
79                          SourceLocation NamespaceLoc,
80                          SourceLocation ColonColonLoc) {
81  Builder.Extend(Context, Namespace, NamespaceLoc, ColonColonLoc);
82
83  if (Range.getBegin().isInvalid())
84    Range.setBegin(NamespaceLoc);
85  Range.setEnd(ColonColonLoc);
86
87  assert(Range == Builder.getSourceRange() &&
88         "NestedNameSpecifierLoc range computation incorrect");
89}
90
91void CXXScopeSpec::Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
92                          SourceLocation AliasLoc,
93                          SourceLocation ColonColonLoc) {
94  Builder.Extend(Context, Alias, AliasLoc, ColonColonLoc);
95
96  if (Range.getBegin().isInvalid())
97    Range.setBegin(AliasLoc);
98  Range.setEnd(ColonColonLoc);
99
100  assert(Range == Builder.getSourceRange() &&
101         "NestedNameSpecifierLoc range computation incorrect");
102}
103
104void CXXScopeSpec::MakeGlobal(ASTContext &Context,
105                              SourceLocation ColonColonLoc) {
106  Builder.MakeGlobal(Context, ColonColonLoc);
107
108  Range = SourceRange(ColonColonLoc);
109
110  assert(Range == Builder.getSourceRange() &&
111         "NestedNameSpecifierLoc range computation incorrect");
112}
113
114void CXXScopeSpec::MakeTrivial(ASTContext &Context,
115                               NestedNameSpecifier *Qualifier, SourceRange R) {
116  Builder.MakeTrivial(Context, Qualifier, R);
117  Range = R;
118}
119
120void CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) {
121  if (!Other) {
122    Range = SourceRange();
123    Builder.Clear();
124    return;
125  }
126
127  Range = Other.getSourceRange();
128  Builder.Adopt(Other);
129}
130
131SourceLocation CXXScopeSpec::getLastQualifierNameLoc() const {
132  if (!Builder.getRepresentation())
133    return SourceLocation();
134  return Builder.getTemporary().getLocalBeginLoc();
135}
136
137NestedNameSpecifierLoc
138CXXScopeSpec::getWithLocInContext(ASTContext &Context) const {
139  if (!Builder.getRepresentation())
140    return NestedNameSpecifierLoc();
141
142  return Builder.getWithLocInContext(Context);
143}
144
145/// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
146/// "TheDeclarator" is the declarator that this will be added to.
147DeclaratorChunk DeclaratorChunk::getFunction(bool hasProto, bool isVariadic,
148                                             bool isAmbiguous,
149                                             SourceLocation EllipsisLoc,
150                                             ParamInfo *ArgInfo,
151                                             unsigned NumArgs,
152                                             unsigned TypeQuals,
153                                             bool RefQualifierIsLvalueRef,
154                                             SourceLocation RefQualifierLoc,
155                                             SourceLocation ConstQualifierLoc,
156                                             SourceLocation
157                                                 VolatileQualifierLoc,
158                                             SourceLocation MutableLoc,
159                                             ExceptionSpecificationType
160                                                 ESpecType,
161                                             SourceLocation ESpecLoc,
162                                             ParsedType *Exceptions,
163                                             SourceRange *ExceptionRanges,
164                                             unsigned NumExceptions,
165                                             Expr *NoexceptExpr,
166                                             SourceLocation LocalRangeBegin,
167                                             SourceLocation LocalRangeEnd,
168                                             Declarator &TheDeclarator,
169                                             TypeResult TrailingReturnType) {
170  DeclaratorChunk I;
171  I.Kind                        = Function;
172  I.Loc                         = LocalRangeBegin;
173  I.EndLoc                      = LocalRangeEnd;
174  I.Fun.AttrList                = 0;
175  I.Fun.hasPrototype            = hasProto;
176  I.Fun.isVariadic              = isVariadic;
177  I.Fun.isAmbiguous             = isAmbiguous;
178  I.Fun.EllipsisLoc             = EllipsisLoc.getRawEncoding();
179  I.Fun.DeleteArgInfo           = false;
180  I.Fun.TypeQuals               = TypeQuals;
181  I.Fun.NumArgs                 = NumArgs;
182  I.Fun.ArgInfo                 = 0;
183  I.Fun.RefQualifierIsLValueRef = RefQualifierIsLvalueRef;
184  I.Fun.RefQualifierLoc         = RefQualifierLoc.getRawEncoding();
185  I.Fun.ConstQualifierLoc       = ConstQualifierLoc.getRawEncoding();
186  I.Fun.VolatileQualifierLoc    = VolatileQualifierLoc.getRawEncoding();
187  I.Fun.MutableLoc              = MutableLoc.getRawEncoding();
188  I.Fun.ExceptionSpecType       = ESpecType;
189  I.Fun.ExceptionSpecLoc        = ESpecLoc.getRawEncoding();
190  I.Fun.NumExceptions           = 0;
191  I.Fun.Exceptions              = 0;
192  I.Fun.NoexceptExpr            = 0;
193  I.Fun.HasTrailingReturnType   = TrailingReturnType.isUsable() ||
194                                  TrailingReturnType.isInvalid();
195  I.Fun.TrailingReturnType      = TrailingReturnType.get();
196
197  // new[] an argument array if needed.
198  if (NumArgs) {
199    // If the 'InlineParams' in Declarator is unused and big enough, put our
200    // parameter list there (in an effort to avoid new/delete traffic).  If it
201    // is already used (consider a function returning a function pointer) or too
202    // small (function taking too many arguments), go to the heap.
203    if (!TheDeclarator.InlineParamsUsed &&
204        NumArgs <= llvm::array_lengthof(TheDeclarator.InlineParams)) {
205      I.Fun.ArgInfo = TheDeclarator.InlineParams;
206      I.Fun.DeleteArgInfo = false;
207      TheDeclarator.InlineParamsUsed = true;
208    } else {
209      I.Fun.ArgInfo = new DeclaratorChunk::ParamInfo[NumArgs];
210      I.Fun.DeleteArgInfo = true;
211    }
212    memcpy(I.Fun.ArgInfo, ArgInfo, sizeof(ArgInfo[0])*NumArgs);
213  }
214
215  // Check what exception specification information we should actually store.
216  switch (ESpecType) {
217  default: break; // By default, save nothing.
218  case EST_Dynamic:
219    // new[] an exception array if needed
220    if (NumExceptions) {
221      I.Fun.NumExceptions = NumExceptions;
222      I.Fun.Exceptions = new DeclaratorChunk::TypeAndRange[NumExceptions];
223      for (unsigned i = 0; i != NumExceptions; ++i) {
224        I.Fun.Exceptions[i].Ty = Exceptions[i];
225        I.Fun.Exceptions[i].Range = ExceptionRanges[i];
226      }
227    }
228    break;
229
230  case EST_ComputedNoexcept:
231    I.Fun.NoexceptExpr = NoexceptExpr;
232    break;
233  }
234  return I;
235}
236
237bool Declarator::isDeclarationOfFunction() const {
238  for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) {
239    switch (DeclTypeInfo[i].Kind) {
240    case DeclaratorChunk::Function:
241      return true;
242    case DeclaratorChunk::Paren:
243      continue;
244    case DeclaratorChunk::Pointer:
245    case DeclaratorChunk::Reference:
246    case DeclaratorChunk::Array:
247    case DeclaratorChunk::BlockPointer:
248    case DeclaratorChunk::MemberPointer:
249      return false;
250    }
251    llvm_unreachable("Invalid type chunk");
252  }
253
254  switch (DS.getTypeSpecType()) {
255    case TST_atomic:
256    case TST_auto:
257    case TST_bool:
258    case TST_char:
259    case TST_char16:
260    case TST_char32:
261    case TST_class:
262    case TST_decimal128:
263    case TST_decimal32:
264    case TST_decimal64:
265    case TST_double:
266    case TST_enum:
267    case TST_error:
268    case TST_float:
269    case TST_half:
270    case TST_int:
271    case TST_int128:
272    case TST_struct:
273    case TST_interface:
274    case TST_union:
275    case TST_unknown_anytype:
276    case TST_unspecified:
277    case TST_void:
278    case TST_wchar:
279      return false;
280
281    case TST_decltype:
282    case TST_typeofExpr:
283      if (Expr *E = DS.getRepAsExpr())
284        return E->getType()->isFunctionType();
285      return false;
286
287    case TST_underlyingType:
288    case TST_typename:
289    case TST_typeofType: {
290      QualType QT = DS.getRepAsType().get();
291      if (QT.isNull())
292        return false;
293
294      if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT))
295        QT = LIT->getType();
296
297      if (QT.isNull())
298        return false;
299
300      return QT->isFunctionType();
301    }
302  }
303
304  llvm_unreachable("Invalid TypeSpecType!");
305}
306
307/// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
308/// declaration specifier includes.
309///
310unsigned DeclSpec::getParsedSpecifiers() const {
311  unsigned Res = 0;
312  if (StorageClassSpec != SCS_unspecified ||
313      SCS_thread_specified)
314    Res |= PQ_StorageClassSpecifier;
315
316  if (TypeQualifiers != TQ_unspecified)
317    Res |= PQ_TypeQualifier;
318
319  if (hasTypeSpecifier())
320    Res |= PQ_TypeSpecifier;
321
322  if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified)
323    Res |= PQ_FunctionSpecifier;
324  return Res;
325}
326
327template <class T> static bool BadSpecifier(T TNew, T TPrev,
328                                            const char *&PrevSpec,
329                                            unsigned &DiagID,
330                                            bool IsExtension = true) {
331  PrevSpec = DeclSpec::getSpecifierName(TPrev);
332  if (TNew != TPrev)
333    DiagID = diag::err_invalid_decl_spec_combination;
334  else
335    DiagID = IsExtension ? diag::ext_duplicate_declspec :
336                           diag::warn_duplicate_declspec;
337  return true;
338}
339
340const char *DeclSpec::getSpecifierName(DeclSpec::SCS S) {
341  switch (S) {
342  case DeclSpec::SCS_unspecified: return "unspecified";
343  case DeclSpec::SCS_typedef:     return "typedef";
344  case DeclSpec::SCS_extern:      return "extern";
345  case DeclSpec::SCS_static:      return "static";
346  case DeclSpec::SCS_auto:        return "auto";
347  case DeclSpec::SCS_register:    return "register";
348  case DeclSpec::SCS_private_extern: return "__private_extern__";
349  case DeclSpec::SCS_mutable:     return "mutable";
350  }
351  llvm_unreachable("Unknown typespec!");
352}
353
354const char *DeclSpec::getSpecifierName(TSW W) {
355  switch (W) {
356  case TSW_unspecified: return "unspecified";
357  case TSW_short:       return "short";
358  case TSW_long:        return "long";
359  case TSW_longlong:    return "long long";
360  }
361  llvm_unreachable("Unknown typespec!");
362}
363
364const char *DeclSpec::getSpecifierName(TSC C) {
365  switch (C) {
366  case TSC_unspecified: return "unspecified";
367  case TSC_imaginary:   return "imaginary";
368  case TSC_complex:     return "complex";
369  }
370  llvm_unreachable("Unknown typespec!");
371}
372
373
374const char *DeclSpec::getSpecifierName(TSS S) {
375  switch (S) {
376  case TSS_unspecified: return "unspecified";
377  case TSS_signed:      return "signed";
378  case TSS_unsigned:    return "unsigned";
379  }
380  llvm_unreachable("Unknown typespec!");
381}
382
383const char *DeclSpec::getSpecifierName(DeclSpec::TST T) {
384  switch (T) {
385  case DeclSpec::TST_unspecified: return "unspecified";
386  case DeclSpec::TST_void:        return "void";
387  case DeclSpec::TST_char:        return "char";
388  case DeclSpec::TST_wchar:       return "wchar_t";
389  case DeclSpec::TST_char16:      return "char16_t";
390  case DeclSpec::TST_char32:      return "char32_t";
391  case DeclSpec::TST_int:         return "int";
392  case DeclSpec::TST_int128:      return "__int128";
393  case DeclSpec::TST_half:        return "half";
394  case DeclSpec::TST_float:       return "float";
395  case DeclSpec::TST_double:      return "double";
396  case DeclSpec::TST_bool:        return "_Bool";
397  case DeclSpec::TST_decimal32:   return "_Decimal32";
398  case DeclSpec::TST_decimal64:   return "_Decimal64";
399  case DeclSpec::TST_decimal128:  return "_Decimal128";
400  case DeclSpec::TST_enum:        return "enum";
401  case DeclSpec::TST_class:       return "class";
402  case DeclSpec::TST_union:       return "union";
403  case DeclSpec::TST_struct:      return "struct";
404  case DeclSpec::TST_interface:   return "__interface";
405  case DeclSpec::TST_typename:    return "type-name";
406  case DeclSpec::TST_typeofType:
407  case DeclSpec::TST_typeofExpr:  return "typeof";
408  case DeclSpec::TST_auto:        return "auto";
409  case DeclSpec::TST_decltype:    return "(decltype)";
410  case DeclSpec::TST_underlyingType: return "__underlying_type";
411  case DeclSpec::TST_unknown_anytype: return "__unknown_anytype";
412  case DeclSpec::TST_atomic: return "_Atomic";
413  case DeclSpec::TST_error:       return "(error)";
414  }
415  llvm_unreachable("Unknown typespec!");
416}
417
418const char *DeclSpec::getSpecifierName(TQ T) {
419  switch (T) {
420  case DeclSpec::TQ_unspecified: return "unspecified";
421  case DeclSpec::TQ_const:       return "const";
422  case DeclSpec::TQ_restrict:    return "restrict";
423  case DeclSpec::TQ_volatile:    return "volatile";
424  }
425  llvm_unreachable("Unknown typespec!");
426}
427
428bool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc,
429                                   const char *&PrevSpec,
430                                   unsigned &DiagID) {
431  // OpenCL v1.1 s6.8g: "The extern, static, auto and register storage-class
432  // specifiers are not supported.
433  // It seems sensible to prohibit private_extern too
434  // The cl_clang_storage_class_specifiers extension enables support for
435  // these storage-class specifiers.
436  // OpenCL v1.2 s6.8 changes this to "The auto and register storage-class
437  // specifiers are not supported."
438  if (S.getLangOpts().OpenCL &&
439      !S.getOpenCLOptions().cl_clang_storage_class_specifiers) {
440    switch (SC) {
441    case SCS_extern:
442    case SCS_private_extern:
443    case SCS_static:
444        if (S.getLangOpts().OpenCLVersion < 120) {
445          DiagID   = diag::err_not_opencl_storage_class_specifier;
446          PrevSpec = getSpecifierName(SC);
447          return true;
448        }
449        break;
450    case SCS_auto:
451    case SCS_register:
452      DiagID   = diag::err_not_opencl_storage_class_specifier;
453      PrevSpec = getSpecifierName(SC);
454      return true;
455    default:
456      break;
457    }
458  }
459
460  if (StorageClassSpec != SCS_unspecified) {
461    // Maybe this is an attempt to use C++0x 'auto' outside of C++0x mode.
462    bool isInvalid = true;
463    if (TypeSpecType == TST_unspecified && S.getLangOpts().CPlusPlus) {
464      if (SC == SCS_auto)
465        return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID);
466      if (StorageClassSpec == SCS_auto) {
467        isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc,
468                                    PrevSpec, DiagID);
469        assert(!isInvalid && "auto SCS -> TST recovery failed");
470      }
471    }
472
473    // Changing storage class is allowed only if the previous one
474    // was the 'extern' that is part of a linkage specification and
475    // the new storage class is 'typedef'.
476    if (isInvalid &&
477        !(SCS_extern_in_linkage_spec &&
478          StorageClassSpec == SCS_extern &&
479          SC == SCS_typedef))
480      return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID);
481  }
482  StorageClassSpec = SC;
483  StorageClassSpecLoc = Loc;
484  assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield");
485  return false;
486}
487
488bool DeclSpec::SetStorageClassSpecThread(SourceLocation Loc,
489                                         const char *&PrevSpec,
490                                         unsigned &DiagID) {
491  if (SCS_thread_specified) {
492    PrevSpec = "__thread";
493    DiagID = diag::ext_duplicate_declspec;
494    return true;
495  }
496  SCS_thread_specified = true;
497  SCS_threadLoc = Loc;
498  return false;
499}
500
501/// These methods set the specified attribute of the DeclSpec, but return true
502/// and ignore the request if invalid (e.g. "extern" then "auto" is
503/// specified).
504bool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc,
505                                const char *&PrevSpec,
506                                unsigned &DiagID) {
507  // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that
508  // for 'long long' we will keep the source location of the first 'long'.
509  if (TypeSpecWidth == TSW_unspecified)
510    TSWLoc = Loc;
511  // Allow turning long -> long long.
512  else if (W != TSW_longlong || TypeSpecWidth != TSW_long)
513    return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID);
514  TypeSpecWidth = W;
515  if (TypeAltiVecVector && !TypeAltiVecBool &&
516      ((TypeSpecWidth == TSW_long) || (TypeSpecWidth == TSW_longlong))) {
517    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
518    DiagID = diag::warn_vector_long_decl_spec_combination;
519    return true;
520  }
521  return false;
522}
523
524bool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc,
525                                  const char *&PrevSpec,
526                                  unsigned &DiagID) {
527  if (TypeSpecComplex != TSC_unspecified)
528    return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID);
529  TypeSpecComplex = C;
530  TSCLoc = Loc;
531  return false;
532}
533
534bool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc,
535                               const char *&PrevSpec,
536                               unsigned &DiagID) {
537  if (TypeSpecSign != TSS_unspecified)
538    return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID);
539  TypeSpecSign = S;
540  TSSLoc = Loc;
541  return false;
542}
543
544bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
545                               const char *&PrevSpec,
546                               unsigned &DiagID,
547                               ParsedType Rep) {
548  return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep);
549}
550
551bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
552                               SourceLocation TagNameLoc,
553                               const char *&PrevSpec,
554                               unsigned &DiagID,
555                               ParsedType Rep) {
556  assert(isTypeRep(T) && "T does not store a type");
557  assert(Rep && "no type provided!");
558  if (TypeSpecType != TST_unspecified) {
559    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
560    DiagID = diag::err_invalid_decl_spec_combination;
561    return true;
562  }
563  TypeSpecType = T;
564  TypeRep = Rep;
565  TSTLoc = TagKwLoc;
566  TSTNameLoc = TagNameLoc;
567  TypeSpecOwned = false;
568  return false;
569}
570
571bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
572                               const char *&PrevSpec,
573                               unsigned &DiagID,
574                               Expr *Rep) {
575  assert(isExprRep(T) && "T does not store an expr");
576  assert(Rep && "no expression provided!");
577  if (TypeSpecType != TST_unspecified) {
578    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
579    DiagID = diag::err_invalid_decl_spec_combination;
580    return true;
581  }
582  TypeSpecType = T;
583  ExprRep = Rep;
584  TSTLoc = Loc;
585  TSTNameLoc = Loc;
586  TypeSpecOwned = false;
587  return false;
588}
589
590bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
591                               const char *&PrevSpec,
592                               unsigned &DiagID,
593                               Decl *Rep, bool Owned) {
594  return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned);
595}
596
597bool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
598                               SourceLocation TagNameLoc,
599                               const char *&PrevSpec,
600                               unsigned &DiagID,
601                               Decl *Rep, bool Owned) {
602  assert(isDeclRep(T) && "T does not store a decl");
603  // Unlike the other cases, we don't assert that we actually get a decl.
604
605  if (TypeSpecType != TST_unspecified) {
606    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
607    DiagID = diag::err_invalid_decl_spec_combination;
608    return true;
609  }
610  TypeSpecType = T;
611  DeclRep = Rep;
612  TSTLoc = TagKwLoc;
613  TSTNameLoc = TagNameLoc;
614  TypeSpecOwned = Owned;
615  return false;
616}
617
618bool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
619                               const char *&PrevSpec,
620                               unsigned &DiagID) {
621  assert(!isDeclRep(T) && !isTypeRep(T) && !isExprRep(T) &&
622         "rep required for these type-spec kinds!");
623  if (TypeSpecType != TST_unspecified) {
624    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
625    DiagID = diag::err_invalid_decl_spec_combination;
626    return true;
627  }
628  TSTLoc = Loc;
629  TSTNameLoc = Loc;
630  if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) {
631    TypeAltiVecBool = true;
632    return false;
633  }
634  TypeSpecType = T;
635  TypeSpecOwned = false;
636  if (TypeAltiVecVector && !TypeAltiVecBool && (TypeSpecType == TST_double)) {
637    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
638    DiagID = diag::err_invalid_vector_decl_spec;
639    return true;
640  }
641  return false;
642}
643
644bool DeclSpec::SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc,
645                          const char *&PrevSpec, unsigned &DiagID) {
646  if (TypeSpecType != TST_unspecified) {
647    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
648    DiagID = diag::err_invalid_vector_decl_spec_combination;
649    return true;
650  }
651  TypeAltiVecVector = isAltiVecVector;
652  AltiVecLoc = Loc;
653  return false;
654}
655
656bool DeclSpec::SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc,
657                          const char *&PrevSpec, unsigned &DiagID) {
658  if (!TypeAltiVecVector || TypeAltiVecPixel ||
659      (TypeSpecType != TST_unspecified)) {
660    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType);
661    DiagID = diag::err_invalid_pixel_decl_spec_combination;
662    return true;
663  }
664  TypeAltiVecPixel = isAltiVecPixel;
665  TSTLoc = Loc;
666  TSTNameLoc = Loc;
667  return false;
668}
669
670bool DeclSpec::SetTypeSpecError() {
671  TypeSpecType = TST_error;
672  TypeSpecOwned = false;
673  TSTLoc = SourceLocation();
674  TSTNameLoc = SourceLocation();
675  return false;
676}
677
678bool DeclSpec::SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec,
679                           unsigned &DiagID, const LangOptions &Lang,
680                           bool IsTypeSpec) {
681  // Duplicates are permitted in C99, and are permitted in C++11 unless the
682  // cv-qualifier appears as a type-specifier.  However, since this is likely
683  // not what the user intended, we will always warn.  We do not need to set the
684  // qualifier's location since we already have it.
685  if (TypeQualifiers & T) {
686    bool IsExtension = true;
687    if (Lang.C99 || (Lang.CPlusPlus0x && !IsTypeSpec))
688      IsExtension = false;
689    return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension);
690  }
691  TypeQualifiers |= T;
692
693  switch (T) {
694  default: llvm_unreachable("Unknown type qualifier!");
695  case TQ_const:    TQ_constLoc = Loc; break;
696  case TQ_restrict: TQ_restrictLoc = Loc; break;
697  case TQ_volatile: TQ_volatileLoc = Loc; break;
698  }
699  return false;
700}
701
702bool DeclSpec::SetFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec,
703                                     unsigned &DiagID) {
704  // 'inline inline' is ok.
705  FS_inline_specified = true;
706  FS_inlineLoc = Loc;
707  return false;
708}
709
710bool DeclSpec::SetFunctionSpecVirtual(SourceLocation Loc, const char *&PrevSpec,
711                                      unsigned &DiagID) {
712  // 'virtual virtual' is ok.
713  FS_virtual_specified = true;
714  FS_virtualLoc = Loc;
715  return false;
716}
717
718bool DeclSpec::SetFunctionSpecExplicit(SourceLocation Loc, const char *&PrevSpec,
719                                       unsigned &DiagID) {
720  // 'explicit explicit' is ok.
721  FS_explicit_specified = true;
722  FS_explicitLoc = Loc;
723  return false;
724}
725
726bool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
727                             unsigned &DiagID) {
728  if (Friend_specified) {
729    PrevSpec = "friend";
730    DiagID = diag::ext_duplicate_declspec;
731    return true;
732  }
733
734  Friend_specified = true;
735  FriendLoc = Loc;
736  return false;
737}
738
739bool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
740                                    unsigned &DiagID) {
741  if (isModulePrivateSpecified()) {
742    PrevSpec = "__module_private__";
743    DiagID = diag::ext_duplicate_declspec;
744    return true;
745  }
746
747  ModulePrivateLoc = Loc;
748  return false;
749}
750
751bool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
752                                unsigned &DiagID) {
753  // 'constexpr constexpr' is ok.
754  Constexpr_specified = true;
755  ConstexprLoc = Loc;
756  return false;
757}
758
759void DeclSpec::setProtocolQualifiers(Decl * const *Protos,
760                                     unsigned NP,
761                                     SourceLocation *ProtoLocs,
762                                     SourceLocation LAngleLoc) {
763  if (NP == 0) return;
764  ProtocolQualifiers = new Decl*[NP];
765  ProtocolLocs = new SourceLocation[NP];
766  memcpy((void*)ProtocolQualifiers, Protos, sizeof(Decl*)*NP);
767  memcpy(ProtocolLocs, ProtoLocs, sizeof(SourceLocation)*NP);
768  NumProtocolQualifiers = NP;
769  ProtocolLAngleLoc = LAngleLoc;
770}
771
772void DeclSpec::SaveWrittenBuiltinSpecs() {
773  writtenBS.Sign = getTypeSpecSign();
774  writtenBS.Width = getTypeSpecWidth();
775  writtenBS.Type = getTypeSpecType();
776  // Search the list of attributes for the presence of a mode attribute.
777  writtenBS.ModeAttr = false;
778  AttributeList* attrs = getAttributes().getList();
779  while (attrs) {
780    if (attrs->getKind() == AttributeList::AT_Mode) {
781      writtenBS.ModeAttr = true;
782      break;
783    }
784    attrs = attrs->getNext();
785  }
786}
787
788void DeclSpec::SaveStorageSpecifierAsWritten() {
789  if (SCS_extern_in_linkage_spec && StorageClassSpec == SCS_extern)
790    // If 'extern' is part of a linkage specification,
791    // then it is not a storage class "as written".
792    StorageClassSpecAsWritten = SCS_unspecified;
793  else
794    StorageClassSpecAsWritten = StorageClassSpec;
795}
796
797/// Finish - This does final analysis of the declspec, rejecting things like
798/// "_Imaginary" (lacking an FP type).  This returns a diagnostic to issue or
799/// diag::NUM_DIAGNOSTICS if there is no error.  After calling this method,
800/// DeclSpec is guaranteed self-consistent, even if an error occurred.
801void DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP) {
802  // Before possibly changing their values, save specs as written.
803  SaveWrittenBuiltinSpecs();
804  SaveStorageSpecifierAsWritten();
805
806  // Check the type specifier components first.
807
808  // Validate and finalize AltiVec vector declspec.
809  if (TypeAltiVecVector) {
810    if (TypeAltiVecBool) {
811      // Sign specifiers are not allowed with vector bool. (PIM 2.1)
812      if (TypeSpecSign != TSS_unspecified) {
813        Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec)
814          << getSpecifierName((TSS)TypeSpecSign);
815      }
816
817      // Only char/int are valid with vector bool. (PIM 2.1)
818      if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) &&
819           (TypeSpecType != TST_int)) || TypeAltiVecPixel) {
820        Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec)
821          << (TypeAltiVecPixel ? "__pixel" :
822                                 getSpecifierName((TST)TypeSpecType));
823      }
824
825      // Only 'short' is valid with vector bool. (PIM 2.1)
826      if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short))
827        Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec)
828          << getSpecifierName((TSW)TypeSpecWidth);
829
830      // Elements of vector bool are interpreted as unsigned. (PIM 2.1)
831      if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) ||
832          (TypeSpecWidth != TSW_unspecified))
833        TypeSpecSign = TSS_unsigned;
834    }
835
836    if (TypeAltiVecPixel) {
837      //TODO: perform validation
838      TypeSpecType = TST_int;
839      TypeSpecSign = TSS_unsigned;
840      TypeSpecWidth = TSW_short;
841      TypeSpecOwned = false;
842    }
843  }
844
845  // signed/unsigned are only valid with int/char/wchar_t.
846  if (TypeSpecSign != TSS_unspecified) {
847    if (TypeSpecType == TST_unspecified)
848      TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int.
849    else if (TypeSpecType != TST_int  && TypeSpecType != TST_int128 &&
850             TypeSpecType != TST_char && TypeSpecType != TST_wchar) {
851      Diag(D, TSSLoc, diag::err_invalid_sign_spec)
852        << getSpecifierName((TST)TypeSpecType);
853      // signed double -> double.
854      TypeSpecSign = TSS_unspecified;
855    }
856  }
857
858  // Validate the width of the type.
859  switch (TypeSpecWidth) {
860  case TSW_unspecified: break;
861  case TSW_short:    // short int
862  case TSW_longlong: // long long int
863    if (TypeSpecType == TST_unspecified)
864      TypeSpecType = TST_int; // short -> short int, long long -> long long int.
865    else if (TypeSpecType != TST_int) {
866      Diag(D, TSWLoc,
867           TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec
868                                      : diag::err_invalid_longlong_spec)
869        <<  getSpecifierName((TST)TypeSpecType);
870      TypeSpecType = TST_int;
871      TypeSpecOwned = false;
872    }
873    break;
874  case TSW_long:  // long double, long int
875    if (TypeSpecType == TST_unspecified)
876      TypeSpecType = TST_int;  // long -> long int.
877    else if (TypeSpecType != TST_int && TypeSpecType != TST_double) {
878      Diag(D, TSWLoc, diag::err_invalid_long_spec)
879        << getSpecifierName((TST)TypeSpecType);
880      TypeSpecType = TST_int;
881      TypeSpecOwned = false;
882    }
883    break;
884  }
885
886  // TODO: if the implementation does not implement _Complex or _Imaginary,
887  // disallow their use.  Need information about the backend.
888  if (TypeSpecComplex != TSC_unspecified) {
889    if (TypeSpecType == TST_unspecified) {
890      Diag(D, TSCLoc, diag::ext_plain_complex)
891        << FixItHint::CreateInsertion(
892                              PP.getLocForEndOfToken(getTypeSpecComplexLoc()),
893                                                 " double");
894      TypeSpecType = TST_double;   // _Complex -> _Complex double.
895    } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) {
896      // Note that this intentionally doesn't include _Complex _Bool.
897      if (!PP.getLangOpts().CPlusPlus)
898        Diag(D, TSTLoc, diag::ext_integer_complex);
899    } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) {
900      Diag(D, TSCLoc, diag::err_invalid_complex_spec)
901        << getSpecifierName((TST)TypeSpecType);
902      TypeSpecComplex = TSC_unspecified;
903    }
904  }
905
906  // If no type specifier was provided and we're parsing a language where
907  // the type specifier is not optional, but we got 'auto' as a storage
908  // class specifier, then assume this is an attempt to use C++0x's 'auto'
909  // type specifier.
910  // FIXME: Does Microsoft really support implicit int in C++?
911  if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().MicrosoftExt &&
912      TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) {
913    TypeSpecType = TST_auto;
914    StorageClassSpec = StorageClassSpecAsWritten = SCS_unspecified;
915    TSTLoc = TSTNameLoc = StorageClassSpecLoc;
916    StorageClassSpecLoc = SourceLocation();
917  }
918  // Diagnose if we've recovered from an ill-formed 'auto' storage class
919  // specifier in a pre-C++0x dialect of C++.
920  if (!PP.getLangOpts().CPlusPlus0x && TypeSpecType == TST_auto)
921    Diag(D, TSTLoc, diag::ext_auto_type_specifier);
922  if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus0x &&
923      StorageClassSpec == SCS_auto)
924    Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class)
925      << FixItHint::CreateRemoval(StorageClassSpecLoc);
926  if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32)
927    Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type)
928      << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t");
929  if (Constexpr_specified)
930    Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr);
931
932  // C++ [class.friend]p6:
933  //   No storage-class-specifier shall appear in the decl-specifier-seq
934  //   of a friend declaration.
935  if (isFriendSpecified() && getStorageClassSpec()) {
936    DeclSpec::SCS SC = getStorageClassSpec();
937    const char *SpecName = getSpecifierName(SC);
938
939    SourceLocation SCLoc = getStorageClassSpecLoc();
940    SourceLocation SCEndLoc = SCLoc.getLocWithOffset(strlen(SpecName));
941
942    Diag(D, SCLoc, diag::err_friend_storage_spec)
943      << SpecName
944      << FixItHint::CreateRemoval(SourceRange(SCLoc, SCEndLoc));
945
946    ClearStorageClassSpecs();
947  }
948
949  assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType));
950
951  // Okay, now we can infer the real type.
952
953  // TODO: return "auto function" and other bad things based on the real type.
954
955  // 'data definition has no type or storage class'?
956}
957
958bool DeclSpec::isMissingDeclaratorOk() {
959  TST tst = getTypeSpecType();
960  return isDeclRep(tst) && getRepAsDecl() != 0 &&
961    StorageClassSpec != DeclSpec::SCS_typedef;
962}
963
964void UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc,
965                                          OverloadedOperatorKind Op,
966                                          SourceLocation SymbolLocations[3]) {
967  Kind = IK_OperatorFunctionId;
968  StartLocation = OperatorLoc;
969  EndLocation = OperatorLoc;
970  OperatorFunctionId.Operator = Op;
971  for (unsigned I = 0; I != 3; ++I) {
972    OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding();
973
974    if (SymbolLocations[I].isValid())
975      EndLocation = SymbolLocations[I];
976  }
977}
978
979bool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc,
980                                  const char *&PrevSpec) {
981  LastLocation = Loc;
982
983  if (Specifiers & VS) {
984    PrevSpec = getSpecifierName(VS);
985    return true;
986  }
987
988  Specifiers |= VS;
989
990  switch (VS) {
991  default: llvm_unreachable("Unknown specifier!");
992  case VS_Override: VS_overrideLoc = Loc; break;
993  case VS_Final:    VS_finalLoc = Loc; break;
994  }
995
996  return false;
997}
998
999const char *VirtSpecifiers::getSpecifierName(Specifier VS) {
1000  switch (VS) {
1001  default: llvm_unreachable("Unknown specifier");
1002  case VS_Override: return "override";
1003  case VS_Final: return "final";
1004  }
1005}
1006