diff options
| -rw-r--r-- | clang/lib/Sema/SemaType.cpp | 18 | 
1 files changed, 11 insertions, 7 deletions
diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index ad5d8b9a4e3..85112dbe21e 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3142,15 +3142,18 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state,      return false;    Sema &S = state.getSema(); +  SourceLocation AttrLoc = attr.getLoc(); +  if (AttrLoc.isMacroID()) +    AttrLoc = S.getSourceManager().getImmediateExpansionRange(AttrLoc).first;    if (type.getQualifiers().getObjCLifetime()) { -    S.Diag(attr.getLoc(), diag::err_attr_objc_ownership_redundant) +    S.Diag(AttrLoc, diag::err_attr_objc_ownership_redundant)        << type;      return true;    }    if (!attr.getParameterName()) { -    S.Diag(attr.getLoc(), diag::err_attribute_argument_n_not_string) +    S.Diag(AttrLoc, diag::err_attribute_argument_n_not_string)        << "objc_ownership" << 1;      attr.setInvalid();      return true; @@ -3166,7 +3169,7 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state,    else if (attr.getParameterName()->isStr("autoreleasing"))      lifetime = Qualifiers::OCL_Autoreleasing;    else { -    S.Diag(attr.getLoc(), diag::warn_attribute_type_not_supported) +    S.Diag(AttrLoc, diag::warn_attribute_type_not_supported)        << "objc_ownership" << attr.getParameterName();      attr.setInvalid();      return true; @@ -3184,7 +3187,7 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state,    // If we have a valid source location for the attribute, use an    // AttributedType instead. -  if (attr.getLoc().isValid()) +  if (AttrLoc.isValid())      type = S.Context.getAttributedType(AttributedType::attr_objc_ownership,                                         origType, type); @@ -3195,10 +3198,11 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state,      // Actually, delay this until we know what we're parsing.      if (S.DelayedDiagnostics.shouldDelayDiagnostics()) {        S.DelayedDiagnostics.add( -          sema::DelayedDiagnostic::makeForbiddenType(attr.getLoc(), +          sema::DelayedDiagnostic::makeForbiddenType( +              S.getSourceManager().getExpansionLoc(AttrLoc),                diag::err_arc_weak_no_runtime, type, /*ignored*/ 0));      } else { -      S.Diag(attr.getLoc(), diag::err_arc_weak_no_runtime); +      S.Diag(AttrLoc, diag::err_arc_weak_no_runtime);      }      attr.setInvalid(); @@ -3214,7 +3218,7 @@ static bool handleObjCOwnershipTypeAttr(TypeProcessingState &state,      if (const ObjCObjectPointerType *ObjT = T->getAs<ObjCObjectPointerType>()) {        ObjCInterfaceDecl *Class = ObjT->getInterfaceDecl();        if (Class->isArcWeakrefUnavailable()) { -          S.Diag(attr.getLoc(), diag::err_arc_unsupported_weak_class); +          S.Diag(AttrLoc, diag::err_arc_unsupported_weak_class);            S.Diag(ObjT->getInterfaceDecl()->getLocation(),                    diag::note_class_declared);        }  | 

