From 7d5c45ed9dc2842ce8e65ea26ced0957be36a569 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Thu, 8 Jul 2010 09:42:26 +0000 Subject: [PATCH] Add support for differentiating between attributes ignored when handled and unknown attributes that we discard. Add a diagnostic group for unknown attribute warnings to allow turning these off when we don't care. Also consolidates the tests for this case. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107864 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/DiagnosticGroups.td | 1 + include/clang/Basic/DiagnosticSemaKinds.td | 2 ++ lib/Sema/SemaDeclAttr.cpp | 3 ++- test/Sema/attr-deprecated.c | 4 +--- test/Sema/attr-unknown.c | 4 ++++ 5 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 test/Sema/attr-unknown.c diff --git a/include/clang/Basic/DiagnosticGroups.td b/include/clang/Basic/DiagnosticGroups.td index 566fc9b964..8572c62e4b 100644 --- a/include/clang/Basic/DiagnosticGroups.td +++ b/include/clang/Basic/DiagnosticGroups.td @@ -116,6 +116,7 @@ def Trigraphs : DiagGroup<"trigraphs">; def : DiagGroup<"type-limits">; def Uninitialized : DiagGroup<"uninitialized">; def UnknownPragmas : DiagGroup<"unknown-pragmas">; +def UnknownAttributes : DiagGroup<"unknown-attributes">; def UnusedArgument : DiagGroup<"unused-argument">; def UnusedExceptionParameter : DiagGroup<"unused-exception-parameter">; def UnusedFunction : DiagGroup<"unused-function">; diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 0883eab003..578fe8c724 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -875,6 +875,8 @@ def err_attribute_aligned_not_power_of_two : Error< def warn_redeclaration_without_attribute_prev_attribute_ignored : Warning< "'%0' redeclared without %1 attribute: previous %1 ignored">; def warn_attribute_ignored : Warning<"%0 attribute ignored">; +def warn_unknown_attribute_ignored : Warning< + "unknown attribute %0 ignored">, InGroup; def warn_attribute_precede_definition : Warning< "attribute declaration must precede definition">; def warn_attribute_void_function_method : Warning< diff --git a/lib/Sema/SemaDeclAttr.cpp b/lib/Sema/SemaDeclAttr.cpp index b7e275a9d4..3b82f58be4 100644 --- a/lib/Sema/SemaDeclAttr.cpp +++ b/lib/Sema/SemaDeclAttr.cpp @@ -2069,7 +2069,8 @@ static void ProcessDeclAttribute(Scope *scope, Decl *D, // Ask target about the attribute. const TargetAttributesSema &TargetAttrs = S.getTargetAttributesSema(); if (!TargetAttrs.ProcessDeclAttribute(scope, D, Attr, S)) - S.Diag(Attr.getLoc(), diag::warn_attribute_ignored) << Attr.getName(); + S.Diag(Attr.getLoc(), diag::warn_unknown_attribute_ignored) + << Attr.getName(); break; } } diff --git a/test/Sema/attr-deprecated.c b/test/Sema/attr-deprecated.c index e723255c0c..e7c997f3ee 100644 --- a/test/Sema/attr-deprecated.c +++ b/test/Sema/attr-deprecated.c @@ -4,8 +4,6 @@ int f() __attribute__((deprecated)); void g() __attribute__((deprecated)); void g(); -void z() __attribute__((bogusattr)); // expected-warning {{'bogusattr' attribute ignored}} - extern int var __attribute__((deprecated)); int a() { @@ -45,7 +43,7 @@ typedef struct foo foo_dep __attribute__((deprecated)); foo_dep *test2; // expected-warning {{'foo_dep' is deprecated}} struct bar_dep __attribute__((deprecated, - invalid_attribute)); // expected-warning {{'invalid_attribute' attribute ignored}} + invalid_attribute)); // expected-warning {{unknown attribute 'invalid_attribute' ignored}} struct bar_dep *test3; // expected-warning {{'bar_dep' is deprecated}} diff --git a/test/Sema/attr-unknown.c b/test/Sema/attr-unknown.c new file mode 100644 index 0000000000..bec2e29585 --- /dev/null +++ b/test/Sema/attr-unknown.c @@ -0,0 +1,4 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wunknown-attributes %s + +int x __attribute__((foobar)); // expected-warning {{unknown attribute 'foobar' ignored}} +void z() __attribute__((bogusattr)); // expected-warning {{unknown attribute 'bogusattr' ignored}} -- 2.40.0