141 lines
5.0 KiB
C++
141 lines
5.0 KiB
C++
// 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
|