From e98194d9e8d2ede5eeaa4de411ffe1697ed6a40e Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Sat, 17 Jul 2010 20:43:49 +0000 Subject: [PATCH] Check for casts to an incomplete type in C. Improves diagnostics for cast to incomplete union (PR5692) and incomplete enum, and fixes obscure accepts-invalid on cast to incomplete struct. llvm-svn: 108630 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ clang/lib/Sema/SemaExpr.cpp | 4 ++++ clang/test/Sema/cast-incomplete.c | 14 ++++++++++++++ 3 files changed, 20 insertions(+) create mode 100644 clang/test/Sema/cast-incomplete.c diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index ef34fb8ef5a2..9f83406c7213 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -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">; diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index d798d9d0e5c3..2d3aaf6edc05 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -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/clang/test/Sema/cast-incomplete.c b/clang/test/Sema/cast-incomplete.c new file mode 100644 index 000000000000..dd10e00d444a --- /dev/null +++ b/clang/test/Sema/cast-incomplete.c @@ -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}} +} +