diff options
Diffstat (limited to 'contrib/llvm-project/clang/include/clang/Sema/DeclSpec.h')
-rw-r--r-- | contrib/llvm-project/clang/include/clang/Sema/DeclSpec.h | 581 |
1 files changed, 301 insertions, 280 deletions
diff --git a/contrib/llvm-project/clang/include/clang/Sema/DeclSpec.h b/contrib/llvm-project/clang/include/clang/Sema/DeclSpec.h index 0a22b5af7c64..3b16295941e4 100644 --- a/contrib/llvm-project/clang/include/clang/Sema/DeclSpec.h +++ b/contrib/llvm-project/clang/include/clang/Sema/DeclSpec.h @@ -249,25 +249,12 @@ public: static const TSCS TSCS_thread_local = clang::TSCS_thread_local; static const TSCS TSCS__Thread_local = clang::TSCS__Thread_local; - // Import type specifier width enumeration and constants. - typedef TypeSpecifierWidth TSW; - static const TSW TSW_unspecified = clang::TSW_unspecified; - static const TSW TSW_short = clang::TSW_short; - static const TSW TSW_long = clang::TSW_long; - static const TSW TSW_longlong = clang::TSW_longlong; - enum TSC { TSC_unspecified, TSC_imaginary, TSC_complex }; - // Import type specifier sign enumeration and constants. - typedef TypeSpecifierSign TSS; - static const TSS TSS_unspecified = clang::TSS_unspecified; - static const TSS TSS_signed = clang::TSS_signed; - static const TSS TSS_unsigned = clang::TSS_unsigned; - // Import type specifier type enumeration and constants. typedef TypeSpecifierType TST; static const TST TST_unspecified = clang::TST_unspecified; @@ -342,7 +329,7 @@ private: unsigned SCS_extern_in_linkage_spec : 1; // type-specifier - /*TSW*/unsigned TypeSpecWidth : 2; + /*TypeSpecifierWidth*/ unsigned TypeSpecWidth : 2; /*TSC*/unsigned TypeSpecComplex : 2; /*TSS*/unsigned TypeSpecSign : 2; /*TST*/unsigned TypeSpecType : 6; @@ -434,15 +421,18 @@ public: DeclSpec(AttributeFactory &attrFactory) : StorageClassSpec(SCS_unspecified), ThreadStorageClassSpec(TSCS_unspecified), - SCS_extern_in_linkage_spec(false), TypeSpecWidth(TSW_unspecified), - TypeSpecComplex(TSC_unspecified), TypeSpecSign(TSS_unspecified), + SCS_extern_in_linkage_spec(false), + TypeSpecWidth(static_cast<unsigned>(TypeSpecifierWidth::Unspecified)), + TypeSpecComplex(TSC_unspecified), + TypeSpecSign(static_cast<unsigned>(TypeSpecifierSign::Unspecified)), TypeSpecType(TST_unspecified), TypeAltiVecVector(false), TypeAltiVecPixel(false), TypeAltiVecBool(false), TypeSpecOwned(false), TypeSpecPipe(false), TypeSpecSat(false), ConstrainedAuto(false), - TypeQualifiers(TQ_unspecified), - FS_inline_specified(false), FS_forceinline_specified(false), - FS_virtual_specified(false), FS_noreturn_specified(false), - Friend_specified(false), ConstexprSpecifier(CSK_unspecified), + TypeQualifiers(TQ_unspecified), FS_inline_specified(false), + FS_forceinline_specified(false), FS_virtual_specified(false), + FS_noreturn_specified(false), Friend_specified(false), + ConstexprSpecifier( + static_cast<unsigned>(ConstexprSpecKind::Unspecified)), FS_explicit_specifier(), Attrs(attrFactory), writtenBS(), ObjCQualifiers(nullptr) {} @@ -476,9 +466,13 @@ public: } // type-specifier - TSW getTypeSpecWidth() const { return (TSW)TypeSpecWidth; } + TypeSpecifierWidth getTypeSpecWidth() const { + return static_cast<TypeSpecifierWidth>(TypeSpecWidth); + } TSC getTypeSpecComplex() const { return (TSC)TypeSpecComplex; } - TSS getTypeSpecSign() const { return (TSS)TypeSpecSign; } + TypeSpecifierSign getTypeSpecSign() const { + return static_cast<TypeSpecifierSign>(TypeSpecSign); + } TST getTypeSpecType() const { return (TST)TypeSpecType; } bool isTypeAltiVecVector() const { return TypeAltiVecVector; } bool isTypeAltiVecPixel() const { return TypeAltiVecPixel; } @@ -540,9 +534,9 @@ public: static const char *getSpecifierName(DeclSpec::TST T, const PrintingPolicy &Policy); static const char *getSpecifierName(DeclSpec::TQ Q); - static const char *getSpecifierName(DeclSpec::TSS S); + static const char *getSpecifierName(TypeSpecifierSign S); static const char *getSpecifierName(DeclSpec::TSC C); - static const char *getSpecifierName(DeclSpec::TSW W); + static const char *getSpecifierName(TypeSpecifierWidth W); static const char *getSpecifierName(DeclSpec::SCS S); static const char *getSpecifierName(DeclSpec::TSCS S); static const char *getSpecifierName(ConstexprSpecKind C); @@ -626,9 +620,9 @@ public: /// Return true if any type-specifier has been found. bool hasTypeSpecifier() const { return getTypeSpecType() != DeclSpec::TST_unspecified || - getTypeSpecWidth() != DeclSpec::TSW_unspecified || + getTypeSpecWidth() != TypeSpecifierWidth::Unspecified || getTypeSpecComplex() != DeclSpec::TSC_unspecified || - getTypeSpecSign() != DeclSpec::TSS_unspecified; + getTypeSpecSign() != TypeSpecifierSign::Unspecified; } /// Return a bitmask of which flavors of specifiers this @@ -659,12 +653,13 @@ public: const PrintingPolicy &Policy); bool SetStorageClassSpecThread(TSCS TSC, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID); - bool SetTypeSpecWidth(TSW W, SourceLocation Loc, const char *&PrevSpec, - unsigned &DiagID, const PrintingPolicy &Policy); + bool SetTypeSpecWidth(TypeSpecifierWidth W, SourceLocation Loc, + const char *&PrevSpec, unsigned &DiagID, + const PrintingPolicy &Policy); bool SetTypeSpecComplex(TSC C, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID); - bool SetTypeSpecSign(TSS S, SourceLocation Loc, const char *&PrevSpec, - unsigned &DiagID); + bool SetTypeSpecSign(TypeSpecifierSign S, SourceLocation Loc, + const char *&PrevSpec, unsigned &DiagID); bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, unsigned &DiagID, const PrintingPolicy &Policy); bool SetTypeSpecType(TST T, SourceLocation Loc, const char *&PrevSpec, @@ -762,11 +757,11 @@ public: SourceLocation getConstexprSpecLoc() const { return ConstexprLoc; } bool hasConstexprSpecifier() const { - return ConstexprSpecifier != CSK_unspecified; + return getConstexprSpecifier() != ConstexprSpecKind::Unspecified; } void ClearConstexprSpec() { - ConstexprSpecifier = CSK_unspecified; + ConstexprSpecifier = static_cast<unsigned>(ConstexprSpecKind::Unspecified); ConstexprLoc = SourceLocation(); } @@ -972,7 +967,7 @@ public: /// Different operators have different numbers of tokens in their name, /// up to three. Any remaining source locations in this array will be /// set to an invalid value for operators with fewer than three tokens. - unsigned SymbolLocations[3]; + SourceLocation SymbolLocations[3]; }; /// Anonymous union that holds extra data associated with the @@ -1035,7 +1030,6 @@ public: /// Determine what kind of name we have. UnqualifiedIdKind getKind() const { return Kind; } - void setKind(UnqualifiedIdKind kind) { Kind = kind; } /// Specify that this unqualified-id was parsed as an identifier. /// @@ -1151,6 +1145,16 @@ public: StartLocation = EndLocation = TemplateLoc; } + /// Specify that this unqualified-id is an implicit 'self' + /// parameter. + /// + /// \param Id the identifier. + void setImplicitSelfParam(const IdentifierInfo *Id) { + Kind = UnqualifiedIdKind::IK_ImplicitSelfParam; + Identifier = const_cast<IdentifierInfo *>(Id); + StartLocation = EndLocation = SourceLocation(); + } + /// Return the source range that covers this unqualified-id. SourceRange getSourceRange() const LLVM_READONLY { return SourceRange(StartLocation, EndLocation); @@ -1167,6 +1171,8 @@ typedef SmallVector<Token, 4> CachedTokens; /// /// This is intended to be a small value object. struct DeclaratorChunk { + DeclaratorChunk() {}; + enum { Pointer, Reference, Array, Function, BlockPointer, MemberPointer, Paren, Pipe } Kind; @@ -1189,19 +1195,19 @@ struct DeclaratorChunk { unsigned TypeQuals : 5; /// The location of the const-qualifier, if any. - unsigned ConstQualLoc; + SourceLocation ConstQualLoc; /// The location of the volatile-qualifier, if any. - unsigned VolatileQualLoc; + SourceLocation VolatileQualLoc; /// The location of the restrict-qualifier, if any. - unsigned RestrictQualLoc; + SourceLocation RestrictQualLoc; /// The location of the _Atomic-qualifier, if any. - unsigned AtomicQualLoc; + SourceLocation AtomicQualLoc; /// The location of the __unaligned-qualifier, if any. - unsigned UnalignedQualLoc; + SourceLocation UnalignedQualLoc; void destroy() { } @@ -1296,13 +1302,13 @@ struct DeclaratorChunk { unsigned HasTrailingReturnType : 1; /// The location of the left parenthesis in the source. - unsigned LParenLoc; + SourceLocation LParenLoc; /// When isVariadic is true, the location of the ellipsis in the source. - unsigned EllipsisLoc; + SourceLocation EllipsisLoc; /// The location of the right parenthesis in the source. - unsigned RParenLoc; + SourceLocation RParenLoc; /// NumParams - This is the number of formal parameters specified by the /// declarator. @@ -1316,17 +1322,17 @@ struct DeclaratorChunk { /// The location of the ref-qualifier, if any. /// /// If this is an invalid location, there is no ref-qualifier. - unsigned RefQualifierLoc; + SourceLocation RefQualifierLoc; /// The location of the 'mutable' qualifer in a lambda-declarator, if /// any. - unsigned MutableLoc; + SourceLocation MutableLoc; /// The beginning location of the exception specification, if any. - unsigned ExceptionSpecLocBeg; + SourceLocation ExceptionSpecLocBeg; /// The end location of the exception specification, if any. - unsigned ExceptionSpecLocEnd; + SourceLocation ExceptionSpecLocEnd; /// Params - This is a pointer to a new[]'d array of ParamInfo objects that /// describe the parameters specified by this function declarator. null if @@ -1363,6 +1369,10 @@ struct DeclaratorChunk { /// type specified. UnionParsedType TrailingReturnType; + /// If HasTrailingReturnType is true, this is the location of the trailing + /// return type. + SourceLocation TrailingReturnTypeLoc; + /// Reset the parameter list to having zero parameters. /// /// This is used in various places for error recovery. @@ -1409,24 +1419,18 @@ struct DeclaratorChunk { /// by the parameter type definitions. bool isKNRPrototype() const { return !hasPrototype && NumParams != 0; } - SourceLocation getLParenLoc() const { - return SourceLocation::getFromRawEncoding(LParenLoc); - } + SourceLocation getLParenLoc() const { return LParenLoc; } - SourceLocation getEllipsisLoc() const { - return SourceLocation::getFromRawEncoding(EllipsisLoc); - } + SourceLocation getEllipsisLoc() const { return EllipsisLoc; } - SourceLocation getRParenLoc() const { - return SourceLocation::getFromRawEncoding(RParenLoc); - } + SourceLocation getRParenLoc() const { return RParenLoc; } SourceLocation getExceptionSpecLocBeg() const { - return SourceLocation::getFromRawEncoding(ExceptionSpecLocBeg); + return ExceptionSpecLocBeg; } SourceLocation getExceptionSpecLocEnd() const { - return SourceLocation::getFromRawEncoding(ExceptionSpecLocEnd); + return ExceptionSpecLocEnd; } SourceRange getExceptionSpecRange() const { @@ -1434,9 +1438,7 @@ struct DeclaratorChunk { } /// Retrieve the location of the ref-qualifier, if any. - SourceLocation getRefQualifierLoc() const { - return SourceLocation::getFromRawEncoding(RefQualifierLoc); - } + SourceLocation getRefQualifierLoc() const { return RefQualifierLoc; } /// Retrieve the location of the 'const' qualifier. SourceLocation getConstQualifierLoc() const { @@ -1457,9 +1459,7 @@ struct DeclaratorChunk { } /// Retrieve the location of the 'mutable' qualifier, if any. - SourceLocation getMutableLoc() const { - return SourceLocation::getFromRawEncoding(MutableLoc); - } + SourceLocation getMutableLoc() const { return MutableLoc; } /// Determine whether this function declaration contains a /// ref-qualifier. @@ -1498,7 +1498,16 @@ struct DeclaratorChunk { bool hasTrailingReturnType() const { return HasTrailingReturnType; } /// Get the trailing-return-type for this function declarator. - ParsedType getTrailingReturnType() const { return TrailingReturnType; } + ParsedType getTrailingReturnType() const { + assert(HasTrailingReturnType); + return TrailingReturnType; + } + + /// Get the trailing-return-type location for this function declarator. + SourceLocation getTrailingReturnTypeLoc() const { + assert(HasTrailingReturnType); + return TrailingReturnTypeLoc; + } }; struct BlockPointerTypeInfo { @@ -1514,7 +1523,7 @@ struct DeclaratorChunk { /// The type qualifiers: const/volatile/restrict/__unaligned/_Atomic. unsigned TypeQuals : 5; /// Location of the '*' token. - unsigned StarLoc; + SourceLocation StarLoc; // CXXScopeSpec has a constructor, so it can't be a direct member. // So we need some pointer-aligned storage and a bit of trickery. alignas(CXXScopeSpec) char ScopeMem[sizeof(CXXScopeSpec)]; @@ -1574,12 +1583,13 @@ struct DeclaratorChunk { DeclaratorChunk I; I.Kind = Pointer; I.Loc = Loc; + new (&I.Ptr) PointerTypeInfo; I.Ptr.TypeQuals = TypeQuals; - I.Ptr.ConstQualLoc = ConstQualLoc.getRawEncoding(); - I.Ptr.VolatileQualLoc = VolatileQualLoc.getRawEncoding(); - I.Ptr.RestrictQualLoc = RestrictQualLoc.getRawEncoding(); - I.Ptr.AtomicQualLoc = AtomicQualLoc.getRawEncoding(); - I.Ptr.UnalignedQualLoc = UnalignedQualLoc.getRawEncoding(); + I.Ptr.ConstQualLoc = ConstQualLoc; + I.Ptr.VolatileQualLoc = VolatileQualLoc; + I.Ptr.RestrictQualLoc = RestrictQualLoc; + I.Ptr.AtomicQualLoc = AtomicQualLoc; + I.Ptr.UnalignedQualLoc = UnalignedQualLoc; return I; } @@ -1633,6 +1643,8 @@ struct DeclaratorChunk { Declarator &TheDeclarator, TypeResult TrailingReturnType = TypeResult(), + SourceLocation TrailingReturnTypeLoc = + SourceLocation(), DeclSpec *MethodQualifiers = nullptr); /// Return a DeclaratorChunk for a block. @@ -1663,7 +1675,8 @@ struct DeclaratorChunk { I.Kind = MemberPointer; I.Loc = SS.getBeginLoc(); I.EndLoc = EndLoc; - I.Mem.StarLoc = StarLoc.getRawEncoding(); + new (&I.Mem) MemberPointerTypeInfo; + I.Mem.StarLoc = StarLoc; I.Mem.TypeQuals = TypeQuals; new (I.Mem.ScopeMem) CXXScopeSpec(SS); return I; @@ -1738,44 +1751,43 @@ public: /// Described the kind of function definition (if any) provided for /// a function. -enum FunctionDefinitionKind { - FDK_Declaration, - FDK_Definition, - FDK_Defaulted, - FDK_Deleted +enum class FunctionDefinitionKind { + Declaration, + Definition, + Defaulted, + Deleted }; enum class DeclaratorContext { - FileContext, // File scope declaration. - PrototypeContext, // Within a function prototype. - ObjCResultContext, // An ObjC method result type. - ObjCParameterContext,// An ObjC method parameter type. - KNRTypeListContext, // K&R type definition list for formals. - TypeNameContext, // Abstract declarator for types. - FunctionalCastContext, // Type in a C++ functional cast expression. - MemberContext, // Struct/Union field. - BlockContext, // Declaration within a block in a function. - ForContext, // Declaration within first part of a for loop. - InitStmtContext, // Declaration within optional init stmt of if/switch. - ConditionContext, // Condition declaration in a C++ if/switch/while/for. - TemplateParamContext,// Within a template parameter list. - CXXNewContext, // C++ new-expression. - CXXCatchContext, // C++ catch exception-declaration - ObjCCatchContext, // Objective-C catch exception-declaration - BlockLiteralContext, // Block literal declarator. - LambdaExprContext, // Lambda-expression declarator. - LambdaExprParameterContext, // Lambda-expression parameter declarator. - ConversionIdContext, // C++ conversion-type-id. - TrailingReturnContext, // C++11 trailing-type-specifier. - TrailingReturnVarContext, // C++11 trailing-type-specifier for variable. - TemplateArgContext, // Any template argument (in template argument list). - TemplateTypeArgContext, // Template type argument (in default argument). - AliasDeclContext, // C++11 alias-declaration. - AliasTemplateContext, // C++11 alias-declaration template. - RequiresExprContext // C++2a requires-expression. + File, // File scope declaration. + Prototype, // Within a function prototype. + ObjCResult, // An ObjC method result type. + ObjCParameter, // An ObjC method parameter type. + KNRTypeList, // K&R type definition list for formals. + TypeName, // Abstract declarator for types. + FunctionalCast, // Type in a C++ functional cast expression. + Member, // Struct/Union field. + Block, // Declaration within a block in a function. + ForInit, // Declaration within first part of a for loop. + SelectionInit, // Declaration within optional init stmt of if/switch. + Condition, // Condition declaration in a C++ if/switch/while/for. + TemplateParam, // Within a template parameter list. + CXXNew, // C++ new-expression. + CXXCatch, // C++ catch exception-declaration + ObjCCatch, // Objective-C catch exception-declaration + BlockLiteral, // Block literal declarator. + LambdaExpr, // Lambda-expression declarator. + LambdaExprParameter, // Lambda-expression parameter declarator. + ConversionId, // C++ conversion-type-id. + TrailingReturn, // C++11 trailing-type-specifier. + TrailingReturnVar, // C++11 trailing-type-specifier for variable. + TemplateArg, // Any template argument (in template argument list). + TemplateTypeArg, // Template type argument (in default argument). + AliasDecl, // C++11 alias-declaration. + AliasTemplate, // C++11 alias-declaration template. + RequiresExpr // C++2a requires-expression. }; - /// Information about one declarator, including the parsed type /// information and the identifier. /// @@ -1835,6 +1847,9 @@ private: /// Indicates whether the InlineParams / InlineBindings storage has been used. unsigned InlineStorageUsed : 1; + /// Indicates whether this declarator has an initializer. + unsigned HasInitializer : 1; + /// Attrs - Attributes. ParsedAttributes Attrs; @@ -1879,11 +1894,12 @@ public: Declarator(const DeclSpec &ds, DeclaratorContext C) : DS(ds), Range(ds.getSourceRange()), Context(C), InvalidType(DS.getTypeSpecType() == DeclSpec::TST_error), - GroupingParens(false), FunctionDefinition(FDK_Declaration), + GroupingParens(false), FunctionDefinition(static_cast<unsigned>( + FunctionDefinitionKind::Declaration)), Redeclaration(false), Extension(false), ObjCIvar(false), ObjCWeakProperty(false), InlineStorageUsed(false), - Attrs(ds.getAttributePool().getFactory()), AsmLabel(nullptr), - TrailingRequiresClause(nullptr), + HasInitializer(false), Attrs(ds.getAttributePool().getFactory()), + AsmLabel(nullptr), TrailingRequiresClause(nullptr), InventedTemplateParameterList(nullptr) {} ~Declarator() { @@ -1919,10 +1935,10 @@ public: DeclaratorContext getContext() const { return Context; } bool isPrototypeContext() const { - return (Context == DeclaratorContext::PrototypeContext || - Context == DeclaratorContext::ObjCParameterContext || - Context == DeclaratorContext::ObjCResultContext || - Context == DeclaratorContext::LambdaExprParameterContext); + return (Context == DeclaratorContext::Prototype || + Context == DeclaratorContext::ObjCParameter || + Context == DeclaratorContext::ObjCResult || + Context == DeclaratorContext::LambdaExprParameter); } /// Get the source range that spans this declarator. @@ -1966,6 +1982,7 @@ public: Attrs.clear(); AsmLabel = nullptr; InlineStorageUsed = false; + HasInitializer = false; ObjCIvar = false; ObjCWeakProperty = false; CommaLoc = SourceLocation(); @@ -1977,35 +1994,35 @@ public: /// parameter lists. bool mayOmitIdentifier() const { switch (Context) { - case DeclaratorContext::FileContext: - case DeclaratorContext::KNRTypeListContext: - case DeclaratorContext::MemberContext: - case DeclaratorContext::BlockContext: - case DeclaratorContext::ForContext: - case DeclaratorContext::InitStmtContext: - case DeclaratorContext::ConditionContext: + case DeclaratorContext::File: + case DeclaratorContext::KNRTypeList: + case DeclaratorContext::Member: + case DeclaratorContext::Block: + case DeclaratorContext::ForInit: + case DeclaratorContext::SelectionInit: + case DeclaratorContext::Condition: return false; - case DeclaratorContext::TypeNameContext: - case DeclaratorContext::FunctionalCastContext: - case DeclaratorContext::AliasDeclContext: - case DeclaratorContext::AliasTemplateContext: - case DeclaratorContext::PrototypeContext: - case DeclaratorContext::LambdaExprParameterContext: - case DeclaratorContext::ObjCParameterContext: - case DeclaratorContext::ObjCResultContext: - case DeclaratorContext::TemplateParamContext: - case DeclaratorContext::CXXNewContext: - case DeclaratorContext::CXXCatchContext: - case DeclaratorContext::ObjCCatchContext: - case DeclaratorContext::BlockLiteralContext: - case DeclaratorContext::LambdaExprContext: - case DeclaratorContext::ConversionIdContext: - case DeclaratorContext::TemplateArgContext: - case DeclaratorContext::TemplateTypeArgContext: - case DeclaratorContext::TrailingReturnContext: - case DeclaratorContext::TrailingReturnVarContext: - case DeclaratorContext::RequiresExprContext: + case DeclaratorContext::TypeName: + case DeclaratorContext::FunctionalCast: + case DeclaratorContext::AliasDecl: + case DeclaratorContext::AliasTemplate: + case DeclaratorContext::Prototype: + case DeclaratorContext::LambdaExprParameter: + case DeclaratorContext::ObjCParameter: + case DeclaratorContext::ObjCResult: + case DeclaratorContext::TemplateParam: + case DeclaratorContext::CXXNew: + case DeclaratorContext::CXXCatch: + case DeclaratorContext::ObjCCatch: + case DeclaratorContext::BlockLiteral: + case DeclaratorContext::LambdaExpr: + case DeclaratorContext::ConversionId: + case DeclaratorContext::TemplateArg: + case DeclaratorContext::TemplateTypeArg: + case DeclaratorContext::TrailingReturn: + case DeclaratorContext::TrailingReturnVar: + case DeclaratorContext::RequiresExpr: return true; } llvm_unreachable("unknown context kind!"); @@ -2016,35 +2033,35 @@ public: /// typenames. bool mayHaveIdentifier() const { switch (Context) { - case DeclaratorContext::FileContext: - case DeclaratorContext::KNRTypeListContext: - case DeclaratorContext::MemberContext: - case DeclaratorContext::BlockContext: - case DeclaratorContext::ForContext: - case DeclaratorContext::InitStmtContext: - case DeclaratorContext::ConditionContext: - case DeclaratorContext::PrototypeContext: - case DeclaratorContext::LambdaExprParameterContext: - case DeclaratorContext::TemplateParamContext: - case DeclaratorContext::CXXCatchContext: - case DeclaratorContext::ObjCCatchContext: - case DeclaratorContext::RequiresExprContext: + case DeclaratorContext::File: + case DeclaratorContext::KNRTypeList: + case DeclaratorContext::Member: + case DeclaratorContext::Block: + case DeclaratorContext::ForInit: + case DeclaratorContext::SelectionInit: + case DeclaratorContext::Condition: + case DeclaratorContext::Prototype: + case DeclaratorContext::LambdaExprParameter: + case DeclaratorContext::TemplateParam: + case DeclaratorContext::CXXCatch: + case DeclaratorContext::ObjCCatch: + case DeclaratorContext::RequiresExpr: return true; - case DeclaratorContext::TypeNameContext: - case DeclaratorContext::FunctionalCastContext: - case DeclaratorContext::CXXNewContext: - case DeclaratorContext::AliasDeclContext: - case DeclaratorContext::AliasTemplateContext: - case DeclaratorContext::ObjCParameterContext: - case DeclaratorContext::ObjCResultContext: - case DeclaratorContext::BlockLiteralContext: - case DeclaratorContext::LambdaExprContext: - case DeclaratorContext::ConversionIdContext: - case DeclaratorContext::TemplateArgContext: - case DeclaratorContext::TemplateTypeArgContext: - case DeclaratorContext::TrailingReturnContext: - case DeclaratorContext::TrailingReturnVarContext: + case DeclaratorContext::TypeName: + case DeclaratorContext::FunctionalCast: + case DeclaratorContext::CXXNew: + case DeclaratorContext::AliasDecl: + case DeclaratorContext::AliasTemplate: + case DeclaratorContext::ObjCParameter: + case DeclaratorContext::ObjCResult: + case DeclaratorContext::BlockLiteral: + case DeclaratorContext::LambdaExpr: + case DeclaratorContext::ConversionId: + case DeclaratorContext::TemplateArg: + case DeclaratorContext::TemplateTypeArg: + case DeclaratorContext::TrailingReturn: + case DeclaratorContext::TrailingReturnVar: return false; } llvm_unreachable("unknown context kind!"); @@ -2053,41 +2070,41 @@ public: /// Return true if the context permits a C++17 decomposition declarator. bool mayHaveDecompositionDeclarator() const { switch (Context) { - case DeclaratorContext::FileContext: + case DeclaratorContext::File: // FIXME: It's not clear that the proposal meant to allow file-scope // structured bindings, but it does. - case DeclaratorContext::BlockContext: - case DeclaratorContext::ForContext: - case DeclaratorContext::InitStmtContext: - case DeclaratorContext::ConditionContext: + case DeclaratorContext::Block: + case DeclaratorContext::ForInit: + case DeclaratorContext::SelectionInit: + case DeclaratorContext::Condition: return true; - case DeclaratorContext::MemberContext: - case DeclaratorContext::PrototypeContext: - case DeclaratorContext::TemplateParamContext: - case DeclaratorContext::RequiresExprContext: + case DeclaratorContext::Member: + case DeclaratorContext::Prototype: + case DeclaratorContext::TemplateParam: + case DeclaratorContext::RequiresExpr: // Maybe one day... return false; // These contexts don't allow any kind of non-abstract declarator. - case DeclaratorContext::KNRTypeListContext: - case DeclaratorContext::TypeNameContext: - case DeclaratorContext::FunctionalCastContext: - case DeclaratorContext::AliasDeclContext: - case DeclaratorContext::AliasTemplateContext: - case DeclaratorContext::LambdaExprParameterContext: - case DeclaratorContext::ObjCParameterContext: - case DeclaratorContext::ObjCResultContext: - case DeclaratorContext::CXXNewContext: - case DeclaratorContext::CXXCatchContext: - case DeclaratorContext::ObjCCatchContext: - case DeclaratorContext::BlockLiteralContext: - case DeclaratorContext::LambdaExprContext: - case DeclaratorContext::ConversionIdContext: - case DeclaratorContext::TemplateArgContext: - case DeclaratorContext::TemplateTypeArgContext: - case DeclaratorContext::TrailingReturnContext: - case DeclaratorContext::TrailingReturnVarContext: + case DeclaratorContext::KNRTypeList: + case DeclaratorContext::TypeName: + case DeclaratorContext::FunctionalCast: + case DeclaratorContext::AliasDecl: + case DeclaratorContext::AliasTemplate: + case DeclaratorContext::LambdaExprParameter: + case DeclaratorContext::ObjCParameter: + case DeclaratorContext::ObjCResult: + case DeclaratorContext::CXXNew: + case DeclaratorContext::CXXCatch: + case DeclaratorContext::ObjCCatch: + case DeclaratorContext::BlockLiteral: + case DeclaratorContext::LambdaExpr: + case DeclaratorContext::ConversionId: + case DeclaratorContext::TemplateArg: + case DeclaratorContext::TemplateTypeArg: + case DeclaratorContext::TrailingReturn: + case DeclaratorContext::TrailingReturnVar: return false; } llvm_unreachable("unknown context kind!"); @@ -2102,7 +2119,7 @@ public: return false; if (getDeclSpec().getStorageClassSpec() == DeclSpec::SCS_extern && - Context != DeclaratorContext::FileContext) + Context != DeclaratorContext::File) return false; // Special names can't have direct initializers. @@ -2110,40 +2127,40 @@ public: return false; switch (Context) { - case DeclaratorContext::FileContext: - case DeclaratorContext::BlockContext: - case DeclaratorContext::ForContext: - case DeclaratorContext::InitStmtContext: - case DeclaratorContext::TrailingReturnVarContext: + case DeclaratorContext::File: + case DeclaratorContext::Block: + case DeclaratorContext::ForInit: + case DeclaratorContext::SelectionInit: + case DeclaratorContext::TrailingReturnVar: return true; - case DeclaratorContext::ConditionContext: + case DeclaratorContext::Condition: // This may not be followed by a direct initializer, but it can't be a // function declaration either, and we'd prefer to perform a tentative // parse in order to produce the right diagnostic. return true; - case DeclaratorContext::KNRTypeListContext: - case DeclaratorContext::MemberContext: - case DeclaratorContext::PrototypeContext: - case DeclaratorContext::LambdaExprParameterContext: - case DeclaratorContext::ObjCParameterContext: - case DeclaratorContext::ObjCResultContext: - case DeclaratorContext::TemplateParamContext: - case DeclaratorContext::CXXCatchContext: - case DeclaratorContext::ObjCCatchContext: - case DeclaratorContext::TypeNameContext: - case DeclaratorContext::FunctionalCastContext: // FIXME - case DeclaratorContext::CXXNewContext: - case DeclaratorContext::AliasDeclContext: - case DeclaratorContext::AliasTemplateContext: - case DeclaratorContext::BlockLiteralContext: - case DeclaratorContext::LambdaExprContext: - case DeclaratorContext::ConversionIdContext: - case DeclaratorContext::TemplateArgContext: - case DeclaratorContext::TemplateTypeArgContext: - case DeclaratorContext::TrailingReturnContext: - case DeclaratorContext::RequiresExprContext: + case DeclaratorContext::KNRTypeList: + case DeclaratorContext::Member: + case DeclaratorContext::Prototype: + case DeclaratorContext::LambdaExprParameter: + case DeclaratorContext::ObjCParameter: + case DeclaratorContext::ObjCResult: + case DeclaratorContext::TemplateParam: + case DeclaratorContext::CXXCatch: + case DeclaratorContext::ObjCCatch: + case DeclaratorContext::TypeName: + case DeclaratorContext::FunctionalCast: // FIXME + case DeclaratorContext::CXXNew: + case DeclaratorContext::AliasDecl: + case DeclaratorContext::AliasTemplate: + case DeclaratorContext::BlockLiteral: + case DeclaratorContext::LambdaExpr: + case DeclaratorContext::ConversionId: + case DeclaratorContext::TemplateArg: + case DeclaratorContext::TemplateTypeArg: + case DeclaratorContext::TrailingReturn: + case DeclaratorContext::RequiresExpr: return false; } llvm_unreachable("unknown context kind!"); @@ -2337,35 +2354,35 @@ public: return false; switch (Context) { - case DeclaratorContext::FileContext: - case DeclaratorContext::MemberContext: - case DeclaratorContext::BlockContext: - case DeclaratorContext::ForContext: - case DeclaratorContext::InitStmtContext: + case DeclaratorContext::File: + case DeclaratorContext::Member: + case DeclaratorContext::Block: + case DeclaratorContext::ForInit: + case DeclaratorContext::SelectionInit: return true; - case DeclaratorContext::ConditionContext: - case DeclaratorContext::KNRTypeListContext: - case DeclaratorContext::TypeNameContext: - case DeclaratorContext::FunctionalCastContext: - case DeclaratorContext::AliasDeclContext: - case DeclaratorContext::AliasTemplateContext: - case DeclaratorContext::PrototypeContext: - case DeclaratorContext::LambdaExprParameterContext: - case DeclaratorContext::ObjCParameterContext: - case DeclaratorContext::ObjCResultContext: - case DeclaratorContext::TemplateParamContext: - case DeclaratorContext::CXXNewContext: - case DeclaratorContext::CXXCatchContext: - case DeclaratorContext::ObjCCatchContext: - case DeclaratorContext::BlockLiteralContext: - case DeclaratorContext::LambdaExprContext: - case DeclaratorContext::ConversionIdContext: - case DeclaratorContext::TemplateArgContext: - case DeclaratorContext::TemplateTypeArgContext: - case DeclaratorContext::TrailingReturnContext: - case DeclaratorContext::TrailingReturnVarContext: - case DeclaratorContext::RequiresExprContext: + case DeclaratorContext::Condition: + case DeclaratorContext::KNRTypeList: + case DeclaratorContext::TypeName: + case DeclaratorContext::FunctionalCast: + case DeclaratorContext::AliasDecl: + case DeclaratorContext::AliasTemplate: + case DeclaratorContext::Prototype: + case DeclaratorContext::LambdaExprParameter: + case DeclaratorContext::ObjCParameter: + case DeclaratorContext::ObjCResult: + case DeclaratorContext::TemplateParam: + case DeclaratorContext::CXXNew: + case DeclaratorContext::CXXCatch: + case DeclaratorContext::ObjCCatch: + case DeclaratorContext::BlockLiteral: + case DeclaratorContext::LambdaExpr: + case DeclaratorContext::ConversionId: + case DeclaratorContext::TemplateArg: + case DeclaratorContext::TemplateTypeArg: + case DeclaratorContext::TrailingReturn: + case DeclaratorContext::TrailingReturnVar: + case DeclaratorContext::RequiresExpr: return false; } llvm_unreachable("unknown context kind!"); @@ -2375,38 +2392,38 @@ public: /// expression could appear. bool isExpressionContext() const { switch (Context) { - case DeclaratorContext::FileContext: - case DeclaratorContext::KNRTypeListContext: - case DeclaratorContext::MemberContext: + case DeclaratorContext::File: + case DeclaratorContext::KNRTypeList: + case DeclaratorContext::Member: // FIXME: sizeof(...) permits an expression. - case DeclaratorContext::TypeNameContext: - - case DeclaratorContext::FunctionalCastContext: - case DeclaratorContext::AliasDeclContext: - case DeclaratorContext::AliasTemplateContext: - case DeclaratorContext::PrototypeContext: - case DeclaratorContext::LambdaExprParameterContext: - case DeclaratorContext::ObjCParameterContext: - case DeclaratorContext::ObjCResultContext: - case DeclaratorContext::TemplateParamContext: - case DeclaratorContext::CXXNewContext: - case DeclaratorContext::CXXCatchContext: - case DeclaratorContext::ObjCCatchContext: - case DeclaratorContext::BlockLiteralContext: - case DeclaratorContext::LambdaExprContext: - case DeclaratorContext::ConversionIdContext: - case DeclaratorContext::TrailingReturnContext: - case DeclaratorContext::TrailingReturnVarContext: - case DeclaratorContext::TemplateTypeArgContext: - case DeclaratorContext::RequiresExprContext: + case DeclaratorContext::TypeName: + + case DeclaratorContext::FunctionalCast: + case DeclaratorContext::AliasDecl: + case DeclaratorContext::AliasTemplate: + case DeclaratorContext::Prototype: + case DeclaratorContext::LambdaExprParameter: + case DeclaratorContext::ObjCParameter: + case DeclaratorContext::ObjCResult: + case DeclaratorContext::TemplateParam: + case DeclaratorContext::CXXNew: + case DeclaratorContext::CXXCatch: + case DeclaratorContext::ObjCCatch: + case DeclaratorContext::BlockLiteral: + case DeclaratorContext::LambdaExpr: + case DeclaratorContext::ConversionId: + case DeclaratorContext::TrailingReturn: + case DeclaratorContext::TrailingReturnVar: + case DeclaratorContext::TemplateTypeArg: + case DeclaratorContext::RequiresExpr: return false; - case DeclaratorContext::BlockContext: - case DeclaratorContext::ForContext: - case DeclaratorContext::InitStmtContext: - case DeclaratorContext::ConditionContext: - case DeclaratorContext::TemplateArgContext: + case DeclaratorContext::Block: + case DeclaratorContext::ForInit: + case DeclaratorContext::SelectionInit: + case DeclaratorContext::Condition: + case DeclaratorContext::TemplateArg: return true; } @@ -2448,6 +2465,8 @@ public: /// \brief Sets a trailing requires clause for this declarator. void setTrailingRequiresClause(Expr *TRC) { TrailingRequiresClause = TRC; + + SetRangeEnd(TRC->getEndLoc()); } /// \brief Sets a trailing requires clause for this declarator. @@ -2551,20 +2570,23 @@ public: void setEllipsisLoc(SourceLocation EL) { EllipsisLoc = EL; } void setFunctionDefinitionKind(FunctionDefinitionKind Val) { - FunctionDefinition = Val; + FunctionDefinition = static_cast<unsigned>(Val); } bool isFunctionDefinition() const { - return getFunctionDefinitionKind() != FDK_Declaration; + return getFunctionDefinitionKind() != FunctionDefinitionKind::Declaration; } FunctionDefinitionKind getFunctionDefinitionKind() const { return (FunctionDefinitionKind)FunctionDefinition; } + void setHasInitializer(bool Val = true) { HasInitializer = Val; } + bool hasInitializer() const { return HasInitializer; } + /// Returns true if this declares a real member and not a friend. bool isFirstDeclarationOfMember() { - return getContext() == DeclaratorContext::MemberContext && + return getContext() == DeclaratorContext::Member && !getDeclSpec().isFriendSpecified(); } @@ -2586,8 +2608,7 @@ struct FieldDeclarator { Declarator D; Expr *BitfieldSize; explicit FieldDeclarator(const DeclSpec &DS) - : D(DS, DeclaratorContext::MemberContext), - BitfieldSize(nullptr) {} + : D(DS, DeclaratorContext::Member), BitfieldSize(nullptr) {} }; /// Represents a C++11 virt-specifier-seq. |