forked from OSchip/llvm-project
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:
parent
27b174f4c3
commit
5fcb51c09c
|
@ -98,10 +98,12 @@ void DeclRefExpr::computeDependence() {
|
||||||
// initialized with an expression that is value-dependent.
|
// initialized with an expression that is value-dependent.
|
||||||
else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
|
else if (VarDecl *Var = dyn_cast<VarDecl>(D)) {
|
||||||
if (Var->getType()->isIntegralType() &&
|
if (Var->getType()->isIntegralType() &&
|
||||||
Var->getType().getCVRQualifiers() == Qualifiers::Const &&
|
Var->getType().getCVRQualifiers() == Qualifiers::Const) {
|
||||||
Var->getInit() &&
|
const VarDecl *Def = 0;
|
||||||
Var->getInit()->isValueDependent())
|
if (const Expr *Init = Var->getDefinition(Def))
|
||||||
ValueDependent = true;
|
if (Init->isValueDependent())
|
||||||
|
ValueDependent = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// (TD) - a nested-name-specifier or a qualified-id that names a
|
// (TD) - a nested-name-specifier or a qualified-id that names a
|
||||||
// member of an unknown specialization.
|
// member of an unknown specialization.
|
||||||
|
|
|
@ -5,3 +5,22 @@ template <typename Iterator>
|
||||||
void Test(Iterator it) {
|
void Test(Iterator it) {
|
||||||
*(it += 1);
|
*(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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue