From b721240f8edc7f511e64955957d5f69778bf4105 Mon Sep 17 00:00:00 2001 From: Argiris Kirtzidis Date: Tue, 25 Jan 2011 23:16:36 +0000 Subject: [PATCH] Fix infinite loop during error diagnostics. Fixes rdar://8875304. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124243 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaExpr.cpp | 2 +- test/SemaCXX/arrow-operator.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index e84e0e11f..9ebfb0593 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -3814,7 +3814,7 @@ Sema::LookupMemberExpr(LookupResult &R, Expr *&BaseExpr, // - 'type' is an Objective C type // - 'bar' is a pseudo-destructor name which happens to refer to // the appropriate pointer type - } else if (Ptr->getPointeeType()->isRecordType() && + } else if (!IsArrow && Ptr->getPointeeType()->isRecordType() && MemberName.getNameKind() != DeclarationName::CXXDestructorName) { Diag(OpLoc, diag::err_typecheck_member_reference_suggestion) << BaseType << int(IsArrow) << BaseExpr->getSourceRange() diff --git a/test/SemaCXX/arrow-operator.cpp b/test/SemaCXX/arrow-operator.cpp index 29b23edad..6535a0a2f 100644 --- a/test/SemaCXX/arrow-operator.cpp +++ b/test/SemaCXX/arrow-operator.cpp @@ -23,3 +23,16 @@ void f(C &c, D& d, E& e) { d->f(); e->f(); // expected-error{{incomplete definition of type}} } + +// rdar://8875304 +namespace rdar8875304 { +class Point {}; +class Line_Segment{ public: Line_Segment(const Point&){} }; +class Node { public: Point Location(){ Point p; return p; } }; + +void f() +{ + Node** node1; + Line_Segment(node1->Location()); // expected-error {{not a structure or union}} +} +} -- 2.11.4.GIT