diff options
author | dim <dim@FreeBSD.org> | 2017-03-07 21:44:05 +0000 |
---|---|---|
committer | dim <dim@FreeBSD.org> | 2017-03-07 21:44:05 +0000 |
commit | 0b83b08fa41977cce765d5ea3e37843dea2d6fcc (patch) | |
tree | 9a7b0c024610dc97a628dbf20d0887d314babf05 /contrib/llvm/tools/clang/include | |
parent | 302c1ab5872d36595738b22e5c81f25970497b05 (diff) | |
download | FreeBSD-src-0b83b08fa41977cce765d5ea3e37843dea2d6fcc.zip FreeBSD-src-0b83b08fa41977cce765d5ea3e37843dea2d6fcc.tar.gz |
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.
Reported by: kami
PR: 215969
Diffstat (limited to 'contrib/llvm/tools/clang/include')
-rw-r--r-- | contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td | 3 | ||||
-rw-r--r-- | contrib/llvm/tools/clang/include/clang/Sema/Overload.h | 6 |
2 files changed, 8 insertions, 1 deletions
diff --git a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td index 98b687b..c49adc3 100644 --- a/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/contrib/llvm/tools/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3180,6 +3180,9 @@ def note_ovl_candidate : Note<"candidate " 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">; diff --git a/contrib/llvm/tools/clang/include/clang/Sema/Overload.h b/contrib/llvm/tools/clang/include/clang/Sema/Overload.h index d0f21cd..898b12e 100644 --- a/contrib/llvm/tools/clang/include/clang/Sema/Overload.h +++ b/contrib/llvm/tools/clang/include/clang/Sema/Overload.h @@ -586,7 +586,11 @@ namespace clang { 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). |