[cfe-commits] r83133 - in /cfe/trunk: lib/Sema/SemaExprCXX.cpp test/SemaCXX/overloaded-operator.cpp
Chris Lattner
clattner at apple.com
Tue Sep 29 18:12:07 PDT 2009
On Sep 29, 2009, at 6:01 PM, John McCall wrote:
> Author: rjmccall
> Date: Tue Sep 29 20:01:30 2009
> New Revision: 83133
>
> URL: http://llvm.org/viewvc/llvm-project?rev=83133&view=rev
> Log:
> Detect operator-> chains of arbitrary length. Use a terrible data
> structure
> to strike fear into the hearts of CPUs everywhere.
*cough*, SmallPtrSet? :)
-Chris
>
>
> Modified:
> cfe/trunk/lib/Sema/SemaExprCXX.cpp
> cfe/trunk/test/SemaCXX/overloaded-operator.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=83133&r1=83132&r2=83133&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Sep 29 20:01:30 2009
> @@ -1977,17 +1977,23 @@
> // [...] When operator->returns, the operator-> is applied to
> the value
> // returned, with the original second operand.
> if (OpKind == tok::arrow) {
> + // The set of types we've considered so far.
> + llvm::SmallVector<CanQualType,8> CTypes;
> + CTypes.push_back(Context.getCanonicalType(BaseType));
> +
> while (BaseType->isRecordType()) {
> Base = BuildOverloadedArrowExpr(S, move(Base), BaseExpr-
> >getExprLoc());
> BaseExpr = (Expr*)Base.get();
> if (BaseExpr == NULL)
> return ExprError();
> - if (Context.getCanonicalType(BaseExpr->getType()) ==
> - Context.getCanonicalType(BaseType)) {
> + BaseType = BaseExpr->getType();
> + CanQualType CBaseType = Context.getCanonicalType(BaseType);
> + if (std::find(CTypes.begin(), CTypes.end(), CBaseType) !=
> CTypes.end()) {
> + // TODO: note the chain of conversions
> Diag(OpLoc, diag::err_operator_arrow_circular);
> return ExprError();
> }
> - BaseType = BaseExpr->getType();
> + CTypes.push_back(CBaseType);
> }
> }
>
>
> Modified: cfe/trunk/test/SemaCXX/overloaded-operator.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/overloaded-operator.cpp?rev=83133&r1=83132&r2=83133&view=diff
>
> =
> =
> =
> =
> =
> =
> =
> =
> ======================================================================
> --- cfe/trunk/test/SemaCXX/overloaded-operator.cpp (original)
> +++ cfe/trunk/test/SemaCXX/overloaded-operator.cpp Tue Sep 29
> 20:01:30 2009
> @@ -224,3 +224,19 @@
> AX a;
> a->b = 0; // expected-error {{circular pointer delegation detected}}
> }
> +
> +struct CircA {
> + struct CircB& operator->();
> + int val;
> +};
> +struct CircB {
> + struct CircC& operator->();
> +};
> +struct CircC {
> + struct CircA& operator->();
> +};
> +
> +void circ() {
> + CircA a;
> + a->val = 0; // expected-error {{circular pointer delegation
> detected}}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list