]> granicus.if.org Git - clang/commitdiff
When constant folding reference variables with an initializer to the
authorChandler Carruth <chandlerc@gmail.com>
Sun, 16 May 2010 09:32:51 +0000 (09:32 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sun, 16 May 2010 09:32:51 +0000 (09:32 +0000)
initializer, don't fold paramters. Their initializers are just default
arguments which can be overridden. This fixes some spectacular regressions due
to more things making it into the constant folding.

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

lib/AST/ExprConstant.cpp
test/CodeGenCXX/references.cpp

index f903035d220d73256a67cc0e8c6524a9d2fa194b..dc614018ec2b7b7b3f48f5819c4254af675c686e 100644 (file)
@@ -355,6 +355,10 @@ bool LValueExprEvaluator::VisitDeclRefExpr(DeclRefExpr *E) {
   } else if (VarDecl* VD = dyn_cast<VarDecl>(E->getDecl())) {
     if (!VD->getType()->isReferenceType())
       return Success(E);
+    // Reference parameters can refer to anything even if they have an
+    // "initializer" in the form of a default argument.
+    if (isa<ParmVarDecl>(VD))
+      return false;
     // FIXME: Check whether VD might be overridden!
     if (const Expr *Init = VD->getAnyInitializer())
       return Visit(const_cast<Expr *>(Init));
index 5a5947dd8162421e0dc8f5f5fa6bf5c4745f4487..3ae1e474f8868ad8a95a1d79400a3c88cffac5ca 100644 (file)
@@ -155,3 +155,16 @@ void f0(s1 a) { s1 b = a; }
 // CHECK: load
 // CHECK: ret
 const int &f2() { return 0; }
+
+// Don't constant fold const reference parameters with default arguments to
+// their default arguments.
+namespace N1 {
+  const int foo = 1;
+  // CHECK: @_ZN2N14test
+  int test(const int& arg = foo) {
+    // Ensure this array is on the stack where we can set values instead of
+    // being a global constant.
+    // CHECK: %args_array = alloca
+    const int* const args_array[] = { &arg };
+  }
+}