Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
On 10/1/21 15:52, Nick Huang wrote: ...the subject line for the commit should be the first line of the commit message, followed by a blank line, followed by the description of the patch; without the subject line, git format-patch thought your whole description was the subject of the patch. oh, I didn't realize this without your mentioning it. I read this guide (https://gcc.gnu.org/codingconventions.html#ChangeLogs) many times and still don't get this. I guess it was written long long ago. FYI that's a git thing, not a ChangeLog thing. From the git format-patch manual: By default, the subject of a single patch is "[PATCH] " followed by the concatenation of lines from the commit message up to the first blank line (see the DISCUSSION section of git-commit(1)). And from git-commit(1): Though not required, it’s a good idea to begin the commit message with a single short (less than 50 character) line summarizing the change, followed by a blank line and then a more thorough description. The text up to the first blank line in a commit message is treated as the commit title, and that title is used throughout Git. For example, git-format- patch(1) turns a commit into email, and it uses the title on the Subject line and the rest of the commit in the body. But yes, it would be good to give more of this instruction in the gcc contribute.html. Jason
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
> ...the subject line for the commit should be the first line of the > commit message, followed by a blank line, followed by the description of > the patch; without the subject line, git format-patch thought your whole > description was the subject of the patch. oh, I didn't realize this without your mentioning it. I read this guide (https://gcc.gnu.org/codingconventions.html#ChangeLogs) many times and still don't get this. I guess it was written long long ago. > I've corrected this and pushed the patch, thanks! I do thank you and without your help I might never accomplish this task. Once again appreciate your patient help! On Fri, Oct 1, 2021 at 11:46 AM Jason Merrill wrote: > > On 10/1/21 11:10, Nick Huang wrote: > >> gcc-verify still fails with this version: > >> > >>> ERR: line should start with a tab: "PR c++/101783" > >>> ERR: line should start with a tab: "* tree.c > >>> (cp_build_qualified_type_real): Excluding typedef from error" > >>> ERR: line should start with a tab: "PR c++/101783" > >>> ERR: line should start with a tab: "* g++.dg/parse/pr101783.C: New > >>> test." > > > >> It might work better to attach the output of git format-patch. > > Sorry for my clumsy copy/paste from git commit message. I now attach > > git format-patch output > > file as attachment. Also maybe for a little convenience of your work, > > I also attach the original > > commit message file when I do git commit -F. > > Thanks, but that isn't necessary; it should be the same in the > format-patch output, except... > > > From e592a475030d99647de736d294cb3c6a7588af49 Mon Sep 17 00:00:00 2001 > > From: qingzhe huang > > Date: Fri, 1 Oct 2021 10:46:35 -0400 > > Subject: [PATCH] The root cause of this bug is that it considers reference > > with cv-qualifiers as an error by generating value for variable > > "bad_quals". > > However, this is not correct for case of typedef. Here I quote spec > > [dcl.ref]/1 : "Cv-qualified references are ill-formed except when the > > cv-qualifiers are introduced through the use of a typedef-name > > ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), > > in > > which case the cv-qualifiers are ignored." > > ...the subject line for the commit should be the first line of the > commit message, followed by a blank line, followed by the description of > the patch; without the subject line, git format-patch thought your whole > description was the subject of the patch. > > I've corrected this and pushed the patch, thanks! > > Jason > -- nick huang/qingzhe huang http://www.staroceans.com http://www.staroceans.com/english.htm
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
On 10/1/21 11:10, Nick Huang wrote: gcc-verify still fails with this version: ERR: line should start with a tab: "PR c++/101783" ERR: line should start with a tab: "* tree.c (cp_build_qualified_type_real): Excluding typedef from error" ERR: line should start with a tab: "PR c++/101783" ERR: line should start with a tab: "* g++.dg/parse/pr101783.C: New test." It might work better to attach the output of git format-patch. Sorry for my clumsy copy/paste from git commit message. I now attach git format-patch output file as attachment. Also maybe for a little convenience of your work, I also attach the original commit message file when I do git commit -F. Thanks, but that isn't necessary; it should be the same in the format-patch output, except... From e592a475030d99647de736d294cb3c6a7588af49 Mon Sep 17 00:00:00 2001 From: qingzhe huang Date: Fri, 1 Oct 2021 10:46:35 -0400 Subject: [PATCH] The root cause of this bug is that it considers reference with cv-qualifiers as an error by generating value for variable "bad_quals". However, this is not correct for case of typedef. Here I quote spec [dcl.ref]/1 : "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." ...the subject line for the commit should be the first line of the commit message, followed by a blank line, followed by the description of the patch; without the subject line, git format-patch thought your whole description was the subject of the patch. I've corrected this and pushed the patch, thanks! Jason
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
> gcc-verify still fails with this version: > > > ERR: line should start with a tab: "PR c++/101783" > > ERR: line should start with a tab: "* tree.c > > (cp_build_qualified_type_real): Excluding typedef from error" > > ERR: line should start with a tab: "PR c++/101783" > > ERR: line should start with a tab: "* g++.dg/parse/pr101783.C: New > > test." > It might work better to attach the output of git format-patch. Sorry for my clumsy copy/paste from git commit message. I now attach git format-patch output file as attachment. Also maybe for a little convenience of your work, I also attach the original commit message file when I do git commit -F. > Also, your commit subject line is too long, at 83 characters: It must be > under 75 characters, and preferably closer to 50. I might shorten it to Please go ahead. I will pay attention to this next time. Thank you! > A change description in the ChangeLog should use present tense > ("Exclude"), have a period at the end, and line wrap at 75 characters > like the rest of the commit message. So, > > * tree.c (cp_build_qualified_type_real): Exclude typedef from > error. > Modified as suggested. > > + ([dcl.type.decltype]),in which case the cv-qualifiers are ignored. > > + */ > > We usually don't put */ on its own line. Adjusted. Once again I thank you for your patience and really appreciate it. On Fri, Oct 1, 2021 at 9:29 AM Jason Merrill via Gcc-patches wrote: > > On 9/30/21 14:24, nick huang wrote: > >>> You may need to run contrib/gcc-git-customization.sh to get the git > >>> gcc-verify command. > > I re-setup and can use git gcc-verify. Now I can see it rejects because I > > forgot to add a > > description of modified file. Now that it passes gcc-verify and I attach > > the changelog > > as attachment. > > > > Thank you again for your patient explanation and help! > > You're welcome, thanks for your patience as well! Unfortunately, git > gcc-verify still fails with this version: > > > ERR: line should start with a tab: "PR c++/101783" > > ERR: line should start with a tab: "* tree.c > > (cp_build_qualified_type_real): Excluding typedef from error" > > ERR: line should start with a tab: "PR c++/101783" > > ERR: line should start with a tab: "* g++.dg/parse/pr101783.C: New > > test." > > It might work better to attach the output of git format-patch. > > Also, your commit subject line is too long, at 83 characters: It must be > under 75 characters, and preferably closer to 50. I might shorten it to > > c++: cv-qualified ref introduced by typedef [PR101783] > > > * tree.c (cp_build_qualified_type_real): Excluding typedef from error > > A change description in the ChangeLog should use present tense > ("Exclude"), have a period at the end, and line wrap at 75 characters > like the rest of the commit message. So, > > * tree.c (cp_build_qualified_type_real): Exclude typedef from > error. > > > + ([dcl.type.decltype]),in which case the cv-qualifiers are ignored. > > + */ > > We usually don't put */ on its own line. > > Jason > -- nick huang/qingzhe huang http://www.staroceans.com http://www.staroceans.com/english.htm The root cause of this bug is that it considers reference with cv-qualifiers as an error by generating value for variable "bad_quals". However, this is not correct for case of typedef. Here I quote spec [dcl.ref]/1 : "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." 2021-09-30 qingzhe huang gcc/cp/ChangeLog: PR c++/101783 * tree.c (cp_build_qualified_type_real): Exclude typedef from error. gcc/testsuite/ChangeLog: PR c++/101783 * g++.dg/parse/pr101783.C: New test. From e592a475030d99647de736d294cb3c6a7588af49 Mon Sep 17 00:00:00 2001 From: qingzhe huang Date: Fri, 1 Oct 2021 10:46:35 -0400 Subject: [PATCH] The root cause of this bug is that it considers reference with cv-qualifiers as an error by generating value for variable "bad_quals". However, this is not correct for case of typedef. Here I quote spec [dcl.ref]/1 : "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." 2021-09-30 qingzhe huang gcc/cp/ChangeLog: PR c++/101783 * tree.c (cp_build_qualified_type_real): Exclude typedef from error. gcc/testsuite/ChangeLog: PR c++/101783 * g++.dg/parse/pr101783.C: New test. --- gcc/cp/tree.c | 9 - gcc/testsuite/g++.dg/parse/pr101783.C | 5 + 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/parse/pr101783.C diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
On 9/30/21 14:24, nick huang wrote: You may need to run contrib/gcc-git-customization.sh to get the git gcc-verify command. I re-setup and can use git gcc-verify. Now I can see it rejects because I forgot to add a description of modified file. Now that it passes gcc-verify and I attach the changelog as attachment. Thank you again for your patient explanation and help! You're welcome, thanks for your patience as well! Unfortunately, git gcc-verify still fails with this version: ERR: line should start with a tab: "PR c++/101783" ERR: line should start with a tab: "* tree.c (cp_build_qualified_type_real): Excluding typedef from error" ERR: line should start with a tab: "PR c++/101783" ERR: line should start with a tab: "* g++.dg/parse/pr101783.C: New test." It might work better to attach the output of git format-patch. Also, your commit subject line is too long, at 83 characters: It must be under 75 characters, and preferably closer to 50. I might shorten it to c++: cv-qualified ref introduced by typedef [PR101783] * tree.c (cp_build_qualified_type_real): Excluding typedef from error A change description in the ChangeLog should use present tense ("Exclude"), have a period at the end, and line wrap at 75 characters like the rest of the commit message. So, * tree.c (cp_build_qualified_type_real): Exclude typedef from error. + ([dcl.type.decltype]),in which case the cv-qualifiers are ignored. + */ We usually don't put */ on its own line. Jason
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
>>You may need to run contrib/gcc-git-customization.sh to get the git >>gcc-verify command. I re-setup and can use git gcc-verify. Now I can see it rejects because I forgot to add a description of modified file. Now that it passes gcc-verify and I attach the changelog as attachment. Thank you again for your patient explanation and help! On 9/26/21 21:31, nick huang via Gcc-patches wrote: > Hi Jason, > > 1. Thank you very much for your detailed comments for my patch and I really > appreciate it! Here is my revised patch: > > The root cause of this bug is that it considers reference with > cv-qualifiers as an error by generating value for variable "bad_quals". > However, this is not correct for case of typedef. Here I quote spec: > "Cv-qualified references are ill-formed except when the cv-qualifiers > are introduced through the use of a typedef-name ([dcl.typedef], > [temp.param]) or decltype-specifier ([dcl.type.decltype]), > in which case the cv-qualifiers are ignored." > > 2021-09-25 qingzhe huang > > gcc/cp/ > PR c++/101783 > * tree.c (cp_build_qualified_type_real): git gcc-verify still rejects this line with ERR: missing description of a change: " * tree.c (cp_build_qualified_type_real):" You may need to run contrib/gcc-git-customization.sh to get the git gcc-verify command. > gcc/testsuite/ > PR c++/101783 > * g++.dg/parse/pr101783.C: New test. > -- next part -- Please drop this line, it breaks git gcc-verify when I apply the patch with git am. The patch should start immediately after the ChangeLog entries. > diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c > index 8840932dba2..d5c8daeb340 100644 > --- a/gcc/cp/tree.c > +++ b/gcc/cp/tree.c > @@ -1356,11 +1356,18 @@ cp_build_qualified_type_real (tree type, > /* A reference or method type shall not be cv-qualified. > [dcl.ref], [dcl.fct]. This used to be an error, but as of DR 295 > (in CD1) we always ignore extra cv-quals on functions. */ > + > + /* Cv-qualified references are ill-formed except when the cv-qualifiers In my previous reply I meant please add "[dcl.ref]/1" at the beginning of this comment. > + are introduced through the use of a typedef-name ([dcl.typedef], > + [temp.param]) or decltype-specifier ([dcl.type.decltype]), > + in which case the cv-qualifiers are ignored. > + */ > if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE) > && (TYPE_REF_P (type) > || FUNC_OR_METHOD_TYPE_P (type))) > { > - if (TYPE_REF_P (type)) > + if (TYPE_REF_P (type) > + && (!typedef_variant_p (type) || FUNC_OR_METHOD_TYPE_P (type))) > bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); > type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); > } > diff --git a/gcc/testsuite/g++.dg/parse/pr101783.C > b/gcc/testsuite/g++.dg/parse/pr101783.C > new file mode 100644 > index 000..4e0a435dd0b > --- /dev/null > +++ b/gcc/testsuite/g++.dg/parse/pr101783.C > @@ -0,0 +1,5 @@ > +template struct A{ > + typedef T& Type; > +}; > +template void f(const typename A::Type){} > +template <> void f(const typename A::Type){} > > > > 2. >> In Jonathan's earlier reply he asked how you tested the patch; this >> message still doesn't say anything about that. > I communicated with Mr. Jonathan in private email, worrying my naive question > might pollute the public maillist. The following is major part of this > communication and I attached original part in attachment. > How has this patch been tested? Have you bootstrapped the compiler and run the full testsuite? > Here is how I am doing: > a) build original 10.2.0 from scratch and make check to get both > "testsuite/gcc/gcc.sum" > and "testsuite/g++/g++.sum". > b) apply my patch and build from scratch and make check to get both two files > above. > c) compare two run's *.sum files to see if there is any difference. > > (Later I realized there is tool "contrib/compare_tests" is a good help of >doing so.) > > 3. >> What is the legal status of your contributions? > I thought small patch didn't require assignment. However, I just sent email > to ass...@gnu.org to request assignment. > Alternatively, I am not sure if adding this "signoff" tag in submission will > help? > Signed-off-by: qingzhe huang > > > Thank you again! > > >> On 8/28/21 07:54, nick huang via Gcc-patches wrote: >>> Reference with cv-qualifiers should be ignored instead of causing an error >>> because standard accepts cv-qualified references introduced by typedef which >>> is ignored. >>> Therefore, the fix prevents GCC from reporting error by not setting variable >>> "bad_quals" in case the reference is introduced by typedef. Still the >>> cv-qualifier is silently ignored. >>> Here I quote spec (https://timsong-cpp.github.io/cppwp/dcl.ref#1): >>> "Cv-qualified references are ill-formed except when the cv-qualifiers >>> are introduced
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
On 9/26/21 21:31, nick huang via Gcc-patches wrote: Hi Jason, 1. Thank you very much for your detailed comments for my patch and I really appreciate it! Here is my revised patch: The root cause of this bug is that it considers reference with cv-qualifiers as an error by generating value for variable "bad_quals". However, this is not correct for case of typedef. Here I quote spec: "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." 2021-09-25 qingzhe huang gcc/cp/ PR c++/101783 * tree.c (cp_build_qualified_type_real): git gcc-verify still rejects this line with ERR: missing description of a change: " * tree.c (cp_build_qualified_type_real):" You may need to run contrib/gcc-git-customization.sh to get the git gcc-verify command. gcc/testsuite/ PR c++/101783 * g++.dg/parse/pr101783.C: New test. -- next part -- Please drop this line, it breaks git gcc-verify when I apply the patch with git am. The patch should start immediately after the ChangeLog entries. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 8840932dba2..d5c8daeb340 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1356,11 +1356,18 @@ cp_build_qualified_type_real (tree type, /* A reference or method type shall not be cv-qualified. [dcl.ref], [dcl.fct]. This used to be an error, but as of DR 295 (in CD1) we always ignore extra cv-quals on functions. */ + + /* Cv-qualified references are ill-formed except when the cv-qualifiers In my previous reply I meant please add "[dcl.ref]/1" at the beginning of this comment. + are introduced through the use of a typedef-name ([dcl.typedef], + [temp.param]) or decltype-specifier ([dcl.type.decltype]), + in which case the cv-qualifiers are ignored. + */ if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE) && (TYPE_REF_P (type) || FUNC_OR_METHOD_TYPE_P (type))) { - if (TYPE_REF_P (type)) + if (TYPE_REF_P (type) + && (!typedef_variant_p (type) || FUNC_OR_METHOD_TYPE_P (type))) bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); } diff --git a/gcc/testsuite/g++.dg/parse/pr101783.C b/gcc/testsuite/g++.dg/parse/pr101783.C new file mode 100644 index 000..4e0a435dd0b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr101783.C @@ -0,0 +1,5 @@ +template struct A{ +typedef T& Type; +}; +template void f(const typename A::Type){} +template <> void f(const typename A::Type){} 2. In Jonathan's earlier reply he asked how you tested the patch; this message still doesn't say anything about that. I communicated with Mr. Jonathan in private email, worrying my naive question might pollute the public maillist. The following is major part of this communication and I attached original part in attachment. How has this patch been tested? Have you bootstrapped the compiler and run the full testsuite? Here is how I am doing: a) build original 10.2.0 from scratch and make check to get both "testsuite/gcc/gcc.sum" and "testsuite/g++/g++.sum". b) apply my patch and build from scratch and make check to get both two files above. c) compare two run's *.sum files to see if there is any difference. (Later I realized there is tool "contrib/compare_tests" is a good help of doing so.) 3. What is the legal status of your contributions? I thought small patch didn't require assignment. However, I just sent email to ass...@gnu.org to request assignment. Alternatively, I am not sure if adding this "signoff" tag in submission will help? Signed-off-by: qingzhe huang Thank you again! On 8/28/21 07:54, nick huang via Gcc-patches wrote: Reference with cv-qualifiers should be ignored instead of causing an error because standard accepts cv-qualified references introduced by typedef which is ignored. Therefore, the fix prevents GCC from reporting error by not setting variable "bad_quals" in case the reference is introduced by typedef. Still the cv-qualifier is silently ignored. Here I quote spec (https://timsong-cpp.github.io/cppwp/dcl.ref#1): "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." PR c++/101783 gcc/cp/ChangeLog: 2021-08-27 qingzhe huang * tree.c (cp_build_qualified_type_real): The git commit verifier rejects this commit message with Checking 1fa0fbcdd15adf936ab4fae584f841beb35da1bb: FAILED ERR: missing description of a change: " * tree.c (cp_build_qualified_type_real):" (your initial patch had a description here, you just need to copy it over) ERR: PR 101783 in
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
Hi Jason, 1. Thank you very much for your detailed comments for my patch and I really appreciate it! Here is my revised patch: The root cause of this bug is that it considers reference with cv-qualifiers as an error by generating value for variable "bad_quals". However, this is not correct for case of typedef. Here I quote spec: "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." 2021-09-25 qingzhe huang gcc/cp/ PR c++/101783 * tree.c (cp_build_qualified_type_real): gcc/testsuite/ PR c++/101783 * g++.dg/parse/pr101783.C: New test. -- next part -- diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 8840932dba2..d5c8daeb340 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1356,11 +1356,18 @@ cp_build_qualified_type_real (tree type, /* A reference or method type shall not be cv-qualified. [dcl.ref], [dcl.fct]. This used to be an error, but as of DR 295 (in CD1) we always ignore extra cv-quals on functions. */ + + /* Cv-qualified references are ill-formed except when the cv-qualifiers + are introduced through the use of a typedef-name ([dcl.typedef], + [temp.param]) or decltype-specifier ([dcl.type.decltype]), + in which case the cv-qualifiers are ignored. + */ if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE) && (TYPE_REF_P (type) || FUNC_OR_METHOD_TYPE_P (type))) { - if (TYPE_REF_P (type)) + if (TYPE_REF_P (type) + && (!typedef_variant_p (type) || FUNC_OR_METHOD_TYPE_P (type))) bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); } diff --git a/gcc/testsuite/g++.dg/parse/pr101783.C b/gcc/testsuite/g++.dg/parse/pr101783.C new file mode 100644 index 000..4e0a435dd0b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr101783.C @@ -0,0 +1,5 @@ +template struct A{ +typedef T& Type; +}; +template void f(const typename A::Type){} +template <> void f(const typename A::Type){} 2. > In Jonathan's earlier reply he asked how you tested the patch; this > message still doesn't say anything about that. I communicated with Mr. Jonathan in private email, worrying my naive question might pollute the public maillist. The following is major part of this communication and I attached original part in attachment. >>>How has this patch been tested? Have you bootstrapped the compiler and >>>run the full testsuite? Here is how I am doing: a) build original 10.2.0 from scratch and make check to get both "testsuite/gcc/gcc.sum" and "testsuite/g++/g++.sum". b) apply my patch and build from scratch and make check to get both two files above. c) compare two run's *.sum files to see if there is any difference. (Later I realized there is tool "contrib/compare_tests" is a good help of doing so.) 3. > What is the legal status of your contributions? I thought small patch didn't require assignment. However, I just sent email to ass...@gnu.org to request assignment. Alternatively, I am not sure if adding this "signoff" tag in submission will help? Signed-off-by: qingzhe huang Thank you again! > On 8/28/21 07:54, nick huang via Gcc-patches wrote: > > Reference with cv-qualifiers should be ignored instead of causing an error > > because standard accepts cv-qualified references introduced by typedef which > > is ignored. > > Therefore, the fix prevents GCC from reporting error by not setting variable > > "bad_quals" in case the reference is introduced by typedef. Still the > > cv-qualifier is silently ignored. > > Here I quote spec (https://timsong-cpp.github.io/cppwp/dcl.ref#1): > > "Cv-qualified references are ill-formed except when the cv-qualifiers > > are introduced through the use of a typedef-name ([dcl.typedef], > > [temp.param]) or decltype-specifier ([dcl.type.decltype]), > > in which case the cv-qualifiers are ignored." > > > > PR c++/101783 > > > > gcc/cp/ChangeLog: > > > > 2021-08-27 qingzhe huang > > > > * tree.c (cp_build_qualified_type_real): > > The git commit verifier rejects this commit message with > > Checking 1fa0fbcdd15adf936ab4fae584f841beb35da1bb: FAILED ERR: missing > description of a change: > " * tree.c (cp_build_qualified_type_real):" > > (your initial patch had a description here, you just need to copy it over) > > ERR: PR 101783 in subject but not in changelog: > "c++: Suppress error when cv-qualified reference is introduced by > typedef [PR101783]" > > (the PR number needs to have a Tab before it) > > In Jonathan's earlier reply he asked how you tested the patch; this > message still doesn't say anything about that. > > https://gcc.gnu.org/contribute.html#testing > > What is the legal status of your contributions? > > https://gcc.gnu.org/contribute.html#legal > >
Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
On 8/28/21 07:54, nick huang via Gcc-patches wrote: Reference with cv-qualifiers should be ignored instead of causing an error because standard accepts cv-qualified references introduced by typedef which is ignored. Therefore, the fix prevents GCC from reporting error by not setting variable "bad_quals" in case the reference is introduced by typedef. Still the cv-qualifier is silently ignored. Here I quote spec (https://timsong-cpp.github.io/cppwp/dcl.ref#1): "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." PR c++/101783 gcc/cp/ChangeLog: 2021-08-27 qingzhe huang * tree.c (cp_build_qualified_type_real): The git commit verifier rejects this commit message with Checking 1fa0fbcdd15adf936ab4fae584f841beb35da1bb: FAILED ERR: missing description of a change: " * tree.c (cp_build_qualified_type_real):" (your initial patch had a description here, you just need to copy it over) ERR: PR 101783 in subject but not in changelog: "c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]" (the PR number needs to have a Tab before it) In Jonathan's earlier reply he asked how you tested the patch; this message still doesn't say anything about that. https://gcc.gnu.org/contribute.html#testing What is the legal status of your contributions? https://gcc.gnu.org/contribute.html#legal Existing code tries to handle this with the tf_ignore_bad_quals, but the unnecessary use of typename gets past the code that tries to set the flag. But your approach is nice and straightforward, so let's go ahead with it. gcc/testsuite/ChangeLog: 2021-08-27 qingzhe huang * g++.dg/parse/pr101783.C: New test. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 8840932dba2..7aa4318a574 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1356,12 +1356,22 @@ cp_build_qualified_type_real (tree type, /* A reference or method type shall not be cv-qualified. [dcl.ref], [dcl.fct]. This used to be an error, but as of DR 295 (in CD1) we always ignore extra cv-quals on functions. */ + + /* PR 101783 Let's cite where this comes from in the standard ([dcl.ref]/1), and not the PR number. + Cv-qualified references are ill-formed except when the cv-qualifiers + are introduced through the use of a typedef-name ([dcl.typedef], + [temp.param]) or decltype-specifier ([dcl.type.decltype]), + in which case the cv-qualifiers are ignored. + */ if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE) && (TYPE_REF_P (type) || FUNC_OR_METHOD_TYPE_P (type))) { - if (TYPE_REF_P (type)) + // do NOT set bad_quals when non-method reference is introduced by typedef. + if (TYPE_REF_P (type) + && (!typedef_variant_p (type) || FUNC_OR_METHOD_TYPE_P (type))) bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); + // non-method reference introduced by typedef is also dropped silently These two // comments seem redundant with the quote from the standard above, let's drop them. type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); } diff --git a/gcc/testsuite/g++.dg/parse/pr101783.C b/gcc/testsuite/g++.dg/parse/pr101783.C new file mode 100644 index 000..4e0a435dd0b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr101783.C @@ -0,0 +1,5 @@ +template struct A{ +typedef T& Type; +}; +template void f(const typename A::Type){} +template <> void f(const typename A::Type){}
*PING* Re: [PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
Reference with cv-qualifiers should be ignored instead of causing an error because standard accepts cv-qualified references introduced by typedef which is ignored. Therefore, the fix prevents GCC from reporting error by not setting variable "bad_quals" in case the reference is introduced by typedef. Still the cv-qualifier is silently ignored. Here I quote spec (https://timsong-cpp.github.io/cppwp/dcl.ref#1): "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." PR c++/101783 gcc/cp/ChangeLog: 2021-08-27 qingzhe huang * tree.c (cp_build_qualified_type_real): gcc/testsuite/ChangeLog: 2021-08-27 qingzhe huang * g++.dg/parse/pr101783.C: New test. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 8840932dba2..7aa4318a574 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1356,12 +1356,22 @@ cp_build_qualified_type_real (tree type, /* A reference or method type shall not be cv-qualified. [dcl.ref], [dcl.fct]. This used to be an error, but as of DR 295 (in CD1) we always ignore extra cv-quals on functions. */ + + /* PR 101783 + Cv-qualified references are ill-formed except when the cv-qualifiers + are introduced through the use of a typedef-name ([dcl.typedef], + [temp.param]) or decltype-specifier ([dcl.type.decltype]), + in which case the cv-qualifiers are ignored. + */ if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE) && (TYPE_REF_P (type) || FUNC_OR_METHOD_TYPE_P (type))) { - if (TYPE_REF_P (type)) + // do NOT set bad_quals when non-method reference is introduced by typedef. + if (TYPE_REF_P (type) + && (!typedef_variant_p (type) || FUNC_OR_METHOD_TYPE_P (type))) bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); + // non-method reference introduced by typedef is also dropped silently type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); } diff --git a/gcc/testsuite/g++.dg/parse/pr101783.C b/gcc/testsuite/g++.dg/parse/pr101783.C new file mode 100644 index 000..4e0a435dd0b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr101783.C @@ -0,0 +1,5 @@ +template struct A{ + typedef T& Type; +}; +template void f(const typename A::Type){} +template <> void f(const typename A::Type){}
[PATCH] c++: Suppress error when cv-qualified reference is introduced by typedef [PR101783]
Reference with cv-qualifiers should be ignored instead of causing an error because standard accepts cv-qualified references introduced by typedef which is ignored. Therefore, the fix prevents GCC from reporting error by not setting variable "bad_quals" in case the reference is introduced by typedef. Still the cv-qualifier is silently ignored. Here I quote spec (https://timsong-cpp.github.io/cppwp/dcl.ref#1): "Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name ([dcl.typedef], [temp.param]) or decltype-specifier ([dcl.type.decltype]), in which case the cv-qualifiers are ignored." PR c++/101783 gcc/cp/ChangeLog: 2021-08-27 qingzhe huang * tree.c (cp_build_qualified_type_real): gcc/testsuite/ChangeLog: 2021-08-27 qingzhe huang * g++.dg/parse/pr101783.C: New test. diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index 8840932dba2..7aa4318a574 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -1356,12 +1356,22 @@ cp_build_qualified_type_real (tree type, /* A reference or method type shall not be cv-qualified. [dcl.ref], [dcl.fct]. This used to be an error, but as of DR 295 (in CD1) we always ignore extra cv-quals on functions. */ + + /* PR 101783 + Cv-qualified references are ill-formed except when the cv-qualifiers + are introduced through the use of a typedef-name ([dcl.typedef], + [temp.param]) or decltype-specifier ([dcl.type.decltype]), + in which case the cv-qualifiers are ignored. + */ if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE) && (TYPE_REF_P (type) || FUNC_OR_METHOD_TYPE_P (type))) { - if (TYPE_REF_P (type)) + // do NOT set bad_quals when non-method reference is introduced by typedef. + if (TYPE_REF_P (type) + && (!typedef_variant_p (type) || FUNC_OR_METHOD_TYPE_P (type))) bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); + // non-method reference introduced by typedef is also dropped silently type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE); } diff --git a/gcc/testsuite/g++.dg/parse/pr101783.C b/gcc/testsuite/g++.dg/parse/pr101783.C new file mode 100644 index 000..4e0a435dd0b --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr101783.C @@ -0,0 +1,5 @@ +template struct A{ +typedef T& Type; +}; +template void f(const typename A::Type){} +template <> void f(const typename A::Type){}