diff options
author | Douglas Gregor <dgregor@apple.com> | 2012-01-24 19:01:26 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2012-01-24 19:01:26 +0000 |
commit | ecd7b04ae7764179d40ee4e3e49c99d1fbcb4eff (patch) | |
tree | a47be8344cf22856f788c0eb31409ce8705974e5 /lib/Sema/SemaDeclCXX.cpp | |
parent | cd0d56a523f877ffd1fe1575caf758b4357f1661 (diff) |
Promote the extension warning for attempts to catch a reference or
pointer to incomplete type from an ExtWarn to an error. We put the
ExtWarn in place as part of a workaround for Boost (PR6527), but it
(1) doesn't actually match a GCC extension and (2) has been fixed for
two years in Boost, and (3) causes us to emit code that fails badly at
run time, so it's a bad idea to keep it. Fixes PR11803.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@148838 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaDeclCXX.cpp')
-rw-r--r-- | lib/Sema/SemaDeclCXX.cpp | 13 |
1 files changed, 3 insertions, 10 deletions
diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index 3f8f585bb0..b710a20831 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -9734,28 +9734,21 @@ VarDecl *Sema::BuildExceptionDeclaration(Scope *S, 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::ext_catch_incomplete_ptr; - IncompleteCatchIsInvalid = false; + DK = diag::err_catch_incomplete_ptr; } 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::ext_catch_incomplete_ref; - IncompleteCatchIsInvalid = false; + DK = diag::err_catch_incomplete_ref; } if (!Invalid && (Mode == 0 || !BaseType->isVoidType()) && - !BaseType->isDependentType() && RequireCompleteType(Loc, BaseType, DK) && - IncompleteCatchIsInvalid) + !BaseType->isDependentType() && RequireCompleteType(Loc, BaseType, DK)) Invalid = true; if (!Invalid && !ExDeclType->isDependentType() && |