[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