OK, the spec says that: A goto transfers to the statement labelled with Identifier. but couldn't the closing brace of a scope be regarded as an empty statement. int foo() { { goto L1; return 1; L1: } return 0; } fails, but of course L1: ; } is OK.