Bug 17098 - In program using unique_ptr, identifier 'tuple' cannot be used (problem with variadic templates?)
Summary: In program using unique_ptr, identifier 'tuple' cannot be used (problem with ...
Status: NEW
Alias: None
Product: gdb
Classification: Unclassified
Component: c++ (show other bugs)
Version: 7.10
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
: 22231 (view as bug list)
Depends on:
Blocks:
 
Reported: 2014-06-28 10:17 UTC by Marc van Leeuwen
Modified: 2023-12-27 17:53 UTC (History)
4 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
Project(s) to access:
ssh public key:


Attachments
preprocessed input from sample program, file mini.ii (77.16 KB, text/plain)
2014-06-28 10:17 UTC, Marc van Leeuwen
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Marc van Leeuwen 2014-06-28 10:17:55 UTC
Created attachment 7662 [details]
preprocessed input from sample program, file mini.ii

When running gdb on a program using an instance of the unique_ptr class template, the identifier 'tuple' can no longer be accessed in any way, as otherwise valid expressions now give a syntax error. A minimal example:

mini.cpp:

    #include <memory>

    int main()
    {
      std::unique_ptr<int> p;
    }

compile this with gcc (version 4.8.1) using the command

    g++ -std=c++11 -ggdb -o mini mini.cpp

now run gdb and ask to print the (nonexistent) variable 'tuple'

    $ gdb mini
    GNU gdb (GDB) 7.6.1-ubuntu
    Copyright (C) 2013 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/license/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-linux-gnu".
    For bug reporting instructions, please see:
    <http://www.gnu.org/software/gdb/bugs/>...
    Reading symbols from /home/marc/atlas/sources/stand-alone/mini...done.
    (gdb) p tuple
    A syntax error in expression, near `'.
    (gdb) 

Whereas in a program not using any unique_ptr (for instance the above program after removing the unique statement in 'main') one would correctly get

    (gdb) p tuple
    No symbol "tuple" in current context.

It seems that 'tuple' has changed its syntax category for gdb, making any access to variables/fields called 'tuple' impossible. I stumbled on this when debugging a program that actually used a field of that name, but the bug does not appear to depend on that circumstance.


Looking and the (attached) preprocessed input, it seems that the problem might be that 'tuple' is defined as a variadic template class:

    template<typename...>
      class tuple;

and later

    template<typename... _Elements>
      class tuple : public _Tuple_impl<0, _Elements...>
      { ... };
Comment 1 scovich 2015-12-17 13:29:31 UTC
Still occurs for me with gdb-7.10
Comment 2 Hannes Domani 2023-12-27 13:10:04 UTC
*** Bug 22231 has been marked as a duplicate of this bug. ***
Comment 3 Tom Tromey 2023-12-27 16:52:55 UTC
Maybe the canonical bug for this is bug#17272?
There are also several bugs open about exposing this to the Python API.
The fix seems to be stalled.
Comment 4 Hannes Domani 2023-12-27 17:53:24 UTC
(In reply to Tom Tromey from comment #3)
> Maybe the canonical bug for this is bug#17272?
> There are also several bugs open about exposing this to the Python API.
> The fix seems to be stalled.

As I understand it, the problem here is about tuple being also the name of
the include file, and that's why you get a syntax error.

And according to c-exp.y, this behavior is intentional:
```
      /* If we found a field on the "this" object, or we are looking
	 up a field on a struct, then we want to prefer it over a
	 filename.  However, if the name was quoted, then it is better
	 to check for a filename or a block, since this is the only
	 way the user has of requiring the extension to be used.  */
```

So if no variable is found by the name, but one of the files has that name,
it assumes the file is meant.