Skip to content

g++ module compile fails with ‘_Atomic’ does not name a type #67832

Closed

Description

@JoshuaJCogliati
BPO 23644
Nosy @vstinner, @jpc2350
Files
  • min_example.tar.gz: Short example of swig files that will trigger the bug.
  • atomic.cpp
  • atomicfix.patch: Atomics compatibility for g++ and gcc
  • pyatomic_cpp.patch
  • pystate_cplusplus.patch
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2020-06-25.09:28:48.938>
    created_at = <Date 2015-03-12.14:59:00.785>
    labels = []
    title = 'g++ module compile fails with \xe2\x80\x98_Atomic\xe2\x80\x99 does not name a type'
    updated_at = <Date 2020-06-25.09:28:48.938>
    user = 'https://bugs.python.org/JoshuaJCogliati'

    bugs.python.org fields:

    activity = <Date 2020-06-25.09:28:48.938>
    actor = 'vstinner'
    assignee = 'none'
    closed = True
    closed_date = <Date 2020-06-25.09:28:48.938>
    closer = 'vstinner'
    components = []
    creation = <Date 2015-03-12.14:59:00.785>
    creator = 'Joshua.J.Cogliati'
    dependencies = []
    files = ['38453', '38458', '38508', '38518', '38519']
    hgrepos = []
    issue_num = 23644
    keywords = ['patch']
    message_count = 33.0
    messages = ['237942', '237943', '237944', '237946', '237951', '237955', '237956', '237958', '238201', '238202', '238208', '238209', '238223', '238244', '238278', '238279', '238289', '238292', '238332', '238334', '238346', '238347', '269611', '297827', '297832', '297833', '297839', '297840', '297841', '297847', '297849', '305430', '372320']
    nosy_count = 11.0
    nosy_names = ['vstinner', 'Arfrever', 'jrincayc', 'python-dev', 'Joshua.J.Cogliati', 'Vitor.de.Lima', 'gustavotemple', 'lbianc', 'Martin Ritter', 'Melroy van den Berg', 'jpc2350']
    pr_nums = []
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = None
    url = 'https://bugs.python.org/issue23644'
    versions = ['Python 3.6']

    Activity

    1. JoshuaJCogliati commented on Mar 12, 2015

      JoshuaJCogliatimannequin
      MannequinAuthor

      The attached example works fine with Python 3.4.2, but fails with Python 3.5.0a1 and 3.5.0a2

      I am using:
      $ g++ --version
      g++ (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
      $ swig -version

      SWIG Version 3.0.5

      Compiled with g++ [x86_64-redhat-linux-gnu]

      Configured options: +pcre
      $ python3 --version
      Python 3.5.0a2

      The output of trying the makefile with Python 3.5.0a2 is:

      $ make
      swig -c++ -python -py3 example.i
      g++ -g -fPIC -c example.cxx example_wrap.cxx -I/local/python350a2/include/python3.5m -I/local/python350a2/include/python3.5m
      In file included from /local/python350a2/include/python3.5m/pyatomic.h:10:0,
                       from /local/python350a2/include/python3.5m/Python.h:53,
                       from example_wrap.cxx:154:
      /usr/include/c++/4.9.2/exception:161:34: error: missing binary operator before token "("
       #if (__cplusplus >= 201103L) && (ATOMIC_INT_LOCK_FREE > 1)
                                        ^
      In file included from /local/python350a2/include/python3.5m/pyatomic.h:10:0,
                       from /local/python350a2/include/python3.5m/Python.h:53,
                       from example_wrap.cxx:154:
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:40:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic _Bool atomic_bool;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:41:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic char atomic_char;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:42:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic signed char atomic_schar;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:43:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic unsigned char atomic_uchar;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:44:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic short atomic_short;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:45:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic unsigned short atomic_ushort;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:46:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic int atomic_int;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:47:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic unsigned int atomic_uint;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:48:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic long atomic_long;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:49:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic unsigned long atomic_ulong;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:50:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic long long atomic_llong;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:51:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic unsigned long long atomic_ullong;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:52:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __CHAR16_TYPE__ atomic_char16_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:53:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __CHAR32_TYPE__ atomic_char32_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:54:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __WCHAR_TYPE__ atomic_wchar_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:55:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_LEAST8_TYPE__ atomic_int_least8_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:56:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_LEAST8_TYPE__ atomic_uint_least8_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:57:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_LEAST16_TYPE__ atomic_int_least16_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:58:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_LEAST16_TYPE__ atomic_uint_least16_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:59:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_LEAST32_TYPE__ atomic_int_least32_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:60:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_LEAST32_TYPE__ atomic_uint_least32_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:61:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_LEAST64_TYPE__ atomic_int_least64_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:62:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_LEAST64_TYPE__ atomic_uint_least64_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:63:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_FAST8_TYPE__ atomic_int_fast8_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:64:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_FAST8_TYPE__ atomic_uint_fast8_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:65:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_FAST16_TYPE__ atomic_int_fast16_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:66:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_FAST16_TYPE__ atomic_uint_fast16_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:67:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_FAST32_TYPE__ atomic_int_fast32_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:68:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_FAST32_TYPE__ atomic_uint_fast32_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:69:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INT_FAST64_TYPE__ atomic_int_fast64_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:70:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINT_FAST64_TYPE__ atomic_uint_fast64_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:71:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INTPTR_TYPE__ atomic_intptr_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:72:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINTPTR_TYPE__ atomic_uintptr_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:73:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __SIZE_TYPE__ atomic_size_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:74:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __PTRDIFF_TYPE__ atomic_ptrdiff_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:75:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __INTMAX_TYPE__ atomic_intmax_t;
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:76:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic __UINTMAX_TYPE__ atomic_uintmax_t;        
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:232:9: error: ‘_Atomic’ does not name a type
       typedef _Atomic struct
               ^
      /usr/lib/gcc/x86_64-redhat-linux/4.9.2/include/stdatomic.h:239:3: error: ‘atomic_flag’ does not name a type
       } atomic_flag;
         ^
      In file included from /local/python350a2/include/python3.5m/Python.h:53:0,
                       from example_wrap.cxx:154:
      /local/python350a2/include/python3.5m/pyatomic.h:37:5: error: ‘_Atomic’ does not name a type
           _Atomic void *_value;
           ^
      /local/python350a2/include/python3.5m/pyatomic.h:41:5: error: ‘atomic_int’ does not name a type
           atomic_int _value;
           ^
      Makefile:4: recipe for target 'example.so' failed
      make: *** [example.so] Error 1

      The output with Python 3.4.2:
      $ make
      swig -c++ -python -py3 example.i
      g++ -g -fPIC -c example.cxx example_wrap.cxx -I/local/python342m/include/python3.4m -I/local/python342m/include/python3.4m
      g++ -g -shared *.o -o _example.so
      $ python3.4 a_test.py
      3

    2. vstinner commented on Mar 12, 2015

      @vstinner
      Member

      _Atomic was added by the issue bpo-22038.

    3. python-dev commented on Mar 12, 2015

      python-devmannequin
      Mannequin

      New changeset eb48295e1f8b by Victor Stinner in branch 'default':
      Issue bpo-23644, bpo-22038: Move #include <stdatomic.c> inside the extern "C" { ... }
      https://hg.python.org/cpython/rev/eb48295e1f8b

    4. vstinner commented on Mar 12, 2015

      @vstinner
      Member

      Can you please try with the latest development version?

    5. JoshuaJCogliati commented on Mar 12, 2015

      JoshuaJCogliatimannequin
      MannequinAuthor
      I have:
      /local/python_fix/include/python3.5m/pyatomic.h
      #ifndef Py_LIMITED_API
      #ifndef Py_ATOMIC_H
      #define Py_ATOMIC_H
      
      #include "dynamic_annotations.h"
      
      #include "pyconfig.h"
      
      #ifdef __cplusplus
      extern "C" {
      #endif
      
      #if defined(HAVE_STD_ATOMIC)
      #include <stdatomic.h>
      #endif

      ...

      and still get:
      In file included from /local/python_fix/include/python3.5m/pyatomic.h:14:0,
                       from /local/python_fix/include/python3.5m/Python.h:53,
                       from example_wrap.cxx:154:
      /usr/include/c++/4.9.2/exception:161:34: error: missing binary operator before token "("
       #if (__cplusplus >= 201103L) && (ATOMIC_INT_LOCK_FREE > 1)

      So the bug still seems to be there.

    6. vstinner commented on Mar 12, 2015

      @vstinner
      Member

      The problem is more general than Python: #include <stdatomic.h> fails in C++. Try to compiled atomic.cpp with g++, you will get the same error.

      The following bug report in the glibc has been closed as WONTFIX:
      https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932

      It suggests to use the following code:

      #ifdef __cplusplus
      #include <atomic>
      using namespace std;
      #else
      #include <stdatomic.h>
      #endif

      I don't know if it works.

    7. gustavotemple commented on Mar 12, 2015

      gustavotemplemannequin
      Mannequin

      @Haypo, @lbianc will investigate this issue.

    8. JoshuaJCogliati commented on Mar 12, 2015

      JoshuaJCogliatimannequin
      MannequinAuthor
      If I change the header to:
      #ifndef Py_LIMITED_API
      #ifndef Py_ATOMIC_H
      #define Py_ATOMIC_H
      
      #include "dynamic_annotations.h"
      
      #include "pyconfig.h"
      
      #ifdef __cplusplus
      extern "C" {
      #endif
      
      #if defined(HAVE_STD_ATOMIC)
      #ifdef __cplusplus
      #include <atomic>
      using namespace std;
      #else
      #include <stdatomic.h>
      #endif
      #endif

      ... (rest same)

      AND use -std=c++11
      Then the error changes to:
      In file included from /local/python_fix/include/python3.5m/Python.h:53:0,
      from example_wrap.cxx:154:
      /local/python_fix/include/python3.5m/pyatomic.h:42:5: error: ‘_Atomic’ does not name a type
      _Atomic void *_value;
      ^

      Basically, <atomic> does define std::atomic_int, but it does not define _Atomic, so the line:
      _Atomic void *_value;
      will also need to be changed.

    9. changed the title [-]swig compile fails with ‘_Atomic’ does not name a type[/-] [+]g++ module compile fails with ‘_Atomic’ does not name a type[/+] on Mar 12, 2015
    10. lbianc commented on Mar 16, 2015

      lbiancmannequin
      Mannequin

      @Haypo

      For adding compatibility for atomics based on @Joshua.J.Cogliati change, I propose:

      #ifndef Py_LIMITED_API
      #ifndef Py_ATOMIC_H
      #define Py_ATOMIC_H
      
      #include "dynamic_annotations.h"
      
      #include "pyconfig.h"
      
      #if defined(HAVE_STD_ATOMIC)
      #ifdef __cplusplus
      #include <atomic>
      #define _Atomic(T) atomic<T>
      using namespace std;
      #else
      #include <stdatomic.h>
      #endif
      #endif
      
      #ifdef __cplusplus
      extern "C" {
      #endif

      /* This is modeled after the atomics interface from C1x, according to

      #if defined(HAVE_STD_ATOMIC)
      

      typedef enum _Py_memory_order {
      _Py_memory_order_relaxed = memory_order_relaxed,
      _Py_memory_order_acquire = memory_order_acquire,
      _Py_memory_order_release = memory_order_release,
      _Py_memory_order_acq_rel = memory_order_acq_rel,
      _Py_memory_order_seq_cst = memory_order_seq_cst
      } _Py_memory_order;

      typedef struct _Py_atomic_address {
          _Atomic (void) *_value;
      } _Py_atomic_address;
      
      typedef struct _Py_atomic_int {
          atomic_int _value;
      } _Py_atomic_int;

      ... (rest same)

    11. vstinner commented on Mar 16, 2015

      @vstinner
      Member

      using namespace std;

      Doing this in a header is ugly.

    12. JoshuaJCogliati commented on Mar 16, 2015

      JoshuaJCogliatimannequin
      MannequinAuthor

      > using namespace std;

      Doing this in a header is ugly.

      If you put it in the:
      #ifdef __cplusplus
      extern "C" {
      #endif

      then it would only apply till the end of the pyatomic header, and not to anything that includes it. Something like:

      #ifdef __cplusplus
      extern "C" {
      #if defined(HAVE_STD_ATOMIC)
      using namespace std;
      #endif
      #endif
      
      But if you are already defining:
      #define _Atomic(T) atomic<T>
      maybe it should be:
      #define _Atomic(T) std::atomic<T>

      (I haven't checked any of this code, but they would get around the namespace std being changed in code that includes pyatomic.h problem. )

    13. vstinner commented on Mar 16, 2015

      @vstinner
      Member

      #define _Atomic(T) std::atomic<T>

      This looks better to me :-) Can you please write a patch?

    14. lbianc commented on Mar 16, 2015

      lbiancmannequin
      Mannequin

      #define _Atomic(T) std::atomic<T>
      Does not work, since there are definitions like "memory_order_relaxed" that are in std.

      I tested the other one, and it works fine:

      #ifdef __cplusplus
      extern "C" {
      #if defined(HAVE_STD_ATOMIC)
      using namespace std;
      #endif
      #endif

      @Haypo, what do you think?

    15. Arfrever commented on Mar 16, 2015

      Arfrevermannequin
      Mannequin

      So use std::memory_order_relaxed, std::memory_order_acquire etc.

    16. 10 remaining items

    17. MelroyvandenBerg commented on Jul 6, 2017

      MelroyvandenBergmannequin
      Mannequin

      I also got this problem with gcc/g++ version 4.9.3.

      ./Include/pyatomic.h:37:5: error: 'atomic_int' does not name a type

      I'm using Python 3.6.1. It's not fixed!

    18. vstinner commented on Jul 6, 2017

      @vstinner
      Member

      I'm using Python 3.6.1. It's not fixed!

      Thanks for the confirmation of the fix ;-)

    19. MelroyvandenBerg commented on Jul 6, 2017

      MelroyvandenBergmannequin
      Mannequin

      Ow sorry, I though it was already fixed in the latest stable version of 3.x. Since is issue is from 2015.

    20. vstinner commented on Jul 6, 2017

      @vstinner
      Member

      Oh, wait, I read your message backward. You said that the fix doesn't work?

      Hum, how can I reproduce the issue? What is your use case?

    21. vstinner commented on Jul 6, 2017

      @vstinner
      Member

      ./Include/pyatomic.h:37:5: error: 'atomic_int' does not name a type

      I don't understand how you got this error. The line 37 of pyatomic.h is only compiled when you build Python itself. At least, since Python 3.5.1 and Python 3.6.0.

      Did you try to build Python? Or did you try to build a C extension?

    22. vstinner commented on Jul 6, 2017

      @vstinner
      Member

      See the following commit of bpo-25150:

      commit 6df29ad
      Author: Victor Stinner <victor.stinner@gmail.com>
      Date: Fri Sep 18 15:06:34 2015 +0200

      Issue bpo-25150: Hide the private _Py_atomic_xxx symbols from the public
      Python.h header to fix a compilation error with OpenMP. PyThreadState_GET()
      becomes an alias to PyThreadState_Get() to avoid ABI incompatibilies.
      
      It is important that the _PyThreadState_Current variable is always accessed
      with the same implementation of pyatomic.h. Use the PyThreadState_Get()
      function so extension modules will all reuse the same implementation.
      
    23. MelroyvandenBerg commented on Jul 6, 2017

      MelroyvandenBergmannequin
      Mannequin

      Yea I'm building Python 3.6.1 from source, using gcc and --with-cxx-main=correct/location/to/g++ flag. So the warning message appears during ./configure about that it can't find g++.

      I didn't try to patch it using the attachments of this issue. Since I was hoping it's fixed in the release itself. I was using gcc/g++ version 4.9.

    24. vstinner commented on Jul 6, 2017

      @vstinner
      Member

      I don't think that CPython can be built by g++. If you consider that it
      should, please open a new issue since it's a different use case.

    25. jpc2350 commented on Nov 2, 2017

      jpc2350mannequin
      Mannequin

      Interestingly, I get the error with Python 3.6.3 build from source, where I include the path to the g++ binary.

      Python builds without the g++ option, but then _Tkinter fails to build - see bpo-31817

    26. vstinner commented on Jun 25, 2020

      @vstinner
      Member

      Atomic functions are no longer part of the public C API: code was moved to pycore_atomic.h internal C API. I close the issue.

    27. transferred this issue fromon Apr 10, 2022
    28. P403n1x87 commented on Aug 20, 2023

      @P403n1x87
      Contributor

      @vstinner This seems to occur in 3.12 when importing e.g. pycore_dict.h in a C++ module https://github.com/P403n1x87/echion/actions/runs/5775912109/job/15654462792

      In file included from /opt/hostedtoolcache/Python/3.12.0-beta.4/x64/include/python3.12/internal/pycore_atomic.h:15,
                             from /opt/hostedtoolcache/Python/3.12.0-beta.4/x64/include/python3.12/internal/pycore_runtime.h:12,
                             from /opt/hostedtoolcache/Python/3.12.0-beta.4/x64/include/python3.12/internal/pycore_dict.h:13,
                             from ./echion/mirrors.h:14,
                             from echion/coremodule.cc:29:
            /usr/lib/gcc/x86_64-linux-gnu/9/include/stdatomic.h: At global scope:
            /usr/lib/gcc/x86_64-linux-gnu/9/include/stdatomic.h:40:9: error: ‘_Atomic’ does not name a type
               40 | typedef _Atomic _Bool atomic_bool;
                  |         ^~~~~~~
      

      https://github.com/P403n1x87/echion/blob/29275a13aea67a8d008471523f38bc4477499a98/echion/mirrors.h#L14

    29. vstinner commented on Aug 21, 2023

      @vstinner
      Member

      This issue is closed. Please open a new issue.

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    No one assigned

      Labels

      No labels
      No labels

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions