]> granicus.if.org Git - clang/commitdiff
When determining whether a DeclRefExpr is value-dependent when it
authorDouglas Gregor <dgregor@apple.com>
Fri, 15 Jan 2010 16:21:02 +0000 (16:21 +0000)
committerDouglas Gregor <dgregor@apple.com>
Fri, 15 Jan 2010 16:21:02 +0000 (16:21 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@93514 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Expr.cpp
test/SemaTemplate/dependent-expr.cpp

index 4c3046bed10bbfabdd5df6dbcc9075f6a3900338..fa44b510e99a700b5e7546aad131aa0b5fecf379 100644 (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.
index 412a811f729203c9513e7993ead7bbc705017bc6..3f481b513691aa64f1a30213a8f7fceed2d2f1a0 100644 (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);
+  }
+}