Kaydet (Commit) cdd1de08 authored tarafından Tor Lillqvist's avatar Tor Lillqvist

Check for the C++11 "final" specifier and introduce SAL_FINAL

I think it is useful to use SAL_FINAL mainly as a documentation aid,
to make it clear to a code reader when a class is not expected to be
derived from, and when a virtual function is not expected to be
overridden in a derived class.

Possibly there is also some class of bugs that using SAL_FINAL will
help find?

Change-Id: I45002f020dcb52e8a9f2962ff98780f2b80627af
üst 0a3fc013
...@@ -14,6 +14,7 @@ Any change in this header will cause a rebuild of almost everything. ...@@ -14,6 +14,7 @@ Any change in this header will cause a rebuild of almost everything.
#define HAVE_CXX11_DELETE 0 #define HAVE_CXX11_DELETE 0
#define HAVE_CXX11_OVERRIDE 0 #define HAVE_CXX11_OVERRIDE 0
#define HAVE_CXX11_FINAL 0
#define HAVE_CXX11_PERFECT_FORWARDING 0 #define HAVE_CXX11_PERFECT_FORWARDING 0
#define HAVE_GCC_BUILTIN_ATOMIC 0 #define HAVE_GCC_BUILTIN_ATOMIC 0
#define HAVE_GCC_PRAGMA_DIAGNOSTIC_MODIFY 0 #define HAVE_GCC_PRAGMA_DIAGNOSTIC_MODIFY 0
......
...@@ -5585,14 +5585,14 @@ struct A ...@@ -5585,14 +5585,14 @@ struct A
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
else else
AC_MSG_RESULT([no (C++11 disabled)]) AC_MSG_RESULT([no])
fi fi
dnl ================================== dnl ==================================
dnl Check for C++11 "override" support dnl Check for C++11 "override" support
dnl ================================== dnl ==================================
AC_MSG_CHECKING([whether $CXX supports C++11 override syntax]) AC_MSG_CHECKING([whether $CXX supports C++11 "override" syntax])
if test "$HAVE_CXX0X" = "TRUE"; then if test "$HAVE_CXX0X" = "TRUE"; then
save_CXXFLAGS=$CXXFLAGS save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11" CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
...@@ -5618,7 +5618,76 @@ struct B : A ...@@ -5618,7 +5618,76 @@ struct B : A
AC_MSG_RESULT([no]) AC_MSG_RESULT([no])
fi fi
else else
AC_MSG_RESULT([no (C++11 disabled)]) AC_MSG_RESULT([no])
fi
dnl ==================================
dnl Check for C++11 "final" support
dnl ==================================
AC_MSG_CHECKING([whether $CXX supports C++11 "final" syntax])
if test "$HAVE_CXX0X" = "TRUE"; then
save_CXXFLAGS=$CXXFLAGS
CXXFLAGS="$CXXFLAGS $CXXFLAGS_CXX11"
AC_LANG_PUSH([C++])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
// First check that this correct program that uses "final" compiles
struct A final
{
};
struct B
{
virtual void test();
};
struct C : B
{
void test() final;
};
]])],[have_final=yes],[])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
// Then check that the "final" works as expected,
// that this program fails to compile
struct A final
{
};
struct B : A
{
};
]])],[],[final_class_works=yes])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
// Also this should fail to compile
struct B
{
virtual void test();
};
struct C : B
{
void test() final;
};
struct D : C
{
void test();
};
]])],[],[final_method_works=yes])
AC_LANG_POP([C++])
CXXFLAGS=$save_CXXFLAGS
if test "$have_final" = yes -a "$final_class_works" = yes -a "$final_method_works" = yes; then
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_CXX11_FINAL])
else
AC_MSG_RESULT([no])
fi
else
AC_MSG_RESULT([no])
fi fi
dnl =================================================================== dnl ===================================================================
......
...@@ -409,6 +409,18 @@ namespace css = ::com::sun::star; ...@@ -409,6 +409,18 @@ namespace css = ::com::sun::star;
#define SAL_OVERRIDE #define SAL_OVERRIDE
#endif #endif
/** C++11 "final" feature.
With HAVE_CXX11_FINAL, mark a class as non-derivable or a method as non-overridable.
@since LibreOffice 4.1
*/
#if HAVE_CXX11_FINAL
#define SAL_FINAL final
#else
#define SAL_FINAL
#endif
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef __cplusplus #ifdef __cplusplus
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment