hokein created this revision. hokein added a reviewer: sammccall. Herald added a project: clang. hokein requested review of this revision.
Given the following case: auto k() { return undef(); return 1; } Prior to the patch, clang emits an `cannot initialize return object of type 'auto' with an rvalue of type 'int'` diagnostic on the second return (because the return type of the function cannot be deduced from the first contain-errors return). This patch suppresses this error. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D92211 Files: clang/lib/Sema/SemaStmt.cpp clang/test/SemaCXX/lambda-expressions.cpp Index: clang/test/SemaCXX/lambda-expressions.cpp =================================================================== --- clang/test/SemaCXX/lambda-expressions.cpp +++ clang/test/SemaCXX/lambda-expressions.cpp @@ -521,6 +521,10 @@ return undeclared_error; // expected-error {{use of undeclared identifier}} return 0; }; + auto bar = []() { + return undef(); // expected-error {{use of undeclared identifier}} + return 0; // verify no init_conversion_failed diagnostic emitted. + }; } } Index: clang/lib/Sema/SemaStmt.cpp =================================================================== --- clang/lib/Sema/SemaStmt.cpp +++ clang/lib/Sema/SemaStmt.cpp @@ -3327,9 +3327,11 @@ } if (HasDeducedReturnType) { + FunctionDecl *FD = CurLambda->CallOperator; + 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();
Index: clang/test/SemaCXX/lambda-expressions.cpp =================================================================== --- clang/test/SemaCXX/lambda-expressions.cpp +++ clang/test/SemaCXX/lambda-expressions.cpp @@ -521,6 +521,10 @@ return undeclared_error; // expected-error {{use of undeclared identifier}} return 0; }; + auto bar = []() { + return undef(); // expected-error {{use of undeclared identifier}} + return 0; // verify no init_conversion_failed diagnostic emitted. + }; } } Index: clang/lib/Sema/SemaStmt.cpp =================================================================== --- clang/lib/Sema/SemaStmt.cpp +++ clang/lib/Sema/SemaStmt.cpp @@ -3327,9 +3327,11 @@ } if (HasDeducedReturnType) { + FunctionDecl *FD = CurLambda->CallOperator; + 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();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits