[Mesa-dev] [PATCH] include: Add helper header to help trap includes inside extern C.

Mark Janes mark.a.janes at intel.com
Wed Mar 4 13:28:49 PST 2015


Jose Fonseca <jfonseca at vmware.com> writes:

> From: José Fonseca <jfonseca at vmware.com>
>
> This is just to help repro and fixing these issues with any C++ compiler --
>
> commiting this will of course wait until all issues are addressed.

Hi Jose,

I have a patch which trivially fixes extern "C" in the 14 files
identified by no_extern_c.h errors.

Should I send the patch?  This helper header was sent a long time ago,
but it seems like a useful mechanism to me.

-Mark

>
>
> $ scons src/glsl/
> scons: Reading SConscript files ...
> Checking for GCC ...  yes
> Checking for Clang ...  no
> Checking for X11 (x11 xext xdamage xfixes glproto >= 1.4.13)... yes
> Checking for XCB (x11-xcb xcb-glx >= 1.8.1 xcb-dri2 >= 1.8)... yes
> Checking for XF86VIDMODE (xxf86vm)... yes
> Checking for DRM (libdrm >= 2.4.38)... yes
> Checking for UDEV (libudev >= 151)... yes
> warning: LLVM disabled: not building llvmpipe
> scons: done reading SConscript files.
> scons: Building targets ...
> scons: building associated VariantDir targets: build/linux-x86_64-debug/glsl
>   Compiling src/glsl/ast_array_index.cpp ...
>   Compiling src/glsl/ast_expr.cpp ...
>   Compiling src/glsl/ast_function.cpp ...
>   Compiling src/glsl/ast_to_hir.cpp ...
>   Compiling src/glsl/ast_type.cpp ...
>   Compiling src/glsl/builtin_functions.cpp ...
> In file included from include/c99_compat.h:28:0,
>                  from src/mapi/u_compiler.h:4,
>                  from src/mapi/u_thread.h:47,
>                  from src/mapi/glapi/glapi.h:47,
>                  from src/mesa/main/mtypes.h:42,
>                  from src/mesa/main/errors.h:47,
>                  from src/mesa/main/imports.h:41,
>                  from src/mesa/main/core.h:44,
>                  from src/glsl/builtin_functions.cpp:58:
> include/no_extern_c.h:48:1: error: template with C linkage
>  template<class T> class _IncludeInsideExternCNotPortable;
>  ^
> In file included from include/c99_compat.h:28:0,
>                  from include/c11/threads.h:38,
>                  from src/mapi/u_thread.h:49,
>                  from src/mapi/glapi/glapi.h:47,
>                  from src/mesa/main/mtypes.h:42,
>                  from src/mesa/main/errors.h:47,
>                  from src/mesa/main/imports.h:41,
>                  from src/mesa/main/core.h:44,
>                  from src/glsl/builtin_functions.cpp:58:
> include/no_extern_c.h:48:1: error: template with C linkage
>  template<class T> class _IncludeInsideExternCNotPortable;
>  ^
>   Compiling src/glsl/builtin_types.cpp ...
>   Compiling src/glsl/builtin_variables.cpp ...
> scons: *** [build/linux-x86_64-debug/glsl/builtin_functions.os] Error 1
> scons: building terminated because of errors.
> ---
>  include/c99_compat.h  |  2 ++
>  include/no_extern_c.h | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>  src/util/u_atomic.h   |  3 +++
>  3 files changed, 54 insertions(+)
>  create mode 100644 include/no_extern_c.h
>
> diff --git a/include/c99_compat.h b/include/c99_compat.h
> index 429c601..a8819ac 100644
> --- a/include/c99_compat.h
> +++ b/include/c99_compat.h
> @@ -25,6 +25,8 @@
>   *
>   **************************************************************************/
>  
> +#include "no_extern_c.h"
> +
>  #ifndef _C99_COMPAT_H_
>  #define _C99_COMPAT_H_
>  
> diff --git a/include/no_extern_c.h b/include/no_extern_c.h
> new file mode 100644
> index 0000000..d038a4f
> --- /dev/null
> +++ b/include/no_extern_c.h
> @@ -0,0 +1,49 @@
> +/**************************************************************************
> + *
> + * Copyright 2014 VMware, Inc.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included
> + * in all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + *
> + **************************************************************************/
> +
> +
> +/*
> + * Including system's headers inside `extern "C" { ... }` is not safe, as system
> + * headers may have C++ code in them, and C++ code inside extern "C"
> + * leads to syntatically incorrect code.
> + *
> + * This is because putting code inside extern "C" won't make __cplusplus define
> + * go away, that is, the headers being included thinks is free to use C++ as it
> + * sees fits.
> + *
> + * Including non-system headers inside extern "C"  is not safe either, because
> + * non-system headers end up including system headers, hence fall in the above
> + * case too.
> + *
> + * Conclusion, includes inside extern "C" is simply not portable.
> + *
> + *
> + * This header helps surface this issues.
> + *
> + */
> +
> +#ifdef __cplusplus
> +template<class T> class _IncludeInsideExternCNotPortable;
> +#endif
> diff --git a/src/util/u_atomic.h b/src/util/u_atomic.h
> index 56c5740..25b8030 100644
> --- a/src/util/u_atomic.h
> +++ b/src/util/u_atomic.h
> @@ -6,6 +6,9 @@
>   *
>   */
>  
> +
> +#include "no_extern_c.h"
> +
>  #ifndef U_ATOMIC_H
>  #define U_ATOMIC_H
>  
> -- 
> 2.1.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list