git: 1a4cfe7f1ee1 - 2024Q3 - audio/libaudiofile: fix build with clang 19, enable tests

From: Dimitry Andric <dim_at_FreeBSD.org>
Date: Sat, 28 Sep 2024 09:48:45 UTC
The branch 2024Q3 has been updated by dim:

URL: https://cgit.FreeBSD.org/ports/commit/?id=1a4cfe7f1ee1ce76987f1455d361032fe456d081

commit 1a4cfe7f1ee1ce76987f1455d361032fe456d081
Author:     Dimitry Andric <dim@FreeBSD.org>
AuthorDate: 2024-09-13 09:11:45 +0000
Commit:     Dimitry Andric <dim@FreeBSD.org>
CommitDate: 2024-09-28 09:48:23 +0000

    audio/libaudiofile: fix build with clang 19, enable tests
    
    Clang 19 has become more strict about initialization with undefined
    behavior, resulting in errors similar to:
    
      ./SimpleModule.h:126:40: error: in-class initializer for static data member is not a constant expression
        126 |         static const int kMinSignedValue = -1 << kScaleBits;
            |                                            ~~~^~~~~~~~~~~~~
      ./SimpleModule.h:176:22: note: in instantiation of template class 'signConverter<kInt8>' requested here
        176 |                 transform<typename signConverter<Format>::signedToUnsigned>(src, dst, count);
            |                                    ^
      ./SimpleModule.h:183:5: note: in instantiation of function template specialization 'ConvertSign::convertSignedToUnsigned<kInt8>' requested here
        183 |                                 convertSignedToUnsigned<kInt8>(src, dst, count);
            |                                 ^
    
    This is because left-shifting negative values is undefined. Replace -1
    with ~0u which results in the expected value.
    
    While here, add a few other patches to remove warnings about undefined
    left-shifts, and add support for the "make test" target.
    
    PR:             281477
    Approved by:    maintainer timeout (2 weeks)
    MFH:            2024Q3
    
    (cherry picked from commit 7955b1d7ec787bf13f2cfea75e9355a3f3e91a53)
---
 audio/libaudiofile/Makefile                        |  3 +++
 audio/libaudiofile/files/patch-gtest_gtest.h       | 11 ++++++++
 .../patch-libaudiofile_modules_SimpleModule.h      | 11 ++++++++
 audio/libaudiofile/files/patch-test_FloatToInt.cpp | 11 ++++++++
 audio/libaudiofile/files/patch-test_IntToFloat.cpp | 11 ++++++++
 audio/libaudiofile/files/patch-test_NeXT.cpp       | 29 ++++++++++++++++++++++
 audio/libaudiofile/files/patch-test_Sign.cpp       | 20 +++++++++++++++
 7 files changed, 96 insertions(+)

diff --git a/audio/libaudiofile/Makefile b/audio/libaudiofile/Makefile
index db5302bbe380..a7b2087ee54a 100644
--- a/audio/libaudiofile/Makefile
+++ b/audio/libaudiofile/Makefile
@@ -23,6 +23,9 @@ USE_LDCONFIG=	yes
 GNU_CONFIGURE=	yes
 GNU_CONFIGURE_MANPREFIX=${PREFIX}/share
 
+do-test:
+	cd ${WRKSRC} && ${MAKE} check
+
 post-install:
 	@${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/libaudiofile.so.1
 
diff --git a/audio/libaudiofile/files/patch-gtest_gtest.h b/audio/libaudiofile/files/patch-gtest_gtest.h
new file mode 100644
index 000000000000..d5e97a6b529b
--- /dev/null
+++ b/audio/libaudiofile/files/patch-gtest_gtest.h
@@ -0,0 +1,11 @@
+--- gtest/gtest.h.orig	2013-02-11 17:23:26 UTC
++++ gtest/gtest.h
+@@ -529,7 +529,7 @@
+ // feature depending on tuple with be disabled in this mode).
+ #ifndef GTEST_HAS_TR1_TUPLE
+ // The user didn't tell us not to do it, so we assume it's OK.
+-# define GTEST_HAS_TR1_TUPLE 1
++# define GTEST_HAS_TR1_TUPLE 0
+ #endif  // GTEST_HAS_TR1_TUPLE
+ 
+ // Determines whether Google Test's own tr1 tuple implementation
diff --git a/audio/libaudiofile/files/patch-libaudiofile_modules_SimpleModule.h b/audio/libaudiofile/files/patch-libaudiofile_modules_SimpleModule.h
new file mode 100644
index 000000000000..641e80136ddf
--- /dev/null
+++ b/audio/libaudiofile/files/patch-libaudiofile_modules_SimpleModule.h
@@ -0,0 +1,11 @@
+--- libaudiofile/modules/SimpleModule.h.orig	2013-03-06 05:30:03 UTC
++++ libaudiofile/modules/SimpleModule.h
+@@ -123,7 +123,7 @@ struct signConverter
+ 	typedef typename IntTypes<Format>::UnsignedType UnsignedType;
+ 
+ 	static const int kScaleBits = (Format + 1) * CHAR_BIT - 1;
+-	static const int kMinSignedValue = -1 << kScaleBits;
++	static const int kMinSignedValue = ~0u << kScaleBits;
+ 
+ 	struct signedToUnsigned : public std::unary_function<SignedType, UnsignedType>
+ 	{
diff --git a/audio/libaudiofile/files/patch-test_FloatToInt.cpp b/audio/libaudiofile/files/patch-test_FloatToInt.cpp
new file mode 100644
index 000000000000..887337422410
--- /dev/null
+++ b/audio/libaudiofile/files/patch-test_FloatToInt.cpp
@@ -0,0 +1,11 @@
+--- test/FloatToInt.cpp.orig	2013-02-11 17:23:26 UTC
++++ test/FloatToInt.cpp
+@@ -115,7 +115,7 @@ TEST_F(FloatToIntTest, Int16)
+ 		EXPECT_EQ(readData[i], expectedData[i]);
+ }
+ 
+-static const int32_t kMinInt24 = -1<<23;
++static const int32_t kMinInt24 = ~0u<<23;
+ static const int32_t kMaxInt24 = (1<<23) - 1;
+ 
+ TEST_F(FloatToIntTest, Int24)
diff --git a/audio/libaudiofile/files/patch-test_IntToFloat.cpp b/audio/libaudiofile/files/patch-test_IntToFloat.cpp
new file mode 100644
index 000000000000..639526afe275
--- /dev/null
+++ b/audio/libaudiofile/files/patch-test_IntToFloat.cpp
@@ -0,0 +1,11 @@
+--- test/IntToFloat.cpp.orig	2013-02-11 17:23:26 UTC
++++ test/IntToFloat.cpp
+@@ -117,7 +117,7 @@ TEST_F(IntToFloatTest, Int16)
+ 		EXPECT_EQ(readData[i], expectedData[i]);
+ }
+ 
+-static const int32_t kMinInt24 = -1<<23;
++static const int32_t kMinInt24 = ~0u<<23;
+ static const int32_t kMaxInt24 = (1<<23) - 1;
+ 
+ TEST_F(IntToFloatTest, Int24)
diff --git a/audio/libaudiofile/files/patch-test_NeXT.cpp b/audio/libaudiofile/files/patch-test_NeXT.cpp
new file mode 100644
index 000000000000..aaff4de4ceaa
--- /dev/null
+++ b/audio/libaudiofile/files/patch-test_NeXT.cpp
@@ -0,0 +1,29 @@
+--- test/NeXT.cpp.orig	2013-02-11 17:23:26 UTC
++++ test/NeXT.cpp
+@@ -37,7 +37,7 @@
+ 
+ #include "TestUtilities.h"
+ 
+-const char kDataUnspecifiedLength[] =
++const unsigned char kDataUnspecifiedLength[] =
+ {
+ 	'.', 's', 'n', 'd',
+ 	0, 0, 0, 24, // offset of 24 bytes
+@@ -57,7 +57,7 @@ const char kDataUnspecifiedLength[] =
+ 	0, 55
+ };
+ 
+-const char kDataTruncated[] =
++const unsigned char kDataTruncated[] =
+ {
+ 	'.', 's', 'n', 'd',
+ 	0, 0, 0, 24, // offset of 24 bytes
+@@ -152,7 +152,7 @@ TEST(NeXT, Truncated)
+ 	ASSERT_EQ(::unlink(testFileName.c_str()), 0);
+ }
+ 
+-const char kDataZeroChannels[] =
++const unsigned char kDataZeroChannels[] =
+ {
+ 	'.', 's', 'n', 'd',
+ 	0, 0, 0, 24, // offset of 24 bytes
diff --git a/audio/libaudiofile/files/patch-test_Sign.cpp b/audio/libaudiofile/files/patch-test_Sign.cpp
new file mode 100644
index 000000000000..04c521685a7f
--- /dev/null
+++ b/audio/libaudiofile/files/patch-test_Sign.cpp
@@ -0,0 +1,20 @@
+--- test/Sign.cpp.orig	2013-02-11 17:23:26 UTC
++++ test/Sign.cpp
+@@ -116,7 +116,7 @@ TEST_F(SignConversionTest, Int16)
+ 		EXPECT_EQ(readData[i], expectedData[i]);
+ }
+ 
+-static const int32_t kMinInt24 = -1<<23;
++static const int32_t kMinInt24 = ~0u<<23;
+ static const int32_t kMaxInt24 = (1<<23) - 1;
+ static const uint32_t kMaxUInt24 = (1<<24) - 1;
+ 
+@@ -157,7 +157,7 @@ TEST_F(SignConversionTest, Int32)
+ 	AFframecount framesRead = afReadFrames(file, AF_DEFAULT_TRACK, readData, frameCount);
+ 	ASSERT_EQ(framesRead, frameCount);
+ 	afCloseFile(file);
+-	const uint32_t expectedData[] = { 0, -kMinInt32, kMaxUInt32 };
++	const uint32_t expectedData[] = { 0, -static_cast<uint32_t>(kMinInt32), kMaxUInt32 };
+ 	for (int i=0; i<frameCount; i++)
+ 		EXPECT_EQ(readData[i], expectedData[i]);
+ }