[cfe-commits] r141522 - in /cfe/trunk: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExprMember.cpp test/SemaObjCXX/propert-dot-error.mm
Douglas Gregor
dgregor at apple.com
Mon Oct 10 09:12:01 PDT 2011
On Oct 10, 2011, at 9:05 AM, jahanian wrote:
>
> On Oct 9, 2011, at 4:22 PM, Douglas Gregor wrote:
>
>> Author: dgregor
>> Date: Sun Oct 9 18:22:49 2011
>> New Revision: 141522
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=141522&view=rev
>> Log:
>> Diagnose attempts to qualify the name of an instance variable or
>> property in an Objective-C++ member access expression. Fixes PR9759.
>>
>> Modified:
>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> cfe/trunk/lib/Sema/SemaExprMember.cpp
>> cfe/trunk/test/SemaObjCXX/propert-dot-error.mm
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=141522&r1=141521&r2=141522&view=diff
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Sun Oct 9 18:22:49 2011
>> @@ -3472,7 +3472,9 @@
>> "setter method is needed to assign to object using property" " assignment syntax">;
>> def error_no_subobject_property_setting : Error<
>> "expression is not assignable">;
>> -
>> +def err_qualified_objc_access : Error<
>> + "%select{property|ivar}0 access cannot be qualified with '%1'">;
>> +
>> def ext_freestanding_complex : Extension<
>> "complex numbers are an extension in a freestanding C99 implementation">;
>>
>>
>> Modified: cfe/trunk/lib/Sema/SemaExprMember.cpp
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprMember.cpp?rev=141522&r1=141521&r2=141522&view=diff
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaExprMember.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaExprMember.cpp Sun Oct 9 18:22:49 2011
>> @@ -1045,6 +1045,13 @@
>>
>> // Handle ivar access to Objective-C objects.
>> if (const ObjCObjectType *OTy = BaseType->getAs<ObjCObjectType>()) {
>> + if (!SS.isEmpty()) {
>> + Diag(SS.getRange().getBegin(), diag::err_qualified_objc_access)
>> + << 1 << SS.getScopeRep()
>> + << FixItHint::CreateRemoval(SS.getRange());
>> + SS.clear();
>> + }
>> +
>> IdentifierInfo *Member = MemberName.getAsIdentifierInfo();
>>
>> // There are three cases for the base type:
>> @@ -1163,6 +1170,13 @@
>> // Objective-C property access.
>> const ObjCObjectPointerType *OPT;
>> if (!IsArrow && (OPT = BaseType->getAs<ObjCObjectPointerType>())) {
>> + if (!SS.isEmpty()) {
>> + Diag(SS.getRange().getBegin(), diag::err_qualified_objc_access)
>> + << 0 << SS.getScopeRep()
>> + << FixItHint::CreateRemoval(SS.getRange());
>> + SS.clear();
>> + }
>> +
>> // This actually uses the base as an r-value.
>> BaseExpr = DefaultLvalueConversion(BaseExpr.take());
>> if (BaseExpr.isInvalid())
>>
>> Modified: cfe/trunk/test/SemaObjCXX/propert-dot-error.mm
>> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaObjCXX/propert-dot-error.mm?rev=141522&r1=141521&r2=141522&view=diff
>> ==============================================================================
>> --- cfe/trunk/test/SemaObjCXX/propert-dot-error.mm (original)
>> +++ cfe/trunk/test/SemaObjCXX/propert-dot-error.mm Sun Oct 9 18:22:49 2011
>> @@ -50,3 +50,18 @@
>> b->operator+ = 17; // expected-error{{'B' does not have a member named 'operator+'}}
>> }
>> @end
>> +
>> +// PR9759
>> +class Forward;
>> + at interface D {
>> + at public
>> + int ivar;
>> +}
>> +
>> + at property int property;
>> + at end
>> +
>> +void testD(D *d) {
>> + d.Forward::property = 17; // expected-error{{property access cannot be qualified with 'Forward::'}}
>> + d->Forward::ivar = 12; // expected-error{{ivar access cannot be qualified with 'Forward::'}}
>> +}
>
> This is the more interesting bug which currently crashes.
>
> // PR9759
> @interface D {
> @public
> int ivar;
> }
>
> @property int property;
> @end
>
> void testD(D *d) {
> d.D::property = 17; // expected-error{{property access cannot be qualified with 'D::'}}
> d->D::ivar = 12; // expected-error{{ivar access cannot be qualified with 'D::'}}
> }
Ah, nice catch! Fixed in r141544.
- Doug
More information about the cfe-commits
mailing list