[PATCH] D16171: Warning on redeclaring with a conflicting asm label

Nick Lewycky via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 14 03:34:24 PST 2016


Weiming Zhao wrote:
> weimingz created this revision.
> weimingz added a reviewer: nicholas.
> weimingz added a subscriber: cfe-commits.
>
> r255371 errors on redeclaring with a conflicting asm label.
> This patch changes errors to warnings to prevent breaking existing codes.

Can you include a testcase where the warning is issued but clang and gcc 
emit the same .o file?

>
> http://reviews.llvm.org/D16171
>
> Files:
>    include/clang/Basic/DiagnosticSemaKinds.td
>    lib/Sema/SemaDecl.cpp
>    test/Sema/asm-label.c
>
> Index: test/Sema/asm-label.c
> ===================================================================
> --- test/Sema/asm-label.c
> +++ test/Sema/asm-label.c
> @@ -7,21 +7,21 @@
>   void f() {
>     g();
>   }
> -void g() __asm__("gold");  // expected-error{{cannot apply asm label to function after its first use}}
> +void g() __asm__("gold");  // expected-warning{{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}}
> +void h() __asm__("hair");  // expected-warning{{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 y __asm__("yacht");  // expected-warning{{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}}
> +int z __asm__("zooms");  // expected-warning{{conflicting asm label}}
>
>
>   // No diagnostics on the following.
> Index: lib/Sema/SemaDecl.cpp
> ===================================================================
> --- lib/Sema/SemaDecl.cpp
> +++ lib/Sema/SemaDecl.cpp
> @@ -2385,13 +2385,13 @@
>       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(New->getLocation(), diag::warn_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)
> +      Diag(New->getLocation(), diag::warn_late_asm_label_name)
>           <<  isa<FunctionDecl>(Old)<<  New->getAttr<AsmLabelAttr>()->getRange();
>       }
>     }
> Index: include/clang/Basic/DiagnosticSemaKinds.td
> ===================================================================
> --- include/clang/Basic/DiagnosticSemaKinds.td
> +++ include/clang/Basic/DiagnosticSemaKinds.td
> @@ -4266,9 +4266,11 @@
>   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 warn_late_asm_label_name : Warning<
> +  "cannot apply asm label to %select{variable|function}0 after its first use">,
> +  InGroup<MismatchedTags>;
> +def warn_different_asm_label : Warning<"conflicting asm label">,
> +  InGroup<MismatchedTags>;
>   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">;
>
>



More information about the cfe-commits mailing list