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.
|
||||
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.
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue