From: Richard Smith Date: Tue, 21 May 2013 22:29:20 +0000 (+0000) Subject: PR16090: C++1y: treat undeduced 'auto' as a literal type, so that constexpr X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bdaeaed3e3293f1915cdf336f406d4d391331039;p=clang PR16090: C++1y: treat undeduced 'auto' as a literal type, so that constexpr function templates can use it as a return type. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@182433 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/AST/Type.cpp b/lib/AST/Type.cpp index eacf367818..004e31af17 100644 --- a/lib/AST/Type.cpp +++ b/lib/AST/Type.cpp @@ -1196,6 +1196,11 @@ bool Type::isLiteralType(ASTContext &Ctx) const { return true; } + // If this type hasn't been deduced yet, then conservatively assume that + // it'll work out to be a literal type. + if (isa(BaseTy->getCanonicalTypeInternal())) + return true; + return false; } diff --git a/test/SemaCXX/constant-expression-cxx1y.cpp b/test/SemaCXX/constant-expression-cxx1y.cpp index ea0c9e6526..23b5d0b460 100644 --- a/test/SemaCXX/constant-expression-cxx1y.cpp +++ b/test/SemaCXX/constant-expression-cxx1y.cpp @@ -708,3 +708,10 @@ namespace switch_stmt { static_assert(test_copy("hello world", 10), ""); static_assert(test_copy("hello world", 10), ""); } + +namespace deduced_return_type { + constexpr auto f() { return 0; } + template constexpr auto g(T t) { return t; } + static_assert(f() == 0, ""); + static_assert(g(true), ""); +}