summaryrefslogtreecommitdiffstats
path: root/contrib/llvm/tools/clang/include
diff options
context:
space:
mode:
authordim <dim@FreeBSD.org>2017-03-07 21:44:05 +0000
committerdim <dim@FreeBSD.org>2017-03-07 21:44:05 +0000
commit0b83b08fa41977cce765d5ea3e37843dea2d6fcc (patch)
tree9a7b0c024610dc97a628dbf20d0887d314babf05 /contrib/llvm/tools/clang/include
parent302c1ab5872d36595738b22e5c81f25970497b05 (diff)
downloadFreeBSD-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.td3
-rw-r--r--contrib/llvm/tools/clang/include/clang/Sema/Overload.h6
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).
OpenPOWER on IntegriCloud