[PATCHv5] Handle TYPE_PACK_EXPANSION in cxx_incomplete_type_diagnostic

Message ID 20200622200105.8223-1-xerofoify@gmail.com
State Superseded
Headers show
Series
  • [PATCHv5] Handle TYPE_PACK_EXPANSION in cxx_incomplete_type_diagnostic
Related show

Commit Message

Christophe Lyon via Gcc-patches June 22, 2020, 8:01 p.m.
From: Nicholas Krause <xerofoify@gmail.com>


This fixs the PR95672 by adding the missing TYPE_PACK_EXPANSION case in
cxx_incomplete_type_diagnostic in order to avoid ICES on diagnosing
incomplete template pack expansion cases. In v2, add the missing required
test case for all new patches. v3 Fixes both the test case to compile in
C++11 mode and the message to print out only the type. v4 fixes the testcase
to only target C++11. v5 fixes test case to run properly.

gcc/cp/ChangeLog:

	* typeck2.c (cxx_incomplete_type_diagnostic): Add missing TYPE_EXPANSION_PACK
	  check for diagnosticing incomplete types in cxx_incomplete_type_diagnostic.

gcc/testsuite/ChangeLog:

	* g++.dg/template/PR95672.C: New test.

Signed-off-by: Nicholas Krause <xerofoify@gmail.com>

---
 gcc/cp/typeck2.c                        | 6 ++++++
 gcc/testsuite/g++.dg/template/PR95672.C | 3 +++
 2 files changed, 9 insertions(+)
 create mode 100644 gcc/testsuite/g++.dg/template/PR95672.C

-- 
2.20.1

Comments

Christophe Lyon via Gcc-patches June 22, 2020, 9:51 p.m. | #1
On 6/22/20 4:01 PM, Nicholas Krause wrote:
> From: Nicholas Krause <xerofoify@gmail.com>

> 

> This fixs the PR95672 by adding the missing TYPE_PACK_EXPANSION case in

> cxx_incomplete_type_diagnostic in order to avoid ICES on diagnosing

> incomplete template pack expansion cases. In v2, add the missing required

> test case for all new patches. v3 Fixes both the test case to compile in

> C++11 mode and the message to print out only the type. v4 fixes the testcase

> to only target C++11. v5 fixes test case to run properly.

> 

> gcc/cp/ChangeLog:

> 

> 	* typeck2.c (cxx_incomplete_type_diagnostic): Add missing TYPE_EXPANSION_PACK

> 	  check for diagnosticing incomplete types in cxx_incomplete_type_diagnostic.

> 

> gcc/testsuite/ChangeLog:

> 

> 	* g++.dg/template/PR95672.C: New test.

> 

> Signed-off-by: Nicholas Krause <xerofoify@gmail.com>

> ---

>   gcc/cp/typeck2.c                        | 6 ++++++

>   gcc/testsuite/g++.dg/template/PR95672.C | 3 +++

>   2 files changed, 9 insertions(+)

>   create mode 100644 gcc/testsuite/g++.dg/template/PR95672.C

> 

> diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c

> index 5fd3b82fa89..28b32fe0b5a 100644

> --- a/gcc/cp/typeck2.c

> +++ b/gcc/cp/typeck2.c

> @@ -552,6 +552,12 @@ cxx_incomplete_type_diagnostic (location_t loc, const_tree value,

>   		       TYPE_NAME (type));

>         break;

>   

> +    case TYPE_PACK_EXPANSION:

> +     emit_diagnostic (diag_kind, loc, 0,

> +		     "invalid use of pack expansion %qT",

> +		      type);

> +      break;

> +

>       case TYPENAME_TYPE:

>       case DECLTYPE_TYPE:

>         emit_diagnostic (diag_kind, loc, 0,

> diff --git a/gcc/testsuite/g++.dg/template/PR95672.C b/gcc/testsuite/g++.dg/template/PR95672.C

> new file mode 100644

> index 00000000000..fcc3da0a132

> --- /dev/null

> +++ b/gcc/testsuite/g++.dg/template/PR95672.C

> @@ -0,0 +1,3 @@

> +//c++ PR96572

> +// { dg-do compile { target c++11 } }

> +struct g_class : decltype  (auto) ... {  } ; // { dg-error "invalid use of pack expansion" }


FAIL: g++.dg/template/PR95672.C  -std=c++11  (test for errors, line 3)
FAIL: g++.dg/template/PR95672.C  -std=c++11 (test for excess errors)
Christophe Lyon via Gcc-patches June 22, 2020, 10:55 p.m. | #2
On 6/22/20 5:51 PM, Jason Merrill wrote:
> On 6/22/20 4:01 PM, Nicholas Krause wrote:

>> From: Nicholas Krause <xerofoify@gmail.com>

>>

>> This fixs the PR95672 by adding the missing TYPE_PACK_EXPANSION case in

>> cxx_incomplete_type_diagnostic in order to avoid ICES on diagnosing

>> incomplete template pack expansion cases. In v2, add the missing required

>> test case for all new patches. v3 Fixes both the test case to compile in

>> C++11 mode and the message to print out only the type. v4 fixes the 

>> testcase

>> to only target C++11. v5 fixes test case to run properly.

>>

>> gcc/cp/ChangeLog:

>>

>>     * typeck2.c (cxx_incomplete_type_diagnostic): Add missing 

>> TYPE_EXPANSION_PACK

>>       check for diagnosticing incomplete types in 

>> cxx_incomplete_type_diagnostic.

>>

>> gcc/testsuite/ChangeLog:

>>

>>     * g++.dg/template/PR95672.C: New test.

>>

>> Signed-off-by: Nicholas Krause <xerofoify@gmail.com>

>> ---

>>   gcc/cp/typeck2.c                        | 6 ++++++

>>   gcc/testsuite/g++.dg/template/PR95672.C | 3 +++

>>   2 files changed, 9 insertions(+)

>>   create mode 100644 gcc/testsuite/g++.dg/template/PR95672.C

>>

>> diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c

>> index 5fd3b82fa89..28b32fe0b5a 100644

>> --- a/gcc/cp/typeck2.c

>> +++ b/gcc/cp/typeck2.c

>> @@ -552,6 +552,12 @@ cxx_incomplete_type_diagnostic (location_t loc, 

>> const_tree value,

>>                  TYPE_NAME (type));

>>         break;

>> +    case TYPE_PACK_EXPANSION:

>> +     emit_diagnostic (diag_kind, loc, 0,

>> +             "invalid use of pack expansion %qT",

>> +              type);

>> +      break;

>> +

>>       case TYPENAME_TYPE:

>>       case DECLTYPE_TYPE:

>>         emit_diagnostic (diag_kind, loc, 0,

>> diff --git a/gcc/testsuite/g++.dg/template/PR95672.C 

>> b/gcc/testsuite/g++.dg/template/PR95672.C

>> new file mode 100644

>> index 00000000000..fcc3da0a132

>> --- /dev/null

>> +++ b/gcc/testsuite/g++.dg/template/PR95672.C

>> @@ -0,0 +1,3 @@

>> +//c++ PR96572

>> +// { dg-do compile { target c++11 } }

>> +struct g_class : decltype  (auto) ... {  } ; // { dg-error "invalid 

>> use of pack expansion" }

> 

> FAIL: g++.dg/template/PR95672.C  -std=c++11  (test for errors, line 3)

> FAIL: g++.dg/template/PR95672.C  -std=c++11 (test for excess errors)

> 


It seems to pass for me with make check RUNTESTFLAGS=dg.exp=PR96752.ext

on one of the farm machines. Not sure why it fails for you unless that

extra space before the semicolon is the issue.

Nick
-- 
Fundamentally an organism has conscious mental states if and only if 
there is something that it is like to be that organism--something it is 
like for the organism. - Thomas Nagel
Christophe Lyon via Gcc-patches June 22, 2020, 11:47 p.m. | #3
On Mon, Jun 22, 2020 at 06:55:01PM -0400, Nicholas Krause via Gcc-patches wrote:
> 

> 

> On 6/22/20 5:51 PM, Jason Merrill wrote:

> > On 6/22/20 4:01 PM, Nicholas Krause wrote:

> > > From: Nicholas Krause <xerofoify@gmail.com>

> > > 

> > > This fixs the PR95672 by adding the missing TYPE_PACK_EXPANSION case in

> > > cxx_incomplete_type_diagnostic in order to avoid ICES on diagnosing

> > > incomplete template pack expansion cases. In v2, add the missing required

> > > test case for all new patches. v3 Fixes both the test case to compile in

> > > C++11 mode and the message to print out only the type. v4 fixes the

> > > testcase

> > > to only target C++11. v5 fixes test case to run properly.

> > > 

> > > gcc/cp/ChangeLog:

> > > 

> > >     * typeck2.c (cxx_incomplete_type_diagnostic): Add missing

> > > TYPE_EXPANSION_PACK

> > >       check for diagnosticing incomplete types in

> > > cxx_incomplete_type_diagnostic.

> > > 

> > > gcc/testsuite/ChangeLog:

> > > 

> > >     * g++.dg/template/PR95672.C: New test.

> > > 

> > > Signed-off-by: Nicholas Krause <xerofoify@gmail.com>

> > > ---

> > >   gcc/cp/typeck2.c                        | 6 ++++++

> > >   gcc/testsuite/g++.dg/template/PR95672.C | 3 +++

> > >   2 files changed, 9 insertions(+)

> > >   create mode 100644 gcc/testsuite/g++.dg/template/PR95672.C

> > > 

> > > diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c

> > > index 5fd3b82fa89..28b32fe0b5a 100644

> > > --- a/gcc/cp/typeck2.c

> > > +++ b/gcc/cp/typeck2.c

> > > @@ -552,6 +552,12 @@ cxx_incomplete_type_diagnostic (location_t loc,

> > > const_tree value,

> > >                  TYPE_NAME (type));

> > >         break;

> > > +    case TYPE_PACK_EXPANSION:

> > > +     emit_diagnostic (diag_kind, loc, 0,

> > > +             "invalid use of pack expansion %qT",

> > > +              type);

> > > +      break;

> > > +

> > >       case TYPENAME_TYPE:

> > >       case DECLTYPE_TYPE:

> > >         emit_diagnostic (diag_kind, loc, 0,

> > > diff --git a/gcc/testsuite/g++.dg/template/PR95672.C

> > > b/gcc/testsuite/g++.dg/template/PR95672.C

> > > new file mode 100644

> > > index 00000000000..fcc3da0a132

> > > --- /dev/null

> > > +++ b/gcc/testsuite/g++.dg/template/PR95672.C

> > > @@ -0,0 +1,3 @@

> > > +//c++ PR96572

> > > +// { dg-do compile { target c++11 } }

> > > +struct g_class : decltype  (auto) ... {  } ; // { dg-error "invalid

> > > use of pack expansion" }

> > 

> > FAIL: g++.dg/template/PR95672.C  -std=c++11  (test for errors, line 3)

> > FAIL: g++.dg/template/PR95672.C  -std=c++11 (test for excess errors)

> > 

> 

> It seems to pass for me with make check RUNTESTFLAGS=dg.exp=PR96752.ext


That doesn't test anything at all, because it's the wrong filename and the
wrong suffix.  Use

GXX_TESTSUITE_STDS=98,11,14,17,2a make check-c++ RUNTESTFLAGS=dg.exp=PR95672.C

Marek
Christophe Lyon via Gcc-patches June 23, 2020, 12:18 a.m. | #4
On 6/22/20 7:47 PM, Marek Polacek wrote:
> On Mon, Jun 22, 2020 at 06:55:01PM -0400, Nicholas Krause via Gcc-patches wrote:

>>

>>

>> On 6/22/20 5:51 PM, Jason Merrill wrote:

>>> On 6/22/20 4:01 PM, Nicholas Krause wrote:

>>>> From: Nicholas Krause <xerofoify@gmail.com>

>>>>

>>>> This fixs the PR95672 by adding the missing TYPE_PACK_EXPANSION case in

>>>> cxx_incomplete_type_diagnostic in order to avoid ICES on diagnosing

>>>> incomplete template pack expansion cases. In v2, add the missing required

>>>> test case for all new patches. v3 Fixes both the test case to compile in

>>>> C++11 mode and the message to print out only the type. v4 fixes the

>>>> testcase

>>>> to only target C++11. v5 fixes test case to run properly.

>>>>

>>>> gcc/cp/ChangeLog:

>>>>

>>>>     * typeck2.c (cxx_incomplete_type_diagnostic): Add missing

>>>> TYPE_EXPANSION_PACK

>>>>       check for diagnosticing incomplete types in

>>>> cxx_incomplete_type_diagnostic.

>>>>

>>>> gcc/testsuite/ChangeLog:

>>>>

>>>>     * g++.dg/template/PR95672.C: New test.

>>>>

>>>> Signed-off-by: Nicholas Krause <xerofoify@gmail.com>

>>>> ---

>>>>   gcc/cp/typeck2.c                        | 6 ++++++

>>>>   gcc/testsuite/g++.dg/template/PR95672.C | 3 +++

>>>>   2 files changed, 9 insertions(+)

>>>>   create mode 100644 gcc/testsuite/g++.dg/template/PR95672.C

>>>>

>>>> diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c

>>>> index 5fd3b82fa89..28b32fe0b5a 100644

>>>> --- a/gcc/cp/typeck2.c

>>>> +++ b/gcc/cp/typeck2.c

>>>> @@ -552,6 +552,12 @@ cxx_incomplete_type_diagnostic (location_t loc,

>>>> const_tree value,

>>>>                  TYPE_NAME (type));

>>>>         break;

>>>> +    case TYPE_PACK_EXPANSION:

>>>> +     emit_diagnostic (diag_kind, loc, 0,

>>>> +             "invalid use of pack expansion %qT",

>>>> +              type);

>>>> +      break;

>>>> +

>>>>       case TYPENAME_TYPE:

>>>>       case DECLTYPE_TYPE:

>>>>         emit_diagnostic (diag_kind, loc, 0,

>>>> diff --git a/gcc/testsuite/g++.dg/template/PR95672.C

>>>> b/gcc/testsuite/g++.dg/template/PR95672.C

>>>> new file mode 100644

>>>> index 00000000000..fcc3da0a132

>>>> --- /dev/null

>>>> +++ b/gcc/testsuite/g++.dg/template/PR95672.C

>>>> @@ -0,0 +1,3 @@

>>>> +//c++ PR96572

>>>> +// { dg-do compile { target c++11 } }

>>>> +struct g_class : decltype  (auto) ... {  } ; // { dg-error "invalid

>>>> use of pack expansion" }

>>>

>>> FAIL: g++.dg/template/PR95672.C  -std=c++11  (test for errors, line 3)

>>> FAIL: g++.dg/template/PR95672.C  -std=c++11 (test for excess errors)

>>>

>>

>> It seems to pass for me with make check RUNTESTFLAGS=dg.exp=PR96752.ext

> 

> That doesn't test anything at all, because it's the wrong filename and the

> wrong suffix.  Use

> 

> GXX_TESTSUITE_STDS=98,11,14,17,2a make check-c++ RUNTESTFLAGS=dg.exp=PR95672.C

> 

> Marek

> 

That makes sense. What is the difference between target and dg-options 
as both seem to be the same for language support. Yet it seems that this
only wants to run under:
/* { dg-options "-std=c++11" } */

The testsuite wiki page mentions no difference between the two for 
targets as related to lanuage so just curious.

Thanks,
Nick

-- 
Fundamentally an organism has conscious mental states if and only if 
there is something that it is like to be that organism--something it is 
like for the organism. - Thomas Nagel

Patch

diff --git a/gcc/cp/typeck2.c b/gcc/cp/typeck2.c
index 5fd3b82fa89..28b32fe0b5a 100644
--- a/gcc/cp/typeck2.c
+++ b/gcc/cp/typeck2.c
@@ -552,6 +552,12 @@  cxx_incomplete_type_diagnostic (location_t loc, const_tree value,
 		       TYPE_NAME (type));
       break;
 
+    case TYPE_PACK_EXPANSION:
+     emit_diagnostic (diag_kind, loc, 0,
+		     "invalid use of pack expansion %qT",
+		      type);
+      break;
+
     case TYPENAME_TYPE:
     case DECLTYPE_TYPE:
       emit_diagnostic (diag_kind, loc, 0,
diff --git a/gcc/testsuite/g++.dg/template/PR95672.C b/gcc/testsuite/g++.dg/template/PR95672.C
new file mode 100644
index 00000000000..fcc3da0a132
--- /dev/null
+++ b/gcc/testsuite/g++.dg/template/PR95672.C
@@ -0,0 +1,3 @@ 
+//c++ PR96572 
+// { dg-do compile { target c++11 } }
+struct g_class : decltype  (auto) ... {  } ; // { dg-error "invalid use of pack expansion" }