Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
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.
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.
(1): i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
(2): Apple clang version 4.0 (tags/Apple/clang-421.0.57) (based on LLVM 3.1svn)
(3): Ubuntu clang version 3.0-6ubuntu3 (tags/RELEASE_30/final) (based on LLVM 3.0)
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?
(4): g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
int __attribute__((deprecated)) b() {
return a() * 2; //< I want to get rid of warnings from this line
int main() {
return b(); //< I expect a warning on this line only
Output from GCC 4.2 (Yes, I do get the same warning twice. I don't care about that, though):
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)
Output from GCC 4.6:
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]
–
–
–
–
gcc 4.6 added diagnostic pragmas that will help solve this problem:
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
int __attribute__((deprecated)) b() {
return a() * 2; //< I want to get rid of warnings from this line
#pragma GCC diagnostic pop
Note: This only works in gcc 4.6 and higher. The push
and pop
are 4.6 extensions. With gcc 4.5, the #pragma GCC diagnostic push
and pop
will be ignored (with warnings). What won't be ignored is the #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-- but now this has effect until end of file.
The behaviour you're seeing in GCC 4.2 is caused by an Apple-specific patch to GCC. FSF GCC 4.2.4 warns about the use of a
. The specific bit that Apple GCC has that FSF GCC doesn't is:
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -902,6 +902,9 @@ warn_deprecated_use (tree node)
if (node == 0 || !warn_deprecated_decl)
return;
+ if (current_function_decl && TREE_DEPRECATED (current_function_decl))
+ return;
if (DECL_P (node))
expanded_location xloc = expand_location (DECL_SOURCE_LOCATION (node));
(Available under GPLv2 or later)
You may wish to adapt this patch to a later version of GCC (perhaps no changes are needed, perhaps major changes are needed), and build GCC from source with this patch applied. Or you may report this as a feature request on FSF GCC bugzilla.
–
–
–
–
I encounter the same issue. The solution that came up is the following
typedef OLD_A_NOT_TO_BE_USED a __attribute__((deprecated));
int OLD_A_NOT_TO_BE_USED () {
return 10;
int __attribute__((deprecated)) b() {
return OLD_A_NOT_TO_BE_USED () * 2; //< I want to get rid of warnings from this line
int main() {
return b(); //< I expect a warning on this line only
So I just rename my a class into OLD_A_NOT_TO_BE_USED class. I get the warning only on return b(); and if someone was using a they will still get the deprecated warning.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.