[cfe-dev] Attribute parsing at end of translation unit?
Richard Smith
richard at metafoo.co.uk
Tue Dec 11 14:54:04 PST 2012
On Tue, Dec 11, 2012 at 2:52 PM, Delesley Hutchins <delesley at google.com> wrote:
> But out-of-line declarations are not standard C++, so you wouldn't be
> able to compile that code with any other compiler, right?
Right, you'd need to remove those declarations in other build
configurations. GCC accepts them with -fpermissive, FWIW.
> On Tue, Dec 11, 2012 at 2:44 PM, Richard Smith <richard at metafoo.co.uk> wrote:
>> On Mon, Dec 10, 2012 at 3:07 PM, Delesley Hutchins <delesley at google.com> wrote:
>>> I am considering changing the way in which thread safety attributes
>>> are parsed, but I wanted to get some feedback.
>>>
>>> Thread safety analysis currently parses attributes at the end of the
>>> class where they occur, just like method bodies. However, this
>>> strategy can lead to situations where there is no valid way to
>>> annotate a piece of code. Here's a toy example:
>>>
>>>
>>> class Graph;
>>>
>>> class Node {
>>> public:
>>> // error: Graph has incomplete type.
>>> void reachable(Graph* g, int nodeID) SHARED_LOCKS_REQUIRED(g->mu_);
>>>
>>> private:
>>> // error: Graph has incomplete type.
>>> std::vector<int> edges_ GUARDED_BY(&Graph::mu_);
>>> };
>>>
>>>
>>> class Graph {
>>> friend class Node;
>>>
>>> Mutex mu_;
>>> std::vector<Node> nodes_ GUARDED_BY(mu_);
>>> };
>>>
>>>
>>> There's a circular dependency here between Graph and Node. You could
>>> try to resolve the dependency by refactoring, but the usual ways of
>>> breaking dependencies in C++ don't work with attributes. The body of
>>> a method can be defined outside of its class, but the attribute can't;
>>> there's no way to redeclare a method (or a data member) with a new
>>> attribute.
>>
>> We could allow out-of-line declarations for members if they contain
>> any thread-safety attributes.
>
>
>
> --
> DeLesley Hutchins | Software Engineer | delesley at google.com | 505-206-0315
More information about the cfe-dev
mailing list