[diff.stat] # Annex C (informative) Compatibility [[diff]](./#diff) ## C.7 C++ and C [[diff.iso]](diff.iso#diff.stat) ### C.7.5 [[stmt]](stmt "8 Statements"): statements [diff.stat] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3120) **Affected subclauses:** [[stmt.switch]](stmt.switch) and [[stmt.goto]](stmt.goto) **Change:** It is now invalid to jump past a declaration with explicit or implicit initializer (except across entire block not entered)[.](#1.sentence-1) **Rationale:** Constructors used in initializers may allocate resources which need to be de-allocated upon leaving the block[.](#1.sentence-2) Allowing jump past initializers would require complicated runtime determination of allocation[.](#1.sentence-3) Furthermore, many operations on such an uninitialized object have undefined behavior[.](#1.sentence-4) With this simple compile-time rule, C++ assures that if an initialized variable is in scope, then it has assuredly been initialized[.](#1.sentence-5) **Effect on original feature:** Deletion of semantically well-defined feature[.](#1.sentence-6) **Difficulty of converting:** Semantic transformation[.](#1.sentence-7) **How widely used:** Seldom[.](#1.sentence-8) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/compatibility.tex#L3141) **Affected subclause:** [[stmt.return]](stmt.return) **Change:** It is now invalid to return (explicitly or implicitly) from a function which is declared to return a value without actually returning a value[.](#2.sentence-1) **Rationale:** The caller and callee may assume fairly elaborate return-value mechanisms for the return of class objects[.](#2.sentence-2) If some flow paths execute a return without specifying any value, the implementation must embody many more complications[.](#2.sentence-3) Besides, promising to return a value of a given type, and then not returning such a value, has always been recognized to be a questionable practice, tolerated only because very-old C had no distinction between functions with void and int return types[.](#2.sentence-4) **Effect on original feature:** Deletion of semantically well-defined feature[.](#2.sentence-5) **Difficulty of converting:** Semantic transformation[.](#2.sentence-6) Add an appropriate return value to the source code, such as zero[.](#2.sentence-7) **How widely used:** Seldom[.](#2.sentence-8) For several years, many existing C implementations have produced warnings in this case[.](#2.sentence-9)