mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 20:23:39 +08:00
Diagnose __builtin_offsetof on incomplete types. Fixes
rdar://problem/7222956 llvm-svn: 85999
This commit is contained in:
@@ -1378,6 +1378,8 @@ def err_alignof_incomplete_type : Error<
|
||||
"invalid application of '__alignof' to an incomplete type %0">;
|
||||
def err_sizeof_alignof_bitfield : Error<
|
||||
"invalid application of '%select{sizeof|__alignof}0' to bit-field">;
|
||||
def err_offsetof_incomplete_type : Error<
|
||||
"offsetof of incomplete type %0">;
|
||||
def err_offsetof_record_type : Error<
|
||||
"offsetof requires struct, union, or class type, %0 invalid">;
|
||||
def err_offsetof_array_type : Error<"offsetof requires array type, %0 invalid">;
|
||||
|
||||
@@ -5707,6 +5707,10 @@ Sema::OwningExprResult Sema::ActOnBuiltinOffsetOf(Scope *S,
|
||||
if (!Dependent) {
|
||||
bool DidWarnAboutNonPOD = false;
|
||||
|
||||
if (RequireCompleteType(TypeLoc, Res->getType(),
|
||||
diag::err_offsetof_incomplete_type))
|
||||
return ExprError();
|
||||
|
||||
// FIXME: Dependent case loses a lot of information here. And probably
|
||||
// leaks like a sieve.
|
||||
for (unsigned i = 0; i != NumComponents; ++i) {
|
||||
|
||||
@@ -48,3 +48,9 @@ int a[__builtin_offsetof(struct sockaddr_un, sun_path[len+1])];
|
||||
// PR4079
|
||||
union x {struct {int x;};};
|
||||
int x[__builtin_offsetof(union x, x)];
|
||||
|
||||
// rdar://problem/7222956
|
||||
struct incomplete; // expected-note 2 {{forward declaration of 'struct incomplete'}}
|
||||
int test1[__builtin_offsetof(struct incomplete, foo)]; // expected-error {{offsetof of incomplete type 'struct incomplete'}}
|
||||
|
||||
int test1[__builtin_offsetof(struct incomplete[10], [4].foo)]; // expected-error {{array has incomplete element type 'struct incomplete'}}
|
||||
|
||||
Reference in New Issue
Block a user