diff options
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/AST/Type.cpp | 6 | ||||
| -rw-r--r-- | clang/lib/Parse/DeclSpec.cpp | 1 | ||||
| -rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 16 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaDecl.cpp | 2 | ||||
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 3 |
5 files changed, 21 insertions, 7 deletions
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp index 637061c499b..5040b95e09c 100644 --- a/clang/lib/AST/Type.cpp +++ b/clang/lib/AST/Type.cpp @@ -60,6 +60,12 @@ bool Type::isDerivedType() const { } } +bool Type::isClassType() const { + if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) + if (RT->getDecl()->getKind() == Decl::Class) + return true; + return false; +} bool Type::isStructureType() const { if (const RecordType *RT = dyn_cast<RecordType>(CanonicalType)) if (RT->getDecl()->getKind() == Decl::Struct) diff --git a/clang/lib/Parse/DeclSpec.cpp b/clang/lib/Parse/DeclSpec.cpp index 1cd350893f4..52c6a339543 100644 --- a/clang/lib/Parse/DeclSpec.cpp +++ b/clang/lib/Parse/DeclSpec.cpp @@ -95,6 +95,7 @@ const char *DeclSpec::getSpecifierName(DeclSpec::TST T) { case DeclSpec::TST_decimal64: return "_Decimal64"; case DeclSpec::TST_decimal128: return "_Decimal128"; case DeclSpec::TST_enum: return "enum"; + case DeclSpec::TST_class: return "class"; case DeclSpec::TST_union: return "union"; case DeclSpec::TST_struct: return "struct"; case DeclSpec::TST_typedef: return "typedef"; diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 7eeb64d578b..8a0dcce31c8 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -515,7 +515,8 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS) { case tok::kw__Decimal128: isInvalid = DS.SetTypeSpecType(DeclSpec::TST_decimal128, Loc, PrevSpec); break; - + + case tok::kw_class: case tok::kw_struct: case tok::kw_union: ParseStructUnionSpecifier(DS); @@ -620,9 +621,12 @@ bool Parser::ParseTag(DeclTy *&Decl, unsigned TagType, SourceLocation StartLoc){ /// 'union' /// void Parser::ParseStructUnionSpecifier(DeclSpec &DS) { - assert((Tok.is(tok::kw_struct) || Tok.is(tok::kw_union)) && - "Not a struct/union specifier"); + assert((Tok.is(tok::kw_class) || + Tok.is(tok::kw_struct) || + Tok.is(tok::kw_union)) && + "Not a class/struct/union specifier"); DeclSpec::TST TagType = + Tok.is(tok::kw_class) ? DeclSpec::TST_class : Tok.is(tok::kw_union) ? DeclSpec::TST_union : DeclSpec::TST_struct; SourceLocation StartLoc = ConsumeToken(); @@ -923,7 +927,8 @@ bool Parser::isTypeSpecifierQualifier() const { case tok::kw__Decimal64: case tok::kw__Decimal128: - // struct-or-union-specifier + // struct-or-union-specifier (C99) or class-specifier (C++) + case tok::kw_class: case tok::kw_struct: case tok::kw_union: // enum-specifier @@ -973,7 +978,8 @@ bool Parser::isDeclarationSpecifier() const { case tok::kw__Decimal64: case tok::kw__Decimal128: - // struct-or-union-specifier + // struct-or-union-specifier (C99) or class-specifier (C++) + case tok::kw_class: case tok::kw_struct: case tok::kw_union: // enum-specifier diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 7a86a8e7d3d..c47a027fece 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -1299,7 +1299,7 @@ Sema::DeclTy *Sema::ActOnTag(Scope *S, unsigned TagType, TagKind TK, default: assert(0 && "Unknown tag type!"); case DeclSpec::TST_struct: Kind = Decl::Struct; break; case DeclSpec::TST_union: Kind = Decl::Union; break; -//case DeclSpec::TST_class: Kind = Decl::Class; break; + case DeclSpec::TST_class: Kind = Decl::Class; break; case DeclSpec::TST_enum: Kind = Decl::Enum; break; } diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 5e155f88170..223cb566366 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -95,11 +95,12 @@ QualType Sema::ConvertDeclSpecToType(DeclSpec &DS) { case DeclSpec::TST_decimal64: // _Decimal64 case DeclSpec::TST_decimal128: // _Decimal128 assert(0 && "FIXME: GNU decimal extensions not supported yet!"); + case DeclSpec::TST_class: case DeclSpec::TST_enum: case DeclSpec::TST_union: case DeclSpec::TST_struct: { Decl *D = static_cast<Decl *>(DS.getTypeRep()); - assert(D && "Didn't get a decl for a enum/union/struct?"); + assert(D && "Didn't get a decl for a class/enum/union/struct?"); assert(DS.getTypeSpecWidth() == 0 && DS.getTypeSpecComplex() == 0 && DS.getTypeSpecSign() == 0 && "Can't handle qualifiers on typedef names yet!"); |

