URL: <https://savannah.gnu.org/support/?111072>
Summary: "[[]] attributes are a C23 extension warning" with clang Group: Autoconf Submitter: None Submitted: Fri 07 Jun 2024 11:49:01 PM UTC Priority: 5 - Unprioritized Severity: 3 - Normal Status: None Privacy: Public Assigned to: None Originator Email: p...@lucasmail.org Open/Closed: Open Discussion Lock: Any Operating System: *BSD _______________________________________________________ Follow-up Comments: ------------------------------------------------------- Date: Fri 07 Jun 2024 11:49:01 PM UTC By: Anonymous Hello — Recently, I started getting warnings like: ./slist.h:170:1: warning: [[]] attributes are a C23 extension [-Wc23-extensions] 170 | NODISCARD | ^ ../lib/attribute.h:143:19: note: expanded from macro 'NODISCARD' 143 | #define NODISCARD _GL_ATTRIBUTE_NODISCARD | ^ ./config.h:1392:37: note: expanded from macro '_GL_ATTRIBUTE_NODISCARD' 1392 | # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] | ^ Specifically, the value defined for NODISCARD defined in config.h as generated by configure as generated by autoconf causes the warning. The relevant section from config.h is: #ifndef _GL_ATTRIBUTE_NODISCARD # ifndef _GL_BRACKET_BEFORE_ATTRIBUTE # if defined __clang__ && defined __cplusplus /* With clang up to 15.0.6 (at least), in C++ mode, [[__nodiscard__]] produces a warning. The 1000 below means a yet unknown threshold. When clang++ version X starts supporting [[__nodiscard__]] without warning about it, you can replace the 1000 with X. */ # if __clang_major__ >= 1000 # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] # endif # elif _GL_HAVE___HAS_C_ATTRIBUTE # if __has_c_attribute (__nodiscard__) # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] # endif # endif # endif # if !defined _GL_ATTRIBUTE_NODISCARD && _GL_HAS_ATTRIBUTE (warn_unused_result) # define _GL_ATTRIBUTE_NODISCARD __attribute__ ((__warn_unused_result__)) # endif # ifndef _GL_ATTRIBUTE_NODISCARD # define _GL_ATTRIBUTE_NODISCARD # endif #endif I think the problem is this line: # if defined __clang__ && defined __cplusplus My project is a C project, not C++, so __cplusplus is not defined so that #if fails which means this part happens: # elif _GL_HAVE___HAS_C_ATTRIBUTE # if __has_c_attribute (__nodiscard__) # define _GL_ATTRIBUTE_NODISCARD [[__nodiscard__]] # endif In this block, no check for __clang_major__ is done, so it always defines _GL_ATTRIBUTE_NODISCARD to [[__nodiscard__]] and clang warns. I don't think the && __cplusplus should be there at all. Attributes using [[ are supported in C23 or later or C++11 or later. Why not use __STDC_VERSION__? FYI: $ clang --version FreeBSD clang version 18.1.5 (https://github.com/llvm/llvm-project.git llvmorg-18.1.5-0-g617a15a9eac9) Target: x86_64-unknown-freebsd14.1 Thread model: posix InstalledDir: /usr/bin $ autoconf --version autoconf (GNU Autoconf) 2.72 Copyright (C) 2023 Free Software Foundation, Inc. License GPLv3+/Autoconf: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>, <https://gnu.org/licenses/exceptions.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by David J. MacKenzie and Akim Demaille. — Paul _______________________________________________________ Reply to this item at: <https://savannah.gnu.org/support/?111072> _______________________________________________ Message sent via Savannah https://savannah.gnu.org/