[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 13:50:24 PDT 2015


On Thu, Jul 16, 2015 at 4:41 PM, Tobias Langner
<randomcppprogrammer at gmail.com> wrote:
> Hi,
>
> I want to write a check that tests whether a catch is done by const reference or not. I currently have the following code but it can’t distinguish between const reference and reference:
>
>   const auto *catchStmt = Result.Nodes.getNodeAs<CXXCatchStmt>("catch");
>   if (catchStmt != nullptr) {
>     auto caughtType = catchStmt->getCaughtType();

This returns the QualType you are looking for.

caughType.isConstant() && caughtType->isLValueReferenceType();

should tell you if it's a const-qualified lvalue reference type.

~Aaron

>     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