diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-01-19 19:26:10 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-01-19 19:26:10 +0000 |
commit | dd430f7ec9511f440a55d090c1a8d4df118e0e68 (patch) | |
tree | 7b670938f8911ad43483817101a0f90454211517 /clang/lib/Sema/SemaExprCXX.cpp | |
parent | ababe7d47df60f0a68b3a3712de4032e1a12d3fb (diff) | |
download | bcm5719-llvm-dd430f7ec9511f440a55d090c1a8d4df118e0e68.tar.gz bcm5719-llvm-dd430f7ec9511f440a55d090c1a8d4df118e0e68.zip |
Centralize error reporting of improper uses of incomplete types in the
new DiagnoseIncompleteType. It provides additional information about
struct/class/union/enum types when possible, either by pointing to the
forward declaration of that type or by pointing to the definition (if
we're in the process of defining that type).
Fixes <rdar://problem/6500531>.
llvm-svn: 62521
Diffstat (limited to 'clang/lib/Sema/SemaExprCXX.cpp')
-rw-r--r-- | clang/lib/Sema/SemaExprCXX.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaExprCXX.cpp b/clang/lib/Sema/SemaExprCXX.cpp index 09db18ea541..8958221ef55 100644 --- a/clang/lib/Sema/SemaExprCXX.cpp +++ b/clang/lib/Sema/SemaExprCXX.cpp @@ -172,9 +172,10 @@ Sema::ActOnCXXTypeConstructExpr(SourceRange TypeRange, TypeTy *TypeRep, // if (Ty->isArrayType()) return Diag(TyBeginLoc, diag::err_value_init_for_array_type) << FullRange; - if (!Ty->isDependentType() && Ty->isIncompleteType() && !Ty->isVoidType()) - return Diag(TyBeginLoc, diag::err_invalid_incomplete_type_use) - << Ty << FullRange; + if (!Ty->isDependentType() && !Ty->isVoidType() && + DiagnoseIncompleteType(TyBeginLoc, Ty, + diag::err_invalid_incomplete_type_use, FullRange)) + return true; return new CXXZeroInitValueExpr(Ty, TyBeginLoc, RParenLoc); } @@ -578,9 +579,10 @@ Sema::ActOnCXXDelete(SourceLocation StartLoc, bool UseGlobal, } QualType Pointee = Type->getAsPointerType()->getPointeeType(); - if (Pointee->isIncompleteType() && !Pointee->isVoidType()) - Diag(StartLoc, diag::warn_delete_incomplete) - << Pointee << Ex->getSourceRange(); + if (!Pointee->isVoidType() && + DiagnoseIncompleteType(StartLoc, Pointee, diag::warn_delete_incomplete, + Ex->getSourceRange())) + return true; else if (!Pointee->isObjectType()) { Diag(StartLoc, diag::err_delete_operand) << Type << Ex->getSourceRange(); |