BwTree icon indicating copy to clipboard operation
BwTree copied to clipboard

cannot build with clang++

Open roblatham00 opened this issue 7 years ago • 2 comments

Trying to compile BwTree with clang++, I get these warnings that don't make a lot of sense to me:

In file included from ./test/main.cpp:2:
In file included from ./test/test_suite.h:20:
./test/../src/bwtree.h:9394:5: error: 'GarbageNode' is a private member of
      'wangziqi2013::bwtree::BwTreeBase'
    GarbageNode *garbage_node_p = \  
    ^
./test/../src/bwtree.h:210:9: note: implicitly declared private here
  class GarbageNode {
        ^
./test/../src/bwtree.h:9395:11: error: 'GarbageNode' is a private member of
      'wangziqi2013::bwtree::BwTreeBase'
      new GarbageNode{GetGlobalEpoch(), (void *)(node_p)};
          ^
./test/../src/bwtree.h:210:9: note: implicitly declared private here
  class GarbageNode {

those declarations look public to me, and trying to mimic your class structure with a small test case did not cause any problems. I clearly oversimplified...

class Foo {
    class Bar {
        public:
            Bar(int a, int b) {}
    };
    void do_stuff() {
        Bar *bar_p = new Bar{5, 10};
    }
};

roblatham00 avatar Sep 07 '17 15:09 roblatham00

@roblatham00 The problem with Clang is that class GarbageNode is private to all classes that is not a friend of class BwTreeBase, and in the meantime it is accessible by classes defined in class BwTreeBase. This is just like a class's member functions could access its private members, but other non-friend classes could not.

Explicitly declaring class GarbageNode in class BwTreeBase as public could solve the problem.

wangziqi2013 avatar Sep 07 '17 20:09 wangziqi2013

I had the same issue. Not only GarbageNode but also GC_NODE_COUNT_THREADHOLD and gc_id led to the same errors (... is a private member of 'wangziqi2013::bwtree::BwTreeBase).

A possible quick-and-dirty fix (git diff output):

diff --git a/src/bwtree.h b/src/bwtree.h
index 781a992..3988683 100644
--- a/src/bwtree.h
+++ b/src/bwtree.h
@@ -197,6 +197,7 @@ class BwTreeBase {
   // This is the mask we used for address alignment (AND with this)
   static constexpr size_t CACHE_LINE_MASK = ~(CACHE_LINE_SIZE - 1);
   
+  public:
   // We invoke the GC procedure after this has been reached
   static constexpr size_t GC_NODE_COUNT_THREADHOLD = 1024;
   
@@ -232,6 +233,7 @@ class BwTreeBase {
     {}
   };
   
+  private:
   /*
    * class GCMetaData - Metadata for performing GC on per-thread basis
    */
@@ -305,13 +307,14 @@ class BwTreeBase {
                 "class PaddedGCMetadata size does"
                 " not conform to the alignment!");
  
- private: 
+ public:
   // This is used as the garbage collection ID, and is maintained in a per
   // thread level
   // This is initialized to -1 in order to distinguish between registered 
   // threads and unregistered threads
   static thread_local int gc_id;
   
+  private:
   // This is used to count the number of threads participating GC process
   // We use this number to initialize GC data structure
   static std::atomic<size_t> total_thread_num;

mweisgut avatar Nov 22 '20 12:11 mweisgut