diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-01-15 16:21:02 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-01-15 16:21:02 +0000 |
commit | 5fcb51c09cdbcb3533dc868343dfcc989e7f653d (patch) | |
tree | 63458197b7224e7afa3af9298cda8472d1f53014 | |
parent | 27b174f4c3f27e68f45a2e26d71cc46a72149192 (diff) | |
download | bcm5719-llvm-5fcb51c09cdbcb3533dc868343dfcc989e7f653d.tar.gz bcm5719-llvm-5fcb51c09cdbcb3533dc868343dfcc989e7f653d.zip |
When determining whether a DeclRefExpr is value-dependent when it
references a const variable of integral type, the initializer may be
in a different declaration than the one that name-lookup saw. Find the
initializer anyway. Fixes PR6045.
llvm-svn: 93514
-rw-r--r-- | clang/lib/AST/Expr.cpp | 10 | ||||
-rw-r--r-- | clang/test/SemaTemplate/dependent-expr.cpp | 19 |
2 files changed, 25 insertions, 4 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 4c3046bed10..fa44b510e99 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -98,10 +98,12 @@ void DeclRefExpr::computeDependence() { // initialized with an expression that is value-dependent. else if (VarDecl *Var = dyn_cast<VarDecl>(D)) { if (Var->getType()->isIntegralType() && - Var->getType().getCVRQualifiers() == Qualifiers::Const && - Var->getInit() && - Var->getInit()->isValueDependent()) - ValueDependent = true; + Var->getType().getCVRQualifiers() == Qualifiers::Const) { + const VarDecl *Def = 0; + if (const Expr *Init = Var->getDefinition(Def)) + if (Init->isValueDependent()) + ValueDependent = true; + } } // (TD) - a nested-name-specifier or a qualified-id that names a // member of an unknown specialization. diff --git a/clang/test/SemaTemplate/dependent-expr.cpp b/clang/test/SemaTemplate/dependent-expr.cpp index 412a811f729..3f481b51369 100644 --- a/clang/test/SemaTemplate/dependent-expr.cpp +++ b/clang/test/SemaTemplate/dependent-expr.cpp @@ -5,3 +5,22 @@ template <typename Iterator> void Test(Iterator it) { *(it += 1); } + +namespace PR6045 { + template<unsigned int r> + class A + { + static const unsigned int member = r; + void f(); + }; + + template<unsigned int r> + const unsigned int A<r>::member; + + template<unsigned int r> + void A<r>::f() + { + unsigned k; + (void)(k % member); + } +} |