From: Aaron Ballman Date: Tue, 21 Nov 2017 19:25:38 +0000 (+0000) Subject: The offsetof macro is intended to work with subobjects rather than simple identifiers... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=781caf03bdf97c1ce3fd6978b6796511408783bc;p=clang The offsetof macro is intended to work with subobjects rather than simple identifiers designating a member, making the -Wextended-offsetof diagnostic obsolete as this construct is not an extension. Implements WG14 DR496. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@318796 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 348b225f91..8725415af9 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -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>; def ext_offsetof_non_pod_type : ExtWarn<"offset of on non-POD type %0">, InGroup; def ext_offsetof_non_standardlayout_type : ExtWarn< diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index f895e0fa1f..4df9a81bab 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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 Comps; diff --git a/test/CXX/drs/dr4xx.cpp b/test/CXX/drs/dr4xx.cpp index 1a5976eada..2e6a261ad0 100644 --- a/test/CXX/drs/dr4xx.cpp +++ b/test/CXX/drs/dr4xx.cpp @@ -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(); // expected-error {{extension}} - g(__builtin_offsetof(A, a[N])).h(); // 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(); + g(__builtin_offsetof(A, a[N])).h(); + U<__builtin_offsetof(A, a[0])>::type c; + U<__builtin_offsetof(A, a[N])>::type d; // expected-error +{{}} expected-warning 0+{{}} } }