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.
Nick Lewycky via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 17 15:59:33 PST 2015
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.
>
>
>
>
>
> 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
>
>
More information about the cfe-commits
mailing list