summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>2008-09-09 21:57:58 +0000
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>2008-09-09 21:57:58 +0000
commit2bdac73591f6decdfa61915371d59cf758b981e2 (patch)
tree6c30827d6922b315684072f96d556838f4aa7aa0 /clang
parent93945287b8843dde31a43a02b2ca02435d5609ad (diff)
downloadbcm5719-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.cpp24
-rw-r--r--clang/lib/Sema/IdentifierResolver.h2
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);
OpenPOWER on IntegriCloud