}
if (HasDeducedReturnType) {
+ FunctionDecl *FD = CurLambda->CallOperator;
+ // If we've already decided this lambda is invalid, e.g. because
+ // we saw a `return` whose expression had an error, don't keep
+ // trying to deduce its return type.
+ if (FD->isInvalidDecl())
+ return StmtError();
// In C++1y, the return type may involve 'auto'.
// FIXME: Blocks might have a return type of 'auto' explicitly specified.
- FunctionDecl *FD = CurLambda->CallOperator;
if (CurCap->ReturnType.isNull())
CurCap->ReturnType = FD->getReturnType();
if (getLangOpts().CPlusPlus14) {
if (AutoType *AT = FnRetType->getContainedAutoType()) {
FunctionDecl *FD = cast<FunctionDecl>(CurContext);
+ // If we've already decided this function is invalid, e.g. because
+ // we saw a `return` whose expression had an error, don't keep
+ // trying to deduce its return type.
+ if (FD->isInvalidDecl())
+ return StmtError();
if (DeduceFunctionTypeFromReturnExpr(FD, ReturnLoc, RetValExp, AT)) {
FD->setInvalidDecl();
return StmtError();
// expected-error@+1 {{multiversioned functions do not yet support deduced return types}}
auto __attribute__((target("default"))) deduced_return(void) { return 0; }
-// expected-error@-1 {{cannot initialize return object of type 'auto' with an rvalue of type 'int'}}
auto __attribute__((target("default"))) trailing_return(void)-> int { return 0; }
struct Conv2 {
operator auto() { return 0; } // expected-note {{previous}}
- operator auto() { return 0.; } // expected-error {{cannot be redeclared}} expected-error {{cannot initialize return object of type 'auto' with an rvalue of type 'double'}}
+ operator auto() { return 0.; } // expected-error {{cannot be redeclared}}
};
struct Conv3 {
auto fac_2(int n) { // expected-note {{declared here}}
if (n > 2)
return n * fac_2(n-1); // expected-error {{cannot be used before it is defined}}
- return n; // expected-error {{cannot initialize return object of type 'auto'}}
+ return n;
}
auto void_ret() {}
};
template<> auto *B<char[1]>::q() { return (int*)0; }
template<> auto B<char[2]>::q() { return (int*)0; } // expected-error {{return type}}
- // FIXME: suppress this follow-on error: expected-error@-1 {{cannot initialize}}
template<> int B<char[3]>::q() { return 0; } // expected-error {{return type}}
}