public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/98283] New: decltype(auto) may be deduce static data member to wrong type
@ 2020-12-15 1:13 wuyongwei at gmail dot com
2021-08-03 5:33 ` [Bug c++/98283] decltype(auto) may deduce a static data member to wrong type in a template pinskia at gcc dot gnu.org
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: wuyongwei at gmail dot com @ 2020-12-15 1:13 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98283
Bug ID: 98283
Summary: decltype(auto) may be deduce static data member to
wrong type
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: wuyongwei at gmail dot com
Target Milestone: ---
The following code shows that `decltype(auto)` is deduced to the wrong type
when used in template code for an expression like `(var.static_data_member>)`.
```cpp
#include <cstddef>
#include <type_traits>
#include <utility>
template <typename T>
struct type_displayer;
#define TYPE_DISPLAY(x) type_displayer<decltype(x)> test_obj;
struct SkipField {};
struct TestSkip {
template <typename T, std::size_t> struct FIELD;
int value;
static SkipField unused;
template <typename T>
struct FIELD<T, 0> {
T &&obj;
FIELD(T &&ref) : obj(std::forward<T>(ref))
{
}
decltype(auto) value()
{
return (obj.value);
}
static constexpr const char *name()
{
return "value";
}
};
template <typename T>
struct FIELD<T, 0 + 1> {
T &&obj;
FIELD(T &&ref) : obj(std::forward<T>(ref))
{
}
decltype(auto) value()
{
return (obj.unused);
}
decltype((obj.unused)) valueAlt()
{
return (obj.unused);
}
static constexpr const char *name()
{
return "unused";
}
};
};
int main()
{
TestSkip s;
// decltype((TestSkip::FIELD<TestSkip&, 0>(s).value())) is int&
// decltype((TestSkip::FIELD<TestSkip&, 1>(s).value())) is SkipField,
but it should be SkipField&
// decltype((TestSkip::FIELD<TestSkip&, 1>(s).valueAlt())) is SkipField&
}
```
This is a simplified usage scenario, where I want to use a macro to generate
code to emulate static reflection. Here is the problematic part:
```cpp
decltype(auto) value()
{
return (obj.unused);
}
```
This function returns `SkipField`, instead of the expected `SkipField&`. I have
verified that clang does what I want.
Currently I have to avoid `decltype(auto)` as a workaround:
```cpp
decltype((obj.unused)) valueAlt()
{
return (obj.unused);
}
```
(I used the macro TYPE_DISPLAY to check the type of an expression.)
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/98283] decltype(auto) may deduce a static data member to wrong type in a template
2020-12-15 1:13 [Bug c++/98283] New: decltype(auto) may be deduce static data member to wrong type wuyongwei at gmail dot com
@ 2021-08-03 5:33 ` pinskia at gcc dot gnu.org
2023-05-07 15:58 ` cvs-commit at gcc dot gnu.org
2023-05-07 15:58 ` ppalka at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-08-03 5:33 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98283
Andrew Pinski <pinskia at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
Keywords| |accepts-invalid
Last reconfirmed| |2021-08-03
Summary|decltype(auto) may deduce a |decltype(auto) may deduce a
|static data member to wrong |static data member to wrong
|type |type in a template
--- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Reduced testcase that is accepted but should not be:
struct TestSkip {
static int unused;
};
template <class T>
struct FIELD {
TestSkip *obj;
decltype(auto) value() { return (obj->unused); }
};
int main()
{
TestSkip s;
int sf;
int i;
decltype((FIELD<int>().value())) b;
}
Confirmed.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/98283] decltype(auto) may deduce a static data member to wrong type in a template
2020-12-15 1:13 [Bug c++/98283] New: decltype(auto) may be deduce static data member to wrong type wuyongwei at gmail dot com
2021-08-03 5:33 ` [Bug c++/98283] decltype(auto) may deduce a static data member to wrong type in a template pinskia at gcc dot gnu.org
@ 2023-05-07 15:58 ` cvs-commit at gcc dot gnu.org
2023-05-07 15:58 ` ppalka at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: cvs-commit at gcc dot gnu.org @ 2023-05-07 15:58 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98283
--- Comment #2 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Patrick Palka <ppalka@gcc.gnu.org>:
https://gcc.gnu.org/g:e4f1ea5d8b96fc9fbe4fc0e0e0a4938ceeef092f
commit r14-560-ge4f1ea5d8b96fc9fbe4fc0e0e0a4938ceeef092f
Author: Patrick Palka <ppalka@redhat.com>
Date: Sun May 7 11:57:22 2023 -0400
c++: parenthesized -> resolving to static data member [PR98283]
Here we're neglecting to propagate parenthesized-ness when the
member access (this->m) resolves to a static data member (and
thus finish_class_member_access_expr yields a VAR_DECL instead
of a COMPONENT_REF).
PR c++/98283
gcc/cp/ChangeLog:
* pt.cc (tsubst_copy_and_build) <case COMPONENT_REF>: Propagate
REF_PARENTHESIZED_P more generally via force_paren_expr.
* semantics.cc (force_paren_expr): Document default argument.
gcc/testsuite/ChangeLog:
* g++.dg/cpp1y/paren6.C: New test.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/98283] decltype(auto) may deduce a static data member to wrong type in a template
2020-12-15 1:13 [Bug c++/98283] New: decltype(auto) may be deduce static data member to wrong type wuyongwei at gmail dot com
2021-08-03 5:33 ` [Bug c++/98283] decltype(auto) may deduce a static data member to wrong type in a template pinskia at gcc dot gnu.org
2023-05-07 15:58 ` cvs-commit at gcc dot gnu.org
@ 2023-05-07 15:58 ` ppalka at gcc dot gnu.org
2 siblings, 0 replies; 4+ messages in thread
From: ppalka at gcc dot gnu.org @ 2023-05-07 15:58 UTC (permalink / raw)
To: gcc-bugs
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98283
Patrick Palka <ppalka at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution|--- |FIXED
Target Milestone|--- |14.0
CC| |ppalka at gcc dot gnu.org
Assignee|unassigned at gcc dot gnu.org |ppalka at gcc dot gnu.org
--- Comment #3 from Patrick Palka <ppalka at gcc dot gnu.org> ---
Fixed for GCC 14, thanks for the bug report
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-05-07 15:58 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-15 1:13 [Bug c++/98283] New: decltype(auto) may be deduce static data member to wrong type wuyongwei at gmail dot com
2021-08-03 5:33 ` [Bug c++/98283] decltype(auto) may deduce a static data member to wrong type in a template pinskia at gcc dot gnu.org
2023-05-07 15:58 ` cvs-commit at gcc dot gnu.org
2023-05-07 15:58 ` ppalka at gcc dot gnu.org
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).