r255371 - Error on redeclaring with a conflicting asm label and on redeclaring with an asm label after the first ODR-use. Detects problems like the one in PR22830 where gcc and clang both compiled the file but with different behaviour.
Kostya Serebryany via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 4 13:40:27 PST 2016
On Thu, Dec 17, 2015 at 5:03 PM, Richard Smith <richard at metafoo.co.uk>
wrote:
> On Thu, Dec 17, 2015 at 3:59 PM, Nick Lewycky via cfe-commits <
> cfe-commits at lists.llvm.org> wrote:
>
>> On 12/17/2015 10:47 AM, Kostya Serebryany wrote:
>>
>>> I am now observing this error message when building glibc with clang
>>> (from trunk):
>>> ../include/string.h:101:28: error: cannot apply asm label to function
>>> after its first use
>>> libc_hidden_builtin_proto (memcpy)
>>> (many more instances)
>>>
>>>
>>> Do you think this is a bug in glibc code, or the error message could be
>>> more relaxed?
>>>
>>
>> Could you email me a .i copy of a failing build? That will help me decide
>> whether it's a bug in the error or in glibc.
>
>
[sorry for delay,]
here is the preprocessed source file from glibc:
% clang ~/tmp/a.i 2>&1 | grep error:
../include/sys/stat.h:16:28: error: cannot apply asm label to function
after its first use
../include/sys/stat.h:17:30: error: cannot apply asm label to function
after its first use
../include/sys/stat.h:18:28: error: cannot apply asm label to function
after its first use
../include/sys/stat.h:19:30: error: cannot apply asm label to function
after its first use
...
>
> Also PR22830 comment 1 seems relevant here.
>
Probably, but since this is a very recent regression in clang I thought I
should report it.
--kcc
>
>
>> On Fri, Dec 11, 2015 at 1:28 PM, Nick Lewycky via cfe-commits
>>> <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
>>>
>>> Author: nicholas
>>> Date: Fri Dec 11 15:28:55 2015
>>> New Revision: 255371
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=255371&view=rev
>>> Log:
>>> Error on redeclaring with a conflicting asm label and on redeclaring
>>> with an asm label after the first ODR-use. Detects problems like the
>>> one in PR22830 where gcc and clang both compiled the file but with
>>> different behaviour.
>>>
>>> Added:
>>> cfe/trunk/test/Sema/asm-label.c
>>> Modified:
>>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>> cfe/trunk/lib/Sema/SemaDecl.cpp
>>>
>>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>>> URL:
>>>
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=255371&r1=255370&r2=255371&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Fri Dec 11
>>> 15:28:55 2015
>>> @@ -4259,6 +4259,9 @@ def err_tag_definition_of_typedef : Erro
>>> def err_conflicting_types : Error<"conflicting types for %0">;
>>> def err_different_pass_object_size_params : Error<
>>> "conflicting pass_object_size attributes on parameters">;
>>> +def err_late_asm_label_name : Error<
>>> + "cannot apply asm label to %select{variable|function}0 after its
>>> first use">;
>>> +def err_different_asm_label : Error<"conflicting asm label">;
>>> def err_nested_redefinition : Error<"nested redefinition of %0">;
>>> def err_use_with_wrong_tag : Error<
>>> "use of %0 with tag type that does not match previous
>>> declaration">;
>>>
>>> Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
>>> URL:
>>>
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=255371&r1=255370&r2=255371&view=diff
>>>
>>> ==============================================================================
>>> --- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
>>> +++ cfe/trunk/lib/Sema/SemaDecl.cpp Fri Dec 11 15:28:55 2015
>>> @@ -2379,9 +2379,24 @@ void Sema::mergeDeclAttributes(NamedDecl
>>> if (!Old->hasAttrs() && !New->hasAttrs())
>>> return;
>>>
>>> - // attributes declared post-definition are currently ignored
>>> + // Attributes declared post-definition are currently ignored.
>>> checkNewAttributesAfterDef(*this, New, Old);
>>>
>>> + if (AsmLabelAttr *NewA = New->getAttr<AsmLabelAttr>()) {
>>> + if (AsmLabelAttr *OldA = Old->getAttr<AsmLabelAttr>()) {
>>> + if (OldA->getLabel() != NewA->getLabel()) {
>>> + // This redeclaration changes __asm__ label.
>>> + Diag(New->getLocation(), diag::err_different_asm_label);
>>> + Diag(OldA->getLocation(), diag::note_previous_declaration);
>>> + }
>>> + } else if (Old->isUsed()) {
>>> + // This redeclaration adds an __asm__ label to a declaration
>>> that has
>>> + // already been ODR-used.
>>> + Diag(New->getLocation(), diag::err_late_asm_label_name)
>>> + << isa<FunctionDecl>(Old) <<
>>> New->getAttr<AsmLabelAttr>()->getRange();
>>> + }
>>> + }
>>> +
>>> if (!Old->hasAttrs())
>>> return;
>>>
>>>
>>> Added: cfe/trunk/test/Sema/asm-label.c
>>> URL:
>>>
>>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/asm-label.c?rev=255371&view=auto
>>>
>>> ==============================================================================
>>> --- cfe/trunk/test/Sema/asm-label.c (added)
>>> +++ cfe/trunk/test/Sema/asm-label.c Fri Dec 11 15:28:55 2015
>>> @@ -0,0 +1,30 @@
>>> +// RUN: %clang_cc1 -verify %s
>>> +
>>> +void f();
>>> +void f() __asm__("fish");
>>> +void g();
>>> +
>>> +void f() {
>>> + g();
>>> +}
>>> +void g() __asm__("gold"); // expected-error{{cannot apply asm
>>> label to function after its first use}}
>>> +
>>> +void h() __asm__("hose"); // expected-note{{previous declaration
>>> is here}}
>>> +void h() __asm__("hair"); // expected-error{{conflicting asm
>>> label}}
>>> +
>>> +int x;
>>> +int x __asm__("xenon");
>>> +int y;
>>> +
>>> +int test() { return y; }
>>> +
>>> +int y __asm__("yacht"); // expected-error{{cannot apply asm label
>>> to variable after its first use}}
>>> +
>>> +int z __asm__("zebra"); // expected-note{{previous declaration is
>>> here}}
>>> +int z __asm__("zooms"); // expected-error{{conflicting asm label}}
>>> +
>>> +
>>> +// No diagnostics on the following.
>>> +void __real_readlink() __asm("readlink");
>>> +void readlink() __asm("__protected_readlink");
>>> +void readlink() { __real_readlink(); }
>>>
>>>
>>> _______________________________________________
>>> cfe-commits mailing list
>>> cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>>
>>>
>>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160104/b17bdbe8/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: a.i
Type: application/octet-stream
Size: 217085 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160104/b17bdbe8/attachment-0001.obj>
More information about the cfe-commits
mailing list