]> granicus.if.org Git - clang/commitdiff
Diagnose __builtin_offsetof on incomplete types. Fixes
authorJohn McCall <rjmccall@apple.com>
Wed, 4 Nov 2009 03:03:43 +0000 (03:03 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 4 Nov 2009 03:03:43 +0000 (03:03 +0000)
rdar://problem/7222956

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@85999 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/Sema/offsetof.c

index a43cf5dc3448bbb76e9a492bb17e1c9a8222ac20..9aae77090a5ad1505fb0adcc67377e5979e902f5 100644 (file)
@@ -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">;
index f1014c6dfecc43a1b884409aa8fc0e9d96ac8941..2c54a792c1aec89681e8ae6bd021dedb8a9fefc0 100644 (file)
@@ -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) {
index f8b9fed03c3c199a90f44bf6e811fa1f2f74ba0d..dfae99216f8a19bfa13f12050911c64354906e95 100644 (file)
@@ -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'}}