https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103629

--- Comment #14 from Jonathan Wakely <redi at gcc dot gnu.org> ---
So one copy of that variable gets initialized, and a different copy gets
dereferenced, so it dereferences null.

If you change Tree.h to:

#pragma once

#include <mutex>
#include <memory>
#include <cstdio>

class Tree
{
public:
    static const std::string treeType() {
      static std::once_flag once;
      std::call_once(once, []() {
        std::printf("%p\n", &sTreeTypeName);
        sTreeTypeName.reset(new std::string());
                      });
      std::printf("%p\n", &sTreeTypeName);
      if (!sTreeTypeName)
        throw "uhoh";
      return *sTreeTypeName;
    }
private:
    static std::unique_ptr<const std::string> sTreeTypeName;
};

std::unique_ptr<const std::string> Tree::sTreeTypeName;

The program prints:

0x4040b0
0x7f81066af0a8
terminate called after throwing an instance of 'char const*'
Aborted (core dumped)

Reply via email to