diff --git a/clang/lib/AST/Interp/ByteCodeStmtGen.cpp b/clang/lib/AST/Interp/ByteCodeStmtGen.cpp index e5ca5c2ae4c33b..e54805cd931aef 100644 --- a/clang/lib/AST/Interp/ByteCodeStmtGen.cpp +++ b/clang/lib/AST/Interp/ByteCodeStmtGen.cpp @@ -309,6 +309,9 @@ bool ByteCodeStmtGen::visitReturnStmt(const ReturnStmt *RS) { return false; this->emitCleanup(); return this->emitRet(*ReturnType, RS); + } else if (RE->getType()->isVoidType()) { + if (!this->visit(RE)) + return false; } else { // RVO - construct the value in the return location. if (!this->emitRVOPtr(RE)) diff --git a/clang/test/AST/Interp/functions.cpp b/clang/test/AST/Interp/functions.cpp index 4bb8791de8f4e5..3540791917fab1 100644 --- a/clang/test/AST/Interp/functions.cpp +++ b/clang/test/AST/Interp/functions.cpp @@ -291,3 +291,12 @@ namespace ReturnLocalPtr { // ref-note {{read of variable whose lifetime has ended}} \ // expected-error {{not an integral constant expression}} } + +namespace VoidReturn { + /// ReturnStmt with an expression in a void function used to cause problems. + constexpr void bar() {} + constexpr void foo() { + return bar(); + } + static_assert((foo(),1) == 1, ""); +}