diff options
Diffstat (limited to 'include/clang/Sema/DeclSpec.h')
| -rw-r--r-- | include/clang/Sema/DeclSpec.h | 120 | 
1 files changed, 100 insertions, 20 deletions
diff --git a/include/clang/Sema/DeclSpec.h b/include/clang/Sema/DeclSpec.h index 059919a35bb00..8f6bd186a7dc6 100644 --- a/include/clang/Sema/DeclSpec.h +++ b/include/clang/Sema/DeclSpec.h @@ -337,6 +337,7 @@ private:    // function-specifier    unsigned FS_inline_specified : 1; +  unsigned FS_forceinline_specified: 1;    unsigned FS_virtual_specified : 1;    unsigned FS_explicit_specified : 1;    unsigned FS_noreturn_specified : 1; @@ -381,6 +382,7 @@ private:    SourceRange TypeofParensRange;    SourceLocation TQ_constLoc, TQ_restrictLoc, TQ_volatileLoc, TQ_atomicLoc;    SourceLocation FS_inlineLoc, FS_virtualLoc, FS_explicitLoc, FS_noreturnLoc; +  SourceLocation FS_forceinlineLoc;    SourceLocation FriendLoc, ModulePrivateLoc, ConstexprLoc;    WrittenBuiltinSpecs writtenBS; @@ -419,6 +421,7 @@ public:        TypeSpecOwned(false),        TypeQualifiers(TQ_unspecified),        FS_inline_specified(false), +      FS_forceinline_specified(false),        FS_virtual_specified(false),        FS_explicit_specified(false),        FS_noreturn_specified(false), @@ -458,6 +461,12 @@ public:      ThreadStorageClassSpecLoc  = SourceLocation();    } +  void ClearTypeSpecType() { +    TypeSpecType = DeclSpec::TST_unspecified; +    TypeSpecOwned = false; +    TSTLoc = SourceLocation(); +  } +    // type-specifier    TSW getTypeSpecWidth() const { return (TSW)TypeSpecWidth; }    TSC getTypeSpecComplex() const { return (TSC)TypeSpecComplex; } @@ -504,6 +513,8 @@ public:      return TypeSpecType == TST_auto || TypeSpecType == TST_decltype_auto;    } +  bool hasTagDefinition() const; +    /// \brief Turn a type-specifier-type into a string like "_Bool" or "union".    static const char *getSpecifierName(DeclSpec::TST T);    static const char *getSpecifierName(DeclSpec::TQ Q); @@ -532,8 +543,12 @@ public:    }    // function-specifier -  bool isInlineSpecified() const { return FS_inline_specified; } -  SourceLocation getInlineSpecLoc() const { return FS_inlineLoc; } +  bool isInlineSpecified() const { +    return FS_inline_specified | FS_forceinline_specified; +  } +  SourceLocation getInlineSpecLoc() const { +    return FS_inline_specified ? FS_inlineLoc : FS_forceinlineLoc; +  }    bool isVirtualSpecified() const { return FS_virtual_specified; }    SourceLocation getVirtualSpecLoc() const { return FS_virtualLoc; } @@ -547,6 +562,8 @@ public:    void ClearFunctionSpecs() {      FS_inline_specified = false;      FS_inlineLoc = SourceLocation(); +    FS_forceinline_specified = false; +    FS_forceinlineLoc = SourceLocation();      FS_virtual_specified = false;      FS_virtualLoc = SourceLocation();      FS_explicit_specified = false; @@ -615,6 +632,8 @@ public:                         const char *&PrevSpec, unsigned &DiagID);    bool SetTypeAltiVecPixel(bool isAltiVecPixel, SourceLocation Loc,                         const char *&PrevSpec, unsigned &DiagID); +  bool SetTypeAltiVecBool(bool isAltiVecBool, SourceLocation Loc, +                       const char *&PrevSpec, unsigned &DiagID);    bool SetTypeSpecError();    void UpdateDeclRep(Decl *Rep) {      assert(isDeclRep((TST) TypeSpecType)); @@ -632,10 +651,16 @@ public:    bool SetTypeQual(TQ T, SourceLocation Loc, const char *&PrevSpec,                     unsigned &DiagID, const LangOptions &Lang); -  bool setFunctionSpecInline(SourceLocation Loc); -  bool setFunctionSpecVirtual(SourceLocation Loc); -  bool setFunctionSpecExplicit(SourceLocation Loc); -  bool setFunctionSpecNoreturn(SourceLocation Loc); +  bool setFunctionSpecInline(SourceLocation Loc, const char *&PrevSpec, +                             unsigned &DiagID); +  bool setFunctionSpecForceInline(SourceLocation Loc, const char *&PrevSpec, +                                  unsigned &DiagID); +  bool setFunctionSpecVirtual(SourceLocation Loc, const char *&PrevSpec, +                              unsigned &DiagID); +  bool setFunctionSpecExplicit(SourceLocation Loc, const char *&PrevSpec, +                               unsigned &DiagID); +  bool setFunctionSpecNoreturn(SourceLocation Loc, const char *&PrevSpec, +                               unsigned &DiagID);    bool SetFriendSpec(SourceLocation Loc, const char *&PrevSpec,                       unsigned &DiagID); @@ -1500,6 +1525,7 @@ public:      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.      TemplateTypeArgContext, // Template type argument. @@ -1575,7 +1601,6 @@ public:    ~Declarator() {      clear();    } -    /// getDeclSpec - Return the declaration-specifier that this declarator was    /// declared with.    const DeclSpec &getDeclSpec() const { return DS; } @@ -1604,7 +1629,8 @@ public:    bool isPrototypeContext() const {      return (Context == PrototypeContext ||              Context == ObjCParameterContext || -            Context == ObjCResultContext); +            Context == ObjCResultContext || +            Context == LambdaExprParameterContext);    }    /// \brief Get the source range that spans this declarator. @@ -1668,6 +1694,7 @@ public:      case AliasDeclContext:      case AliasTemplateContext:      case PrototypeContext: +    case LambdaExprParameterContext:      case ObjCParameterContext:      case ObjCResultContext:      case TemplateParamContext: @@ -1696,6 +1723,7 @@ public:      case ForContext:      case ConditionContext:      case PrototypeContext: +    case LambdaExprParameterContext:      case TemplateParamContext:      case CXXCatchContext:      case ObjCCatchContext: @@ -1717,6 +1745,39 @@ public:      llvm_unreachable("unknown context kind!");    } +  /// diagnoseIdentifier - Return true if the identifier is prohibited and +  /// should be diagnosed (because it cannot be anything else). +  bool diagnoseIdentifier() const { +    switch (Context) { +    case FileContext: +    case KNRTypeListContext: +    case MemberContext: +    case BlockContext: +    case ForContext: +    case ConditionContext: +    case PrototypeContext: +    case LambdaExprParameterContext: +    case TemplateParamContext: +    case CXXCatchContext: +    case ObjCCatchContext: +    case TypeNameContext: +    case ConversionIdContext: +    case ObjCParameterContext: +    case ObjCResultContext: +    case BlockLiteralContext: +    case CXXNewContext: +    case LambdaExprContext: +      return false; + +    case AliasDeclContext: +    case AliasTemplateContext: +    case TemplateTypeArgContext: +    case TrailingReturnContext: +      return true; +    } +    llvm_unreachable("unknown context kind!"); +  } +    /// mayBeFollowedByCXXDirectInit - Return true if the declarator can be    /// followed by a C++ direct initializer, e.g. "int x(1);".    bool mayBeFollowedByCXXDirectInit() const { @@ -1748,6 +1809,7 @@ public:      case KNRTypeListContext:      case MemberContext:      case PrototypeContext: +    case LambdaExprParameterContext:      case ObjCParameterContext:      case ObjCResultContext:      case TemplateParamContext: @@ -1934,6 +1996,7 @@ public:      case AliasDeclContext:      case AliasTemplateContext:      case PrototypeContext: +    case LambdaExprParameterContext:      case ObjCParameterContext:      case ObjCResultContext:      case TemplateParamContext: @@ -1995,7 +2058,7 @@ public:    /// \brief Return a source range list of C++11 attributes associated    /// with the declarator. -  void getCXX11AttributeRanges(SmallVector<SourceRange, 4> &Ranges) { +  void getCXX11AttributeRanges(SmallVectorImpl<SourceRange> &Ranges) {      AttributeList *AttrList = Attrs.getList();      while (AttrList) {        if (AttrList->isCXX11Attribute()) @@ -2038,6 +2101,16 @@ public:      return (FunctionDefinitionKind)FunctionDefinition;     } +  /// Returns true if this declares a real member and not a friend. +  bool isFirstDeclarationOfMember() { +    return getContext() == MemberContext && !getDeclSpec().isFriendSpecified(); +  } + +  /// Returns true if this declares a static member.  This cannot be called on a +  /// declarator outside of a MemberContext because we won't know until +  /// redeclaration time if the decl is static. +  bool isStaticMember(); +    void setRedeclaration(bool Val) { Redeclaration = Val; }    bool isRedeclaration() const { return Redeclaration; }  }; @@ -2057,7 +2130,8 @@ public:    enum Specifier {      VS_None = 0,      VS_Override = 1, -    VS_Final = 2 +    VS_Final = 2, +    VS_Sealed = 4    };    VirtSpecifiers() : Specifiers(0) { } @@ -2068,7 +2142,8 @@ public:    bool isOverrideSpecified() const { return Specifiers & VS_Override; }    SourceLocation getOverrideLoc() const { return VS_overrideLoc; } -  bool isFinalSpecified() const { return Specifiers & VS_Final; } +  bool isFinalSpecified() const { return Specifiers & (VS_Final | VS_Sealed); } +  bool isFinalSpelledSealed() const { return Specifiers & VS_Sealed; }    SourceLocation getFinalLoc() const { return VS_finalLoc; }    void clear() { Specifiers = 0; } @@ -2088,13 +2163,16 @@ private:  struct LambdaCapture {    LambdaCaptureKind Kind;    SourceLocation Loc; -  IdentifierInfo* Id; +  IdentifierInfo *Id;    SourceLocation EllipsisLoc; -   +  ExprResult Init; +  ParsedType InitCaptureType;    LambdaCapture(LambdaCaptureKind Kind, SourceLocation Loc, -                IdentifierInfo* Id = 0, -                SourceLocation EllipsisLoc = SourceLocation()) -    : Kind(Kind), Loc(Loc), Id(Id), EllipsisLoc(EllipsisLoc) +                IdentifierInfo* Id, +                SourceLocation EllipsisLoc, +                ExprResult Init, ParsedType InitCaptureType) +    : Kind(Kind), Loc(Loc), Id(Id), EllipsisLoc(EllipsisLoc), Init(Init), +        InitCaptureType(InitCaptureType)    {}  }; @@ -2111,11 +2189,13 @@ struct LambdaIntroducer {    /// \brief Append a capture in a lambda introducer.    void addCapture(LambdaCaptureKind Kind,                    SourceLocation Loc, -                  IdentifierInfo* Id = 0,  -                  SourceLocation EllipsisLoc = SourceLocation()) { -    Captures.push_back(LambdaCapture(Kind, Loc, Id, EllipsisLoc)); +                  IdentifierInfo* Id, +                  SourceLocation EllipsisLoc, +                  ExprResult Init,  +                  ParsedType InitCaptureType) { +    Captures.push_back(LambdaCapture(Kind, Loc, Id, EllipsisLoc, Init,  +        InitCaptureType));    } -  };  } // end namespace clang  | 
