]> granicus.if.org Git - clang/commitdiff
Check for casts to an incomplete type in C. Improves diagnostics for cast to
authorEli Friedman <eli.friedman@gmail.com>
Sat, 17 Jul 2010 20:43:49 +0000 (20:43 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sat, 17 Jul 2010 20:43:49 +0000 (20:43 +0000)
incomplete union (PR5692) and incomplete enum, and fixes obscure
accepts-invalid on cast to incomplete struct.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/Sema/cast-incomplete.c [new file with mode: 0644]

index ef34fb8ef5a2d7b7f89d856a83eec3e024e85f0b..9f83406c7213425eec37eb4c8371507b7d5447c5 100644 (file)
@@ -2650,6 +2650,8 @@ def err_typecheck_cond_expect_scalar : Error<
   "used type %0 where arithmetic or pointer type is required">;
 def ext_typecheck_cond_one_void : Extension<
   "C99 forbids conditional expressions with only one void side">;
+def err_typecheck_cast_to_incomplete : Error<
+  "cast to incomplete type %0">;
 def ext_typecheck_cast_nonscalar : Extension<
   "C99 forbids casting nonscalar type %0 to the same type">;
 def ext_typecheck_cast_to_union : Extension<"C99 forbids casts to union type">;
index d798d9d0e5c3bb77378da5acb55e2c41c8829248..2d3aaf6edc05daf74742b8bdc70061ec94b270b0 100644 (file)
@@ -3891,6 +3891,10 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr,
     return false;
   }
 
+  if (RequireCompleteType(TyR.getBegin(), castType,
+                          diag::err_typecheck_cast_to_incomplete))
+    return true;
+
   if (!castType->isScalarType() && !castType->isVectorType()) {
     if (Context.hasSameUnqualifiedType(castType, castExpr->getType()) &&
         (castType->isStructureType() || castType->isUnionType())) {
diff --git a/test/Sema/cast-incomplete.c b/test/Sema/cast-incomplete.c
new file mode 100644 (file)
index 0000000..dd10e00
--- /dev/null
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -fsyntax-only %s -verify
+// PR5692
+
+enum x;            // expected-note   {{forward declaration}}
+extern struct y a; // expected-note   {{forward declaration}}
+extern union z b;  // expected-note 2 {{forward declaration}}
+
+void foo() {
+  (enum x)1;   // expected-error {{cast to incomplete type}}
+  (struct y)a; // expected-error {{cast to incomplete type}}
+  (union z)b;  // expected-error {{cast to incomplete type}}
+  (union z)1;  // expected-error {{cast to incomplete type}}
+}
+