In Ada 2012, the RM 4.5.2(9.8) clause prevents an equality operator for an untagged record type from being declared after the type is frozen. While the clause is implemented in GNAT, the implementation has a loophole which lets subprogram bodies that are not the completion of a declaration pass the check without being flagged. Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * sem_ch6.adb (Analyze_Subprogram_Body_Helper): Set Acts_As_Spec earlier if the body is not the completion of a declaration. (Check_Untagged_Equality): Deal with subprogram bodies that are not the completion of a declaration and make sure that they are not flagged when they cause the freezing of the type themselves. Give a warning on the freezing point of the type in more cases. * sem_res.adb (Resolve_Equality_Op): Revert latest change.