forked from OSchip/llvm-project
Sema: Disallow inheriting from classes with flexible array members
Flexible array members inherently index off of the end of their parent type. We shouldn't allow this type to be used as a base, virtual or otherwise, because indexing off the end may find us inside of another base or the derived types members. llvm-svn: 193923
This commit is contained in:
parent
4589760efd
commit
9b1754d058
|
@ -5885,6 +5885,8 @@ def err_base_must_be_class : Error<"base specifier must name a class">;
|
||||||
def err_union_as_base_class : Error<"unions cannot be base classes">;
|
def err_union_as_base_class : Error<"unions cannot be base classes">;
|
||||||
def err_circular_inheritance : Error<
|
def err_circular_inheritance : Error<
|
||||||
"circular inheritance between %0 and %1">;
|
"circular inheritance between %0 and %1">;
|
||||||
|
def err_base_class_has_flexible_array_member : Error<
|
||||||
|
"base class %0 has a flexible array member">;
|
||||||
def err_incomplete_base_class : Error<"base class has incomplete type">;
|
def err_incomplete_base_class : Error<"base class has incomplete type">;
|
||||||
def err_duplicate_base_class : Error<
|
def err_duplicate_base_class : Error<
|
||||||
"base class %0 specified more than once as a direct base class">;
|
"base class %0 specified more than once as a direct base class">;
|
||||||
|
|
|
@ -1370,6 +1370,18 @@ Sema::CheckBaseSpecifier(CXXRecordDecl *Class,
|
||||||
CXXRecordDecl *CXXBaseDecl = cast<CXXRecordDecl>(BaseDecl);
|
CXXRecordDecl *CXXBaseDecl = cast<CXXRecordDecl>(BaseDecl);
|
||||||
assert(CXXBaseDecl && "Base type is not a C++ type");
|
assert(CXXBaseDecl && "Base type is not a C++ type");
|
||||||
|
|
||||||
|
// A class which contains a flexible array member is not suitable for use as a
|
||||||
|
// base class:
|
||||||
|
// - If the layout determines that a base comes before another base,
|
||||||
|
// the flexible array member would index into the subsequent base.
|
||||||
|
// - If the layout determines that base comes before the derived class,
|
||||||
|
// the flexible array member would index into the derived class.
|
||||||
|
if (CXXBaseDecl->hasFlexibleArrayMember()) {
|
||||||
|
Diag(BaseLoc, diag::err_base_class_has_flexible_array_member)
|
||||||
|
<< CXXBaseDecl->getDeclName();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// C++ [class]p3:
|
// C++ [class]p3:
|
||||||
// If a class is marked final and it appears as a base-type-specifier in
|
// If a class is marked final and it appears as a base-type-specifier in
|
||||||
// base-clause, the program is ill-formed.
|
// base-clause, the program is ill-formed.
|
||||||
|
|
Loading…
Reference in New Issue