On Wed, Nov 14, 2018 at 09:55:39PM +0530, Umesh Kalappa wrote:
> My bad Marek and thank you for pointing that out.
> 
> Please find the attached correct one (pr52869.patch) .

Index: gcc/cp/ChangeLog
===================================================================
--- gcc/cp/ChangeLog    (revision 266026)
+++ gcc/cp/ChangeLog    (working copy)
@@ -1,3 +1,9 @@
+2018-11-14  Kamlesh Kumar  <kamleshbha...@gmail.com>
+
+       PR c++/52869
+       *parser.c () :  restore the old current_class_{ptr,ref} by
+       inject_this_parameter().
+

So the correct CL entry would look like

2018-11-14  Kamlesh Kumar  <kamleshbha...@gmail.com>

        DR 1207
        PR c++/52869
        * parser.c (cp_parser_noexcept_specification_opt): Call
        inject_this_parameter.

or so.

Index: gcc/cp/parser.c
===================================================================
--- gcc/cp/parser.c     (revision 266026)
+++ gcc/cp/parser.c     (working copy)
@@ -24615,11 +24615,24 @@
     {
       tree expr;
       cp_lexer_consume_token (parser->lexer);
-
+   

You're adding whitespaces where they shouldn't be.  Let's avoid changes like 
these.

       if (cp_lexer_peek_token (parser->lexer)->type == CPP_OPEN_PAREN)
        {
          matching_parens parens;
          parens.consume_open (parser);
+         
+         if (current_class_type)
+              inject_this_parameter (current_class_type, TYPE_UNQUALIFIED);
+          else
+            {
+              /*clear the current_class_ptr for non class type , like 
+               int foo() noexcept(*this)
+               {               
+                 return 1;
+               }       
+             */
+                current_class_ptr = NULL_TREE;
+            }
 
I don't believe that's what Jason meant by restoring; I think you want

  tree save_ccp = current_class_ptr;
  tree save_ccr = current_class_ref;

  inject_this_parameter (current_class_type, TYPE_UNQUALIFIED);

  [...]

  current_class_ptr = save_ccp;
  current_class_ref = save_ccr;

In the future, if using diff, please also use the -p option.

Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog     (revision 266026)
+++ gcc/testsuite/ChangeLog     (working copy)
@@ -1,3 +1,8 @@
+2018-11-14  Kamlesh Kumar  <kamleshbha...@gmail.com>
+
+       PR g++.dg/52869
+       * g++.dg/pr52869.C: New.

Should be "PR c++/52869".

Index: gcc/testsuite/g++.dg/pr52869.C
===================================================================
--- gcc/testsuite/g++.dg/pr52869.C      (nonexistent)
+++ gcc/testsuite/g++.dg/pr52869.C      (working copy)

Maybe move the test to testsuite/g++.dg/DRs?

@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O0 -g" } */

Why these options?  I don't think you need -g.

+struct S {
+    void f() { }
+    void g() noexcept(noexcept(f())) { }
+    void h() noexcept(noexcept(this->f())) { }
+};
+
+struct Nyan {
+       constexpr Nyan &operator++() noexcept { return *this; }
+       constexpr void omg() noexcept(noexcept(++*this)) {}
+};

I was hoping you'd add also a test with 'this' in noexcept in a class template.

This test doesn't compile on all dialects:
FAIL: g++.dg/pr52869.C  -std=gnu++98 (test for excess errors)
FAIL: g++.dg/pr52869.C  -std=gnu++11 (test for excess errors)

You can run just the new test in all dialects using:
GXX_TESTSUITE_STDS=98,11,14,17,2a make check-c++ RUNTESTFLAGS=dg.exp=pr52869.C

The noexcept specifier is only in C++11 and newer I think.

+template< typename T >
+T sine( T const& a, T const& b ) noexcept
+{
+    static_assert( noexcept( T(a / sqrt(a * a  + b * b)) ), "throwing expr" );
+    return a / sqrt(a * a  + b * b);
+}
+
+int foo() noexcept
+{
+  return 1;
+}
+

I don't understand what this part of the test is testing.  It compiles even
without the patch.  Let's drop it.

Marek

Reply via email to