title: How can I get rid of deprecated warnings in deprecated functions in GCC?
body: <p>One way to implement deprecation warnings is to produce warnings on calls to deprecated functions, unless you are calling from a deprecated context. This way legacy code can call legacy code without producing warnings that only amount to noise.</p>
  
  <p>This is a reasonable line of thinking, and it is reflected in the implementations I see in GCC 4.2 (1) and Clang 4.0 (2) on OS X as well as Clang 3.0 (3) on Ubuntu.</p>
  
  <ul>
  <li>(1): i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)</li>
  <li>(2): Apple clang version 4.0 (tags/Apple/clang-421.0.57) (based on LLVM 3.1svn)</li>
  <li>(3): Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)</li>
  </ul>
  
  <hr>
  
  <p>However, when I compile with GCC 4.6 (4) on Ubuntu, I get deprecated warnings for all invocations of deprecated functions, independently of context. Is this a regression in functionality? Are there compiler options I can use to get the other behavior?</p>
  
  <ul>
  <li>(4): g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3</li>
  </ul>
  
  <hr>
  
  <p>Example program:</p>
  
  <pre><code>int __attribute__((deprecated)) a() {
      return 10;
  }
  
  int __attribute__((deprecated)) b() {
      return a() * 2; //&lt; I want to get rid of warnings from this line
  }
  
  int main() {
      return b(); //&lt; I expect a warning on this line only
  }
  </code></pre>
  
  <p>Output from GCC 4.2 (Yes, I do get the same warning twice. I don't care about that, though):</p>
  
  <pre><code>main.cpp: In function ‘int main()’:
  main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5)
  main.cpp:10: warning: ‘b’ is deprecated (declared at main.cpp:5)
  </code></pre>
  
  <p>Output from GCC 4.6:</p>
  
  <pre><code>main.cpp: In function 'int b()':
  main.cpp:6:9: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations]
  main.cpp:6:11: warning: 'int a()' is deprecated (declared at main.cpp:1) [-Wdeprecated-declarations]
  main.cpp: In function 'int main()':
  main.cpp:10:9: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations]
  main.cpp:10:11: warning: 'int b()' is deprecated (declared at main.cpp:5) [-Wdeprecated-declarations]
  </code></pre>
  
  <hr>
  
  <p>How can I convince GCC 4.6 that it should give me the same output as GCC 4.2?</p>