[Cfp-interest] draft of syntax discussion for C committee

Jim Thomas jaswthomas at sbcglobal.net
Fri Jun 6 17:04:49 PDT 2014


On Jun 6, 2014, at 4:25 PM, David Hough CFP <pcfp at oakapple.net> wrote:

> Here are some revisions based on Jim's comments, along with responses
> on some of the comments:
> 
> =========================================
> 
> DIFF: 36,37c36,44
> 
> < traps, but with significant performance penalties for either the normal case 
> < or exceptional case.
> ---
>> traps, but that might entail significant performance penalties for either 
>> the normal case or exceptional case.     Exceptions can be detected
>> inline for each operation with tests on operands and results and flags -
>> slowing down the normal case - or at the end of the try clause with flags -
>> slowing the detection of the exceptional case (but testing flags alone does
>> not detect exact underflow exceptions).    Instead of traps,
>> some existing hardware such as
>> PowerPC can exploit its unconventional conditional branch instructions 
>> to detect exceptions.

Consider omitting “unconventional”.

> 
> COMMENT:
> 
> [
>> Is how to implement alternate exception handling without traps 
>> (including for underflow) documented somewhere?
> 
> Not that I know of - the general idea is mentioned here; how that works out
> in detailed code generation depends on the hardware architecture, but we
> could write up some hints that look like C code - 
> but I don't think this document is the place for it.

Right, this isn’t the place for such details. (I’m still wondering if some HW might not provide any way for a program to detect underflow exceptions.)

> ]
> 
> =========================================
> 
> DIFF: 150,151c157,160
> 
> < But having to specify the same exception-list in two different places
> < seems error-prone.
> ---
>> Compilers that would process the catch_fe clauses before generating the
>> try clause code could ignore that pragma.
>> One-pass compilers that encountered discrepancies in catch_fe clauses 
>> from the exceptions flagged in advance should probably generate errors.
> 
> COMMENT:
> 
> [
>> It doesn't need to be error prone. The CATCH_AHEAD exception list could be required to be a super set of all the catch_fe exception lists, which the compiler could check. The advantages would be a concise statement of exceptions that might get alternate exception handling and not having to see all the exception code before getting to the main code - which I believe would make the code more readable.
> 
> Actually the simplest method for doing what Jim proposes without duplicating
> effort might be like this:
> 
> {
> #pragma STDC catch_fe fe_exception1 label1
> #pragma STDC catch_fe fe_exception2 label2
>  ... normal case code
> }
>  ... normal case continues here
> label1:
>  ... exception case 1 code
> label2:
>  ... exception case 2 code
> 
> You don't need exception lists any more - list one exception at a time
> even if they both go to the same place.
> The above is entirely freed from block structure... or not:
> 
> {
> #pragma STDC catch_fe fe_exception1 label1
> #pragma STDC catch_fe fe_exception2 label2
>  ... normal case code
>  break;
> label1:
>  ... exception case 1 code
> label2:
>  ... exception case 2 code
> }
> ... normal case continues here
> 
> Putting it into C++ try/catch form requires a way of creating a type
> from an exception name:
> 
> try {
> #pragma STDC catch_fe fe_exception1
> #pragma STDC catch_fe fe_exception2
>  ... normal case code
> }
> catch (FE_EXCEPTION_TYPE(fp_exception1) e1) {
>  ... exception case 1 code
> }
> catch (FE_EXCEPTION_TYPE(fp_exception2) e2) {
>  ... exception case 2 code
> }
> ... normal case continues here
> 
> FE_EXCEPTION_TYPE is a standard macro that converts an <fenv.h> exception
> like FE_INVALID (which is just an implementation-defined integer 
> representing a bit in a field) into a type FE_INVALID_TYPE,
> since C++ style catch works on the type of its argument.
> Whatever is actually in the variable e1 or e2 doesn't matter because it's
> not likely to be in a form useful in a portable program.
> 
> I don't regard defining FE_EXCEPTION_TYPE 
> as doing the application programmer any favor.
> I'd much rather write
> catch_fe(fp_exception1)
> than 
> catch (FE_EXCEPTION_TYPE(fp_exception1) e1)
> 
> The point is that it could be made to look more or less like C++
> if that were deemed important enough.
> ]
> 
> =========================================
> 
> DIFF: 156,160c164,168
> 
> < exception handling could be added to C++ with minimal syntactic 
> < effort, and most of
> < C++ exception handling could be added to C with minimal syntactic 
> < effort.
> < If that compatibility is deemed to be of low value, 
> ---
>> exception handling could be added to C++ with less syntactic 
>> effort than other possible approaches, and most of
>> C++ exception handling could be added to C with less syntactic 
>> effort than other possible approaches.
>> If that compatibility were deemed to cost more than its benefit,

The pragma approach adds nothing to the syntax of the language.

> 
> COMMENT:
> 
> [
>>> One result of preserving some form of try/catch syntax is that 
>>> floating-point
>>> exception handling could be added to C++ with minimal syntactic effort, 
> 
>> Is this true? Has it been done?
> 
>>> and most of
>>> C++ exception handling could be added to C with minimal syntactic effort.
> 
>> Really? We don't have a specification of the changes to C required to add such syntax.
> 
> Neither of these has been done.
> But they would require minimal syntactic effort 
> compared to a completely different syntax.     

See previous comment.

> That doesn't address the effort to implement the semantics.
> ]
> 
> [
>>> If that compatibility is deemed to be of low value
> 
>> Not a fair statement. C and C++ compatibility is certainly of value, and it might be regarded as a reasons for not adding a different specialized try-catch.
> 
> I should have used the subjunctive here - I really don't know if there is
> consensus one way or another on the C committee on this point.
> ]
> 




More information about the Cfp-interest mailing list