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
This commit is contained in:
Douglas Gregor 2010-01-15 16:21:02 +00:00
parent 27b174f4c3
commit 5fcb51c09c
2 changed files with 25 additions and 4 deletions

View File

@ -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.

View File

@ -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);
}
}