[cfe-dev] RFC: unreachable catch-clauses due to superclass cathes
AlisdairM(public)
public at alisdairm.net
Thu Jul 30 10:33:11 PDT 2009
[Oops, forgot the CC the list again with my reply]
> -----Original Message-----
> From: cfe-dev-bounces at cs.uiuc.edu [mailto:cfe-dev-bounces at cs.uiuc.edu]
> On Behalf Of Erik Verbruggen
> Sent: 30 July 2009 11:35
> To: clang-dev Developers
> Subject: [cfe-dev] RFC: unreachable catch-clauses due to superclass
> cathes
>
> Hi all,
>
> After doing duplicate handlers for exceptions in C++, there is still a
> FIXME in Sema::ActOnCXXTryBlock which I am thinking of fixing:
>
> // FIXME: We should detect handlers that cannot catch anything
> because an
> // earlier handler catches a superclass. Need to find a method that
> is not
> // quadratic for this.
>
> I pondered a bit on this, and I cannot think of a non-quadratic
> algorithm. So, does anybody have ideas for this?
>
> I am currently thinking of implementing a quadratic algorithm for it,
> and keep a TODO mentioning that the algorithm should be improved. That
> way, there at least is a check, albeit maybe not the most efficient
> one.
Actually, that FIXME sounds wrong. An earlier catch handler for a superclass may not trigger due to ambiguity when using multiple inheritance. Example:
struct base {};
struct a1 : base {};
struct a2 : base {};
struct derived : a1, a2 {};
int main() {
try {
throw derived();
}
catch( base const &) {} // ambiguous, not selected
catch( a1 const &) {
// a1 unambiguously derived from base
// yet this is the selected catch clause
}
}
This might be worth checking in as a perverse test case, but I'm not sure what the protocol for run-time checks in C++ is - all the current tests are syntax-check only as we are not yet generating code for C++.
AlisdairM
More information about the cfe-dev
mailing list