diff options
Diffstat (limited to 'lib/Parse/ParseDecl.cpp')
| -rw-r--r-- | lib/Parse/ParseDecl.cpp | 35 | 
1 files changed, 20 insertions, 15 deletions
| diff --git a/lib/Parse/ParseDecl.cpp b/lib/Parse/ParseDecl.cpp index d0ce9fc89583..07054546f42f 100644 --- a/lib/Parse/ParseDecl.cpp +++ b/lib/Parse/ParseDecl.cpp @@ -71,11 +71,18 @@ TypeResult Parser::ParseTypeName(SourceRange *Range,    return Actions.ActOnTypeName(getCurScope(), DeclaratorInfo);  } +/// \brief Normalizes an attribute name by dropping prefixed and suffixed __. +static StringRef normalizeAttrName(StringRef Name) { +  if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__")) +    return Name.drop_front(2).drop_back(2); +  return Name; +} +  /// isAttributeLateParsed - Return true if the attribute has arguments that  /// require late parsing.  static bool isAttributeLateParsed(const IdentifierInfo &II) {  #define CLANG_ATTR_LATE_PARSED_LIST -    return llvm::StringSwitch<bool>(II.getName()) +    return llvm::StringSwitch<bool>(normalizeAttrName(II.getName()))  #include "clang/Parse/AttrParserStringSwitches.inc"          .Default(false);  #undef CLANG_ATTR_LATE_PARSED_LIST @@ -200,13 +207,6 @@ void Parser::ParseGNUAttributes(ParsedAttributes &attrs,    }  } -/// \brief Normalizes an attribute name by dropping prefixed and suffixed __. -static StringRef normalizeAttrName(StringRef Name) { -  if (Name.size() >= 4 && Name.startswith("__") && Name.endswith("__")) -    Name = Name.drop_front(2).drop_back(2); -  return Name; -} -  /// \brief Determine whether the given attribute has an identifier argument.  static bool attributeHasIdentifierArg(const IdentifierInfo &II) {  #define CLANG_ATTR_IDENTIFIER_ARG_LIST @@ -4319,8 +4319,15 @@ void Parser::ParseEnumSpecifier(SourceLocation StartLoc, DeclSpec &DS,      return;    } -  if (Tok.is(tok::l_brace) && TUK != Sema::TUK_Reference) -    ParseEnumBody(StartLoc, TagDecl); +  if (Tok.is(tok::l_brace) && TUK != Sema::TUK_Reference) { +    Decl *D = SkipBody.CheckSameAsPrevious ? SkipBody.New : TagDecl; +    ParseEnumBody(StartLoc, D); +    if (SkipBody.CheckSameAsPrevious && +        !Actions.ActOnDuplicateDefinition(DS, TagDecl, SkipBody)) { +      DS.SetTypeSpecError(); +      return; +    } +  }    if (DS.SetTypeSpecType(DeclSpec::TST_enum, StartLoc,                           NameLoc.isValid() ? NameLoc : StartLoc, @@ -4392,11 +4399,9 @@ void Parser::ParseEnumBody(SourceLocation StartLoc, Decl *EnumDecl) {      }      // Install the enumerator constant into EnumDecl. -    Decl *EnumConstDecl = Actions.ActOnEnumConstant(getCurScope(), EnumDecl, -                                                    LastEnumConstDecl, -                                                    IdentLoc, Ident, -                                                    attrs.getList(), EqualLoc, -                                                    AssignedVal.get()); +    Decl *EnumConstDecl = Actions.ActOnEnumConstant( +        getCurScope(), EnumDecl, LastEnumConstDecl, IdentLoc, Ident, +        attrs.getList(), EqualLoc, AssignedVal.get());      EnumAvailabilityDiags.back().done();      EnumConstantDecls.push_back(EnumConstDecl); | 
