Index: clang/lib/AST/Interp/ByteCodeStmtGen.cpp =================================================================== --- clang/lib/AST/Interp/ByteCodeStmtGen.cpp +++ clang/lib/AST/Interp/ByteCodeStmtGen.cpp @@ -309,6 +309,9 @@ 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)) Index: clang/test/AST/Interp/functions.cpp =================================================================== --- clang/test/AST/Interp/functions.cpp +++ clang/test/AST/Interp/functions.cpp @@ -265,3 +265,12 @@ g(0); } } + +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, ""); +}