2012-05-16 1 views
6

Oggi ho provato clang su un progetto che ho sviluppato qualche tempo fa. Sono rimasto sorpreso quando ha riscontrato un errore di compilazione, dal momento che avevo compilato il mio progetto usando con successo g ++.Parentesi squilibrata usando __attribute__ in g ++

Questo breve frammento riproduce la linea dove è stato rilevato l'errore:

int main() { 
    __attribute__((aligned(16)) char arr[5]; 
} 

che produce questo errore:

test.cpp:2:32: error: expected ')' 
    __attribute__((aligned(16)) char arr[5]; 
          ^
           ) 

Come si può vedere, c'è una parentesi umbalanced. Ci sono tre '(' 'e due') '. Questo sembra chiaramente che dovrebbe effettivamente produrre un errore di compilazione.

È un utilizzo valido di questa parola chiave? Non riesco a trovare nulla su the documentation che indica che lo è.

Sto usando g ++ 4.5.2 e clang 2.8.

Si noti che questo errore viene rilevato quando si utilizza gcc anziché g ++.

+0

La [documentazione gcc] (http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html) afferma * "La parola chiave __attributo__' consente di specificare attributi speciali di variabili o campi struttura. * * Questa parola chiave è seguita da una specifica di attributo all'interno di doppie parentesi "***. Quindi non lo dice in parole esplicite precise sulla chiusura con lo stesso numero di parentesi, ma tutti gli esempi di gcc mostrano parentesi corrispondente, quindi sembra un bug. –

+0

Sì, sembra che sia effettivamente un bug. Non riesco a trovare nulla che possa indicare il contrario. – mfontanini

+0

@ DavidRodríguez-dribeas clang lo supporta. Voglio dire, sembra davvero che g ++ non stia analizzando correttamente l'espressione. Clang sta facendo la cosa giusta (almeno io sospetto di sì ... ecco perché sto chiedendo: D) quando si segnala un errore qui. – mfontanini

risposta

3

Questo sarebbe un bug del compilatore. Il compilatore vede __attribute__ seguito da due parentesi di apertura, altri token e due parentesi di chiusura, che è probabilmente la definizione “ ” di ciò che dovrebbe essere un __attribute__, ad es.

<attribute> ::= __attribute__ '((' something '))'

La mia ipotesi è che i token in mezzo vengono interpretati come aligned(16 e per qualche miracolo funziona ancora.

+0

Perfetto. Ho appena segnalato questo bug come bug su gcc's bugzilla. – mfontanini

+0

Sì, probabilmente ha 'allineato()' più che con '__attribute__', poiché' __attribute __ ((packed) 'non viene compilato. – mfontanini

+2

Potrebbe non essere un bug, ai miei occhi è perché le parentesi sbilanciate non sono quasi mai quello che vuoi, ma se GCC consente a qualsiasi tipo di token di apparire all'interno di '((' e '))' allora potrebbe non essere considerato un bug. Prova '__attribute __ ((((((())' e vedi se questo si lamenta di un attributo sconosciuto piuttosto che parentesi non bilanciate – dreamlax