Hi,
the attached is slightly larger than my last ones but, assuming the
analysis is correct, should be pretty safe, it avoids a segfault: in
fact, for a pure virtual called from a NSDMI, current_function_decl is
null and the existing warning about *structors breaks. I'm reading
12.7/4 and I think we can solve the issue by just adding an
appropriately worded warning. Tested x86_64-linux.
Thanks,
Paolo.
///////////////////
Index: cp/call.c
===================================================================
--- cp/call.c (revision 208658)
+++ cp/call.c (working copy)
@@ -7828,15 +7828,20 @@ build_new_method_call_1 (tree instance, tree fns,
if (!(flags & LOOKUP_NONVIRTUAL)
&& DECL_PURE_VIRTUAL_P (fn)
&& instance == current_class_ref
- && (DECL_CONSTRUCTOR_P (current_function_decl)
- || DECL_DESTRUCTOR_P (current_function_decl))
&& (complain & tf_warning))
- /* This is not an error, it is runtime undefined
- behavior. */
- warning (0, (DECL_CONSTRUCTOR_P (current_function_decl) ?
- "pure virtual %q#D called from constructor"
- : "pure virtual %q#D called from destructor"),
- fn);
+ {
+ /* These is not an error, it is runtime undefined
+ behavior. */
+ if (!current_function_decl)
+ warning (0, "pure virtual %q#D called from "
+ "non-static data member initializer", fn);
+ else if (DECL_CONSTRUCTOR_P (current_function_decl)
+ || DECL_DESTRUCTOR_P (current_function_decl))
+ warning (0, (DECL_CONSTRUCTOR_P (current_function_decl)
+ ? "pure virtual %q#D called from constructor"
+ : "pure virtual %q#D called from destructor"),
+ fn);
+ }
if (TREE_CODE (TREE_TYPE (fn)) == METHOD_TYPE
&& is_dummy_object (instance))
Index: testsuite/g++.dg/cpp0x/nsdmi-virtual2.C
===================================================================
--- testsuite/g++.dg/cpp0x/nsdmi-virtual2.C (revision 0)
+++ testsuite/g++.dg/cpp0x/nsdmi-virtual2.C (working copy)
@@ -0,0 +1,8 @@
+// PR c++/51474
+// { dg-do compile { target c++11 } }
+
+struct A
+{
+ virtual int foo() = 0;
+ int i = foo(); // { dg-warning "pure virtual" }
+};