The problem is that "garbage collection" as a term seems to have become synonymous with "tracing GC" (or, in other circles, "whatever the JVM does"). I've started using the term "dynamic lifetime determination" to refer to both tracing garbage collection and reference counting (with our without cycle detection, though the distinction matters). The question then is how
pervasive a given language makes dynamic lifetime determination. In Java (GC) and Python (RC with CC), it's ubiquitous. In Go (GC with value types) and Swift (RC without CC), it's pervasive. In Rust and C++, it's selective (note that a large C++ codebase with shared_ptr
everywhere would, effectively, be garbage-collected (to say nothing of e.g. Boehm)).
In contrast, C's automatic storage duration for stack-allocated items ( http://en.cppreference.com/w/cpp/language/storage_duration#S... ) and Rust's system of ownership for heap-allocated items are things that I'd consider "static lifetime determination".