15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- SemaDeclSpec.cpp - Declaration Specifier Semantic Analysis -------===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file implements semantic analysis for declaration specifiers.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1419510856727e0e14a3696b2a72c35163bff2a71fJohn McCall#include "clang/Sema/DeclSpec.h"
15c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor#include "clang/AST/ASTContext.h"
16d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner#include "clang/AST/DeclCXX.h"
17555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor#include "clang/AST/Expr.h"
182e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor#include "clang/AST/NestedNameSpecifier.h"
192e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor#include "clang/AST/TypeLoc.h"
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/LangOptions.h"
2155fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Lex/Preprocessor.h"
2255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Parse/ParseDiagnostic.h" // FIXME: remove this back-dependency!
2355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/LocInfoType.h"
2455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/ParsedTemplate.h"
2555fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/Sema.h"
2655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth#include "clang/Sema/SemaDiagnostic.h"
275af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner#include "llvm/ADT/STLExtras.h"
28ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith#include "llvm/ADT/SmallString.h"
2932d335e63bd287e5c9297532171284cdf4c7888cJohn McCall#include "llvm/Support/ErrorHandling.h"
30e4e5b054b4917f0ee493bb2fda5b1ec749bfb9a1Douglas Gregor#include <cstring>
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerusing namespace clang;
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
33254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner
34d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikiestatic DiagnosticBuilder Diag(DiagnosticsEngine &D, SourceLocation Loc,
3533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis                              unsigned DiagID) {
3633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis  return D.Report(Loc, DiagID);
37254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner}
38254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner
39314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor
40314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregorvoid UnqualifiedId::setTemplateId(TemplateIdAnnotation *TemplateId) {
41314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor  assert(TemplateId && "NULL template-id annotation?");
42314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor  Kind = IK_TemplateId;
43314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor  this->TemplateId = TemplateId;
44314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor  StartLocation = TemplateId->TemplateNameLoc;
45314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor  EndLocation = TemplateId->RAngleLoc;
46314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor}
47314b97f8c564b465af605efaee23f91ec18a982bDouglas Gregor
480efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregorvoid UnqualifiedId::setConstructorTemplateId(TemplateIdAnnotation *TemplateId) {
490efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor  assert(TemplateId && "NULL template-id annotation?");
500efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor  Kind = IK_ConstructorTemplateId;
510efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor  this->TemplateId = TemplateId;
520efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor  StartLocation = TemplateId->TemplateNameLoc;
530efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor  EndLocation = TemplateId->RAngleLoc;
540efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor}
550efc2c1716be4f1c5f1343cad3b047e74861f030Douglas Gregor
562e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregorvoid CXXScopeSpec::Extend(ASTContext &Context, SourceLocation TemplateKWLoc,
572e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                          TypeLoc TL, SourceLocation ColonColonLoc) {
585f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Builder.Extend(Context, TemplateKWLoc, TL, ColonColonLoc);
592e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  if (Range.getBegin().isInvalid())
602e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor    Range.setBegin(TL.getBeginLoc());
612e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  Range.setEnd(ColonColonLoc);
62c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
635f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  assert(Range == Builder.getSourceRange() &&
64c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor         "NestedNameSpecifierLoc range computation incorrect");
652e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor}
662e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor
672e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregorvoid CXXScopeSpec::Extend(ASTContext &Context, IdentifierInfo *Identifier,
682e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                          SourceLocation IdentifierLoc,
692e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                          SourceLocation ColonColonLoc) {
705f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Builder.Extend(Context, Identifier, IdentifierLoc, ColonColonLoc);
715f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
722e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  if (Range.getBegin().isInvalid())
732e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor    Range.setBegin(IdentifierLoc);
742e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  Range.setEnd(ColonColonLoc);
75c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
765f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  assert(Range == Builder.getSourceRange() &&
77c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor         "NestedNameSpecifierLoc range computation incorrect");
782e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor}
792e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor
802e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregorvoid CXXScopeSpec::Extend(ASTContext &Context, NamespaceDecl *Namespace,
812e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                          SourceLocation NamespaceLoc,
822e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                          SourceLocation ColonColonLoc) {
835f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Builder.Extend(Context, Namespace, NamespaceLoc, ColonColonLoc);
845f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
852e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  if (Range.getBegin().isInvalid())
862e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor    Range.setBegin(NamespaceLoc);
872e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor  Range.setEnd(ColonColonLoc);
88c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
895f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  assert(Range == Builder.getSourceRange() &&
90c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor         "NestedNameSpecifierLoc range computation incorrect");
912e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor}
922e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor
9314aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregorvoid CXXScopeSpec::Extend(ASTContext &Context, NamespaceAliasDecl *Alias,
9414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                          SourceLocation AliasLoc,
9514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor                          SourceLocation ColonColonLoc) {
965f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Builder.Extend(Context, Alias, AliasLoc, ColonColonLoc);
975f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
9814aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  if (Range.getBegin().isInvalid())
9914aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor    Range.setBegin(AliasLoc);
10014aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor  Range.setEnd(ColonColonLoc);
101c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
1025f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  assert(Range == Builder.getSourceRange() &&
103c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor         "NestedNameSpecifierLoc range computation incorrect");
10414aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor}
10514aba76042e041b2c5e439bf4ae353a0a3c7fd73Douglas Gregor
1062e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregorvoid CXXScopeSpec::MakeGlobal(ASTContext &Context,
1072e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor                              SourceLocation ColonColonLoc) {
1085f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Builder.MakeGlobal(Context, ColonColonLoc);
109c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
1105f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Range = SourceRange(ColonColonLoc);
111c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
1125f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  assert(Range == Builder.getSourceRange() &&
113c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor         "NestedNameSpecifierLoc range computation incorrect");
114c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
115c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
116c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregorvoid CXXScopeSpec::MakeTrivial(ASTContext &Context,
117c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor                               NestedNameSpecifier *Qualifier, SourceRange R) {
1185f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Builder.MakeTrivial(Context, Qualifier, R);
119c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  Range = R;
120c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
121c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
122c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregorvoid CXXScopeSpec::Adopt(NestedNameSpecifierLoc Other) {
123c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  if (!Other) {
124c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    Range = SourceRange();
1255f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor    Builder.Clear();
126c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return;
127c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  }
1285f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor
129c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor  Range = Other.getSourceRange();
1305f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  Builder.Adopt(Other);
131c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor}
132c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
1339dc71d2fddcd283e07d45f3894c8559e2f7dd9a7John McCallSourceLocation CXXScopeSpec::getLastQualifierNameLoc() const {
1349dc71d2fddcd283e07d45f3894c8559e2f7dd9a7John McCall  if (!Builder.getRepresentation())
1359dc71d2fddcd283e07d45f3894c8559e2f7dd9a7John McCall    return SourceLocation();
1369dc71d2fddcd283e07d45f3894c8559e2f7dd9a7John McCall  return Builder.getTemporary().getLocalBeginLoc();
1379dc71d2fddcd283e07d45f3894c8559e2f7dd9a7John McCall}
1389dc71d2fddcd283e07d45f3894c8559e2f7dd9a7John McCall
139c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorNestedNameSpecifierLoc
140c22b5fff39a7520207f165fb16a27a34b944bd9cDouglas GregorCXXScopeSpec::getWithLocInContext(ASTContext &Context) const {
141b46ae3964ba02535276c71332396e9a7bad2dfa5Douglas Gregor  if (!Builder.getRepresentation())
142c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor    return NestedNameSpecifierLoc();
143c34348a7ef1a6b3f92a644a227953800cd1f9947Douglas Gregor
1445f791bb44417ecc201ed57a85d0fe02001d8a615Douglas Gregor  return Builder.getWithLocInContext(Context);
1452e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor}
1462e4c34ac53d08633b9473df921db4c7e4c9cd577Douglas Gregor
1475af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner/// DeclaratorChunk::getFunction - Return a DeclaratorChunk for a function.
1485af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner/// "TheDeclarator" is the declarator that this will be added to.
14959c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo BagnaraDeclaratorChunk DeclaratorChunk::getFunction(bool hasProto,
150b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith                                             bool isAmbiguous,
15159c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo Bagnara                                             SourceLocation LParenLoc,
152651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                             ParamInfo *Params,
153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                             unsigned NumParams,
15459c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo Bagnara                                             SourceLocation EllipsisLoc,
15559c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo Bagnara                                             SourceLocation RParenLoc,
1565af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner                                             unsigned TypeQuals,
15783f51722ed2b8134810cb178f39e44da811de7cdDouglas Gregor                                             bool RefQualifierIsLvalueRef,
15883f51722ed2b8134810cb178f39e44da811de7cdDouglas Gregor                                             SourceLocation RefQualifierLoc,
15943f5103f8051bbac19022e6edaf7d9138b0f3c0fDouglas Gregor                                             SourceLocation ConstQualifierLoc,
16043f5103f8051bbac19022e6edaf7d9138b0f3c0fDouglas Gregor                                             SourceLocation
16143f5103f8051bbac19022e6edaf7d9138b0f3c0fDouglas Gregor                                                 VolatileQualifierLoc,
16290ebed0734fac9b464c9bdff53fbf85a86b27f32Douglas Gregor                                             SourceLocation MutableLoc,
1636e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl                                             ExceptionSpecificationType
1646e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl                                                 ESpecType,
1656e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl                                             SourceLocation ESpecLoc,
166b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                                             ParsedType *Exceptions,
167ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl                                             SourceRange *ExceptionRanges,
1687dc813462dd9fd3f6f4296f896a12de14264fef8Sebastian Redl                                             unsigned NumExceptions,
1696e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl                                             Expr *NoexceptExpr,
170796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara                                             SourceLocation LocalRangeBegin,
171796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara                                             SourceLocation LocalRangeEnd,
172dab60ad68a3a98d687305941a3852e793705f945Douglas Gregor                                             Declarator &TheDeclarator,
17354655be65585ed6618fdd7a19fa6c70efc321d3aRichard Smith                                             TypeResult TrailingReturnType) {
1744cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  assert(!(TypeQuals & DeclSpec::TQ_atomic) &&
1754cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith         "function cannot have _Atomic qualifier");
1764cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith
1775af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner  DeclaratorChunk I;
1786e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Kind                        = Function;
179796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara  I.Loc                         = LocalRangeBegin;
180796aa443ab5ed036f42ef33fed629e1b4b34871bAbramo Bagnara  I.EndLoc                      = LocalRangeEnd;
181ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  I.Fun.AttrList                = nullptr;
1826e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Fun.hasPrototype            = hasProto;
18359c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo Bagnara  I.Fun.isVariadic              = EllipsisLoc.isValid();
184b9c6261d02f688d0a9a36b736ad5956fbc737854Richard Smith  I.Fun.isAmbiguous             = isAmbiguous;
18559c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo Bagnara  I.Fun.LParenLoc               = LParenLoc.getRawEncoding();
1866e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Fun.EllipsisLoc             = EllipsisLoc.getRawEncoding();
18759c0a818a79be850f7ae8fdafd57a1710e5b809aAbramo Bagnara  I.Fun.RParenLoc               = RParenLoc.getRawEncoding();
188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  I.Fun.DeleteParams            = false;
1896e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Fun.TypeQuals               = TypeQuals;
190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  I.Fun.NumParams               = NumParams;
191ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  I.Fun.Params                  = nullptr;
19283f51722ed2b8134810cb178f39e44da811de7cdDouglas Gregor  I.Fun.RefQualifierIsLValueRef = RefQualifierIsLvalueRef;
1936e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Fun.RefQualifierLoc         = RefQualifierLoc.getRawEncoding();
19443f5103f8051bbac19022e6edaf7d9138b0f3c0fDouglas Gregor  I.Fun.ConstQualifierLoc       = ConstQualifierLoc.getRawEncoding();
19543f5103f8051bbac19022e6edaf7d9138b0f3c0fDouglas Gregor  I.Fun.VolatileQualifierLoc    = VolatileQualifierLoc.getRawEncoding();
19690ebed0734fac9b464c9bdff53fbf85a86b27f32Douglas Gregor  I.Fun.MutableLoc              = MutableLoc.getRawEncoding();
1976e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Fun.ExceptionSpecType       = ESpecType;
1986e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Fun.ExceptionSpecLoc        = ESpecLoc.getRawEncoding();
1996e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  I.Fun.NumExceptions           = 0;
200ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  I.Fun.Exceptions              = nullptr;
201ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  I.Fun.NoexceptExpr            = nullptr;
20254655be65585ed6618fdd7a19fa6c70efc321d3aRichard Smith  I.Fun.HasTrailingReturnType   = TrailingReturnType.isUsable() ||
20354655be65585ed6618fdd7a19fa6c70efc321d3aRichard Smith                                  TrailingReturnType.isInvalid();
20454655be65585ed6618fdd7a19fa6c70efc321d3aRichard Smith  I.Fun.TrailingReturnType      = TrailingReturnType.get();
2057dc813462dd9fd3f6f4296f896a12de14264fef8Sebastian Redl
206651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // new[] a parameter array if needed.
207651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (NumParams) {
2085af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner    // If the 'InlineParams' in Declarator is unused and big enough, put our
2095af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner    // parameter list there (in an effort to avoid new/delete traffic).  If it
2105af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner    // is already used (consider a function returning a function pointer) or too
211651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // small (function with too many parameters), go to the heap.
2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (!TheDeclarator.InlineParamsUsed &&
213651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        NumParams <= llvm::array_lengthof(TheDeclarator.InlineParams)) {
214651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      I.Fun.Params = TheDeclarator.InlineParams;
215651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      I.Fun.DeleteParams = false;
2165af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner      TheDeclarator.InlineParamsUsed = true;
2175af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner    } else {
218651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      I.Fun.Params = new DeclaratorChunk::ParamInfo[NumParams];
219651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      I.Fun.DeleteParams = true;
2205af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner    }
221651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    memcpy(I.Fun.Params, Params, sizeof(Params[0]) * NumParams);
2225af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner  }
2236e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl
2246e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  // Check what exception specification information we should actually store.
2256e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  switch (ESpecType) {
2266e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  default: break; // By default, save nothing.
2276e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  case EST_Dynamic:
2286e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl    // new[] an exception array if needed
2296e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl    if (NumExceptions) {
2306e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl      I.Fun.NumExceptions = NumExceptions;
2316e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl      I.Fun.Exceptions = new DeclaratorChunk::TypeAndRange[NumExceptions];
2326e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl      for (unsigned i = 0; i != NumExceptions; ++i) {
2336e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl        I.Fun.Exceptions[i].Ty = Exceptions[i];
2346e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl        I.Fun.Exceptions[i].Range = ExceptionRanges[i];
2356e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl      }
236ef65f06e8e440aec541442cfd73a8a836e9bc842Sebastian Redl    }
2376e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl    break;
2386e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl
2396e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl  case EST_ComputedNoexcept:
2406e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl    I.Fun.NoexceptExpr = NoexceptExpr;
2416e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl    break;
2427dc813462dd9fd3f6f4296f896a12de14264fef8Sebastian Redl  }
2435af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner  return I;
2445af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner}
245254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner
246555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregorbool Declarator::isDeclarationOfFunction() const {
2471ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith  for (unsigned i = 0, i_end = DeclTypeInfo.size(); i < i_end; ++i) {
2481ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    switch (DeclTypeInfo[i].Kind) {
2491ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    case DeclaratorChunk::Function:
2501ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith      return true;
2511ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    case DeclaratorChunk::Paren:
2521ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith      continue;
2531ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    case DeclaratorChunk::Pointer:
2541ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    case DeclaratorChunk::Reference:
2551ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    case DeclaratorChunk::Array:
2561ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    case DeclaratorChunk::BlockPointer:
2571ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    case DeclaratorChunk::MemberPointer:
2581ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith      return false;
2591ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    }
2601ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith    llvm_unreachable("Invalid type chunk");
2611ab0d90af489b5441d0bf25338d420ddae3ece74Richard Smith  }
262555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor
263555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor  switch (DS.getTypeSpecType()) {
264b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman    case TST_atomic:
265555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_auto:
266555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_bool:
267555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_char:
268555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_char16:
269555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_char32:
270555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_class:
271555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_decimal128:
272555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_decimal32:
273555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_decimal64:
274555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_double:
275555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_enum:
276555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_error:
277555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_float:
278aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov    case TST_half:
279555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_int:
2805a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith    case TST_int128:
281555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_struct:
2826666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos    case TST_interface:
283555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_union:
284555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_unknown_anytype:
285555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_unspecified:
286555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_void:
287555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_wchar:
288555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      return false;
289555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor
290a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    case TST_decltype_auto:
291a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      // This must have an initializer, so can't be a function declaration,
292a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      // even if the initializer has function type.
293a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      return false;
294a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith
295555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_decltype:
296555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_typeofExpr:
297555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      if (Expr *E = DS.getRepAsExpr())
298555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor        return E->getType()->isFunctionType();
299555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      return false;
300555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor
301555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_underlyingType:
302555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_typename:
303555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    case TST_typeofType: {
304555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      QualType QT = DS.getRepAsType().get();
305555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      if (QT.isNull())
306555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor        return false;
307555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor
308555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT))
309555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor        QT = LIT->getType();
310555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor
311555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      if (QT.isNull())
312555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor        return false;
313555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor
314555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor      return QT->isFunctionType();
315555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor    }
316555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor  }
3177530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie
3187530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  llvm_unreachable("Invalid TypeSpecType!");
319555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor}
320555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor
321d1a32c328bce903fb1b17fc8147b646be818298eReid Klecknerbool Declarator::isStaticMember() {
322d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner  assert(getContext() == MemberContext);
323d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner  return getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static ||
324d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner         CXXMethodDecl::isStaticOverloadedOperator(
325d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner             getName().OperatorFunctionId.Operator);
326d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner}
327d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner
328f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendlingbool DeclSpec::hasTagDefinition() const {
329f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling  if (!TypeSpecOwned)
330f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling    return false;
331f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling  return cast<TagDecl>(getRepAsDecl())->isCompleteDefinition();
332f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling}
333f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling
3345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this
3352a327d11a07dfbdf20910cebbae38910eda111fdChris Lattner/// declaration specifier includes.
3365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
3375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerunsigned DeclSpec::getParsedSpecifiers() const {
3385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned Res = 0;
3395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (StorageClassSpec != SCS_unspecified ||
340ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      ThreadStorageClassSpec != TSCS_unspecified)
3415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Res |= PQ_StorageClassSpecifier;
342d42043333a6d6bd35d641efe44b9b40819169384Mike Stump
3435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeQualifiers != TQ_unspecified)
3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Res |= PQ_TypeQualifier;
3451eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (hasTypeSpecifier())
3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Res |= PQ_TypeSpecifier;
3481eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
349de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith  if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified ||
350d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov      FS_noreturn_specified || FS_forceinline_specified)
3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Res |= PQ_FunctionSpecifier;
3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return Res;
3535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
355fec54013fcd0eb72642741584ca04c1bc292bef8John McCalltemplate <class T> static bool BadSpecifier(T TNew, T TPrev,
356fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                                            const char *&PrevSpec,
357c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman                                            unsigned &DiagID,
358c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman                                            bool IsExtension = true) {
35932d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  PrevSpec = DeclSpec::getSpecifierName(TPrev);
360c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman  if (TNew != TPrev)
361c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman    DiagID = diag::err_invalid_decl_spec_combination;
362c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman  else
363c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman    DiagID = IsExtension ? diag::ext_duplicate_declspec :
364c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman                           diag::warn_duplicate_declspec;
36532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  return true;
3661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
36732d335e63bd287e5c9297532171284cdf4c7888cJohn McCall
3685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *DeclSpec::getSpecifierName(DeclSpec::SCS S) {
3695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (S) {
3705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::SCS_unspecified: return "unspecified";
3715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::SCS_typedef:     return "typedef";
3725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::SCS_extern:      return "extern";
3735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::SCS_static:      return "static";
3745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::SCS_auto:        return "auto";
3755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::SCS_register:    return "register";
37663054b39a27ff333487e88247d495a444838b44aEli Friedman  case DeclSpec::SCS_private_extern: return "__private_extern__";
377669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl  case DeclSpec::SCS_mutable:     return "mutable";
3785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3799f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("Unknown typespec!");
3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
382ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smithconst char *DeclSpec::getSpecifierName(DeclSpec::TSCS S) {
383ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  switch (S) {
384ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  case DeclSpec::TSCS_unspecified:   return "unspecified";
385ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  case DeclSpec::TSCS___thread:      return "__thread";
386ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  case DeclSpec::TSCS_thread_local:  return "thread_local";
387ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  case DeclSpec::TSCS__Thread_local: return "_Thread_local";
388ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  }
389ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  llvm_unreachable("Unknown typespec!");
390ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith}
391ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith
39232d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TSW W) {
3935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (W) {
39432d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSW_unspecified: return "unspecified";
39532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSW_short:       return "short";
39632d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSW_long:        return "long";
39732d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSW_longlong:    return "long long";
3985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
3999f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("Unknown typespec!");
4005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
40232d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TSC C) {
4035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (C) {
40432d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSC_unspecified: return "unspecified";
40532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSC_imaginary:   return "imaginary";
40632d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSC_complex:     return "complex";
4075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4089f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("Unknown typespec!");
4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
41232d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TSS S) {
4135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (S) {
41432d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSS_unspecified: return "unspecified";
41532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSS_signed:      return "signed";
41632d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case TSS_unsigned:    return "unsigned";
4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4189f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("Unknown typespec!");
4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
421651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesconst char *DeclSpec::getSpecifierName(DeclSpec::TST T,
422651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                       const PrintingPolicy &Policy) {
4235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (T) {
4245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_unspecified: return "unspecified";
4255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_void:        return "void";
4265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_char:        return "char";
427651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case DeclSpec::TST_wchar:       return Policy.MSWChar ? "__wchar_t" : "wchar_t";
428f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  case DeclSpec::TST_char16:      return "char16_t";
429f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith  case DeclSpec::TST_char32:      return "char32_t";
4305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_int:         return "int";
4315a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith  case DeclSpec::TST_int128:      return "__int128";
432aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case DeclSpec::TST_half:        return "half";
4335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_float:       return "float";
4345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_double:      return "double";
435651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  case DeclSpec::TST_bool:        return Policy.Bool ? "bool" : "_Bool";
4365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_decimal32:   return "_Decimal32";
4375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_decimal64:   return "_Decimal64";
4385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_decimal128:  return "_Decimal128";
4395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_enum:        return "enum";
44099dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner  case DeclSpec::TST_class:       return "class";
4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_union:       return "union";
4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case DeclSpec::TST_struct:      return "struct";
4436666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos  case DeclSpec::TST_interface:   return "__interface";
4441a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor  case DeclSpec::TST_typename:    return "type-name";
445d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  case DeclSpec::TST_typeofType:
446d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff  case DeclSpec::TST_typeofExpr:  return "typeof";
44732d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case DeclSpec::TST_auto:        return "auto";
44832d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case DeclSpec::TST_decltype:    return "(decltype)";
449a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith  case DeclSpec::TST_decltype_auto: return "decltype(auto)";
450ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt  case DeclSpec::TST_underlyingType: return "__underlying_type";
451a5fc472b353b88be3b4981da946fb01f5a5cc0c6John McCall  case DeclSpec::TST_unknown_anytype: return "__unknown_anytype";
452b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  case DeclSpec::TST_atomic: return "_Atomic";
45332d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case DeclSpec::TST_error:       return "(error)";
4545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4559f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("Unknown typespec!");
4565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
45832d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TQ T) {
4595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (T) {
46032d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case DeclSpec::TQ_unspecified: return "unspecified";
46132d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case DeclSpec::TQ_const:       return "const";
46232d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case DeclSpec::TQ_restrict:    return "restrict";
46332d335e63bd287e5c9297532171284cdf4c7888cJohn McCall  case DeclSpec::TQ_volatile:    return "volatile";
4644cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  case DeclSpec::TQ_atomic:      return "_Atomic";
4655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
4669f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin  llvm_unreachable("Unknown typespec!");
4675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
4685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
469b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbournebool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc,
470fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                                   const char *&PrevSpec,
471651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                   unsigned &DiagID,
472651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                   const PrintingPolicy &Policy) {
4735e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner  // OpenCL v1.1 s6.8g: "The extern, static, auto and register storage-class
4745e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner  // specifiers are not supported.
475e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne  // It seems sensible to prohibit private_extern too
476b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne  // The cl_clang_storage_class_specifiers extension enables support for
477b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne  // these storage-class specifiers.
4785e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner  // OpenCL v1.2 s6.8 changes this to "The auto and register storage-class
4795e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner  // specifiers are not supported."
4804e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (S.getLangOpts().OpenCL &&
481b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne      !S.getOpenCLOptions().cl_clang_storage_class_specifiers) {
482b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne    switch (SC) {
483e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne    case SCS_extern:
484e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne    case SCS_private_extern:
4855e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner    case SCS_static:
4865e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner        if (S.getLangOpts().OpenCLVersion < 120) {
4875e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner          DiagID   = diag::err_not_opencl_storage_class_specifier;
4885e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner          PrevSpec = getSpecifierName(SC);
4895e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner          return true;
4905e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner        }
4915e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner        break;
492e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne    case SCS_auto:
493e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne    case SCS_register:
494e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne      DiagID   = diag::err_not_opencl_storage_class_specifier;
495b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne      PrevSpec = getSpecifierName(SC);
496e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne      return true;
497e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne    default:
498e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne      break;
499e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne    }
500e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne  }
501e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne
50235f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara  if (StorageClassSpec != SCS_unspecified) {
503a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    // Maybe this is an attempt to use C++11 'auto' outside of C++11 mode.
5048f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    bool isInvalid = true;
5054e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie    if (TypeSpecType == TST_unspecified && S.getLangOpts().CPlusPlus) {
506b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne      if (SC == SCS_auto)
507651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID, Policy);
5088f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith      if (StorageClassSpec == SCS_auto) {
5098f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith        isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc,
510651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                    PrevSpec, DiagID, Policy);
5118f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith        assert(!isInvalid && "auto SCS -> TST recovery failed");
5128f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith      }
5138f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    }
5148f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith
51535f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara    // Changing storage class is allowed only if the previous one
51635f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara    // was the 'extern' that is part of a linkage specification and
51735f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara    // the new storage class is 'typedef'.
5188f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    if (isInvalid &&
5198f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith        !(SCS_extern_in_linkage_spec &&
52035f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara          StorageClassSpec == SCS_extern &&
521b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne          SC == SCS_typedef))
522b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne      return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID);
52335f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara  }
524b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne  StorageClassSpec = SC;
5255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  StorageClassSpecLoc = Loc;
526b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne  assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield");
5275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
530ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smithbool DeclSpec::SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc,
531fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                                         const char *&PrevSpec,
532fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                                         unsigned &DiagID) {
533ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  if (ThreadStorageClassSpec != TSCS_unspecified)
534ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    return BadSpecifier(TSC, (TSCS)ThreadStorageClassSpec, PrevSpec, DiagID);
535ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith
536ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  ThreadStorageClassSpec = TSC;
537ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  ThreadStorageClassSpecLoc = Loc;
5385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// These methods set the specified attribute of the DeclSpec, but return true
5425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// and ignore the request if invalid (e.g. "extern" then "auto" is
5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified).
5445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc,
545fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                                const char *&PrevSpec,
546651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                unsigned &DiagID,
547651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                const PrintingPolicy &Policy) {
5482553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara  // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that
5492553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara  // for 'long long' we will keep the source location of the first 'long'.
5502553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara  if (TypeSpecWidth == TSW_unspecified)
5512553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara    TSWLoc = Loc;
5522553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara  // Allow turning long -> long long.
5532553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara  else if (W != TSW_longlong || TypeSpecWidth != TSW_long)
554fec54013fcd0eb72642741584ca04c1bc292bef8John McCall    return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID);
5555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TypeSpecWidth = W;
556788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  if (TypeAltiVecVector && !TypeAltiVecBool &&
557788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      ((TypeSpecWidth == TSW_long) || (TypeSpecWidth == TSW_longlong))) {
558651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
55982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    DiagID = diag::warn_vector_long_decl_spec_combination;
56082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    return true;
56182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  }
5625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc,
566fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                                  const char *&PrevSpec,
567fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                                  unsigned &DiagID) {
5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeSpecComplex != TSC_unspecified)
569fec54013fcd0eb72642741584ca04c1bc292bef8John McCall    return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID);
5705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TypeSpecComplex = C;
5715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TSCLoc = Loc;
5725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5751eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc,
576fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                               const char *&PrevSpec,
577fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                               unsigned &DiagID) {
5785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeSpecSign != TSS_unspecified)
579fec54013fcd0eb72642741584ca04c1bc292bef8John McCall    return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID);
5805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TypeSpecSign = S;
5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TSSLoc = Loc;
5825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
5835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
5845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
5855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
586fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                               const char *&PrevSpec,
587fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                               unsigned &DiagID,
588651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               ParsedType Rep,
589651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               const PrintingPolicy &Policy) {
590651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Policy);
5910daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara}
5920daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara
5930daaf32723ac78549c507c2a68a5300502703673Abramo Bagnarabool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
5940daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara                               SourceLocation TagNameLoc,
5950daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara                               const char *&PrevSpec,
5960daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara                               unsigned &DiagID,
597651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               ParsedType Rep,
598651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               const PrintingPolicy &Policy) {
599b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  assert(isTypeRep(T) && "T does not store a type");
600b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  assert(Rep && "no type provided!");
601b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  if (TypeSpecType != TST_unspecified) {
602651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
603b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    DiagID = diag::err_invalid_decl_spec_combination;
604b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    return true;
605b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  }
606b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TypeSpecType = T;
607b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TypeRep = Rep;
6080daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTLoc = TagKwLoc;
6090daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTNameLoc = TagNameLoc;
610b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TypeSpecOwned = false;
611b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  return false;
612b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall}
613b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall
614b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
615b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                               const char *&PrevSpec,
616b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                               unsigned &DiagID,
617651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               Expr *Rep,
618651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               const PrintingPolicy &Policy) {
619b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  assert(isExprRep(T) && "T does not store an expr");
620b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  assert(Rep && "no expression provided!");
621b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  if (TypeSpecType != TST_unspecified) {
622651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
623b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    DiagID = diag::err_invalid_decl_spec_combination;
624b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    return true;
625b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  }
626b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TypeSpecType = T;
627b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  ExprRep = Rep;
628b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TSTLoc = Loc;
6290daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTNameLoc = Loc;
630b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TypeSpecOwned = false;
631b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  return false;
632b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall}
633b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall
634b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
635b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                               const char *&PrevSpec,
636b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                               unsigned &DiagID,
637651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               Decl *Rep, bool Owned,
638651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               const PrintingPolicy &Policy) {
639651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned, Policy);
6400daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara}
6410daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara
6420daaf32723ac78549c507c2a68a5300502703673Abramo Bagnarabool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc,
6430daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara                               SourceLocation TagNameLoc,
6440daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara                               const char *&PrevSpec,
6450daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara                               unsigned &DiagID,
646651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               Decl *Rep, bool Owned,
647651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               const PrintingPolicy &Policy) {
648b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  assert(isDeclRep(T) && "T does not store a decl");
649b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  // Unlike the other cases, we don't assert that we actually get a decl.
650b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall
651b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  if (TypeSpecType != TST_unspecified) {
652651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
653b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    DiagID = diag::err_invalid_decl_spec_combination;
654b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    return true;
655b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  }
656b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TypeSpecType = T;
657b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  DeclRep = Rep;
6580daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTLoc = TagKwLoc;
6590daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTNameLoc = TagNameLoc;
660ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  TypeSpecOwned = Owned && Rep != nullptr;
661b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  return false;
662b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall}
663b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall
664b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc,
665b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall                               const char *&PrevSpec,
666651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               unsigned &DiagID,
667651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                               const PrintingPolicy &Policy) {
668b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  assert(!isDeclRep(T) && !isTypeRep(T) && !isExprRep(T) &&
669b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall         "rep required for these type-spec kinds!");
670fec54013fcd0eb72642741584ca04c1bc292bef8John McCall  if (TypeSpecType != TST_unspecified) {
671651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
672fec54013fcd0eb72642741584ca04c1bc292bef8John McCall    DiagID = diag::err_invalid_decl_spec_combination;
673fec54013fcd0eb72642741584ca04c1bc292bef8John McCall    return true;
674fec54013fcd0eb72642741584ca04c1bc292bef8John McCall  }
6750daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTLoc = Loc;
6760daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTNameLoc = Loc;
677788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) {
678788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    TypeAltiVecBool = true;
679788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    return false;
680788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  }
6815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TypeSpecType = T;
682b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall  TypeSpecOwned = false;
683788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  if (TypeAltiVecVector && !TypeAltiVecBool && (TypeSpecType == TST_double)) {
684651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
685788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    DiagID = diag::err_invalid_vector_decl_spec;
68682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    return true;
68782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  }
68882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  return false;
68982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson}
69082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson
69182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompsonbool DeclSpec::SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc,
692651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                          const char *&PrevSpec, unsigned &DiagID,
693651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                          const PrintingPolicy &Policy) {
69482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  if (TypeSpecType != TST_unspecified) {
695651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
69682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    DiagID = diag::err_invalid_vector_decl_spec_combination;
69782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    return true;
69882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  }
69982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  TypeAltiVecVector = isAltiVecVector;
70082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  AltiVecLoc = Loc;
70182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  return false;
70282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson}
70382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson
70482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompsonbool DeclSpec::SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc,
705651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                          const char *&PrevSpec, unsigned &DiagID,
706651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                          const PrintingPolicy &Policy) {
707788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  if (!TypeAltiVecVector || TypeAltiVecPixel ||
708788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      (TypeSpecType != TST_unspecified)) {
709651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
71082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    DiagID = diag::err_invalid_pixel_decl_spec_combination;
71182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson    return true;
71282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  }
71382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  TypeAltiVecPixel = isAltiVecPixel;
71482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson  TSTLoc = Loc;
7150daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTNameLoc = Loc;
7165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
7175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
7193e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidtbool DeclSpec::SetTypeAltiVecBool(bool isAltiVecBool, SourceLocation Loc,
720651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                  const char *&PrevSpec, unsigned &DiagID,
721651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                  const PrintingPolicy &Policy) {
7223e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt  if (!TypeAltiVecVector || TypeAltiVecBool ||
7233e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt      (TypeSpecType != TST_unspecified)) {
724651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType, Policy);
7253e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt    DiagID = diag::err_invalid_vector_bool_decl_spec;
7263e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt    return true;
7273e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt  }
7283e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt  TypeAltiVecBool = isAltiVecBool;
7293e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt  TSTLoc = Loc;
7303e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt  TSTNameLoc = Loc;
7313e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt  return false;
7323e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt}
7333e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt
734ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregorbool DeclSpec::SetTypeSpecError() {
735ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  TypeSpecType = TST_error;
7369e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall  TypeSpecOwned = false;
737ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  TSTLoc = SourceLocation();
7380daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara  TSTNameLoc = SourceLocation();
739ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor  return false;
740ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor}
741ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor
7425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool DeclSpec::SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec,
743d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith                           unsigned &DiagID, const LangOptions &Lang) {
744d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // Duplicates are permitted in C99 onwards, but are not permitted in C89 or
745d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // C++.  However, since this is likely not what the user intended, we will
746d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // always warn.  We do not need to set the qualifier's location since we
747d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // already have it.
748c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman  if (TypeQualifiers & T) {
749a14f400e4c4239b92137fc8aab1ac4700a209591Aaron Ballman    bool IsExtension = true;
750d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith    if (Lang.C99)
751a14f400e4c4239b92137fc8aab1ac4700a209591Aaron Ballman      IsExtension = false;
752c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman    return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension);
753c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman  }
7545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  TypeQualifiers |= T;
7551eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
7565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (T) {
7574cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  case TQ_unspecified: break;
7584cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  case TQ_const:    TQ_constLoc = Loc; return false;
7594cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  case TQ_restrict: TQ_restrictLoc = Loc; return false;
7604cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  case TQ_volatile: TQ_volatileLoc = Loc; return false;
7614cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  case TQ_atomic:   TQ_atomicLoc = Loc; return false;
7625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
7634cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith
7644cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith  llvm_unreachable("Unknown type qualifier!");
7655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
767d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec,
768d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                     unsigned &DiagID) {
769d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // 'inline inline' is ok.  However, since this is likely not what the user
770d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // intended, we will always warn, similar to duplicates of type qualifiers.
771d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  if (FS_inline_specified) {
772d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    DiagID = diag::warn_duplicate_declspec;
773d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    PrevSpec = "inline";
774d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    return true;
775d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  }
7765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  FS_inline_specified = true;
7775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  FS_inlineLoc = Loc;
7785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  return false;
7795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
7805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
781d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec,
782d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                          unsigned &DiagID) {
783d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  if (FS_forceinline_specified) {
784d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    DiagID = diag::warn_duplicate_declspec;
785d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    PrevSpec = "__forceinline";
786d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    return true;
787d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  }
788d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  FS_forceinline_specified = true;
789d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  FS_forceinlineLoc = Loc;
790d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  return false;
791d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov}
792d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov
793d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc,
794d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                      const char *&PrevSpec,
795d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                      unsigned &DiagID) {
796d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // 'virtual virtual' is ok, but warn as this is likely not what the user
797d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // intended.
798d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  if (FS_virtual_specified) {
799d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    DiagID = diag::warn_duplicate_declspec;
800d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    PrevSpec = "virtual";
801d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    return true;
802d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  }
803b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor  FS_virtual_specified = true;
804b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor  FS_virtualLoc = Loc;
805b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor  return false;
806b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor}
807b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor
808d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc,
809d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                       const char *&PrevSpec,
810d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                       unsigned &DiagID) {
811d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // 'explicit explicit' is ok, but warn as this is likely not what the user
812d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // intended.
813d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  if (FS_explicit_specified) {
814d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    DiagID = diag::warn_duplicate_declspec;
815d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    PrevSpec = "explicit";
816d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    return true;
817d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  }
818b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor  FS_explicit_specified = true;
819b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor  FS_explicitLoc = Loc;
820b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor  return false;
821b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor}
822b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor
823d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecNoreturn(SourceLocation Loc,
824d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                       const char *&PrevSpec,
825d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov                                       unsigned &DiagID) {
826d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // '_Noreturn _Noreturn' is ok, but warn as this is likely not what the user
827d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  // intended.
828d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  if (FS_noreturn_specified) {
829d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    DiagID = diag::warn_duplicate_declspec;
830d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    PrevSpec = "_Noreturn";
831d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov    return true;
832d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov  }
833de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith  FS_noreturn_specified = true;
834de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith  FS_noreturnLoc = Loc;
835de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith  return false;
836de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith}
837de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith
838fec54013fcd0eb72642741584ca04c1bc292bef8John McCallbool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,
839fec54013fcd0eb72642741584ca04c1bc292bef8John McCall                             unsigned &DiagID) {
840f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson  if (Friend_specified) {
841f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson    PrevSpec = "friend";
842651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // Keep the later location, so that we can later diagnose ill-formed
843651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // declarations like 'friend class X friend;'. Per [class.friend]p3,
844651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // 'friend' must be the first token in a friend declaration that is
845651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // not a function declaration.
846651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    FriendLoc = Loc;
847651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DiagID = diag::warn_duplicate_declspec;
848f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson    return true;
849f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson  }
850fec54013fcd0eb72642741584ca04c1bc292bef8John McCall
851f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson  Friend_specified = true;
852f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson  FriendLoc = Loc;
853f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson  return false;
854f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson}
8555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
8568d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregorbool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec,
8578d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor                                    unsigned &DiagID) {
8588d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor  if (isModulePrivateSpecified()) {
8598d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor    PrevSpec = "__module_private__";
8608d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor    DiagID = diag::ext_duplicate_declspec;
8618d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor    return true;
8628d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor  }
8638d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor
8648d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor  ModulePrivateLoc = Loc;
8658d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor  return false;
8668d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor}
8678d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor
8682ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redlbool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec,
8692ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl                                unsigned &DiagID) {
870651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // 'constexpr constexpr' is ok, but warn as this is likely not what the user
871651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // intended.
872651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (Constexpr_specified) {
873651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    DiagID = diag::warn_duplicate_declspec;
874651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    PrevSpec = "constexpr";
875651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    return true;
876651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
8772ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl  Constexpr_specified = true;
8782ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl  ConstexprLoc = Loc;
8792ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl  return false;
8802ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl}
8812ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl
882d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid DeclSpec::setProtocolQualifiers(Decl * const *Protos,
883e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis                                     unsigned NP,
884e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis                                     SourceLocation *ProtoLocs,
885e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis                                     SourceLocation LAngleLoc) {
886e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis  if (NP == 0) return;
887c23e69d761e369bb7ffeef52926ab0442c41670fDavid Greene  Decl **ProtoQuals = new Decl*[NP];
888c23e69d761e369bb7ffeef52926ab0442c41670fDavid Greene  memcpy(ProtoQuals, Protos, sizeof(Decl*)*NP);
889c23e69d761e369bb7ffeef52926ab0442c41670fDavid Greene  ProtocolQualifiers = ProtoQuals;
890e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis  ProtocolLocs = new SourceLocation[NP];
891e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis  memcpy(ProtocolLocs, ProtoLocs, sizeof(SourceLocation)*NP);
892e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis  NumProtocolQualifiers = NP;
893e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis  ProtocolLAngleLoc = LAngleLoc;
894e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis}
895e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis
896ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregorvoid DeclSpec::SaveWrittenBuiltinSpecs() {
897ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  writtenBS.Sign = getTypeSpecSign();
898ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  writtenBS.Width = getTypeSpecWidth();
899ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  writtenBS.Type = getTypeSpecType();
900ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  // Search the list of attributes for the presence of a mode attribute.
901ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  writtenBS.ModeAttr = false;
9027f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall  AttributeList* attrs = getAttributes().getList();
903ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  while (attrs) {
9048e083e71d48f7f4d6ef40c00531c2e14df745486Sean Hunt    if (attrs->getKind() == AttributeList::AT_Mode) {
905ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      writtenBS.ModeAttr = true;
906ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor      break;
907ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    }
908ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor    attrs = attrs->getNext();
909ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  }
910ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor}
911ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
9125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Finish - This does final analysis of the declspec, rejecting things like
9135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// "_Imaginary" (lacking an FP type).  This returns a diagnostic to issue or
9145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// diag::NUM_DIAGNOSTICS if there is no error.  After calling this method,
9155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DeclSpec is guaranteed self-consistent, even if an error occurred.
916651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP, const PrintingPolicy &Policy) {
917ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  // Before possibly changing their values, save specs as written.
918ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor  SaveWrittenBuiltinSpecs();
919ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor
9205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Check the type specifier components first.
9215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
922a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith  // If decltype(auto) is used, no other type specifiers are permitted.
923a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith  if (TypeSpecType == TST_decltype_auto &&
924a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      (TypeSpecWidth != TSW_unspecified ||
925a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith       TypeSpecComplex != TSC_unspecified ||
926a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith       TypeSpecSign != TSS_unspecified ||
927a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith       TypeAltiVecVector || TypeAltiVecPixel || TypeAltiVecBool ||
928a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith       TypeQualifiers)) {
929c6a31777fe03c73aca654c7c54224e36e75398ddBenjamin Kramer    const unsigned NumLocs = 8;
930a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    SourceLocation ExtraLocs[NumLocs] = {
931a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      TSWLoc, TSCLoc, TSSLoc, AltiVecLoc,
932a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc
933a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    };
934a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    FixItHint Hints[NumLocs];
935a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    SourceLocation FirstLoc;
936a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    for (unsigned I = 0; I != NumLocs; ++I) {
937a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      if (!ExtraLocs[I].isInvalid()) {
938a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith        if (FirstLoc.isInvalid() ||
939a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith            PP.getSourceManager().isBeforeInTranslationUnit(ExtraLocs[I],
940a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith                                                            FirstLoc))
941a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith          FirstLoc = ExtraLocs[I];
942a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith        Hints[I] = FixItHint::CreateRemoval(ExtraLocs[I]);
943a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      }
944a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    }
945a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    TypeSpecWidth = TSW_unspecified;
946a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    TypeSpecComplex = TSC_unspecified;
947a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    TypeSpecSign = TSS_unspecified;
948a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    TypeAltiVecVector = TypeAltiVecPixel = TypeAltiVecBool = false;
949a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    TypeQualifiers = 0;
950a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith    Diag(D, TSTLoc, diag::err_decltype_auto_cannot_be_combined)
951a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      << Hints[0] << Hints[1] << Hints[2] << Hints[3]
952a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith      << Hints[4] << Hints[5] << Hints[6] << Hints[7];
953a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith  }
954a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith
955788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  // Validate and finalize AltiVec vector declspec.
956788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  if (TypeAltiVecVector) {
957788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    if (TypeAltiVecBool) {
958788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      // Sign specifiers are not allowed with vector bool. (PIM 2.1)
959788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      if (TypeSpecSign != TSS_unspecified) {
96033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis        Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec)
961788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner          << getSpecifierName((TSS)TypeSpecSign);
962788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      }
963788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
964788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      // Only char/int are valid with vector bool. (PIM 2.1)
9652e964a922c0826a1216d101df315432c6a0a78f6Duncan Sands      if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) &&
9662e964a922c0826a1216d101df315432c6a0a78f6Duncan Sands           (TypeSpecType != TST_int)) || TypeAltiVecPixel) {
96733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis        Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec)
968788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner          << (TypeAltiVecPixel ? "__pixel" :
969651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                                 getSpecifierName((TST)TypeSpecType, Policy));
970788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      }
971788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
972788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      // Only 'short' is valid with vector bool. (PIM 2.1)
973788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short))
97433e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis        Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec)
975788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner          << getSpecifierName((TSW)TypeSpecWidth);
976788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
977788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      // Elements of vector bool are interpreted as unsigned. (PIM 2.1)
978788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) ||
979788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner          (TypeSpecWidth != TSW_unspecified))
980788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner        TypeSpecSign = TSS_unsigned;
981788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    }
982788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
983788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    if (TypeAltiVecPixel) {
984788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      //TODO: perform validation
985788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      TypeSpecType = TST_int;
986788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      TypeSpecSign = TSS_unsigned;
987788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner      TypeSpecWidth = TSW_short;
9889e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall      TypeSpecOwned = false;
989788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner    }
990788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner  }
991788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner
99264c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis  // signed/unsigned are only valid with int/char/wchar_t.
9935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeSpecSign != TSS_unspecified) {
9945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (TypeSpecType == TST_unspecified)
9955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int.
9965a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith    else if (TypeSpecType != TST_int  && TypeSpecType != TST_int128 &&
99764c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis             TypeSpecType != TST_char && TypeSpecType != TST_wchar) {
99833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      Diag(D, TSSLoc, diag::err_invalid_sign_spec)
999651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        << getSpecifierName((TST)TypeSpecType, Policy);
10005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // signed double -> double.
10015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecSign = TSS_unspecified;
10025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
10035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
10055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Validate the width of the type.
10065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  switch (TypeSpecWidth) {
10075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case TSW_unspecified: break;
10085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case TSW_short:    // short int
10095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case TSW_longlong: // long long int
10105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (TypeSpecType == TST_unspecified)
10115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecType = TST_int; // short -> short int, long long -> long long int.
10125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (TypeSpecType != TST_int) {
101333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      Diag(D, TSWLoc,
10145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer           TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec
1015254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner                                      : diag::err_invalid_longlong_spec)
1016651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        <<  getSpecifierName((TST)TypeSpecType, Policy);
10175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecType = TST_int;
10189e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall      TypeSpecOwned = false;
10195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
10205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    break;
10215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  case TSW_long:  // long double, long int
10225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (TypeSpecType == TST_unspecified)
10235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecType = TST_int;  // long -> long int.
10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    else if (TypeSpecType != TST_int && TypeSpecType != TST_double) {
102533e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      Diag(D, TSWLoc, diag::err_invalid_long_spec)
1026651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        << getSpecifierName((TST)TypeSpecType, Policy);
10275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecType = TST_int;
10289e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall      TypeSpecOwned = false;
10295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
10305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    break;
10315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
10335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // TODO: if the implementation does not implement _Complex or _Imaginary,
10345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // disallow their use.  Need information about the backend.
10355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  if (TypeSpecComplex != TSC_unspecified) {
10365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    if (TypeSpecType == TST_unspecified) {
103733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      Diag(D, TSCLoc, diag::ext_plain_complex)
1038849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor        << FixItHint::CreateInsertion(
10399b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor                              PP.getLocForEndOfToken(getTypeSpecComplexLoc()),
10409b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor                                                 " double");
10415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecType = TST_double;   // _Complex -> _Complex double.
10425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) {
10435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      // Note that this intentionally doesn't include _Complex _Bool.
10444e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie      if (!PP.getLangOpts().CPlusPlus)
10457ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman        Diag(D, TSTLoc, diag::ext_integer_complex);
10465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) {
104733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis      Diag(D, TSCLoc, diag::err_invalid_complex_spec)
1048651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines        << getSpecifierName((TST)TypeSpecType, Policy);
10495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer      TypeSpecComplex = TSC_unspecified;
10505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    }
10515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
10525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1053ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  // C11 6.7.1/3, C++11 [dcl.stc]p1, GNU TLS: __thread, thread_local and
1054ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  // _Thread_local can only appear with the 'static' and 'extern' storage class
1055ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  // specifiers. We also allow __private_extern__ as an extension.
1056ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  if (ThreadStorageClassSpec != TSCS_unspecified) {
1057ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    switch (StorageClassSpec) {
1058ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    case SCS_unspecified:
1059ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    case SCS_extern:
1060ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    case SCS_private_extern:
1061ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    case SCS_static:
1062ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      break;
1063ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    default:
1064ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      if (PP.getSourceManager().isBeforeInTranslationUnit(
1065ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith            getThreadStorageClassSpecLoc(), getStorageClassSpecLoc()))
1066ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith        Diag(D, getStorageClassSpecLoc(),
1067ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith             diag::err_invalid_decl_spec_combination)
1068ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith          << DeclSpec::getSpecifierName(getThreadStorageClassSpec())
1069ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith          << SourceRange(getThreadStorageClassSpecLoc());
1070ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      else
1071ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith        Diag(D, getThreadStorageClassSpecLoc(),
1072ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith             diag::err_invalid_decl_spec_combination)
1073ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith          << DeclSpec::getSpecifierName(getStorageClassSpec())
1074ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith          << SourceRange(getStorageClassSpecLoc());
1075ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      // Discard the thread storage class specifier to recover.
1076ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      ThreadStorageClassSpec = TSCS_unspecified;
1077ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      ThreadStorageClassSpecLoc = SourceLocation();
1078ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    }
1079ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  }
1080ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith
10818f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith  // If no type specifier was provided and we're parsing a language where
10828f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith  // the type specifier is not optional, but we got 'auto' as a storage
10838f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith  // class specifier, then assume this is an attempt to use C++0x's 'auto'
10848f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith  // type specifier.
108558eb37036b47bbe7433f72d92a2cb60848507707Richard Smith  if (PP.getLangOpts().CPlusPlus &&
10868f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith      TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) {
10878f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    TypeSpecType = TST_auto;
1088d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola    StorageClassSpec = SCS_unspecified;
10898f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    TSTLoc = TSTNameLoc = StorageClassSpecLoc;
10908f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    StorageClassSpecLoc = SourceLocation();
10918f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith  }
10928f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith  // Diagnose if we've recovered from an ill-formed 'auto' storage class
1093a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith  // specifier in a pre-C++11 dialect of C++.
109480ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith  if (!PP.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto)
10958f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    Diag(D, TSTLoc, diag::ext_auto_type_specifier);
109680ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith  if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus11 &&
10978f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith      StorageClassSpec == SCS_auto)
10988f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith    Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class)
10998f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith      << FixItHint::CreateRemoval(StorageClassSpecLoc);
1100841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith  if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32)
1101841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith    Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type)
1102841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith      << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t");
1103841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith  if (Constexpr_specified)
1104841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith    Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr);
11058f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith
110667d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall  // C++ [class.friend]p6:
110767d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall  //   No storage-class-specifier shall appear in the decl-specifier-seq
110867d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall  //   of a friend declaration.
1109ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith  if (isFriendSpecified() &&
1110ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      (getStorageClassSpec() || getThreadStorageClassSpec())) {
1111ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    SmallString<32> SpecName;
1112ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    SourceLocation SCLoc;
1113ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    FixItHint StorageHint, ThreadHint;
1114ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith
1115ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    if (DeclSpec::SCS SC = getStorageClassSpec()) {
1116ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      SpecName = getSpecifierName(SC);
1117ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      SCLoc = getStorageClassSpecLoc();
1118ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      StorageHint = FixItHint::CreateRemoval(SCLoc);
1119ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    }
112067d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall
1121ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    if (DeclSpec::TSCS TSC = getThreadStorageClassSpec()) {
1122ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      if (!SpecName.empty()) SpecName += " ";
1123ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      SpecName += getSpecifierName(TSC);
1124ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      SCLoc = getThreadStorageClassSpecLoc();
1125ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      ThreadHint = FixItHint::CreateRemoval(SCLoc);
1126ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith    }
112767d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall
11286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Diag(D, SCLoc, diag::err_friend_decl_spec)
1129ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith      << SpecName << StorageHint << ThreadHint;
113067d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall
113167d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall    ClearStorageClassSpecs();
113267d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall  }
113367d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall
11346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // C++11 [dcl.fct.spec]p5:
11356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   The virtual specifier shall be used only in the initial
11366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   declaration of a non-static class member function;
11376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // C++11 [dcl.fct.spec]p6:
11386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   The explicit specifier shall be used only in the declaration of
11396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   a constructor or conversion function within its class
11406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  //   definition;
11416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  if (isFriendSpecified() && (isVirtualSpecified() || isExplicitSpecified())) {
11426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    StringRef Keyword;
11436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    SourceLocation SCLoc;
11446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
11456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    if (isVirtualSpecified()) {
11466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Keyword = "virtual";
11476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      SCLoc = getVirtualSpecLoc();
11486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    } else {
11496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      Keyword = "explicit";
11506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      SCLoc = getExplicitSpecLoc();
11516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    }
11526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
11536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    FixItHint Hint = FixItHint::CreateRemoval(SCLoc);
11546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    Diag(D, SCLoc, diag::err_friend_decl_spec)
11556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines      << Keyword << Hint;
11566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
11576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    FS_virtual_specified = FS_explicit_specified = false;
11586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines    FS_virtualLoc = FS_explicitLoc = SourceLocation();
11596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  }
11606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
11616274d30d77870393d83a404dd223b8005f2b8cd5Douglas Gregor  assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType));
11626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
11635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // Okay, now we can infer the real type.
11641eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // TODO: return "auto function" and other bad things based on the real type.
11661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
11675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  // 'data definition has no type or storage class'?
11685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}
1169e4858a65a93fb36c099d8dd2ea0a98e33e77687eDaniel Dunbar
1170a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redlbool DeclSpec::isMissingDeclaratorOk() {
1171a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl  TST tst = getTypeSpecType();
1172ef8225444452a1486bd721f3285301fe84643b00Stephen Hines  return isDeclRep(tst) && getRepAsDecl() != nullptr &&
1173b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall    StorageClassSpec != DeclSpec::SCS_typedef;
1174a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl}
11753f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor
11763f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregorvoid UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc,
11773f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor                                          OverloadedOperatorKind Op,
11783f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor                                          SourceLocation SymbolLocations[3]) {
11793f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  Kind = IK_OperatorFunctionId;
11803f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  StartLocation = OperatorLoc;
11813f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  EndLocation = OperatorLoc;
11823f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  OperatorFunctionId.Operator = Op;
11833f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  for (unsigned I = 0; I != 3; ++I) {
11843f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor    OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding();
11853f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor
11863f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor    if (SymbolLocations[I].isValid())
11873f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor      EndLocation = SymbolLocations[I];
11883f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor  }
11893f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor}
1190b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson
1191cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlssonbool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc,
119246127a96b6dd6b93aa18d5f7a55bc2db8b52a2c9Anders Carlsson                                  const char *&PrevSpec) {
1193f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor  LastLocation = Loc;
1194f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor
1195b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  if (Specifiers & VS) {
1196b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson    PrevSpec = getSpecifierName(VS);
1197b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson    return true;
1198b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  }
1199b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson
1200b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  Specifiers |= VS;
1201b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson
1202b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  switch (VS) {
1203b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Unknown specifier!");
1204b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  case VS_Override: VS_overrideLoc = Loc; break;
12057121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer  case VS_Sealed:
1206b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  case VS_Final:    VS_finalLoc = Loc; break;
1207b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  }
120846127a96b6dd6b93aa18d5f7a55bc2db8b52a2c9Anders Carlsson
1209b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson  return false;
1210b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson}
1211b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson
1212cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlssonconst char *VirtSpecifiers::getSpecifierName(Specifier VS) {
1213c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson  switch (VS) {
1214b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  default: llvm_unreachable("Unknown specifier");
1215c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson  case VS_Override: return "override";
1216c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson  case VS_Final: return "final";
12177121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer  case VS_Sealed: return "sealed";
1218c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson  }
1219c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson}
1220