From: John McCall Date: Wed, 30 Sep 2009 01:30:54 +0000 (+0000) Subject: Spare the processors of those poor wretches who have no choice but to write X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=432887fadd6bf87a6985906d6cef356b1f617d84;p=clang Spare the processors of those poor wretches who have no choice but to write unbounded chains of operator-> delegations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83134 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 25a6591d76..dafafba474 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1978,8 +1978,8 @@ Sema::ActOnStartCXXMemberReference(Scope *S, ExprArg Base, SourceLocation OpLoc, // returned, with the original second operand. if (OpKind == tok::arrow) { // The set of types we've considered so far. - llvm::SmallVector CTypes; - CTypes.push_back(Context.getCanonicalType(BaseType)); + llvm::SmallPtrSet CTypes; + CTypes.insert(Context.getCanonicalType(BaseType)); while (BaseType->isRecordType()) { Base = BuildOverloadedArrowExpr(S, move(Base), BaseExpr->getExprLoc()); @@ -1988,12 +1988,11 @@ Sema::ActOnStartCXXMemberReference(Scope *S, ExprArg Base, SourceLocation OpLoc, return ExprError(); BaseType = BaseExpr->getType(); CanQualType CBaseType = Context.getCanonicalType(BaseType); - if (std::find(CTypes.begin(), CTypes.end(), CBaseType) != CTypes.end()) { + if (!CTypes.insert(CBaseType)) { // TODO: note the chain of conversions Diag(OpLoc, diag::err_operator_arrow_circular); return ExprError(); } - CTypes.push_back(CBaseType); } }