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