Commit f3a5da85 authored by Pawel Wodnicki's avatar Pawel Wodnicki
Browse files

Merging r167766: into the 3.2 release branch.

Fix more try scoping bugs introduced by r167650.

Introduces more clear scoping flags & flag combinations which should hopefully
be more understandable.

llvm-svn: 169451
parent 3583b549
Loading
Loading
Loading
Loading
+9 −2
Original line number Diff line number Diff line
@@ -84,11 +84,18 @@ public:
    /// TryScope - This is the scope of a C++ try statement.
    TryScope = 0x1000,

    /// CatchScope - This is the scope of a C++ catch statement.
    CatchScope = 0x2000,

    /// FnTryCatchScope - This is the scope for a function-level C++ try or
    /// catch scope.
    FnTryCatchScope = 0x4000,

    /// FnTryScope - This is the scope of a function-level C++ try scope.
    FnTryScope = 0x3000,
    FnTryScope = TryScope | FnTryCatchScope,

    /// FnCatchScope - This is the scope of a function-level C++ catch scope.
    FnCatchScope = 0x4000
    FnCatchScope = CatchScope | FnTryCatchScope
  };
private:
  /// The parent scope for this scope.  This is null for the translation-unit
+1 −1
Original line number Diff line number Diff line
@@ -2197,7 +2197,7 @@ StmtResult Parser::ParseCXXCatchBlock(bool FnCatch) {
  // The name in a catch exception-declaration is local to the handler and
  // shall not be redeclared in the outermost block of the handler.
  ParseScope CatchScope(this, Scope::DeclScope | Scope::ControlScope |
                          (FnCatch ? Scope::FnCatchScope : 0));
                          (FnCatch ? Scope::FnCatchScope : Scope::CatchScope));

  // exception-declaration is equivalent to '...' or a parameter-declaration
  // without default arguments.
+5 −8
Original line number Diff line number Diff line
@@ -135,17 +135,14 @@ bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx,
      // of the controlled statement.
      //
      assert(S->getParent() && "No TUScope?");
      if (S->getFlags() & Scope::FnTryScope)
        return S->getParent()->isDeclScope(D);
      if (S->getParent()->getFlags() & Scope::ControlScope) {
        if (S->getParent()->getFlags() & Scope::FnCatchScope) {
        S = S->getParent();
        if (S->isDeclScope(D))
          return true;
      }
      if (S->getFlags() & Scope::FnTryCatchScope)
        return S->getParent()->isDeclScope(D);
    }
    }
    return false;
  }

+23 −0
Original line number Diff line number Diff line
@@ -35,3 +35,26 @@ void func7() {
    int i; // expected-error{{redefinition of 'i'}}
  }
}

void func8() {
  int i;
  try {
    int i;
  } catch (...) {
  }
}

void func9() {
  if (bool b = true)
    try {
      int b; // FIXME: this probably should be invalid, maybe
    } catch (...) {
    }
}

void func10() {
  if (bool b = true)
    if (true) {
      int b; // FIXME: decide whether this is valid
    }
}