<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-GB link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hi,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In C++, the undefined behaviour of a missing return statements for a non-void function results in not generating the function epilogue (unreachable statement is inserted and the return statement is optimised away).  Consequently, the runtime behaviour is that control is never properly returned from this function and thus it starts executing “garbage instructions”. As this is undefined behaviour, this is perfectly fine and according to the spec, and a compile warning for this missing return statement is issued. However, in C, the behaviour is that a function epilogue is generated, i.e. basically by returning uninitialised local variable. Codes that rely on this are not beautiful pieces of code, i.e are buggy, but it might just be okay if you for example have a function that just initialises stuff (and the return value is not checked, directly or indirectly); some one might argue that not returning from that function might be a bit harsh. So this email is to probe if there would be strong resistance to follow the C behaviour? I am not yet sure how, but would perhaps a compromise be possible/acceptable to make the undefined behaviour explicit and also generate the function epilogue?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>The code snippet below is taken from CodeGenFunction.cpp, which implements this C++ behaviour and also nicely documents why that is:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>919   // C++11 [stmt.return]p2:<o:p></o:p></p><p class=MsoNormal>920   //   Flowing off the end of a function [...] results in undefined behavior in<o:p></o:p></p><p class=MsoNormal>921   //   a value-returning function.<o:p></o:p></p><p class=MsoNormal>922   // C11 6.9.1p12:        <o:p></o:p></p><p class=MsoNormal> 923   //   If the '}' that terminates a function is reached, and the value of the<o:p></o:p></p><p class=MsoNormal>924   //   function call is used by the caller, the behavior is undefined.<o:p></o:p></p><p class=MsoNormal>925   if (getLangOpts().CPlusPlus && !FD->hasImplicitReturnZero() && !SawAsmBlock &&<o:p></o:p></p><p class=MsoNormal>926       !FD->getReturnType()->isVoidType() && Builder.GetInsertBlock()) {<o:p></o:p></p><p class=MsoNormal>927     if (SanOpts.has(SanitizerKind::Return)) {<o:p></o:p></p><p class=MsoNormal>928       SanitizerScope SanScope(this);<o:p></o:p></p><p class=MsoNormal>929       llvm::Value *IsFalse = Builder.getFalse();<o:p></o:p></p><p class=MsoNormal>930       EmitCheck(std::make_pair(IsFalse, SanitizerKind::Return),<o:p></o:p></p><p class=MsoNormal>931                 "missing_return", EmitCheckSourceLocation(FD->getLocation()),<o:p></o:p></p><p class=MsoNormal>932                 None);<o:p></o:p></p><p class=MsoNormal>933     } else if (CGM.getCodeGenOpts().OptimizationLevel == 0) {<o:p></o:p></p><p class=MsoNormal>934       EmitTrapCall(llvm::Intrinsic::trap);                 <o:p></o:p></p><p class=MsoNormal> 935     }   <o:p></o:p></p><p class=MsoNormal> 936     Builder.CreateUnreachable();<o:p></o:p></p><p class=MsoNormal>937     Builder.ClearInsertionPoint();<o:p></o:p></p><p class=MsoNormal>938   }                                     <o:p></o:p></p><p class=MsoNormal> <o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Cheers,<o:p></o:p></p><p class=MsoNormal>Sjoerd.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>