// RUN: %clang_cc1 -std=c++14 -fsyntax-only -verify %s // RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s // Check that we don't get any extra warning for "return" without an // expression, in a function that might have been intended to return // void all along. decltype(h1) h1() { // expected-error {{use of undeclared identifier 'h1'}} return; } namespace JustAuto { int i; auto f1() { } auto f2() { return; } auto f3() { return void(); } auto f4() { return i; return; // expected-error {{'auto' in return type deduced as 'void' here but deduced as 'int' in earlier return statement}} } auto f5() { return i; return void(); // expected-error {{'auto' in return type deduced as 'void' here but deduced as 'int' in earlier return statement}} } auto l1 = []() { }; auto l2 = []() { return; }; auto l3 = []() { return void(); }; auto l4 = []() { return i; return; // expected-error {{return type 'void' must match previous return type 'int' when lambda expression has unspecified explicit return type}} }; auto l5 = []() { return i; return void(); // expected-error {{return type 'void' must match previous return type 'int' when lambda expression has unspecified explicit return type}} }; } // namespace JustAuto namespace DecltypeAuto { int i; decltype(auto) f1() { } decltype(auto) f2() { return; } decltype(auto) f3() { return void(); } decltype(auto) f4() { return i; return; // expected-error {{'decltype(auto)' in return type deduced as 'void' here but deduced as 'int' in earlier return statement}} } decltype(auto) f5() { return i; return void(); // expected-error {{'decltype(auto)' in return type deduced as 'void' here but deduced as 'int' in earlier return statement}} } auto l1 = []() -> decltype(auto) { }; auto l2 = []() -> decltype(auto) { return; }; auto l3 = []() -> decltype(auto) { return void(); }; auto l4 = []() -> decltype(auto) { return i; return; // expected-error {{'decltype(auto)' in return type deduced as 'void' here but deduced as 'int' in earlier return statement}} }; auto l5 = []() -> decltype(auto) { return i; return void(); // expected-error {{'decltype(auto)' in return type deduced as 'void' here but deduced as 'int' in earlier return statement}} }; } // namespace DecltypeAuto namespace AutoPtr { int i; auto *f1() { } // expected-error {{cannot deduce return type 'auto *' for function with no return statements}} auto *f2() { return; // expected-error {{cannot deduce return type 'auto *' from omitted return expression}} } auto *f3() { return void(); // expected-error {{cannot deduce return type 'auto *' from returned value of type 'void'}} } auto *f4() { return &i; return; // expected-error {{cannot deduce return type 'auto *' from omitted return expression}} } auto *f5() { return &i; return void(); // expected-error {{cannot deduce return type 'auto *' from returned value of type 'void'}} } auto l1 = []() -> auto* { }; // expected-error {{cannot deduce return type 'auto *' for function with no return statements}} auto l2 = []() -> auto* { return; // expected-error {{cannot deduce return type 'auto *' from omitted return expression}} }; auto l3 = []() -> auto* { return void(); // expected-error {{cannot deduce return type 'auto *' from returned value of type 'void'}} }; auto l4 = []() -> auto* { return &i; return; // expected-error {{cannot deduce return type 'auto *' from omitted return expression}} }; auto l5 = []() -> auto* { return &i; return void(); // expected-error {{cannot deduce return type 'auto *' from returned value of type 'void'}} }; } // namespace AutoPtr namespace AutoRef { int i; auto& f1() { // expected-error {{cannot deduce return type 'auto &' for function with no return statements}} } auto& f2() { return; // expected-error {{cannot deduce return type 'auto &' from omitted return expression}} } auto& f3() { return void(); // expected-error@-1 {{cannot form a reference to 'void'}} } auto& f4() { return i; return; // expected-error {{cannot deduce return type 'auto &' from omitted return expression}} } auto& f5() { return i; return void(); // expected-error {{deduced as 'int' in earlier return statement}} } auto& f6() { return 42; } // expected-error {{non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'}} auto l1 = []() -> auto& { }; // expected-error {{cannot deduce return type 'auto &' for function with no return statements}} auto l2 = []() -> auto& { return; // expected-error {{cannot deduce return type 'auto &' from omitted return expression}} }; auto l3 = []() -> auto& { // expected-error {{cannot form a reference to 'void'}} return void(); }; auto l4 = []() -> auto& { return i; return; // expected-error {{cannot deduce return type 'auto &' from omitted return expression}} }; auto l5 = []() -> auto & { return i; return void(); // expected-error {{deduced as 'int' in earlier return statement}} }; auto l6 = []() -> auto& { return 42; // expected-error {{non-const lvalue reference to type 'int' cannot bind to a temporary of type 'int'}} }; } // namespace AutoRef