[Bug objc/77481] New: @finally not executed if exception not caught or rethrown

vries at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Sep 5 09:34:00 GMT 2016


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77481

            Bug ID: 77481
           Summary: @finally not executed if exception not caught or
                    rethrown
           Product: gcc
           Version: 7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: objc
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

Consider finally.m, testing 4 scenarios:
1. no exception
2. caught exception
3. uncaught exception
4. rethrown exception

finally.m:
...
#import <objc/Object.h>
#import <stdio.h>

#if F == 1
int
main (void)
{
  id o = nil;

  @try {

    printf ("trying\n");

  } @catch (id ue) {

    printf ("catching id\n");

  } @finally {

    printf ("finalizing\n");

  }

  printf ("done\n");
  return 0;
}
#endif

#if F == 2
int
main (void)
{
  id o = nil;

  @try {

    printf ("trying\n");
    @throw o;

  } @catch (id ue) {

    printf ("catching id\n");

  } @finally {

    printf ("finalizing\n");

  }

  printf ("done\n");
  return 0;
}
#endif

#if F == 3
int
main (void)
{
  id o = nil;

  @try {

    printf ("trying\n");
    @throw o;

  } @catch (Object *ue) {

    printf ("catching id\n");

  } @finally {

    printf ("finalizing\n");

  }

  printf ("done\n");
  return 0;
}
#endif

#if F == 4
int
main (void)
{
  id o = nil;

  @try {

    printf ("trying\n");
    @throw o;

  } @catch (id ue) {

    printf ("catching id\n");
    @throw;

  } @finally {

    printf ("finalizing\n");

  }

  printf ("done\n");
  return 0;
}
#endif
...

Executing with gcc gives:
...
$ for n in $(seq 1 4); do echo executing case $n; gcc -DF=$n finally.m
-fobjc-exceptions -lobjc -static && ./a.out ; echo $?; echo ; done
executing case 1
trying
finalizing
done
0

executing case 2
trying
catching id
finalizing
done
0

executing case 3
trying
Aborted (core dumped)
134

executing case 4
trying
catching id
Aborted (core dumped)
134
...

As we can see, in the cases of the uncaught and rethrown exception, finally is
not executed.

If we try the same with clang, we see that finally is executed in all four
cases:
...
$ for n in $(seq 1 4); do echo executing case $n; clang finally.m -lobjc
-fobjc-exceptions -static -fexceptions -DF=1 $n && ./a.out; echo $? ; echo;
done
executing case 1
trying
finalizing
done
0

executing case 2
trying
catching id
finalizing
done
0

executing case 3
trying
finalizing
Aborted (core dumped)
134

executing case 4
trying
catching id
finalizing
Aborted (core dumped)
134
...


More information about the Gcc-bugs mailing list