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@lists.llvm.org <mailto:cfe-commits@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@lists.llvm.org <mailto:cfe-commits@lists.llvm.org>
    http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to