[cfe-dev] Patch & feedback request

Sebastian Redl sebastian.redl at getdesigned.at
Mon Jul 27 08:07:28 PDT 2009

Erik Verbruggen wrote:
> A new patch is attached
> On the map type: I checked http://llvm.org/docs/ProgrammersManual.html#ds_map and none of the other datatypes seem applicable.
Yes, we really need SmallPtrMap. It would be perfect for this.

Some comments on the patch.

> -    if (!Handler->getExceptionDecl())
> +    if (!Handler->getExceptionDecl() && i < NumHandlers - 1)
>        return StmtError(Diag(Handler->getLocStart(),
> diag::err_early_catch_all));
> +
> +    // Detect handlers for the same type as an earlier one.
> +    const QualType QT = Handler->getCaughtType();
> +               if (QT.isNull())
> +                       continue;

You have some tabs in here, but that's a minor point.

If I remember correctly, Handler->getExceptionDecl() == 0 <=>
Handler->getCaughtType().isNull(). Thus, I think this could be better
written as

if (!Handler->getExceptionDecl()) {
  if (i < NumHandlers - 1)
    return StmtError(...);

> +    const QualType CQT = QT.getTypePtr()->getCanonicalTypeInternal();
Why access the internal function directly? The usual way to get a
canonical type is

Also, I don't like the name QT. It says exactly nothing. Consider
calling the variables Caught and CanonicalCaught (or overwrite Caught
with the canonical form).

> +    const QTypeToHandler::const_iterator it = HandlersForTypes.find(CQT);
Since you're inserting when you don't find anything, it's faster (just
one lookup) and IMO more readable to do this:

CXXCatchStmt *&PrevHandler = HandlersForTypes[CQT];
if (PrevHandler) {
  // Diags here
} else
  PrevHandler = Handler;


More information about the cfe-dev mailing list