diff options
author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2008-09-09 21:57:58 +0000 |
---|---|---|
committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2008-09-09 21:57:58 +0000 |
commit | 2bdac73591f6decdfa61915371d59cf758b981e2 (patch) | |
tree | 6c30827d6922b315684072f96d556838f4aa7aa0 /clang | |
parent | 93945287b8843dde31a43a02b2ca02435d5609ad (diff) | |
download | bcm5719-llvm-2bdac73591f6decdfa61915371d59cf758b981e2.tar.gz bcm5719-llvm-2bdac73591f6decdfa61915371d59cf758b981e2.zip |
Make IdentifierResolver::isDeclInScope regard declarations of a parent 'control' scope as part of the current scope.
The 'control' scope is the 'condition' scope of if/switch/while statements and the scope that contains the for-init-statement and 'condition' of a for statement.
e.g:
if (int x = 0 /*'control' scope*/) {
// x will be regarded as part of this substatement scope.
} else {
// and as part of this substatement scope too.
}
llvm-svn: 56020
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/Sema/IdentifierResolver.cpp | 24 | ||||
-rw-r--r-- | clang/lib/Sema/IdentifierResolver.h | 2 |
2 files changed, 22 insertions, 4 deletions
diff --git a/clang/lib/Sema/IdentifierResolver.cpp b/clang/lib/Sema/IdentifierResolver.cpp index 8c0c4d69326..e97de738178 100644 --- a/clang/lib/Sema/IdentifierResolver.cpp +++ b/clang/lib/Sema/IdentifierResolver.cpp @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "IdentifierResolver.h" +#include "clang/Basic/LangOptions.h" #include <list> #include <vector> @@ -144,9 +145,26 @@ IdentifierResolver::~IdentifierResolver() { /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns /// true if 'D' belongs to the given declaration context. -bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S) { - if (Ctx->isFunctionOrMethod()) - return S->isDeclScope(D); +bool IdentifierResolver::isDeclInScope(Decl *D, DeclContext *Ctx, + Scope *S) const { + if (Ctx->isFunctionOrMethod()) { + if (S->isDeclScope(D)) + return true; + if (LangOpt.CPlusPlus) { + // C++ 3.3.2p4: + // Names declared in the for-init-statement, and in the condition of if, + // while, for, and switch statements are local to the if, while, for, or + // switch statement (including the controlled statement), and shall not be + // redeclared in a subsequent condition of that statement nor in the + // outermost block (or, for the if statement, any of the outermost blocks) + // of the controlled statement. + // + assert(S->getParent() && "No TUScope?"); + if (S->getParent()->getFlags() & Scope::ControlScope) + return S->getParent()->isDeclScope(D); + } + return false; + } return LookupContext(D) == LookupContext(Ctx); } diff --git a/clang/lib/Sema/IdentifierResolver.h b/clang/lib/Sema/IdentifierResolver.h index 82c4f06196a..c661145d89f 100644 --- a/clang/lib/Sema/IdentifierResolver.h +++ b/clang/lib/Sema/IdentifierResolver.h @@ -207,7 +207,7 @@ public: /// isDeclInScope - If 'Ctx' is a function/method, isDeclInScope returns true /// if 'D' is in Scope 'S', otherwise 'S' is ignored and isDeclInScope returns /// true if 'D' belongs to the given declaration context. - static bool isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S = 0); + bool isDeclInScope(Decl *D, DeclContext *Ctx, Scope *S = 0) const; /// AddDecl - Link the decl to its shadowed decl chain. void AddDecl(NamedDecl *D); |