On May 16, 2013, at 9:43 PM, John McCall <[email protected]> wrote:
> On May 16, 2013, at 5:11 PM, jahanian <[email protected]> wrote: >> Attached patch fixes a sema crash when gnu’s ?: extension is used for >> Objective-C++’s dictionary subscripting. >> This is done by essentially allowing application of unary conversion on the >> common expression when >> its type is pseudo-object type. (common expression is ObjCSubscriptRefExpr >> with the >> pseudo-object type which is not suitable for the lhs expression of the >> conditional). >> Please review. This is for // rdar://13749180 > > This is the right way to fix this, but (1) go ahead and filter out all the > placeholder types instead of just pseudo-objects, and (2) please do > that before this check so that we can do the right thing for getters > of reference type. > > That is, do this: > // Lower out placeholder types first. This is important so that we don't > // try to capture a placeholder, and it also lets us do the right thing in > // a few cases in C++. > // the placeholder happens > if (commonExpr->hasPlaceholderType()) { > ExprResult result = CheckPlaceholderExpr(commonExpr); > if (!result.isUsable()) return ExprError(); > commonExpr = result.take(); > } > > This should make us do the right thing with overloaded function > references; here's a test case for that: > > template <class T, class U = T> T foo(U x) { return x; } > ... > int (*fn)(int) = (&foo<int> ?: 0); > > (this might not be *useful*, but it should *work*) > > And here's an ObjC++ test case for a reference-valued property: > @interface A > - (int &) foo; > @end > ... > void test(A *a) { > int x = 0; > int &y = a.foo ?: x; > } Somehow, these two tests were not adequate to show the necessity for more general lowering of placeholder types. Regardless, r182120 does this as you suggested. Thanks for the detailed review. - Fariborz > > John.
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
