Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 9 Mar 2017 03:10:59 +0000 (UTC)
From:      Brooks Davis <brooks@FreeBSD.org>
To:        ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org
Subject:   svn commit: r435742 - in head/devel/llvm39: . files
Message-ID:  <201703090310.v293AxIC007957@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: brooks
Date: Thu Mar  9 03:10:59 2017
New Revision: 435742
URL: https://svnweb.freebsd.org/changeset/ports/435742

Log:
  Apply the changes from FreeBSD r314883:
  
  Pull in r291403 from upstream clang trunk (by Richard Smith):
  
    PR30305: Implement proposed DR resolution to prevent slicing via
    inherited constructor.
  
    The rule we use is that a construction of a class type T from an
    argument of type U cannot use an inherited constructor if U is the
    same as T or is derived from T (or if the initialization would first
    convert it to such a type). This (approximately) matches the rule in
    use by GCC, and matches the current proposed DR resolution.
  
  Pull in r291955 from upstream clang trunk (by Richard Smith):
  
    PR31606: Generalize our tentative DR resolution for inheriting
    copy/move constructors to better match the pre-P0136R1 behavior.
  
  Together, these fix an issue with C++ using declarations sometimes
  enabling illegal implicit casts.
  
  Direct commit to stable/11, since head already has clang 4.0.0, which
  includes this change.
  
  PR:		215969
  Submitted by:	dim

Added:
  head/devel/llvm39/files/clang-patch-tools_clang_include_clang_Basic_DiagnosticSemaKinds.td   (contents, props changed)
  head/devel/llvm39/files/clang-patch-tools_clang_lib_Sema_SemaOverload.cpp   (contents, props changed)
  head/devel/llvm39/files/config-patch-tools_clang_include_clang_Sema_Overload.h   (contents, props changed)
Modified:
  head/devel/llvm39/Makefile

Modified: head/devel/llvm39/Makefile
==============================================================================
--- head/devel/llvm39/Makefile	Thu Mar  9 03:05:19 2017	(r435741)
+++ head/devel/llvm39/Makefile	Thu Mar  9 03:10:59 2017	(r435742)
@@ -2,7 +2,7 @@
 
 PORTNAME=	llvm
 DISTVERSION=	3.9.1
-PORTREVISION=	1
+PORTREVISION=	2
 CATEGORIES=	devel lang
 MASTER_SITES=	http://llvm.org/${PRE_}releases/${LLVM_RELEASE}/${RCDIR}
 PKGNAMESUFFIX=	${LLVM_SUFFIX}
@@ -56,7 +56,10 @@ CLANG_EXTRA_PATCHES= \
 	${PATCHDIR}/clang-patch-fopenmp.diff \
 	${PATCHDIR}/clang-patch-tools_clang_lib_Headers_CMakeLists.txt \
 	${PATCHDIR}/clang-patch-tools_clang_tools_clang-format_clang-format.py \
-	${PATCHDIR}/clang-patch-tools_clang_tools_scan-build_libexec_ccc-analyzer
+	${PATCHDIR}/clang-patch-tools_clang_tools_scan-build_libexec_ccc-analyzer \
+	${PATCHDIR}/clang-patch-tools_clang_include_clang_Basic_DiagnosticSemaKinds.td \
+	${PATCHDIR}/clang-patch-tools_clang_lib_Sema_SemaOverload.cpp \
+	${PATCHDIR}/config-patch-tools_clang_include_clang_Sema_Overload.h
 CLANG_CONFLICTS_INSTALL=	clang-devel-3.[1234567]*
 CLANG_DISTFILES=	cfe-${DISTVERSION}.src${EXTRACT_SUFX}
 CLANG_CMAKE_ON=		-DCLANG_DEFAULT_OPENMP_RUNTIME=libomp

Added: head/devel/llvm39/files/clang-patch-tools_clang_include_clang_Basic_DiagnosticSemaKinds.td
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/llvm39/files/clang-patch-tools_clang_include_clang_Basic_DiagnosticSemaKinds.td	Thu Mar  9 03:10:59 2017	(r435742)
@@ -0,0 +1,15 @@
+
+$FreeBSD$
+
+--- tools/clang/include/clang/Basic/DiagnosticSemaKinds.td.orig
++++ tools/clang/include/clang/Basic/DiagnosticSemaKinds.td
+@@ -3180,6 +3180,9 @@
+ 
+ def note_ovl_candidate_inherited_constructor : Note<
+     "constructor from base class %0 inherited here">;
++def note_ovl_candidate_inherited_constructor_slice : Note<
++    "candidate %select{constructor|template}0 ignored: "
++    "inherited constructor cannot be used to %select{copy|move}1 object">;
+ def note_ovl_candidate_illegal_constructor : Note<
+     "candidate %select{constructor|template}0 ignored: "
+     "instantiation %select{takes|would take}0 its own class type by value">;

Added: head/devel/llvm39/files/clang-patch-tools_clang_lib_Sema_SemaOverload.cpp
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/llvm39/files/clang-patch-tools_clang_lib_Sema_SemaOverload.cpp	Thu Mar  9 03:10:59 2017	(r435742)
@@ -0,0 +1,52 @@
+
+$FreeBSD$
+
+--- tools/clang/lib/Sema/SemaOverload.cpp.orig
++++ tools/clang/lib/Sema/SemaOverload.cpp
+@@ -5783,6 +5783,28 @@
+       Candidate.FailureKind = ovl_fail_illegal_constructor;
+       return;
+     }
++
++    // C++ [over.match.funcs]p8: (proposed DR resolution)
++    //   A constructor inherited from class type C that has a first parameter
++    //   of type "reference to P" (including such a constructor instantiated
++    //   from a template) is excluded from the set of candidate functions when
++    //   constructing an object of type cv D if the argument list has exactly
++    //   one argument and D is reference-related to P and P is reference-related
++    //   to C.
++    auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(FoundDecl.getDecl());
++    if (Shadow && Args.size() == 1 && Constructor->getNumParams() >= 1 &&
++        Constructor->getParamDecl(0)->getType()->isReferenceType()) {
++      QualType P = Constructor->getParamDecl(0)->getType()->getPointeeType();
++      QualType C = Context.getRecordType(Constructor->getParent());
++      QualType D = Context.getRecordType(Shadow->getParent());
++      SourceLocation Loc = Args.front()->getExprLoc();
++      if ((Context.hasSameUnqualifiedType(P, C) || IsDerivedFrom(Loc, P, C)) &&
++          (Context.hasSameUnqualifiedType(D, P) || IsDerivedFrom(Loc, D, P))) {
++        Candidate.Viable = false;
++        Candidate.FailureKind = ovl_fail_inhctor_slice;
++        return;
++      }
++    }
+   }
+ 
+   unsigned NumParams = Proto->getNumParams();
+@@ -9750,6 +9772,17 @@
+   case ovl_fail_enable_if:
+     return DiagnoseFailedEnableIfAttr(S, Cand);
+ 
++  case ovl_fail_inhctor_slice:
++    // It's generally not interesting to note copy/move constructors here.
++    if (cast<CXXConstructorDecl>(Fn)->isCopyOrMoveConstructor())
++      return;
++    S.Diag(Fn->getLocation(),
++           diag::note_ovl_candidate_inherited_constructor_slice)
++      << (Fn->getPrimaryTemplate() ? 1 : 0)
++      << Fn->getParamDecl(0)->getType()->isRValueReferenceType();
++    MaybeEmitInheritedConstructorNote(S, Cand->FoundDecl);
++    return;
++
+   case ovl_fail_addr_not_available: {
+     bool Available = checkAddressOfCandidateIsAvailable(S, Cand->Function);
+     (void)Available;

Added: head/devel/llvm39/files/config-patch-tools_clang_include_clang_Sema_Overload.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/devel/llvm39/files/config-patch-tools_clang_include_clang_Sema_Overload.h	Thu Mar  9 03:10:59 2017	(r435742)
@@ -0,0 +1,18 @@
+
+$FreeBSD$
+
+--- tools/clang/include/clang/Sema/Overload.h.orig
++++ tools/clang/include/clang/Sema/Overload.h
+@@ -586,7 +586,11 @@
+     ovl_fail_enable_if,
+ 
+     /// This candidate was not viable because its address could not be taken.
+-    ovl_fail_addr_not_available
++    ovl_fail_addr_not_available,
++
++    /// This inherited constructor is not viable because it would slice the
++    /// argument.
++    ovl_fail_inhctor_slice,
+   };
+ 
+   /// OverloadCandidate - A single candidate in an overload set (C++ 13.3).



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703090310.v293AxIC007957>