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? On Fri, Dec 11, 2015 at 1:28 PM, Nick Lewycky via cfe-commits < 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 > 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