r193751 - Fixed bug with checking the kind of types.

Sean Silva silvas at purdue.edu
Thu Oct 31 15:11:13 PDT 2013


Test?


On Thu, Oct 31, 2013 at 11:38 AM, Chris Wailes <chris.wailes at gmail.com>wrote:

> Author: chris.wailes
> Date: Thu Oct 31 10:38:12 2013
> New Revision: 193751
>
> URL: http://llvm.org/viewvc/llvm-project?rev=193751&view=rev
> Log:
> Fixed bug with checking the kind of types.
>
> The isLValueReferenceType function checks to see if the QualType's
> canonical type is an LValue reference, and not if the QualType
> itself is an LValue reference.  This caused a segfault when trying
> to cast the QualType's Type to a LValueReference.  This is now
> fixed by casting the result of getCanonicalType().
>
> In addition, a test was added to isConsumableType to prevent
> segfaults when a type being tested by the analysis is a reference
> to a pointer or a pointer to a reference.
>
> Modified:
>     cfe/trunk/lib/Analysis/Consumed.cpp
>
> Modified: cfe/trunk/lib/Analysis/Consumed.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/Consumed.cpp?rev=193751&r1=193750&r2=193751&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Analysis/Consumed.cpp (original)
> +++ cfe/trunk/lib/Analysis/Consumed.cpp Thu Oct 31 10:38:12 2013
> @@ -142,10 +142,13 @@ static bool isCallableInState(const Call
>  }
>
>  static bool isConsumableType(const QualType &QT) {
> +  if (QT->isPointerType() || QT->isReferenceType())
> +    return false;
> +
>    if (const CXXRecordDecl *RD = QT->getAsCXXRecordDecl())
>      return RD->hasAttr<ConsumableAttr>();
> -  else
> -    return false;
> +
> +  return false;
>  }
>
>  static bool isKnownState(ConsumedState State) {
> @@ -163,7 +166,8 @@ static bool isKnownState(ConsumedState S
>  static bool isRValueRefish(QualType ParamType) {
>    return ParamType->isRValueReferenceType() ||
>          (ParamType->isLValueReferenceType() &&
> -         !cast<LValueReferenceType>(*ParamType).isSpelledAsLValue());
> +         !cast<LValueReferenceType>(
> +           ParamType.getCanonicalType())->isSpelledAsLValue());
>  }
>
>  static bool isTestingFunction(const FunctionDecl *FunDecl) {
> @@ -864,7 +868,7 @@ void ConsumedStmtVisitor::VisitParmVarDe
>      const ParamTypestateAttr *PTAttr =
> Param->getAttr<ParamTypestateAttr>();
>      ParamState = mapParamTypestateAttrState(PTAttr);
>
> -  } else if (isValueType(ParamType) && isConsumableType(ParamType)) {
> +  } else if (isConsumableType(ParamType)) {
>      ParamState = mapConsumableAttrState(ParamType);
>
>    } else if (isRValueRefish(ParamType) &&
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131031/4f5e229e/attachment.html>


More information about the cfe-commits mailing list