summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2011-11-09 02:12:41 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2011-11-09 02:12:41 +0000
commitf8120cad16cd30f90b96cf6b00f4ec7db1845699 (patch)
tree01dbfb1d9ce8327cc512c33f11919534e8b21090
parent8c2418594e29637e66cc4be469bed33c7fdf1064 (diff)
downloadbcm5719-llvm-f8120cad16cd30f90b96cf6b00f4ec7db1845699.tar.gz
bcm5719-llvm-f8120cad16cd30f90b96cf6b00f4ec7db1845699.zip
Constant expression evaluation: support for default arguments.
llvm-svn: 144156
-rw-r--r--clang/lib/AST/ExprConstant.cpp2
-rw-r--r--clang/test/SemaCXX/constant-expression-cxx11.cpp30
2 files changed, 32 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprConstant.cpp b/clang/lib/AST/ExprConstant.cpp
index d6e263b4476..aa949907eb1 100644
--- a/clang/lib/AST/ExprConstant.cpp
+++ b/clang/lib/AST/ExprConstant.cpp
@@ -935,6 +935,8 @@ public:
{ return StmtVisitorTy::Visit(E->getResultExpr()); }
RetTy VisitSubstNonTypeTemplateParmExpr(const SubstNonTypeTemplateParmExpr *E)
{ return StmtVisitorTy::Visit(E->getReplacement()); }
+ RetTy VisitCXXDefaultArgExpr(const CXXDefaultArgExpr *E)
+ { return StmtVisitorTy::Visit(E->getExpr()); }
RetTy VisitBinaryConditionalOperator(const BinaryConditionalOperator *E) {
OpaqueValueEvaluation opaque(Info, E->getOpaqueValue(), E->getCommon());
diff --git a/clang/test/SemaCXX/constant-expression-cxx11.cpp b/clang/test/SemaCXX/constant-expression-cxx11.cpp
index 8481c8a6e19..e0bf8416346 100644
--- a/clang/test/SemaCXX/constant-expression-cxx11.cpp
+++ b/clang/test/SemaCXX/constant-expression-cxx11.cpp
@@ -66,6 +66,36 @@ namespace MemberEnum {
static_assert_fold(wme.A == 42, "");
}
+namespace DefaultArguments {
+
+const int z = int();
+constexpr int Sum(int a = 0, const int &b = 0, const int *c = &z, char d = 0) {
+ return a + b + *c + d;
+}
+const int four = 4;
+constexpr int eight = 8;
+constexpr const int twentyseven = 27;
+static_assert_fold(Sum() == 0, "");
+static_assert_fold(Sum(1) == 1, "");
+static_assert_fold(Sum(1, four) == 5, "");
+static_assert_fold(Sum(1, eight, &twentyseven) == 36, "");
+static_assert_fold(Sum(1, 2, &four, eight) == 15, "");
+
+}
+
+namespace Ellipsis {
+
+// Note, values passed through an ellipsis can't actually be used.
+constexpr int F(int a, ...) { return a; }
+static_assert_fold(F(0) == 0, "");
+static_assert_fold(F(1, 0) == 1, "");
+static_assert_fold(F(2, "test") == 2, "");
+static_assert_fold(F(3, &F) == 3, "");
+int k = 0;
+static_assert_fold(F(4, k) == 3, ""); // expected-error {{constant expression}}
+
+}
+
namespace Recursion {
constexpr int fib(int n) { return n > 1 ? fib(n-1) + fib(n-2) : n; }
static_assert_fold(fib(11) == 89, "");
OpenPOWER on IntegriCloud