================ @@ -640,3 +640,36 @@ namespace PR46637 { template<typename T> struct Y { T x; }; Y<auto() -> auto> y; // expected-error {{'auto' not allowed in template argument}} } + +namespace GH71015 { + +// Check that there is no error in case a templated function is recursive and +// has a placeholder return type. +struct Node { + int value; + Node* left; + Node* right; +}; + +bool parse(const char*); +Node* parsePrimaryExpr(); + +auto parseMulExpr(auto node) { // cxx14-error {{'auto' not allowed in function prototype}} + if (node == nullptr) node = parsePrimaryExpr(); + if (!parse("*")) return node; + return parseMulExpr(new Node{.left = node, .right = parsePrimaryExpr()}); ---------------- Fznamznon wrote:
Added the test. A note here is that It will only be rejected if the function instantiated because clang doesn't take into account return statements if the function is templated due to this part: https://github.com/llvm/llvm-project/blob/11276563c81987791a2326950dbc3315a32dd709/clang/lib/Sema/SemaStmt.cpp#L3806 gcc rejects even if the function is not instantiated. msvc doesn't. https://compiler-explorer.com/z/hGc8M1esT https://github.com/llvm/llvm-project/pull/75456 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits