Fix up constant expression handling to deal with the address 
of a reference correctly.



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72463 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp
index 7651884..d0d8b81 100644
--- a/lib/AST/ExprConstant.cpp
+++ b/lib/AST/ExprConstant.cpp
@@ -178,11 +178,20 @@
 }
 
 APValue LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E)
-{ 
+{
   if (!E->hasGlobalStorage())
     return APValue();
-  
-  return APValue(E, 0); 
+
+  if (isa<FunctionDecl>(E->getDecl())) {
+    return APValue(E, 0);
+  } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
+    if (!VD->getType()->isReferenceType())
+      return APValue(E, 0);
+    if (VD->getInit())
+      return Visit(VD->getInit());
+  }
+
+  return APValue();
 }
 
 APValue LValueExprEvaluator::VisitBlockExpr(BlockExpr *E)