https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52321
--- Comment #10 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Untested patch:
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -7348,8 +7348,19 @@ build_static_cast (tree type, tree oexpr, tsubst_flags_t
complain)
}
if (complain & tf_error)
- error ("invalid static_cast from type %qT to type %qT",
- TREE_TYPE (expr), type);
+ {
+ error ("invalid static_cast from type %qT to type %qT",
+ TREE_TYPE (expr), type);
+ if ((TYPE_PTR_P (type) || TYPE_REF_P (type))
+ || !COMPLETE_TYPE_P (TREE_TYPE (type)))
+ inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (TREE_TYPE (type))),
+ "class type %qT is incomplete", TREE_TYPE (type));
+ tree expr_type = TREE_TYPE (expr);
+ if ((TYPE_PTR_P (expr_type) || TYPE_REF_P (expr_type))
+ || !COMPLETE_TYPE_P (TREE_TYPE (expr_type)))
+ inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (TREE_TYPE (expr_type))),
+ "class type %qT is incomplete", TREE_TYPE (expr_type));
+ }
return error_mark_node;
}
For the original example this produces:
53231.cc: In function 'int main()':
53231.cc:5:31: error: invalid static_cast from type 'foo*' to type 'bar*'
5 | bar* b = static_cast<bar*>(f);
| ^
53231.cc:1:7: note: class type 'foo' is incomplete
1 | class foo;
| ^~~
And for the example from Bug 88503:
88503.cc: In function 'Derived* foo(Parent*)':
88503.cc:6:39: error: invalid static_cast from type 'Parent*' to type
'Derived*'
6 | return static_cast<Derived*>(p);
| ^
88503.cc:2:7: note: class type 'Derived' is incomplete
2 | class Derived;
| ^~~~~~~
88503.cc:1:7: note: class type 'Parent' is incomplete
1 | class Parent;
| ^~~~~~