summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDávid Bolvanský <david.bolvansky@gmail.com>2019-11-04 16:26:21 +0100
committerDávid Bolvanský <david.bolvansky@gmail.com>2019-11-04 16:26:43 +0100
commit55507110b988c27cfb9ff4c2231fa38171692545 (patch)
treee2ecc8d8998efc0e2798bbba06e3d5ec239b7336
parent0bab0538d8cc0de242ed2936a4766930cfc934d2 (diff)
downloadbcm5719-llvm-55507110b988c27cfb9ff4c2231fa38171692545.tar.gz
bcm5719-llvm-55507110b988c27cfb9ff4c2231fa38171692545.zip
[Diagnostics] Improve some error messages related to bad use of dynamic_cast
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td6
-rw-r--r--clang/lib/Sema/SemaCast.cpp2
-rw-r--r--clang/test/SemaCXX/dynamic-cast.cpp12
-rw-r--r--clang/test/SemaTemplate/instantiate-cast.cpp2
4 files changed, 11 insertions, 11 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 2313c60f006..1aff4688de5 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -6568,10 +6568,10 @@ def err_downcast_from_inaccessible_base : Error<
def err_upcast_to_inaccessible_base : Error<
"cannot cast %0 to its %select{private|protected}2 base class %1">;
def err_bad_dynamic_cast_not_ref_or_ptr : Error<
- "%0 is not a reference or pointer">;
-def err_bad_dynamic_cast_not_class : Error<"%0 is not a class">;
+ "invalid target type %0 for dynamic_cast; target type must be a reference or pointer type to a defined class">;
+def err_bad_dynamic_cast_not_class : Error<"%0 is not a class type">;
def err_bad_dynamic_cast_incomplete : Error<"%0 is an incomplete type">;
-def err_bad_dynamic_cast_not_ptr : Error<"%0 is not a pointer">;
+def err_bad_dynamic_cast_not_ptr : Error<"cannot use dynamic_cast to convert from %0 to %1">;
def err_bad_dynamic_cast_not_polymorphic : Error<"%0 is not polymorphic">;
// Other C++ expressions
diff --git a/clang/lib/Sema/SemaCast.cpp b/clang/lib/Sema/SemaCast.cpp
index 2ab0a11e532..741cf638760 100644
--- a/clang/lib/Sema/SemaCast.cpp
+++ b/clang/lib/Sema/SemaCast.cpp
@@ -763,7 +763,7 @@ void CastOperation::CheckDynamicCast() {
SrcPointee = SrcPointer->getPointeeType();
} else {
Self.Diag(OpRange.getBegin(), diag::err_bad_dynamic_cast_not_ptr)
- << OrigSrcType << SrcExpr.get()->getSourceRange();
+ << OrigSrcType << this->DestType << SrcExpr.get()->getSourceRange();
SrcExpr = ExprError();
return;
}
diff --git a/clang/test/SemaCXX/dynamic-cast.cpp b/clang/test/SemaCXX/dynamic-cast.cpp
index b605194ecd6..6ab7823a093 100644
--- a/clang/test/SemaCXX/dynamic-cast.cpp
+++ b/clang/test/SemaCXX/dynamic-cast.cpp
@@ -22,17 +22,17 @@ struct PolyDerived : Poly
void basic_bad()
{
// ptr -> nonptr
- (void)dynamic_cast<A>((A*)0); // expected-error {{'A' is not a reference or pointer}}
+ (void)dynamic_cast<A>((A*)0); // expected-error {{invalid target type 'A' for dynamic_cast; target type must be a reference or pointer type to a defined class}}
// nonptr -> ptr
- (void)dynamic_cast<A*>(0); // expected-error {{'int' is not a pointer}}
+ (void)dynamic_cast<A*>(0); // expected-error {{cannot use dynamic_cast to convert from 'int' to 'A *'}}
// ptr -> noncls
- (void)dynamic_cast<int*>((A*)0); // expected-error {{'int' is not a class}}
+ (void)dynamic_cast<int*>((A*)0); // expected-error {{'int' is not a class type}}
// noncls -> ptr
- (void)dynamic_cast<A*>((int*)0); // expected-error {{'int' is not a class}}
+ (void)dynamic_cast<A*>((int*)0); // expected-error {{'int' is not a class type}}
// ref -> noncls
- (void)dynamic_cast<int&>(*((A*)0)); // expected-error {{'int' is not a class}}
+ (void)dynamic_cast<int&>(*((A*)0)); // expected-error {{'int' is not a class type}}
// noncls -> ref
- (void)dynamic_cast<A&>(*((int*)0)); // expected-error {{'int' is not a class}}
+ (void)dynamic_cast<A&>(*((int*)0)); // expected-error {{'int' is not a class type}}
// ptr -> incomplete
(void)dynamic_cast<Incomplete*>((A*)0); // expected-error {{'Incomplete' is an incomplete type}}
// incomplete -> ptr
diff --git a/clang/test/SemaTemplate/instantiate-cast.cpp b/clang/test/SemaTemplate/instantiate-cast.cpp
index 32a1cfdfec9..69aaac73b7f 100644
--- a/clang/test/SemaTemplate/instantiate-cast.cpp
+++ b/clang/test/SemaTemplate/instantiate-cast.cpp
@@ -57,7 +57,7 @@ template struct StaticCast0<int, A>; // expected-note{{instantiation}}
template<typename T, typename U>
struct DynamicCast0 {
void f(T t) {
- (void)dynamic_cast<U>(t); // expected-error{{not a reference or pointer}}
+ (void)dynamic_cast<U>(t); // expected-error{{invalid target type 'A' for dynamic_cast; target type must be a reference or pointer type to a defined class}}
}
};
OpenPOWER on IntegriCloud