From: Richard Smith Date: Wed, 9 Nov 2011 02:12:41 +0000 (+0000) Subject: Constant expression evaluation: support for default arguments. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3d75ca836205856077c18e30e9447accbd85f751;p=clang Constant expression evaluation: support for default arguments. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144156 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/ExprConstant.cpp b/lib/AST/ExprConstant.cpp index d6e263b447..aa949907eb 100644 --- a/lib/AST/ExprConstant.cpp +++ b/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/test/SemaCXX/constant-expression-cxx11.cpp b/test/SemaCXX/constant-expression-cxx11.cpp index 8481c8a6e1..e0bf841634 100644 --- a/test/SemaCXX/constant-expression-cxx11.cpp +++ b/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, "");