From: Fariborz Jahanian Date: Wed, 30 Sep 2009 00:19:41 +0000 (+0000) Subject: self-referecing operator '->' member function was causing X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a4e345a8bf749b5462a127ecfb1f90d4a9d6ba7;p=clang self-referecing operator '->' member function was causing infinit recursion. This patch fixes it. [13.3.1.2]-p2 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83124 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 1d4e003e59..6843270ec0 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -1646,6 +1646,8 @@ def err_return_in_constructor_handler : Error< def err_ident_in_pseudo_dtor_not_a_type : Error< "identifier %0 in pseudo-destructor expression does not name a type">; +def err_operator_arrow_circular : Error< + "circular pointer delegation detected">; def err_pseudo_dtor_base_not_scalar : Error< "object expression of non-scalar type %0 cannot be used in a " "pseudo-destructor expression">; diff --git a/lib/Sema/SemaExprCXX.cpp b/lib/Sema/SemaExprCXX.cpp index 3ca8849e6c..fc32c3b3a6 100644 --- a/lib/Sema/SemaExprCXX.cpp +++ b/lib/Sema/SemaExprCXX.cpp @@ -1982,6 +1982,11 @@ Sema::ActOnStartCXXMemberReference(Scope *S, ExprArg Base, SourceLocation OpLoc, BaseExpr = (Expr*)Base.get(); if (BaseExpr == NULL) return ExprError(); + if (Context.getCanonicalType(BaseExpr->getType()) == + Context.getCanonicalType(BaseType)) { + Diag(OpLoc, diag::err_operator_arrow_circular); + return ExprError(); + } BaseType = BaseExpr->getType(); } } diff --git a/test/SemaCXX/overloaded-operator.cpp b/test/SemaCXX/overloaded-operator.cpp index 77b5d6c701..c849a145e2 100644 --- a/test/SemaCXX/overloaded-operator.cpp +++ b/test/SemaCXX/overloaded-operator.cpp @@ -213,3 +213,14 @@ namespace M { struct AA { bool operator!=(AA&); }; struct BB : AA {}; bool x(BB y, BB z) { return y != z; } + + +struct AX { + AX& operator ->(); + int b; +}; + +void m() { + AX a; + a->b = 0; // expected-error {{circular pointer delegation detected}} +}