[cfe-dev] clang ast: how do I find out whether a catch is done by const reference

Aaron Ballman aaron at aaronballman.com
Thu Jul 16 15:00:54 PDT 2015


Sorry, I got distracted by some clang-query crashes when trying to
make a matcher for this. ;-) The issue is that the top level is not
const qualified. You need to look at what the lvalue reference is
referencing to see if that is const qualified.

clang-query> match
catchStmt(has(varDecl(hasType(references(isConstQualified())))))

Match #1:

E:\Aaron Ballman\Documents\test.cpp:15:5: note: "root" binds here
  } catch (const logic_error &e) {
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 match.

~Aaron

On Thu, Jul 16, 2015 at 5:53 PM, Tobias Langner
<randomcppprogrammer at gmail.com> wrote:
> yes, the result is the same. If someone wants a compilable example:
> https://github.com/iso8859-1/clang-tools-extra/tree/tobias-additional-checks
> (a reasonably new fork of the extra tools). The branch
> “tobias-additional-checks” contains the code.
>
> Thank you
> Tobias
>
>
> Do you get the same results if you look at the canonical type instead?
>
> auto QT = caughtType->getCaughtType().getCanonicalType();
> if (QT.isConstQualified() && QT->isLValueReferenceType()) ...
>
> ~Aaron
>
>
> Regards
> Tobias
>
>   auto *type = caughtType.getTypePtr();
>   auto *varDecl = catchStmt->getExceptionDecl();
>   if (type->isPointerType()) {
>     diag(varDecl->getLocStart(),
>          "catch by const reference instead of pointer");
>   } else if (!type->isReferenceType()) {
>     diag(varDecl->getLocStart(), "catch by const reference");
>   } else {
>     if (caughtType.isConstQualified() == false) {
>       diag(varDecl->getLocStart(),
>            "catch by const reference to avoid unnecessary copies");
>     }
>   }
> }
>
> I tried looking at the varDecl but from there I can’t even find out how to
> get the QualType. Can somebody give me a hint?
>
> Regards
> Tobias
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
>




More information about the cfe-dev mailing list