Author: faisalv Date: Sat Aug 26 19:21:21 2017 New Revision: 311839 URL: http://llvm.org/viewvc/llvm-project?rev=311839&view=rev Log: Pass the correct object argument when a member call to an 'unrelated' class is made.
Prior to this patch, clang would do the wrong thing here (see inline comments for pre-patch behavior): struct A { void bar(int) { } static void bar(double) { } void g(int*); static void g(char *); }; struct B { void f() { A::bar(3); // selects (double) ??!! A::g((int*)0); // Instead of no object argument, states conversion error?!! } }; The fix is as follows: When we detect that what appears to be an implicit member function call (A::bar) is actually a call to a member of a class (A) unrelated to the type (B) that contains the member function (B::f) from which the call is being made, don't treat it (A::bar) as an Implicit Member Call Expression. P.S. I wonder if there is an existing bug report related to this? (Surprisingly, a cursory search did not find one). Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp cfe/trunk/test/SemaCXX/member-expr.cpp Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=311839&r1=311838&r2=311839&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaExprMember.cpp (original) +++ cfe/trunk/lib/Sema/SemaExprMember.cpp Sat Aug 26 19:21:21 2017 @@ -243,7 +243,6 @@ Sema::BuildPossibleImplicitMemberExpr(co return BuildImplicitMemberExpr(SS, TemplateKWLoc, R, TemplateArgs, true, S); case IMA_Mixed: - case IMA_Mixed_Unrelated: case IMA_Unresolved: return BuildImplicitMemberExpr(SS, TemplateKWLoc, R, TemplateArgs, false, S); @@ -252,6 +251,7 @@ Sema::BuildPossibleImplicitMemberExpr(co Diag(R.getNameLoc(), diag::warn_cxx98_compat_non_static_member_use) << R.getLookupNameInfo().getName(); // Fall through. + case IMA_Mixed_Unrelated: case IMA_Static: case IMA_Abstract: case IMA_Mixed_StaticContext: Modified: cfe/trunk/test/SemaCXX/member-expr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/member-expr.cpp?rev=311839&r1=311838&r2=311839&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/member-expr.cpp (original) +++ cfe/trunk/test/SemaCXX/member-expr.cpp Sat Aug 26 19:21:21 2017 @@ -228,3 +228,25 @@ namespace pr16676 { .i; // expected-error {{member reference type 'pr16676::S *' is a pointer; did you mean to use '->'}} } } + +namespace unrelated_class_instance_call_should_be_illformed { + + +struct A { + void bar(int) { } + static void bar(double) { } + + void g(int*); + static void g(char *); +}; + + +struct B { + void f() { + A::bar(3); //expected-error{{call to non-static member}} + A::g((int*)0); //expected-error{{call to non-static member}} + } +}; + + +} // ns unrelated_class_mixed_static_nonstatic_call_should_be_illformed _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits