From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 48669431FBC for ; Sat, 17 Aug 2013 14:30:07 -0700 (PDT) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id V-WK4gyobssi for ; Sat, 17 Aug 2013 14:30:01 -0700 (PDT) Received: from mail-bk0-f50.google.com (mail-bk0-f50.google.com [209.85.214.50]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (No client certificate requested) by olra.theworths.org (Postfix) with ESMTPS id 83674431FAE for ; Sat, 17 Aug 2013 14:30:01 -0700 (PDT) Received: by mail-bk0-f50.google.com with SMTP id mz11so1046185bkb.9 for ; Sat, 17 Aug 2013 14:30:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=r9H7n3z2BQT3k5X8dNh2XgLVm9MJ5Z0o/K5o96V4TD4=; b=PxwqAj2tgOa2pJlb8xgghJYNr+f2C2BlWP+jhoWUTKjI8fsCp5ump7m6rIE9ILXZUg DQMaKwvC7aIwz+CL2BdYpUjDRIzSMrWx/EQZwf6T6FjeGtkqa5OP5hNEWqg04L4BZE9n F/kaXWtdbQ9z6YMdXPPgPLHHCYar6626fCpXvJOxF4SjWNN7oC2Jz+jumqKTi426ERTe 19yWW7Godjuf4KTi574RW5iwqhh73AIyeZx4Hy7D7f5adKIs+i94G+wMksSKb8+HqU6H ndCaxiO76bgtB9nkH6Oqbqgz/nnGaSgffqp34YPoO+/zQIhuUjyL479IzqiJmii2XzWc MJTQ== X-Gm-Message-State: ALoCoQlKCOGAA9ITryPj3r1mvbsrGcTr4PzT71DxzG3u3dfzUP38cIZt1GaKPes/DTBOTHez2BqM X-Received: by 10.204.188.200 with SMTP id db8mr2663989bkb.12.1376774998912; Sat, 17 Aug 2013 14:29:58 -0700 (PDT) Received: from localhost (dsl-hkibrasgw2-58c36f-91.dhcp.inet.fi. [88.195.111.91]) by mx.google.com with ESMTPSA id m6sm552985bki.7.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Sat, 17 Aug 2013 14:29:58 -0700 (PDT) From: Jani Nikula To: notmuch@notmuchmail.org Subject: [PATCH] lib: fix clang build Date: Sun, 18 Aug 2013 00:30:01 +0300 Message-Id: <1376775001-16528-1-git-send-email-jani@nikula.org> X-Mailer: git-send-email 1.7.10.4 Cc: Simonas Kazlauskas X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 17 Aug 2013 21:30:07 -0000 Long story short, fix build on recent (3.2+) clang. The long story for posterity follows. gcc 4.6 added new warnings about structs with greater visibility than their fields. The warnings were silenced by adjusting visibility in commit d5523ead90b6be2b07d4af745b8ed9b980a6b9f1 Author: Carl Worth Date: Wed May 11 13:23:13 2011 -0700 Mark some structures in the library interface with visibility=default attribute. Later on, commit 3b76adf9e2c026dd03b820f4c6eab50e25444113 Author: Austin Clements Date: Sat Jan 14 19:17:33 2012 -0500 lib: Add support for automatically excluding tags from queries changed visibility of struct _notmuch_string_list for the same reason, and commit 1a53f9f116fa7c460cda3df532be921baaafb082 Author: Mark Walters Date: Thu Mar 1 22:30:38 2012 +0000 lib: Add the exclude flag to notmuch_query_search_threads split the struct _notmuch_string_list and its typedef notmuch_string_list_t as a way to make a forward declaration for _notmuch_thread_create(). The subtle difference was that the struct definition now had 'visible' in it, while the typedef didn't, and it was within the #pragma GCC visibility push(hidden) block. This went unnoticed, as the then common versions of clang didn't care about this. A later change in clang (I did not dig into when this change was introduced) caused the following error: CXX -O2 lib/database.o In file included from lib/database.cc:21: In file included from ./lib/database-private.h:33: ./lib/notmuch-private.h:479:8: error: visibility does not match previous declaration struct visible _notmuch_string_list { ^ ./lib/notmuch-private.h:67:33: note: expanded from macro 'visible' ^ ./lib/notmuch-private.h:52:13: note: previous attribute is here ^ 1 error generated. make: *** [lib/database.o] Error 1 This is slightly misleading due to the reference to the #pragma. The real culprit is the typedef within the #pragma. We could just add 'visible' to the typedef, or move the typedef outside of the #pragma, and be done with it, but juggle the declarations a bit to accommodate moving the typedef back with the struct, and keep the visibility attribute in one place. The problem was originally reported by Simonas Kazlauskas in id:20130418102507.GA23688@godbox but I was only able to reproduce and investigate now that I upgraded clang. --- lib/notmuch-private.h | 28 +++++++++++++--------------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/lib/notmuch-private.h b/lib/notmuch-private.h index eced03e..af185c7 100644 --- a/lib/notmuch-private.h +++ b/lib/notmuch-private.h @@ -162,8 +162,6 @@ typedef enum _notmuch_find_flags { typedef struct _notmuch_doc_id_set notmuch_doc_id_set_t; -typedef struct _notmuch_string_list notmuch_string_list_t; - /* database.cc */ /* Lookup a prefix value by name. @@ -228,17 +226,6 @@ _notmuch_directory_create (notmuch_database_t *notmuch, unsigned int _notmuch_directory_get_document_id (notmuch_directory_t *directory); -/* thread.cc */ - -notmuch_thread_t * -_notmuch_thread_create (void *ctx, - notmuch_database_t *notmuch, - unsigned int seed_doc_id, - notmuch_doc_id_set_t *match_set, - notmuch_string_list_t *excluded_terms, - notmuch_exclude_t omit_exclude, - notmuch_sort_t sort); - /* message.cc */ notmuch_message_t * @@ -476,11 +463,11 @@ typedef struct _notmuch_string_node { struct _notmuch_string_node *next; } notmuch_string_node_t; -struct visible _notmuch_string_list { +typedef struct visible _notmuch_string_list { int length; notmuch_string_node_t *head; notmuch_string_node_t **tail; -}; +} notmuch_string_list_t; notmuch_string_list_t * _notmuch_string_list_create (const void *ctx); @@ -509,6 +496,17 @@ notmuch_filenames_t * _notmuch_filenames_create (const void *ctx, notmuch_string_list_t *list); +/* thread.cc */ + +notmuch_thread_t * +_notmuch_thread_create (void *ctx, + notmuch_database_t *notmuch, + unsigned int seed_doc_id, + notmuch_doc_id_set_t *match_set, + notmuch_string_list_t *excluded_terms, + notmuch_exclude_t omit_exclude, + notmuch_sort_t sort); + NOTMUCH_END_DECLS #ifdef __cplusplus -- 1.7.10.4