forked from OSchip/llvm-project
parent
cafbab7443
commit
65c76d3826
|
@ -810,7 +810,7 @@ void Parser::ParseClassSpecifier(tok::TokenKind TagTokKind,
|
|||
// There are four options here. If we have 'struct foo;', then this
|
||||
// is either a forward declaration or a friend declaration, which
|
||||
// have to be treated differently. If we have 'struct foo {...',
|
||||
// 'struct foo :...' or 'struct foo <class-virt-specifier>' then this is a
|
||||
// 'struct foo :...' or 'struct foo final[opt]' then this is a
|
||||
// definition. Otherwise we have something like 'struct foo xyz', a reference.
|
||||
// However, in some contexts, things look like declarations but are just
|
||||
// references, e.g.
|
||||
|
|
|
@ -563,10 +563,9 @@ Sema::CheckBaseSpecifier(CXXRecordDecl *Class,
|
|||
CXXRecordDecl * CXXBaseDecl = cast<CXXRecordDecl>(BaseDecl);
|
||||
assert(CXXBaseDecl && "Base type is not a C++ type");
|
||||
|
||||
// C++ [class.derived]p2:
|
||||
// If a class is marked with the class-virt-specifier final and it appears
|
||||
// as a base-type-specifier in a base-clause (10 class.derived), the program
|
||||
// is ill-formed.
|
||||
// C++ [class]p3:
|
||||
// If a class is marked final and it appears as a base-type-specifier in
|
||||
// base-clause, the program is ill-formed.
|
||||
if (CXXBaseDecl->hasAttr<FinalAttr>()) {
|
||||
Diag(BaseLoc, diag::err_class_marked_final_used_as_base)
|
||||
<< CXXBaseDecl->getDeclName();
|
||||
|
|
Loading…
Reference in New Issue