aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/uri.c9
-rw-r--r--src/warnings.h23
-rw-r--r--src/writer.c16
3 files changed, 47 insertions, 1 deletions
diff --git a/src/uri.c b/src/uri.c
index b45f7e16..897d0462 100644
--- a/src/uri.c
+++ b/src/uri.c
@@ -3,6 +3,7 @@
#include "string_utils.h"
#include "uri_utils.h"
+#include "warnings.h"
#include "serd/serd.h"
@@ -336,6 +337,8 @@ write_path_tail(SerdSink sink,
const SerdURI* const uri,
const size_t i)
{
+ SERD_DISABLE_NULL_WARNINGS
+
size_t len = 0;
if (i < uri->path_base.len) {
len += sink(uri->path_base.buf + i, uri->path_base.len - i, stream);
@@ -351,6 +354,8 @@ write_path_tail(SerdSink sink,
}
return len;
+
+ SERD_RESTORE_WARNINGS
}
/** Write the path of `uri` relative to the path of `base`. */
@@ -419,6 +424,8 @@ serd_uri_serialise_relative(const SerdURI* const uri,
len = write_rel_path(sink, stream, uri, base);
}
+ SERD_DISABLE_NULL_WARNINGS
+
if (!relative || (!len && base->query.buf)) {
if (uri->scheme.buf) {
len += sink(uri->scheme.buf, uri->scheme.len, stream);
@@ -452,6 +459,8 @@ serd_uri_serialise_relative(const SerdURI* const uri,
len += sink(uri->fragment.buf, uri->fragment.len, stream);
}
+ SERD_RESTORE_WARNINGS
+
return len;
}
diff --git a/src/warnings.h b/src/warnings.h
new file mode 100644
index 00000000..4fdec095
--- /dev/null
+++ b/src/warnings.h
@@ -0,0 +1,23 @@
+// Copyright 2019-2024 David Robillard <d@drobilla.net>
+// SPDX-License-Identifier: ISC
+
+#ifndef SERD_SRC_WARNINGS_H
+#define SERD_SRC_WARNINGS_H
+
+#if defined(__clang__)
+
+/// Clang 15 null checking regressed, so we need to suppress it sometimes
+# define SERD_DISABLE_NULL_WARNINGS \
+ _Pragma("clang diagnostic push") \
+ _Pragma("clang diagnostic ignored \"-Wnullable-to-nonnull-conversion\"")
+
+# define SERD_RESTORE_WARNINGS _Pragma("clang diagnostic pop")
+
+#else
+
+# define SERD_DISABLE_NULL_WARNINGS
+# define SERD_RESTORE_WARNINGS
+
+#endif
+
+#endif // SERD_SRC_WARNINGS_H
diff --git a/src/writer.c b/src/writer.c
index 2a6d7c31..bdcb8e8e 100644
--- a/src/writer.c
+++ b/src/writer.c
@@ -8,6 +8,7 @@
#include "string_utils.h"
#include "try.h"
#include "uri_utils.h"
+#include "warnings.h"
#include "serd/serd.h"
@@ -762,7 +763,9 @@ write_uri_node(SerdWriter* const writer,
SerdURI uri;
SerdURI abs_uri;
serd_env_get_base_uri(writer->env, &in_base_uri);
+ SERD_DISABLE_NULL_WARNINGS
serd_uri_parse(node->buf, &uri);
+ SERD_RESTORE_WARNINGS
serd_uri_resolve(&uri, &in_base_uri, &abs_uri);
bool rooted = uri_is_under(&writer->base_uri, &writer->root_uri);
SerdURI* root = rooted ? &writer->root_uri : &writer->base_uri;
@@ -976,6 +979,8 @@ serd_writer_write_statement(SerdWriter* writer,
return SERD_SUCCESS;
}
+ SERD_DISABLE_NULL_WARNINGS
+
// Separate graphs if necessary
if ((graph && !serd_node_equals(graph, &writer->context.graph)) ||
(!graph && writer->context.graph.type)) {
@@ -989,6 +994,8 @@ serd_writer_write_statement(SerdWriter* writer,
}
}
+ SERD_RESTORE_WARNINGS
+
if ((flags & SERD_LIST_CONT)) {
// Continue a list
if (!strcmp((const char*)predicate->buf, NS_RDF "first") &&
@@ -1106,11 +1113,14 @@ serd_writer_end_anon(SerdWriter* writer, const SerdNode* node)
TRY(st, write_sep(writer, SEP_ANON_END));
pop_context(writer);
- if (serd_node_equals(node, &writer->context.subject)) {
+ SERD_DISABLE_NULL_WARNINGS
+
+ if (node && serd_node_equals(node, &writer->context.subject)) {
// Now-finished anonymous node is the new subject with no other context
writer->context.predicate.type = SERD_NOTHING;
}
+ SERD_RESTORE_WARNINGS
return st;
}
@@ -1201,7 +1211,9 @@ serd_writer_set_root_uri(SerdWriter* writer, const SerdNode* uri)
if (uri && uri->buf) {
writer->root_node = serd_node_copy(uri);
+ SERD_DISABLE_NULL_WARNINGS
serd_uri_parse(uri->buf, &writer->root_uri);
+ SERD_RESTORE_WARNINGS
} else {
writer->root_node = SERD_NODE_NULL;
writer->root_uri = SERD_URI_NULL;
@@ -1240,7 +1252,9 @@ serd_writer_free(SerdWriter* writer)
return;
}
+ SERD_DISABLE_NULL_WARNINGS
serd_writer_finish(writer);
+ SERD_RESTORE_WARNINGS
free_context(&writer->context);
free_anon_stack(writer);
serd_stack_free(&writer->anon_stack);