Skip to contentSkip to conversation

__attribute__((force)) should not be a storage class

DISCUSSION Josh Triplett 2 participants 4 messages Feb 1, 2014 – Feb 27, 2014 Sparse checker

lore
Share & tools
lore
#0 lore raw

Commit 3829c4d8b097776e6b3472290a9fae08a705ab7a ("Don't mix storage class bits with ctype->modifiers while parsing type") in 2009 separated storage classes from modifiers; in the process, it changed __attribute__((force)) from a modifier to a storage class. I don't think it makes sense to have force as a storage class, for one critical
reason: storage classes are mutually exclusive.

$ cat /tmp/test.c
static __attribute__((force)) int *p;
static int q = *p;
$ ./sparse /tmp/test.c
/tmp/test.c:1:28: error: multiple storage classes

Given this, I think force should become a modifier again. Any objections?

- Josh Triplett

maintainer
#1 lore raw
Quoted 6 lines · Josh Triplett

Commit 3829c4d8b097776e6b3472290a9fae08a705ab7a ("Don't mix storage class bits with ctype->modifiers while parsing type") in 2009 separated storage classes from modifiers; in the process, it changed __attribute__((force)) from a modifier to a storage class. I don't think it makes sense to have force as a storage class, for one critical
reason: storage classes are mutually exclusive.

I am not convinced yet.

The current usage case for attribute "force" is to silence the type mismatch during the type conversion. For variable declaration, there is not need to silence any mismatch because there is no type conversion.

What you are purposing here is a new usage case. Do you want to silence every single type mismatch in every assignment to that variable? How about assignment from that variable?

That seems a lot of complexity to keep track of the attribute belong to which level of the type tree.

Quoted 4 lines
$ cat /tmp/test.c
static __attribute__((force)) int *p;
static int q = *p;

In this example, the attribute "force" is not needed. I think it compiles fine without forcing it. The "force" don't actually do any thing. So why do we want to support this?

I want to justify the extra complexity it add to the code base.

Chris

#2 lore raw
Quoted 10 lines · Christopher Li
Quoted 6 lines · Josh Triplett

Commit 3829c4d8b097776e6b3472290a9fae08a705ab7a ("Don't mix storage class bits with ctype->modifiers while parsing type") in 2009 separated storage classes from modifiers; in the process, it changed __attribute__((force)) from a modifier to a storage class. I don't think it makes sense to have force as a storage class, for one critical
reason: storage classes are mutually exclusive.

I am not convinced yet.

Quoted 7 lines

The current usage case for attribute "force" is to silence the type mismatch during the type conversion. For variable declaration, there is not need to silence any mismatch because there is no type conversion.

What you are purposing here is a new usage case. Do you want to silence every single type mismatch in every assignment to that variable? How about assignment from that variable?

I'd suggest that either it should have exactly the same behavior as it does when applied to the type of a function argument (suppressing Sparse-specific pointer qualifier mismatches on input), or it should be prohibited entirely on standalone variable declarations. I'd be fine with the latter, if you prefer.

Quoted 7 lines
Quoted 3 lines
$ cat /tmp/test.c
static __attribute__((force)) int *p;
static int q = *p;

In this example, the attribute "force" is not needed. I think it compiles fine without forcing it. The "force" don't actually do any thing. So why do we want to support this?

This particular case was simply an unrelated test case which happened to trigger the error about having multiple storage classes. The original test case came from http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59850#c3
; I noticed the use of -Wno-decl, presumably to suppress the warnings about the two variables not being static, so I marked them as static and got the error that motivated this thread.

- Josh Triplett

maintainer
#3 lore raw
Quoted 5 lines · Josh Triplett

I'd suggest that either it should have exactly the same behavior as it does when applied to the type of a function argument (suppressing Sparse-specific pointer qualifier mismatches on input), or it should be prohibited entirely on standalone variable declarations. I'd be fine with the latter, if you prefer.

BTW, patch are welcome to make it consistent, hopefully in a not too complicate way.

Chris