DeclSpec.cpp revision f0cc19f43d5e05dbd22d00faca8c093b7005be3f
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, 1525af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner ParamInfo *ArgInfo, 1535af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner unsigned NumArgs, 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; 1810b7e678a11ece4288dc01aebb5b17e5eef8f8d2dJohn McCall I.Fun.AttrList = 0; 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(); 1886e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl I.Fun.DeleteArgInfo = false; 1896e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl I.Fun.TypeQuals = TypeQuals; 1906e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl I.Fun.NumArgs = NumArgs; 1916e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl I.Fun.ArgInfo = 0; 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; 2006e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl I.Fun.Exceptions = 0; 2016e5d319b671dbb0ecf70619834aa23c853d17621Sebastian Redl I.Fun.NoexceptExpr = 0; 20254655be65585ed6618fdd7a19fa6c70efc321d3aRichard Smith I.Fun.HasTrailingReturnType = TrailingReturnType.isUsable() || 20354655be65585ed6618fdd7a19fa6c70efc321d3aRichard Smith TrailingReturnType.isInvalid(); 20454655be65585ed6618fdd7a19fa6c70efc321d3aRichard Smith I.Fun.TrailingReturnType = TrailingReturnType.get(); 2057dc813462dd9fd3f6f4296f896a12de14264fef8Sebastian Redl 2065af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner // new[] an argument array if needed. 2075af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner if (NumArgs) { 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 2115af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner // small (function taking too many arguments), go to the heap. 2121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump if (!TheDeclarator.InlineParamsUsed && 2135af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner NumArgs <= llvm::array_lengthof(TheDeclarator.InlineParams)) { 2145af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner I.Fun.ArgInfo = TheDeclarator.InlineParams; 2155af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner I.Fun.DeleteArgInfo = false; 2165af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner TheDeclarator.InlineParamsUsed = true; 2175af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner } else { 2185af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner I.Fun.ArgInfo = new DeclaratorChunk::ParamInfo[NumArgs]; 2195af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner I.Fun.DeleteArgInfo = true; 2205af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner } 2215af2f35c6ad1cb78b2aed3705d221954d1689b8aChris Lattner memcpy(I.Fun.ArgInfo, ArgInfo, sizeof(ArgInfo[0])*NumArgs); 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: 288b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case TST_image1d_t: 289b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case TST_image1d_array_t: 290b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case TST_image1d_buffer_t: 291b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case TST_image2d_t: 292b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case TST_image2d_array_t: 293b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case TST_image3d_t: 29421f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case TST_sampler_t: 295e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case TST_event_t: 296555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor return false; 297555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor 298a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith case TST_decltype_auto: 299a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // This must have an initializer, so can't be a function declaration, 300a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // even if the initializer has function type. 301a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith return false; 302a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 303555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor case TST_decltype: 304555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor case TST_typeofExpr: 305555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor if (Expr *E = DS.getRepAsExpr()) 306555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor return E->getType()->isFunctionType(); 307555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor return false; 308555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor 309555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor case TST_underlyingType: 310555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor case TST_typename: 311555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor case TST_typeofType: { 312555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor QualType QT = DS.getRepAsType().get(); 313555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor if (QT.isNull()) 314555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor return false; 315555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor 316555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor if (const LocInfoType *LIT = dyn_cast<LocInfoType>(QT)) 317555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor QT = LIT->getType(); 318555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor 319555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor if (QT.isNull()) 320555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor return false; 321555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor 322555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor return QT->isFunctionType(); 323555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor } 324555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor } 3257530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie 3267530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie llvm_unreachable("Invalid TypeSpecType!"); 327555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor} 328555f57e3549fb5cc963a2ce38180c4f3643a6f95Douglas Gregor 329d1a32c328bce903fb1b17fc8147b646be818298eReid Klecknerbool Declarator::isStaticMember() { 330d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner assert(getContext() == MemberContext); 331d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner return getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_static || 332d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner CXXMethodDecl::isStaticOverloadedOperator( 333d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner getName().OperatorFunctionId.Operator); 334d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner} 335d1a32c328bce903fb1b17fc8147b646be818298eReid Kleckner 336f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendlingbool DeclSpec::hasTagDefinition() const { 337f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling if (!TypeSpecOwned) 338f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling return false; 339f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling return cast<TagDecl>(getRepAsDecl())->isCompleteDefinition(); 340f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling} 341f0cc19f43d5e05dbd22d00faca8c093b7005be3fBill Wendling 3425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// getParsedSpecifiers - Return a bitmask of which flavors of specifiers this 3432a327d11a07dfbdf20910cebbae38910eda111fdChris Lattner/// declaration specifier includes. 3445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// 3455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerunsigned DeclSpec::getParsedSpecifiers() const { 3465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer unsigned Res = 0; 3475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (StorageClassSpec != SCS_unspecified || 348ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith ThreadStorageClassSpec != TSCS_unspecified) 3495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Res |= PQ_StorageClassSpecifier; 350d42043333a6d6bd35d641efe44b9b40819169384Mike Stump 3515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeQualifiers != TQ_unspecified) 3525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Res |= PQ_TypeQualifier; 3531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (hasTypeSpecifier()) 3555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Res |= PQ_TypeSpecifier; 3561eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 357de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith if (FS_inline_specified || FS_virtual_specified || FS_explicit_specified || 358d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov FS_noreturn_specified || FS_forceinline_specified) 3595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer Res |= PQ_FunctionSpecifier; 3605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return Res; 3615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 363fec54013fcd0eb72642741584ca04c1bc292bef8John McCalltemplate <class T> static bool BadSpecifier(T TNew, T TPrev, 364fec54013fcd0eb72642741584ca04c1bc292bef8John McCall const char *&PrevSpec, 365c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman unsigned &DiagID, 366c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman bool IsExtension = true) { 36732d335e63bd287e5c9297532171284cdf4c7888cJohn McCall PrevSpec = DeclSpec::getSpecifierName(TPrev); 368c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman if (TNew != TPrev) 369c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman DiagID = diag::err_invalid_decl_spec_combination; 370c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman else 371c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman DiagID = IsExtension ? diag::ext_duplicate_declspec : 372c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman diag::warn_duplicate_declspec; 37332d335e63bd287e5c9297532171284cdf4c7888cJohn McCall return true; 3741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump} 37532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall 3765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *DeclSpec::getSpecifierName(DeclSpec::SCS S) { 3775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (S) { 3785f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::SCS_unspecified: return "unspecified"; 3795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::SCS_typedef: return "typedef"; 3805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::SCS_extern: return "extern"; 3815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::SCS_static: return "static"; 3825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::SCS_auto: return "auto"; 3835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::SCS_register: return "register"; 38463054b39a27ff333487e88247d495a444838b44aEli Friedman case DeclSpec::SCS_private_extern: return "__private_extern__"; 385669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl case DeclSpec::SCS_mutable: return "mutable"; 3865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 3879f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Unknown typespec!"); 3885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 3895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 390ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smithconst char *DeclSpec::getSpecifierName(DeclSpec::TSCS S) { 391ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith switch (S) { 392ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case DeclSpec::TSCS_unspecified: return "unspecified"; 393ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case DeclSpec::TSCS___thread: return "__thread"; 394ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case DeclSpec::TSCS_thread_local: return "thread_local"; 395ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case DeclSpec::TSCS__Thread_local: return "_Thread_local"; 396ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith } 397ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith llvm_unreachable("Unknown typespec!"); 398ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith} 399ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith 40032d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TSW W) { 4015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (W) { 40232d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSW_unspecified: return "unspecified"; 40332d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSW_short: return "short"; 40432d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSW_long: return "long"; 40532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSW_longlong: return "long long"; 4065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4079f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Unknown typespec!"); 4085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 41032d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TSC C) { 4115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (C) { 41232d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSC_unspecified: return "unspecified"; 41332d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSC_imaginary: return "imaginary"; 41432d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSC_complex: return "complex"; 4155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4169f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Unknown typespec!"); 4175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 42032d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TSS S) { 4215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (S) { 42232d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSS_unspecified: return "unspecified"; 42332d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSS_signed: return "signed"; 42432d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case TSS_unsigned: return "unsigned"; 4255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4269f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Unknown typespec!"); 4275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 4295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerconst char *DeclSpec::getSpecifierName(DeclSpec::TST T) { 4305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (T) { 4315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_unspecified: return "unspecified"; 4325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_void: return "void"; 4335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_char: return "char"; 43464c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis case DeclSpec::TST_wchar: return "wchar_t"; 435f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case DeclSpec::TST_char16: return "char16_t"; 436f5c209d23b20ada4a9b6235db50317239cbf6ae1Alisdair Meredith case DeclSpec::TST_char32: return "char32_t"; 4375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_int: return "int"; 4385a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith case DeclSpec::TST_int128: return "__int128"; 439aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov case DeclSpec::TST_half: return "half"; 4405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_float: return "float"; 4415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_double: return "double"; 4425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_bool: return "_Bool"; 4435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_decimal32: return "_Decimal32"; 4445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_decimal64: return "_Decimal64"; 4455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_decimal128: return "_Decimal128"; 4465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_enum: return "enum"; 44799dc91422144483c20d1c7381bc9ac634b646b04Chris Lattner case DeclSpec::TST_class: return "class"; 4485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_union: return "union"; 4495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case DeclSpec::TST_struct: return "struct"; 4506666ed4ed2e2bc13da5ac5d0a4947019137d45beJoao Matos case DeclSpec::TST_interface: return "__interface"; 4511a51b4a11b7db25cac2134249711ecaaf9d1c0a8Douglas Gregor case DeclSpec::TST_typename: return "type-name"; 452d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff case DeclSpec::TST_typeofType: 453d1861fd633d5096a00777c918eb8575ea7162fe7Steve Naroff case DeclSpec::TST_typeofExpr: return "typeof"; 45432d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case DeclSpec::TST_auto: return "auto"; 45532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case DeclSpec::TST_decltype: return "(decltype)"; 456a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith case DeclSpec::TST_decltype_auto: return "decltype(auto)"; 457ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt case DeclSpec::TST_underlyingType: return "__underlying_type"; 458a5fc472b353b88be3b4981da946fb01f5a5cc0c6John McCall case DeclSpec::TST_unknown_anytype: return "__unknown_anytype"; 459b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman case DeclSpec::TST_atomic: return "_Atomic"; 460b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case DeclSpec::TST_image1d_t: return "image1d_t"; 461b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case DeclSpec::TST_image1d_array_t: return "image1d_array_t"; 462b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case DeclSpec::TST_image1d_buffer_t: return "image1d_buffer_t"; 463b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case DeclSpec::TST_image2d_t: return "image2d_t"; 464b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case DeclSpec::TST_image2d_array_t: return "image2d_array_t"; 465b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case DeclSpec::TST_image3d_t: return "image3d_t"; 46621f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case DeclSpec::TST_sampler_t: return "sampler_t"; 467e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case DeclSpec::TST_event_t: return "event_t"; 46832d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case DeclSpec::TST_error: return "(error)"; 4695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4709f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Unknown typespec!"); 4715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 47332d335e63bd287e5c9297532171284cdf4c7888cJohn McCallconst char *DeclSpec::getSpecifierName(TQ T) { 4745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (T) { 47532d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case DeclSpec::TQ_unspecified: return "unspecified"; 47632d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case DeclSpec::TQ_const: return "const"; 47732d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case DeclSpec::TQ_restrict: return "restrict"; 47832d335e63bd287e5c9297532171284cdf4c7888cJohn McCall case DeclSpec::TQ_volatile: return "volatile"; 4794cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith case DeclSpec::TQ_atomic: return "_Atomic"; 4805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 4819f61aa9e280adea9fbf3365f0e4f6ed568c9885aJeffrey Yasskin llvm_unreachable("Unknown typespec!"); 4825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 4835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 484b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbournebool DeclSpec::SetStorageClassSpec(Sema &S, SCS SC, SourceLocation Loc, 485fec54013fcd0eb72642741584ca04c1bc292bef8John McCall const char *&PrevSpec, 486b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne unsigned &DiagID) { 4875e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner // OpenCL v1.1 s6.8g: "The extern, static, auto and register storage-class 4885e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner // specifiers are not supported. 489e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne // It seems sensible to prohibit private_extern too 490b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne // The cl_clang_storage_class_specifiers extension enables support for 491b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne // these storage-class specifiers. 4925e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner // OpenCL v1.2 s6.8 changes this to "The auto and register storage-class 4935e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner // specifiers are not supported." 4944e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (S.getLangOpts().OpenCL && 495b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne !S.getOpenCLOptions().cl_clang_storage_class_specifiers) { 496b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne switch (SC) { 497e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne case SCS_extern: 498e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne case SCS_private_extern: 4995e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner case SCS_static: 5005e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner if (S.getLangOpts().OpenCLVersion < 120) { 5015e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner DiagID = diag::err_not_opencl_storage_class_specifier; 5025e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner PrevSpec = getSpecifierName(SC); 5035e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner return true; 5045e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner } 5055e94d6fa2e1d5ca606e060406adee13b96849f2aTanya Lattner break; 506e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne case SCS_auto: 507e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne case SCS_register: 508e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne DiagID = diag::err_not_opencl_storage_class_specifier; 509b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne PrevSpec = getSpecifierName(SC); 510e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne return true; 511e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne default: 512e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne break; 513e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne } 514e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne } 515e2f82f71385051ce5abfba317d2f592aa332c588Peter Collingbourne 51635f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara if (StorageClassSpec != SCS_unspecified) { 517a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // Maybe this is an attempt to use C++11 'auto' outside of C++11 mode. 5188f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith bool isInvalid = true; 5194e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (TypeSpecType == TST_unspecified && S.getLangOpts().CPlusPlus) { 520b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne if (SC == SCS_auto) 5218f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith return SetTypeSpecType(TST_auto, Loc, PrevSpec, DiagID); 5228f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith if (StorageClassSpec == SCS_auto) { 5238f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith isInvalid = SetTypeSpecType(TST_auto, StorageClassSpecLoc, 5248f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith PrevSpec, DiagID); 5258f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith assert(!isInvalid && "auto SCS -> TST recovery failed"); 5268f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith } 5278f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith } 5288f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith 52935f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara // Changing storage class is allowed only if the previous one 53035f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara // was the 'extern' that is part of a linkage specification and 53135f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara // the new storage class is 'typedef'. 5328f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith if (isInvalid && 5338f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith !(SCS_extern_in_linkage_spec && 53435f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara StorageClassSpec == SCS_extern && 535b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne SC == SCS_typedef)) 536b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne return BadSpecifier(SC, (SCS)StorageClassSpec, PrevSpec, DiagID); 53735f9a196ef897b9559de25aaecd957208f0b4f59Abramo Bagnara } 538b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne StorageClassSpec = SC; 5395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer StorageClassSpecLoc = Loc; 540b8b0e75aeec85a7a268fdba311de4f1cd527fae1Peter Collingbourne assert((unsigned)SC == StorageClassSpec && "SCS constants overflow bitfield"); 5415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 544ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smithbool DeclSpec::SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc, 545fec54013fcd0eb72642741584ca04c1bc292bef8John McCall const char *&PrevSpec, 546fec54013fcd0eb72642741584ca04c1bc292bef8John McCall unsigned &DiagID) { 547ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith if (ThreadStorageClassSpec != TSCS_unspecified) 548ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith return BadSpecifier(TSC, (TSCS)ThreadStorageClassSpec, PrevSpec, DiagID); 549ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith 550ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith ThreadStorageClassSpec = TSC; 551ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith ThreadStorageClassSpecLoc = Loc; 5525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// These methods set the specified attribute of the DeclSpec, but return true 5565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// and ignore the request if invalid (e.g. "extern" then "auto" is 5575f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// specified). 5585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool DeclSpec::SetTypeSpecWidth(TSW W, SourceLocation Loc, 559fec54013fcd0eb72642741584ca04c1bc292bef8John McCall const char *&PrevSpec, 560fec54013fcd0eb72642741584ca04c1bc292bef8John McCall unsigned &DiagID) { 5612553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara // Overwrite TSWLoc only if TypeSpecWidth was unspecified, so that 5622553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara // for 'long long' we will keep the source location of the first 'long'. 5632553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara if (TypeSpecWidth == TSW_unspecified) 5642553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara TSWLoc = Loc; 5652553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara // Allow turning long -> long long. 5662553eaf4a6b9ca9ca59383287cdfef2a5c9fca83Abramo Bagnara else if (W != TSW_longlong || TypeSpecWidth != TSW_long) 567fec54013fcd0eb72642741584ca04c1bc292bef8John McCall return BadSpecifier(W, (TSW)TypeSpecWidth, PrevSpec, DiagID); 5685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecWidth = W; 569788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (TypeAltiVecVector && !TypeAltiVecBool && 570788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner ((TypeSpecWidth == TSW_long) || (TypeSpecWidth == TSW_longlong))) { 57182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 57282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson DiagID = diag::warn_vector_long_decl_spec_combination; 57382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return true; 57482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson } 5755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5781eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool DeclSpec::SetTypeSpecComplex(TSC C, SourceLocation Loc, 579fec54013fcd0eb72642741584ca04c1bc292bef8John McCall const char *&PrevSpec, 580fec54013fcd0eb72642741584ca04c1bc292bef8John McCall unsigned &DiagID) { 5815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecComplex != TSC_unspecified) 582fec54013fcd0eb72642741584ca04c1bc292bef8John McCall return BadSpecifier(C, (TSC)TypeSpecComplex, PrevSpec, DiagID); 5835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecComplex = C; 5845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TSCLoc = Loc; 5855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5881eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpbool DeclSpec::SetTypeSpecSign(TSS S, SourceLocation Loc, 589fec54013fcd0eb72642741584ca04c1bc292bef8John McCall const char *&PrevSpec, 590fec54013fcd0eb72642741584ca04c1bc292bef8John McCall unsigned &DiagID) { 5915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecSign != TSS_unspecified) 592fec54013fcd0eb72642741584ca04c1bc292bef8John McCall return BadSpecifier(S, (TSS)TypeSpecSign, PrevSpec, DiagID); 5935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecSign = S; 5945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TSSLoc = Loc; 5955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 5965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 5975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 5985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 599fec54013fcd0eb72642741584ca04c1bc292bef8John McCall const char *&PrevSpec, 600fec54013fcd0eb72642741584ca04c1bc292bef8John McCall unsigned &DiagID, 601b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ParsedType Rep) { 6020daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep); 6030daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara} 6040daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara 6050daaf32723ac78549c507c2a68a5300502703673Abramo Bagnarabool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc, 6060daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara SourceLocation TagNameLoc, 6070daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara const char *&PrevSpec, 6080daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara unsigned &DiagID, 6090daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara ParsedType Rep) { 610b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall assert(isTypeRep(T) && "T does not store a type"); 611b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall assert(Rep && "no type provided!"); 612b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall if (TypeSpecType != TST_unspecified) { 613b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 614b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall DiagID = diag::err_invalid_decl_spec_combination; 615b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall return true; 616b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall } 617b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TypeSpecType = T; 618b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TypeRep = Rep; 6190daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTLoc = TagKwLoc; 6200daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTNameLoc = TagNameLoc; 621b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TypeSpecOwned = false; 622b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall return false; 623b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall} 624b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall 625b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 626b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall const char *&PrevSpec, 627b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall unsigned &DiagID, 628b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall Expr *Rep) { 629b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall assert(isExprRep(T) && "T does not store an expr"); 630b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall assert(Rep && "no expression provided!"); 631b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall if (TypeSpecType != TST_unspecified) { 632b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 633b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall DiagID = diag::err_invalid_decl_spec_combination; 634b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall return true; 635b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall } 636b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TypeSpecType = T; 637b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall ExprRep = Rep; 638b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TSTLoc = Loc; 6390daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTNameLoc = Loc; 640b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TypeSpecOwned = false; 641b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall return false; 642b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall} 643b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall 644b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 645b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall const char *&PrevSpec, 646b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall unsigned &DiagID, 647b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall Decl *Rep, bool Owned) { 6480daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara return SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, Rep, Owned); 6490daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara} 6500daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara 6510daaf32723ac78549c507c2a68a5300502703673Abramo Bagnarabool DeclSpec::SetTypeSpecType(TST T, SourceLocation TagKwLoc, 6520daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara SourceLocation TagNameLoc, 6530daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara const char *&PrevSpec, 6540daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara unsigned &DiagID, 6550daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara Decl *Rep, bool Owned) { 656b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall assert(isDeclRep(T) && "T does not store a decl"); 657b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall // Unlike the other cases, we don't assert that we actually get a decl. 658b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall 659b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall if (TypeSpecType != TST_unspecified) { 660b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 661b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall DiagID = diag::err_invalid_decl_spec_combination; 662b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall return true; 663b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall } 664b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TypeSpecType = T; 665b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall DeclRep = Rep; 6660daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTLoc = TagKwLoc; 6670daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTNameLoc = TagNameLoc; 66886a87308f11e7ee7c71ff608aec0cde11aa7df58Douglas Gregor TypeSpecOwned = Owned && Rep != 0; 669b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall return false; 670b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall} 671b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall 672b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCallbool DeclSpec::SetTypeSpecType(TST T, SourceLocation Loc, 673b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall const char *&PrevSpec, 674b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall unsigned &DiagID) { 675b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall assert(!isDeclRep(T) && !isTypeRep(T) && !isExprRep(T) && 676b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall "rep required for these type-spec kinds!"); 677fec54013fcd0eb72642741584ca04c1bc292bef8John McCall if (TypeSpecType != TST_unspecified) { 678fec54013fcd0eb72642741584ca04c1bc292bef8John McCall PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 679fec54013fcd0eb72642741584ca04c1bc292bef8John McCall DiagID = diag::err_invalid_decl_spec_combination; 680fec54013fcd0eb72642741584ca04c1bc292bef8John McCall return true; 681fec54013fcd0eb72642741584ca04c1bc292bef8John McCall } 6820daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTLoc = Loc; 6830daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTNameLoc = Loc; 684788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (TypeAltiVecVector && (T == TST_bool) && !TypeAltiVecBool) { 685788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner TypeAltiVecBool = true; 686788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner return false; 687788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner } 6885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecType = T; 689b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall TypeSpecOwned = false; 690788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (TypeAltiVecVector && !TypeAltiVecBool && (TypeSpecType == TST_double)) { 69182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 692788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner DiagID = diag::err_invalid_vector_decl_spec; 69382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return true; 69482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson } 69582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return false; 69682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson} 69782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson 69882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompsonbool DeclSpec::SetTypeAltiVecVector(bool isAltiVecVector, SourceLocation Loc, 69982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson const char *&PrevSpec, unsigned &DiagID) { 70082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson if (TypeSpecType != TST_unspecified) { 70182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 70282287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson DiagID = diag::err_invalid_vector_decl_spec_combination; 70382287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return true; 70482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson } 70582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson TypeAltiVecVector = isAltiVecVector; 70682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson AltiVecLoc = Loc; 70782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return false; 70882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson} 70982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson 71082287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompsonbool DeclSpec::SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc, 71182287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson const char *&PrevSpec, unsigned &DiagID) { 712788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (!TypeAltiVecVector || TypeAltiVecPixel || 713788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner (TypeSpecType != TST_unspecified)) { 71482287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 71582287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson DiagID = diag::err_invalid_pixel_decl_spec_combination; 71682287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson return true; 71782287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson } 71882287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson TypeAltiVecPixel = isAltiVecPixel; 71982287d19ded35248c4ce6a425ce74116a13ce44eJohn Thompson TSTLoc = Loc; 7200daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTNameLoc = Loc; 7215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 7225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 7243e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidtbool DeclSpec::SetTypeAltiVecBool(bool isAltiVecBool, SourceLocation Loc, 7253e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt const char *&PrevSpec, unsigned &DiagID) { 7263e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt if (!TypeAltiVecVector || TypeAltiVecBool || 7273e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt (TypeSpecType != TST_unspecified)) { 7283e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt PrevSpec = DeclSpec::getSpecifierName((TST) TypeSpecType); 7293e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt DiagID = diag::err_invalid_vector_bool_decl_spec; 7303e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt return true; 7313e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt } 7323e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt TypeAltiVecBool = isAltiVecBool; 7333e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt TSTLoc = Loc; 7343e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt TSTNameLoc = Loc; 7353e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt return false; 7363e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt} 7373e3d20b2b26a885fcae855bb0b02dbc42d7c5739Bill Schmidt 738ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregorbool DeclSpec::SetTypeSpecError() { 739ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor TypeSpecType = TST_error; 7409e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall TypeSpecOwned = false; 741ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor TSTLoc = SourceLocation(); 7420daaf32723ac78549c507c2a68a5300502703673Abramo Bagnara TSTNameLoc = SourceLocation(); 743ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor return false; 744ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor} 745ddc29e116db3c3f4144355e67a0137b38b6bb6d1Douglas Gregor 7465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerbool DeclSpec::SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec, 747d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith unsigned &DiagID, const LangOptions &Lang) { 748d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // Duplicates are permitted in C99 onwards, but are not permitted in C89 or 749d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // C++. However, since this is likely not what the user intended, we will 750d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // always warn. We do not need to set the qualifier's location since we 751d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // already have it. 752c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman if (TypeQualifiers & T) { 753a14f400e4c4239b92137fc8aab1ac4700a209591Aaron Ballman bool IsExtension = true; 754d654f2d722d4cb6366edcb8f27e99745fcbae486Richard Smith if (Lang.C99) 755a14f400e4c4239b92137fc8aab1ac4700a209591Aaron Ballman IsExtension = false; 756c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman return BadSpecifier(T, T, PrevSpec, DiagID, IsExtension); 757c828620a03b20835a376f6f456a72e44599f4f87Aaron Ballman } 7585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeQualifiers |= T; 7591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 7605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (T) { 7614cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith case TQ_unspecified: break; 7624cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith case TQ_const: TQ_constLoc = Loc; return false; 7634cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith case TQ_restrict: TQ_restrictLoc = Loc; return false; 7644cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith case TQ_volatile: TQ_volatileLoc = Loc; return false; 7654cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith case TQ_atomic: TQ_atomicLoc = Loc; return false; 7665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 7674cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith 7684cf4a5e96ab0babd13774b17112e7c1d83042ea7Richard Smith llvm_unreachable("Unknown type qualifier!"); 7695f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 771d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec, 772d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov unsigned &DiagID) { 773d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // 'inline inline' is ok. However, since this is likely not what the user 774d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // intended, we will always warn, similar to duplicates of type qualifiers. 775d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov if (FS_inline_specified) { 776d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov DiagID = diag::warn_duplicate_declspec; 777d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov PrevSpec = "inline"; 778d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov return true; 779d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov } 7805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer FS_inline_specified = true; 7815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer FS_inlineLoc = Loc; 7825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer return false; 7835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 7845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 785d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec, 786d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov unsigned &DiagID) { 787d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov if (FS_forceinline_specified) { 788d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov DiagID = diag::warn_duplicate_declspec; 789d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov PrevSpec = "__forceinline"; 790d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov return true; 791d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov } 792d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov FS_forceinline_specified = true; 793d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov FS_forceinlineLoc = Loc; 794d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov return false; 795d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov} 796d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov 797d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecVirtual(SourceLocation Loc, 798d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov const char *&PrevSpec, 799d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov unsigned &DiagID) { 800d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // 'virtual virtual' is ok, but warn as this is likely not what the user 801d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // intended. 802d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov if (FS_virtual_specified) { 803d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov DiagID = diag::warn_duplicate_declspec; 804d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov PrevSpec = "virtual"; 805d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov return true; 806d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov } 807b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor FS_virtual_specified = true; 808b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor FS_virtualLoc = Loc; 809b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor return false; 810b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor} 811b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor 812d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecExplicit(SourceLocation Loc, 813d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov const char *&PrevSpec, 814d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov unsigned &DiagID) { 815d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // 'explicit explicit' is ok, but warn as this is likely not what the user 816d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // intended. 817d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov if (FS_explicit_specified) { 818d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov DiagID = diag::warn_duplicate_declspec; 819d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov PrevSpec = "explicit"; 820d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov return true; 821d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov } 822b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor FS_explicit_specified = true; 823b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor FS_explicitLoc = Loc; 824b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor return false; 825b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor} 826b48fe3812047e84164925c8938ce82be0624c40cDouglas Gregor 827d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlovbool DeclSpec::setFunctionSpecNoreturn(SourceLocation Loc, 828d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov const char *&PrevSpec, 829d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov unsigned &DiagID) { 830d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // '_Noreturn _Noreturn' is ok, but warn as this is likely not what the user 831d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov // intended. 832d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov if (FS_noreturn_specified) { 833d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov DiagID = diag::warn_duplicate_declspec; 834d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov PrevSpec = "_Noreturn"; 835d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov return true; 836d1fa81ccbce1ba2d8f467e7c2800250b81ea2e35Serge Pavlov } 837de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith FS_noreturn_specified = true; 838de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith FS_noreturnLoc = Loc; 839de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith return false; 840de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith} 841de03c15ad92b44a4be11507ca2501bb9dd014dceRichard Smith 842fec54013fcd0eb72642741584ca04c1bc292bef8John McCallbool DeclSpec::SetFriendSpec(SourceLocation Loc, const char *&PrevSpec, 843fec54013fcd0eb72642741584ca04c1bc292bef8John McCall unsigned &DiagID) { 844f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson if (Friend_specified) { 845f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson PrevSpec = "friend"; 846fec54013fcd0eb72642741584ca04c1bc292bef8John McCall DiagID = diag::ext_duplicate_declspec; 847f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson return true; 848f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson } 849fec54013fcd0eb72642741584ca04c1bc292bef8John McCall 850f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson Friend_specified = true; 851f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson FriendLoc = Loc; 852f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson return false; 853f47f7a1c4082b42b21f1c7dc211ff90f4b38258aAnders Carlsson} 8545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 8558d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregorbool DeclSpec::setModulePrivateSpec(SourceLocation Loc, const char *&PrevSpec, 8568d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor unsigned &DiagID) { 8578d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor if (isModulePrivateSpecified()) { 8588d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor PrevSpec = "__module_private__"; 8598d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor DiagID = diag::ext_duplicate_declspec; 8608d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor return true; 8618d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor } 8628d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 8638d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor ModulePrivateLoc = Loc; 8648d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor return false; 8658d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor} 8668d267c57afb3af418ed5281b7a9bb4555d701a82Douglas Gregor 8672ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redlbool DeclSpec::SetConstexprSpec(SourceLocation Loc, const char *&PrevSpec, 8682ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl unsigned &DiagID) { 8692ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl // 'constexpr constexpr' is ok. 8702ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl Constexpr_specified = true; 8712ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl ConstexprLoc = Loc; 8722ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl return false; 8732ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl} 8742ac67239b4ab81c439ffcc56367574c869f87daeSebastian Redl 875d226f65006733ed7f709c3174f22ce33391cb58fJohn McCallvoid DeclSpec::setProtocolQualifiers(Decl * const *Protos, 876e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis unsigned NP, 877e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis SourceLocation *ProtoLocs, 878e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis SourceLocation LAngleLoc) { 879e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis if (NP == 0) return; 880c23e69d761e369bb7ffeef52926ab0442c41670fDavid Greene Decl **ProtoQuals = new Decl*[NP]; 881c23e69d761e369bb7ffeef52926ab0442c41670fDavid Greene memcpy(ProtoQuals, Protos, sizeof(Decl*)*NP); 882c23e69d761e369bb7ffeef52926ab0442c41670fDavid Greene ProtocolQualifiers = ProtoQuals; 883e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis ProtocolLocs = new SourceLocation[NP]; 884e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis memcpy(ProtocolLocs, ProtoLocs, sizeof(SourceLocation)*NP); 885e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis NumProtocolQualifiers = NP; 886e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis ProtocolLAngleLoc = LAngleLoc; 887e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis} 888e3a535bb6b39ff721aa3a7177dc427974ca0ff42Argyrios Kyrtzidis 889ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregorvoid DeclSpec::SaveWrittenBuiltinSpecs() { 890ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor writtenBS.Sign = getTypeSpecSign(); 891ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor writtenBS.Width = getTypeSpecWidth(); 892ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor writtenBS.Type = getTypeSpecType(); 893ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor // Search the list of attributes for the presence of a mode attribute. 894ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor writtenBS.ModeAttr = false; 8957f040a9d817cd1c72b565e92abff473510bf9e1dJohn McCall AttributeList* attrs = getAttributes().getList(); 896ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor while (attrs) { 8978e083e71d48f7f4d6ef40c00531c2e14df745486Sean Hunt if (attrs->getKind() == AttributeList::AT_Mode) { 898ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor writtenBS.ModeAttr = true; 899ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor break; 900ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 901ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor attrs = attrs->getNext(); 902ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor } 903ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor} 904ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 9055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// Finish - This does final analysis of the declspec, rejecting things like 9065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// "_Imaginary" (lacking an FP type). This returns a diagnostic to issue or 9075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// diag::NUM_DIAGNOSTICS if there is no error. After calling this method, 9085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// DeclSpec is guaranteed self-consistent, even if an error occurred. 909d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikievoid DeclSpec::Finish(DiagnosticsEngine &D, Preprocessor &PP) { 910ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor // Before possibly changing their values, save specs as written. 911ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor SaveWrittenBuiltinSpecs(); 912ddf889a2ad2888f1dea573987bbe952d9912c1a0Douglas Gregor 9135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Check the type specifier components first. 9145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 915a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // If decltype(auto) is used, no other type specifiers are permitted. 916a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith if (TypeSpecType == TST_decltype_auto && 917a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith (TypeSpecWidth != TSW_unspecified || 918a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeSpecComplex != TSC_unspecified || 919a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeSpecSign != TSS_unspecified || 920a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeAltiVecVector || TypeAltiVecPixel || TypeAltiVecBool || 921a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeQualifiers)) { 922c6a31777fe03c73aca654c7c54224e36e75398ddBenjamin Kramer const unsigned NumLocs = 8; 923a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith SourceLocation ExtraLocs[NumLocs] = { 924a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TSWLoc, TSCLoc, TSSLoc, AltiVecLoc, 925a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc 926a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith }; 927a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith FixItHint Hints[NumLocs]; 928a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith SourceLocation FirstLoc; 929a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith for (unsigned I = 0; I != NumLocs; ++I) { 930a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith if (!ExtraLocs[I].isInvalid()) { 931a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith if (FirstLoc.isInvalid() || 932a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith PP.getSourceManager().isBeforeInTranslationUnit(ExtraLocs[I], 933a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith FirstLoc)) 934a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith FirstLoc = ExtraLocs[I]; 935a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith Hints[I] = FixItHint::CreateRemoval(ExtraLocs[I]); 936a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith } 937a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith } 938a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeSpecWidth = TSW_unspecified; 939a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeSpecComplex = TSC_unspecified; 940a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeSpecSign = TSS_unspecified; 941a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeAltiVecVector = TypeAltiVecPixel = TypeAltiVecBool = false; 942a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith TypeQualifiers = 0; 943a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith Diag(D, TSTLoc, diag::err_decltype_auto_cannot_be_combined) 944a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith << Hints[0] << Hints[1] << Hints[2] << Hints[3] 945a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith << Hints[4] << Hints[5] << Hints[6] << Hints[7]; 946a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith } 947a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith 948788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner // Validate and finalize AltiVec vector declspec. 949788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (TypeAltiVecVector) { 950788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (TypeAltiVecBool) { 951788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner // Sign specifiers are not allowed with vector bool. (PIM 2.1) 952788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (TypeSpecSign != TSS_unspecified) { 95333e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSSLoc, diag::err_invalid_vector_bool_decl_spec) 954788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner << getSpecifierName((TSS)TypeSpecSign); 955788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner } 956788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 957788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner // Only char/int are valid with vector bool. (PIM 2.1) 9582e964a922c0826a1216d101df315432c6a0a78f6Duncan Sands if (((TypeSpecType != TST_unspecified) && (TypeSpecType != TST_char) && 9592e964a922c0826a1216d101df315432c6a0a78f6Duncan Sands (TypeSpecType != TST_int)) || TypeAltiVecPixel) { 96033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSTLoc, diag::err_invalid_vector_bool_decl_spec) 961788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner << (TypeAltiVecPixel ? "__pixel" : 962788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner getSpecifierName((TST)TypeSpecType)); 963788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner } 964788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 965788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner // Only 'short' is valid with vector bool. (PIM 2.1) 966788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if ((TypeSpecWidth != TSW_unspecified) && (TypeSpecWidth != TSW_short)) 96733e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSWLoc, diag::err_invalid_vector_bool_decl_spec) 968788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner << getSpecifierName((TSW)TypeSpecWidth); 969788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 970788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner // Elements of vector bool are interpreted as unsigned. (PIM 2.1) 971788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if ((TypeSpecType == TST_char) || (TypeSpecType == TST_int) || 972788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner (TypeSpecWidth != TSW_unspecified)) 973788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner TypeSpecSign = TSS_unsigned; 974788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner } 975788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 976788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner if (TypeAltiVecPixel) { 977788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner //TODO: perform validation 978788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner TypeSpecType = TST_int; 979788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner TypeSpecSign = TSS_unsigned; 980788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner TypeSpecWidth = TSW_short; 9819e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall TypeSpecOwned = false; 982788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner } 983788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner } 984788b0fd67e1992f23555454efcdb16a19dfefac3Chris Lattner 98564c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis // signed/unsigned are only valid with int/char/wchar_t. 9865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecSign != TSS_unspecified) { 9875f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecType == TST_unspecified) 9885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecType = TST_int; // unsigned -> unsigned int, signed -> signed int. 9895a5a971908a1fd064454db44c42333a3aecf3d5bRichard Smith else if (TypeSpecType != TST_int && TypeSpecType != TST_int128 && 99064c438a4be2a871fa43c78264663ba1e9788b94dArgyrios Kyrtzidis TypeSpecType != TST_char && TypeSpecType != TST_wchar) { 99133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSSLoc, diag::err_invalid_sign_spec) 992254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner << getSpecifierName((TST)TypeSpecType); 9935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // signed double -> double. 9945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecSign = TSS_unspecified; 9955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 9965f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 9975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 9985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Validate the width of the type. 9995f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer switch (TypeSpecWidth) { 10005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case TSW_unspecified: break; 10015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case TSW_short: // short int 10025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case TSW_longlong: // long long int 10035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecType == TST_unspecified) 10045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecType = TST_int; // short -> short int, long long -> long long int. 10055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else if (TypeSpecType != TST_int) { 100633e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSWLoc, 10075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecWidth == TSW_short ? diag::err_invalid_short_spec 1008254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner : diag::err_invalid_longlong_spec) 1009254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner << getSpecifierName((TST)TypeSpecType); 10105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecType = TST_int; 10119e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall TypeSpecOwned = false; 10125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 10145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer case TSW_long: // long double, long int 10155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecType == TST_unspecified) 10165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecType = TST_int; // long -> long int. 10175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer else if (TypeSpecType != TST_int && TypeSpecType != TST_double) { 101833e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSWLoc, diag::err_invalid_long_spec) 1019254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner << getSpecifierName((TST)TypeSpecType); 10205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecType = TST_int; 10219e46b8cfb3e6c6feab5664744f52f06a40f9566bJohn McCall TypeSpecOwned = false; 10225f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer break; 10245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 10265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // TODO: if the implementation does not implement _Complex or _Imaginary, 10275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // disallow their use. Need information about the backend. 10285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecComplex != TSC_unspecified) { 10295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer if (TypeSpecType == TST_unspecified) { 103033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSCLoc, diag::ext_plain_complex) 1031849b243d4065f56742a4677d6dc8277609a151f8Douglas Gregor << FixItHint::CreateInsertion( 10329b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor PP.getLocForEndOfToken(getTypeSpecComplexLoc()), 10339b3064b55f3c858923734e8b1c9831777fc22554Douglas Gregor " double"); 10345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecType = TST_double; // _Complex -> _Complex double. 10355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (TypeSpecType == TST_int || TypeSpecType == TST_char) { 10365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Note that this intentionally doesn't include _Complex _Bool. 10374e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie if (!PP.getLangOpts().CPlusPlus) 10387ead5c7b6fd48cf549e55b4db499c26ecf88ae75Eli Friedman Diag(D, TSTLoc, diag::ext_integer_complex); 10395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } else if (TypeSpecType != TST_float && TypeSpecType != TST_double) { 104033e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, TSCLoc, diag::err_invalid_complex_spec) 1041254be6ac14092e0bdd9e632dfea09f237850e63dChris Lattner << getSpecifierName((TST)TypeSpecType); 10425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer TypeSpecComplex = TSC_unspecified; 10435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer } 10455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer 1046ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith // C11 6.7.1/3, C++11 [dcl.stc]p1, GNU TLS: __thread, thread_local and 1047ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith // _Thread_local can only appear with the 'static' and 'extern' storage class 1048ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith // specifiers. We also allow __private_extern__ as an extension. 1049ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith if (ThreadStorageClassSpec != TSCS_unspecified) { 1050ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith switch (StorageClassSpec) { 1051ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case SCS_unspecified: 1052ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case SCS_extern: 1053ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case SCS_private_extern: 1054ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith case SCS_static: 1055ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith break; 1056ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith default: 1057ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith if (PP.getSourceManager().isBeforeInTranslationUnit( 1058ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith getThreadStorageClassSpecLoc(), getStorageClassSpecLoc())) 1059ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith Diag(D, getStorageClassSpecLoc(), 1060ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith diag::err_invalid_decl_spec_combination) 1061ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith << DeclSpec::getSpecifierName(getThreadStorageClassSpec()) 1062ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith << SourceRange(getThreadStorageClassSpecLoc()); 1063ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith else 1064ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith Diag(D, getThreadStorageClassSpecLoc(), 1065ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith diag::err_invalid_decl_spec_combination) 1066ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith << DeclSpec::getSpecifierName(getStorageClassSpec()) 1067ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith << SourceRange(getStorageClassSpecLoc()); 1068ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith // Discard the thread storage class specifier to recover. 1069ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith ThreadStorageClassSpec = TSCS_unspecified; 1070ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith ThreadStorageClassSpecLoc = SourceLocation(); 1071ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith } 1072ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith } 1073ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith 10748f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith // If no type specifier was provided and we're parsing a language where 10758f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith // the type specifier is not optional, but we got 'auto' as a storage 10768f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith // class specifier, then assume this is an attempt to use C++0x's 'auto' 10778f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith // type specifier. 107858eb37036b47bbe7433f72d92a2cb60848507707Richard Smith if (PP.getLangOpts().CPlusPlus && 10798f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith TypeSpecType == TST_unspecified && StorageClassSpec == SCS_auto) { 10808f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith TypeSpecType = TST_auto; 1081d2615cc53b916e8aae45783ca7113b93de515ce3Rafael Espindola StorageClassSpec = SCS_unspecified; 10828f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith TSTLoc = TSTNameLoc = StorageClassSpecLoc; 10838f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith StorageClassSpecLoc = SourceLocation(); 10848f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith } 10858f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith // Diagnose if we've recovered from an ill-formed 'auto' storage class 1086a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith // specifier in a pre-C++11 dialect of C++. 108780ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (!PP.getLangOpts().CPlusPlus11 && TypeSpecType == TST_auto) 10888f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith Diag(D, TSTLoc, diag::ext_auto_type_specifier); 108980ad52f327b532bded5c5b0ee38779d841c6cd35Richard Smith if (PP.getLangOpts().CPlusPlus && !PP.getLangOpts().CPlusPlus11 && 10908f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith StorageClassSpec == SCS_auto) 10918f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith Diag(D, StorageClassSpecLoc, diag::warn_auto_storage_class) 10928f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith << FixItHint::CreateRemoval(StorageClassSpecLoc); 1093841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith if (TypeSpecType == TST_char16 || TypeSpecType == TST_char32) 1094841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith Diag(D, TSTLoc, diag::warn_cxx98_compat_unicode_type) 1095841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith << (TypeSpecType == TST_char16 ? "char16_t" : "char32_t"); 1096841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith if (Constexpr_specified) 1097841804baff6ea8ba1904a2ba81265aae1479e882Richard Smith Diag(D, ConstexprLoc, diag::warn_cxx98_compat_constexpr); 10988f4fb190852d3f86787c7e2c3dfc1b96143197aeRichard Smith 109967d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall // C++ [class.friend]p6: 110067d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall // No storage-class-specifier shall appear in the decl-specifier-seq 110167d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall // of a friend declaration. 1102ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith if (isFriendSpecified() && 1103ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith (getStorageClassSpec() || getThreadStorageClassSpec())) { 1104ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith SmallString<32> SpecName; 1105ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith SourceLocation SCLoc; 1106ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith FixItHint StorageHint, ThreadHint; 1107ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith 1108ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith if (DeclSpec::SCS SC = getStorageClassSpec()) { 1109ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith SpecName = getSpecifierName(SC); 1110ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith SCLoc = getStorageClassSpecLoc(); 1111ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith StorageHint = FixItHint::CreateRemoval(SCLoc); 1112ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith } 111367d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall 1114ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith if (DeclSpec::TSCS TSC = getThreadStorageClassSpec()) { 1115ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith if (!SpecName.empty()) SpecName += " "; 1116ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith SpecName += getSpecifierName(TSC); 1117ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith SCLoc = getThreadStorageClassSpecLoc(); 1118ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith ThreadHint = FixItHint::CreateRemoval(SCLoc); 1119ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith } 112067d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall 112133e4e70c8c0a17e0ccb7465d96556b077a68ecb1Argyrios Kyrtzidis Diag(D, SCLoc, diag::err_friend_storage_spec) 1122ec64244f5939fa81596fbeddad966cca4b4a4c51Richard Smith << SpecName << StorageHint << ThreadHint; 112367d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall 112467d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall ClearStorageClassSpecs(); 112567d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall } 112667d1a67f3db2f1aa69083c5c94164d6e0ee05b32John McCall 11276274d30d77870393d83a404dd223b8005f2b8cd5Douglas Gregor assert(!TypeSpecOwned || isDeclRep((TST) TypeSpecType)); 11286274d30d77870393d83a404dd223b8005f2b8cd5Douglas Gregor 11295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // Okay, now we can infer the real type. 11301eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // TODO: return "auto function" and other bad things based on the real type. 11321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 11335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer // 'data definition has no type or storage class'? 11345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer} 1135e4858a65a93fb36c099d8dd2ea0a98e33e77687eDaniel Dunbar 1136a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redlbool DeclSpec::isMissingDeclaratorOk() { 1137a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl TST tst = getTypeSpecType(); 1138b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall return isDeclRep(tst) && getRepAsDecl() != 0 && 1139b3d8748e797c6c2f1dc01186c8eeb3b1b5fe970cJohn McCall StorageClassSpec != DeclSpec::SCS_typedef; 1140a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl} 11413f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor 11423f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregorvoid UnqualifiedId::setOperatorFunctionId(SourceLocation OperatorLoc, 11433f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor OverloadedOperatorKind Op, 11443f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor SourceLocation SymbolLocations[3]) { 11453f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor Kind = IK_OperatorFunctionId; 11463f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor StartLocation = OperatorLoc; 11473f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor EndLocation = OperatorLoc; 11483f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor OperatorFunctionId.Operator = Op; 11493f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor for (unsigned I = 0; I != 3; ++I) { 11503f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor OperatorFunctionId.SymbolLocations[I] = SymbolLocations[I].getRawEncoding(); 11513f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor 11523f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor if (SymbolLocations[I].isValid()) 11533f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor EndLocation = SymbolLocations[I]; 11543f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor } 11553f9a0566e6793151b99a65ab936220971cf96c1bDouglas Gregor} 1156b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson 1157cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlssonbool VirtSpecifiers::SetSpecifier(Specifier VS, SourceLocation Loc, 115846127a96b6dd6b93aa18d5f7a55bc2db8b52a2c9Anders Carlsson const char *&PrevSpec) { 1159f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor LastLocation = Loc; 1160f52516038ab5d0b1b90a6dd32f46b7d6dabd04c8Douglas Gregor 1161b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson if (Specifiers & VS) { 1162b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson PrevSpec = getSpecifierName(VS); 1163b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson return true; 1164b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson } 1165b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson 1166b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson Specifiers |= VS; 1167b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson 1168b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson switch (VS) { 1169b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown specifier!"); 1170b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson case VS_Override: VS_overrideLoc = Loc; break; 11717121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer case VS_Sealed: 1172b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson case VS_Final: VS_finalLoc = Loc; break; 1173b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson } 117446127a96b6dd6b93aa18d5f7a55bc2db8b52a2c9Anders Carlsson 1175b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson return false; 1176b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson} 1177b971dbdb65149a7cf0c046380186d0204e5b411eAnders Carlsson 1178cc54d594d4f6509c0e3a8e349e481d9b5d899df6Anders Carlssonconst char *VirtSpecifiers::getSpecifierName(Specifier VS) { 1179c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson switch (VS) { 1180b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie default: llvm_unreachable("Unknown specifier"); 1181c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson case VS_Override: return "override"; 1182c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson case VS_Final: return "final"; 11837121bdb91b86f6053765bda18dd0a8a118929aceDavid Majnemer case VS_Sealed: return "sealed"; 1184c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson } 1185c46bb7d098bf9e9f0258bf2bb97d8f0f7d382288Anders Carlsson} 1186