diff options
| author | Douglas Gregor <dgregor@apple.com> | 2010-03-08 01:47:36 +0000 |
|---|---|---|
| committer | Douglas Gregor <dgregor@apple.com> | 2010-03-08 01:47:36 +0000 |
| commit | 104ee00181f90735eaa945ac628d594e483edbcc (patch) | |
| tree | 535a71adc1a987f8367468f76a7157bb33ed25ed /clang/lib | |
| parent | 3681e58d8b61134d81be28ad19e89d2f54f38f19 (diff) | |
| download | bcm5719-llvm-104ee00181f90735eaa945ac628d594e483edbcc.tar.gz bcm5719-llvm-104ee00181f90735eaa945ac628d594e483edbcc.zip | |
Downgrade errors when trying to catch a pointer or reference to
incomplete type to warnings; GCC (and EDG in GCC compatibility mode)
permit such handles. Fixes PR6527.
(For real this time)
llvm-svn: 97927
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaDeclCXX.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index e32d14e1c87..a89f355147f 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -5195,21 +5195,28 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S, QualType ExDeclType, Invalid = true; } + // GCC allows catching pointers and references to incomplete types + // as an extension; so do we, but we warn by default. + QualType BaseType = ExDeclType; int Mode = 0; // 0 for direct type, 1 for pointer, 2 for reference unsigned DK = diag::err_catch_incomplete; + bool IncompleteCatchIsInvalid = true; if (const PointerType *Ptr = BaseType->getAs<PointerType>()) { BaseType = Ptr->getPointeeType(); Mode = 1; - DK = diag::err_catch_incomplete_ptr; + DK = diag::ext_catch_incomplete_ptr; + IncompleteCatchIsInvalid = false; } else if (const ReferenceType *Ref = BaseType->getAs<ReferenceType>()) { // For the purpose of error recovery, we treat rvalue refs like lvalue refs. BaseType = Ref->getPointeeType(); Mode = 2; - DK = diag::err_catch_incomplete_ref; + DK = diag::ext_catch_incomplete_ref; + IncompleteCatchIsInvalid = false; } if (!Invalid && (Mode == 0 || !BaseType->isVoidType()) && - !BaseType->isDependentType() && RequireCompleteType(Loc, BaseType, DK)) + !BaseType->isDependentType() && RequireCompleteType(Loc, BaseType, DK) && + IncompleteCatchIsInvalid) Invalid = true; if (!Invalid && !ExDeclType->isDependentType() && |

