Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
The offsetof macro is intended to work with subobjects rather than si…
…mple identifiers designating a member, making the -Wextended-offsetof diagnostic obsolete as this construct is not an extension. Implements WG14 DR496.
llvm-svn: 318796
Loading branch information
@@ -5546,9 +5546,6 @@ def err_offsetof_incomplete_type : Error<
def err_offsetof_record_type : Error<
"offsetof requires struct, union, or class type, %0 invalid">;
def err_offsetof_array_type : Error<"offsetof requires array type, %0 invalid">;
def ext_offsetof_extended_field_designator : Extension<
"using extended field designator is an extension">,
InGroup<DiagGroup<"extended-offsetof">>;
def ext_offsetof_non_pod_type : ExtWarn<"offset of on non-POD type %0">,
InGroup<InvalidOffsetof>;
def ext_offsetof_non_standardlayout_type : ExtWarn<
@@ -12588,15 +12588,7 @@ ExprResult Sema::BuildBuiltinOffsetOf(SourceLocation BuiltinLoc,
&& RequireCompleteType(BuiltinLoc, ArgTy,
diag::err_offsetof_incomplete_type, TypeRange))
return ExprError();
// offsetof with non-identifier designators (e.g. "offsetof(x, a.b[c])") are a
// GCC extension, diagnose them.
// FIXME: This diagnostic isn't actually visible because the location is in
// a system header!
if (Components.size() != 1)
Diag(BuiltinLoc, diag::ext_offsetof_extended_field_designator)
<< SourceRange(Components[1].LocStart, Components.back().LocEnd);
bool DidWarnAboutNonPOD = false;
QualType CurrentType = ArgTy;
SmallVector<OffsetOfNode, 4> Comps;
@@ -593,10 +593,10 @@ namespace dr447 { // dr447: yes
U<__builtin_offsetof (A, n)>::type a;
U<__builtin_offsetof (T, n)>::type b; // expected-error +{{}} expected-warning 0+{{}}
// as an extension, we allow the member-designator to include array indices
g (__builtin_offsetof (A, a[0 ])).h <int >(); // expected-error {{extension}}
g (__builtin_offsetof (A, a[N])).h <int >(); // expected-error {{extension}}
U<__builtin_offsetof (A, a[0 ])>::type c; // expected-error {{extension}}
U<__builtin_offsetof (A, a[N])>::type d; // expected-error {{extension}} expected-error +{{}} expected-warning 0+{{}}
g (__builtin_offsetof (A, a[0 ])).h <int >();
g (__builtin_offsetof (A, a[N])).h <int >();
U<__builtin_offsetof (A, a[0 ])>::type c;
U<__builtin_offsetof (A, a[N])>::type d; // expected-error +{{}} expected-warning 0+{{}}
}
}
Toggle all file notes
Toggle all file annotations