re PR c++/71099 (Misleading diagnostic message with 'virtual' used in out-of-line...
authorPaolo Carlini <paolo.carlini@oracle.com>
Mon, 30 May 2016 15:10:51 +0000 (15:10 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Mon, 30 May 2016 15:10:51 +0000 (15:10 +0000)
/cp
2016-05-30  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/71099
* parser.c (cp_parser_function_specifier_opt): Use current_class_type
to improve the diagnostic about wrong uses of 'virtual'.

/testsuite
2016-05-30  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/71099
* g++.dg/parse/virtual1.C: New.

From-SVN: r236885

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/virtual1.C [new file with mode: 0644]

index b970c6ebae4c5704cf6d7c0267dc825ac19001ee..9b35abc66bc922dc6da4b0dafcde158feccc3385 100644 (file)
@@ -1,3 +1,9 @@
+2016-05-30  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/71099
+       * parser.c (cp_parser_function_specifier_opt): Use current_class_type
+       to improve the diagnostic about wrong uses of 'virtual'.
+
 2016-05-29  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/71105
index 2a46d6fbde7f3fcda5e2fe916f0dc036f3b49521..c6c2c0cf948478480314edcc14f193bb257e66aa 100644 (file)
@@ -12888,7 +12888,8 @@ cp_parser_function_specifier_opt (cp_parser* parser,
       /* 14.5.2.3 [temp.mem]
 
         A member function template shall not be virtual.  */
-      if (PROCESSING_REAL_TEMPLATE_DECL_P ())
+      if (PROCESSING_REAL_TEMPLATE_DECL_P ()
+         && current_class_type)
        error_at (token->location, "templates may not be %<virtual%>");
       else
        set_and_check_decl_spec_loc (decl_specs, ds_virtual, token);
index 8abccad412906040151b85c72f75bb3ea974282f..6df7274fcfda1677b27e54580229691b6efe571f 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-30  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/71099
+       * g++.dg/parse/virtual1.C: New.
+
 2016-05-30  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/i386/iamcu/args.h (clear_non_sret_int_hardware_registers):
diff --git a/gcc/testsuite/g++.dg/parse/virtual1.C b/gcc/testsuite/g++.dg/parse/virtual1.C
new file mode 100644 (file)
index 0000000..1a5b995
--- /dev/null
@@ -0,0 +1,33 @@
+// PR c++/71099
+
+struct A {
+  virtual void foo();
+};
+
+virtual void A::foo() {}  // { dg-error "'virtual' outside class" }
+
+template<typename>
+struct B {
+  virtual void foo();
+};
+
+template<typename T>
+virtual void B<T>::foo() {}  // { dg-error "'virtual' outside class" }
+
+struct C {
+  template<typename>
+  virtual void foo();  // { dg-error "templates may not be 'virtual'" }
+};
+
+template<typename>
+virtual void C::foo() {}  // { dg-error "'virtual' outside class" }
+
+template<typename>
+struct D {
+  template<typename>
+  virtual void foo();  // { dg-error "templates may not be 'virtual'" }
+};
+
+template<typename T>
+template<typename>
+virtual void D<T>::foo() {}  // { dg-error "'virtual' outside class" }