[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