1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
// 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
|