Sudden warnings

Hi all,

Compiling the following snippet:

typedef unsigned long size_t; // line 1

template<class K, class T>
class map {
private:

  size_t num_m;
  size_t max_m;

  static const size_t start_size = 1, factor = 2; // 10

  map(const map&);
  map& operator=(const map&);
public:
  static const size_t max_length = -1; // 15

  map() : num_m(0), max_m(0) { }

  ~map() {
  }

  void add(const K& , T ) {
    if (num_m > 0) {
      if (num_m >= max_m) {
        if (max_m <= max_length / factor) // 25
          max_m *= factor;
        else if (max_m < max_length)
          max_m = max_length;
      }
    } else {
      max_m = start_size; // 31
    }
    num_m++;
  }
};

class Type;

namespace { // no warnings without it

  enum state { PROCESSING = -1, ANSWER_NO, ANSWER_YES };

  struct memoizer : private map<Type*, state> {
    memoizer() : map<Type*, state>() {}

    void remember (Type *t, state s) {
        add(t, s);
    }
  };
}

with

clang version 2.9 (trunk 126116)
Target: x86_64-unknown-linux-gnu
Thread model: posix"

results in the following warnings (errors due to -Werror)

TypeI.cc:15:23: error: variable 'map<Type *,
<anonymous>::state>::max_length' has internal linkage but is not
defined
  static const size_t max_length = -1;
                      ^
TypeI.cc:25:22: note: used here
        if (max_m <= max_length / factor)
                     ^
TypeI.cc:10:39: error: variable 'map<Type *,
<anonymous>::state>::factor' has internal linkage but is not defined
  static const size_t start_size = 1, factor = 2;
                                      ^
TypeI.cc:25:35: note: used here
        if (max_m <= max_length / factor)
                                  ^
TypeI.cc:10:23: error: variable 'map<Type *,
<anonymous>::state>::start_size' has internal linkage but is not
defined
  static const size_t start_size = 1, factor = 2;
                      ^
TypeI.cc:31:15: note: used here
      max_m = start_size;
              ^

These warnings were not emitted from clang version 2.9 (trunk 125566).

I think clang is too trigger-happy here. Neither G++ nor Comeau online
reproduced these warnings (Comeau complained about the sign change in
line 15 and some functions being defined but not used).

Csaba

Technically, Clang is correct here, because you're using these variables
without defining them. But we should probably not be so pedantic, since most
other compilers seem not to be.

Please try again with r126137.

John.