r333498 - Sema: Add a flag for rejecting member pointers with incomplete base types.

Mike Edwards via cfe-commits cfe-commits at lists.llvm.org
Tue May 29 21:33:26 PDT 2018


Hi Peter,
Would you please have a look at:
http://green.lab.llvm.org/green/job/clang-stage1-cmake-RA-incremental/48945/

It looks like this commit cause a test failure on the Green Dragon
Incremental Builder.

Thanks,
Mike

On Tue, May 29, 2018 at 8:40 PM, Peter Collingbourne via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: pcc
> Date: Tue May 29 20:40:04 2018
> New Revision: 333498
>
> URL: http://llvm.org/viewvc/llvm-project?rev=333498&view=rev
> Log:
> Sema: Add a flag for rejecting member pointers with incomplete base types.
>
> Codebases that need to be compatible with the Microsoft ABI can pass
> this flag to avoid issues caused by the lack of a fixed ABI for
> incomplete member pointers.
>
> Differential Revision: https://reviews.llvm.org/D47503
>
> Added:
>     cfe/trunk/test/Driver/complete-member-pointers.cpp
>     cfe/trunk/test/SemaCXX/complete-member-pointers.cpp
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/include/clang/Basic/LangOptions.def
>     cfe/trunk/include/clang/Driver/Options.td
>     cfe/trunk/lib/Driver/ToolChains/Clang.cpp
>     cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>     cfe/trunk/lib/Sema/SemaType.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/
> DiagnosticSemaKinds.td?rev=333498&r1=333497&r2=333498&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue May 29
> 20:40:04 2018
> @@ -6350,6 +6350,8 @@ def err_bad_memptr_rhs : Error<
>  def err_bad_memptr_lhs : Error<
>    "left hand operand to %0 must be a %select{|pointer to }1class "
>    "compatible with the right hand operand, but is %2">;
> +def err_memptr_incomplete : Error<
> +  "member pointer has incomplete base type %0">;
>  def warn_exception_caught_by_earlier_handler : Warning<
>    "exception of type %0 will be caught by earlier handler">,
>    InGroup<Exceptions>;
>
> Modified: cfe/trunk/include/clang/Basic/LangOptions.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Basic/LangOptions.def?rev=333498&r1=333497&r2=333498&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Basic/LangOptions.def (original)
> +++ cfe/trunk/include/clang/Basic/LangOptions.def Tue May 29 20:40:04 2018
> @@ -247,6 +247,10 @@ ENUM_LANGOPT(AddressSpaceMapMangling , A
>  LANGOPT(IncludeDefaultHeader, 1, 0, "Include default header file for
> OpenCL")
>  BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "delayed template parsing")
>  LANGOPT(BlocksRuntimeOptional , 1, 0, "optional blocks runtime")
> +LANGOPT(
> +    CompleteMemberPointers, 1, 0,
> +    "Require member pointer base types to be complete at the point where
> the "
> +    "type's inheritance model would be determined under the Microsoft
> ABI")
>
>  ENUM_LANGOPT(GC, GCMode, 2, NonGC, "Objective-C Garbage Collection mode")
>  ENUM_LANGOPT(ValueVisibilityMode, Visibility, 3, DefaultVisibility,
>
> Modified: cfe/trunk/include/clang/Driver/Options.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/
> clang/Driver/Options.td?rev=333498&r1=333497&r2=333498&view=diff
> ============================================================
> ==================
> --- cfe/trunk/include/clang/Driver/Options.td (original)
> +++ cfe/trunk/include/clang/Driver/Options.td Tue May 29 20:40:04 2018
> @@ -782,6 +782,12 @@ def fcomment_block_commands : CommaJoine
>  def fparse_all_comments : Flag<["-"], "fparse-all-comments">,
> Group<f_clang_Group>, Flags<[CC1Option]>;
>  def fcommon : Flag<["-"], "fcommon">, Group<f_Group>;
>  def fcompile_resource_EQ : Joined<["-"], "fcompile-resource=">,
> Group<f_Group>;
> +def fcomplete_member_pointers : Flag<["-"], "fcomplete-member-pointers">,
> Group<f_clang_Group>,
> +   Flags<[CoreOption, CC1Option]>,
> +   HelpText<"Require member pointer base types to be complete if they
> would be significant under the Microsoft ABI">;
> +def fno_complete_member_pointers : Flag<["-"],
> "fno-complete-member-pointers">, Group<f_clang_Group>,
> +   Flags<[CoreOption]>,
> +   HelpText<"Do not require member pointer base types to be complete if
> they would be significant under the Microsoft ABI">;
>  def fconstant_cfstrings : Flag<["-"], "fconstant-cfstrings">,
> Group<f_Group>;
>  def fconstant_string_class_EQ : Joined<["-"], "fconstant-string-class=">,
> Group<f_Group>;
>  def fconstexpr_depth_EQ : Joined<["-"], "fconstexpr-depth=">,
> Group<f_Group>;
>
> Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/
> ToolChains/Clang.cpp?rev=333498&r1=333497&r2=333498&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original)
> +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Tue May 29 20:40:04 2018
> @@ -4784,6 +4784,10 @@ void Clang::ConstructJob(Compilation &C,
>        CmdArgs.push_back("-fforce-enable-int128");
>    }
>
> +  if (Args.hasFlag(options::OPT_fcomplete_member_pointers,
> +                   options::OPT_fno_complete_member_pointers, false))
> +    CmdArgs.push_back("-fcomplete-member-pointers");
> +
>    // Finally add the compile command to the compilation.
>    if (Args.hasArg(options::OPT__SLASH_fallback) &&
>        Output.getType() == types::TY_Object &&
>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/
> Frontend/CompilerInvocation.cpp?rev=333498&r1=333497&r2=333498&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Tue May 29 20:40:04 2018
> @@ -2754,6 +2754,8 @@ static void ParseLangArgs(LangOptions &O
>            << A->getAsString(Args) << A->getValue();
>      }
>    }
> +
> +  Opts.CompleteMemberPointers = Args.hasArg(OPT_fcomplete_
> member_pointers);
>  }
>
>  static bool isStrictlyPreprocessorAction(frontend::ActionKind Action) {
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/
> SemaType.cpp?rev=333498&r1=333497&r2=333498&view=diff
> ============================================================
> ==================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Tue May 29 20:40:04 2018
> @@ -7585,11 +7585,17 @@ bool Sema::RequireCompleteTypeImpl(Sourc
>    //  assert(!T->isDependentType() &&
>    //         "Can't ask whether a dependent type is complete");
>
> -  // We lock in the inheritance model once somebody has asked us to ensure
> -  // that a pointer-to-member type is complete.
> -  if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
> -    if (const MemberPointerType *MPTy = T->getAs<MemberPointerType>()) {
> -      if (!MPTy->getClass()->isDependentType()) {
> +  if (const MemberPointerType *MPTy = T->getAs<MemberPointerType>()) {
> +    if (!MPTy->getClass()->isDependentType()) {
> +      if (getLangOpts().CompleteMemberPointers &&
> +          !MPTy->getClass()->getAsCXXRecordDecl()->isBeingDefined() &&
> +          RequireCompleteType(Loc, QualType(MPTy->getClass(), 0),
> +                              diag::err_memptr_incomplete))
> +        return true;
> +
> +      // We lock in the inheritance model once somebody has asked us to
> ensure
> +      // that a pointer-to-member type is complete.
> +      if (Context.getTargetInfo().getCXXABI().isMicrosoft()) {
>          (void)isCompleteType(Loc, QualType(MPTy->getClass(), 0));
>          assignInheritanceModel(*this, MPTy->
> getMostRecentCXXRecordDecl());
>        }
>
> Added: cfe/trunk/test/Driver/complete-member-pointers.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/
> complete-member-pointers.cpp?rev=333498&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/Driver/complete-member-pointers.cpp (added)
> +++ cfe/trunk/test/Driver/complete-member-pointers.cpp Tue May 29
> 20:40:04 2018
> @@ -0,0 +1,7 @@
> +// RUN: %clangxx -### -c %s -o %t.o -target x86_64-unknown-linux 2>&1 |
> FileCheck --check-prefix=NOFLAG %s
> +// RUN: %clangxx -### -c %s -o %t.o -target x86_64-unknown-linux
> -fcomplete-member-pointers 2>&1 | FileCheck %s
> +// RUN: %clangxx -### -c %s -o %t.o -target x86_64-unknown-linux
> -fcomplete-member-pointers -fno-complete-member-pointers 2>&1 | FileCheck
> --check-prefix=NOFLAG %s
> +// RUN: %clang_cl -### /c %s /Fo%t.o -target x86_64-pc-win32
> -fcomplete-member-pointers 2>&1 | FileCheck %s
> +
> +// CHECK: "-fcomplete-member-pointers"
> +// NOFLAG-NOT: "-fcomplete-member-pointers"
>
> Added: cfe/trunk/test/SemaCXX/complete-member-pointers.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/
> SemaCXX/complete-member-pointers.cpp?rev=333498&view=auto
> ============================================================
> ==================
> --- cfe/trunk/test/SemaCXX/complete-member-pointers.cpp (added)
> +++ cfe/trunk/test/SemaCXX/complete-member-pointers.cpp Tue May 29
> 20:40:04 2018
> @@ -0,0 +1,15 @@
> +// RUN: %clang_cc1 -verify -fsyntax-only -fcomplete-member-pointers %s
> +
> +struct S; // expected-note {{forward declaration of 'S'}}
> +typedef int S::*t;
> +t foo; // expected-error {{member pointer has incomplete base type 'S'}}
> +
> +struct S2 {
> +  int S2::*foo;
> +};
> +int S2::*bar;
> +
> +template <typename T>
> +struct S3 {
> +  int T::*foo;
> +};
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20180529/f2621f86/attachment-0001.html>


More information about the cfe-commits mailing list