This revision was landed with ongoing or failed builds. This revision was automatically updated to reflect the committed changes. Closed by commit rGf9c2f821d71b: [Clang] Fix unknown type attributes diagnosed twice with [[]] spelling (authored by junaire).
Changed prior to commit: https://reviews.llvm.org/D123447?vs=422096&id=422205#toc Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D123447/new/ https://reviews.llvm.org/D123447 Files: clang/docs/ReleaseNotes.rst clang/include/clang/Parse/Parser.h clang/lib/Parse/ParseDecl.cpp clang/lib/Parse/Parser.cpp clang/test/SemaCXX/warn-once-on-unknown-attr.cpp
Index: clang/test/SemaCXX/warn-once-on-unknown-attr.cpp =================================================================== --- /dev/null +++ clang/test/SemaCXX/warn-once-on-unknown-attr.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c++11 +// RUN: %clang_cc1 -fsyntax-only -verify -std=c2x -x c %s +void foo() { + int [[attr]] i; // expected-warning {{unknown attribute 'attr' ignored}} + (void)sizeof(int [[attr]]); // expected-warning {{unknown attribute 'attr' ignored}} +} + +void bar() { + [[attr]]; // expected-warning {{unknown attribute 'attr' ignored}} + [[attr]] int i; // expected-warning {{unknown attribute 'attr' ignored}} +} Index: clang/lib/Parse/Parser.cpp =================================================================== --- clang/lib/Parse/Parser.cpp +++ clang/lib/Parse/Parser.cpp @@ -2386,7 +2386,9 @@ // We don't support any module attributes yet; just parse them and diagnose. ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); - ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_module_attr); + ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_module_attr, + /*DiagnoseEmptyAttrs=*/false, + /*WarnOnUnknownAttrs=*/true); ExpectAndConsumeSemi(diag::err_module_expected_semi); @@ -2453,7 +2455,9 @@ ParsedAttributes Attrs(AttrFactory); MaybeParseCXX11Attributes(Attrs); // We don't support any module import attributes yet. - ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_import_attr); + ProhibitCXX11Attributes(Attrs, diag::err_attribute_not_import_attr, + /*DiagnoseEmptyAttrs=*/false, + /*WarnOnUnknownAttrs=*/true); if (PP.hadModuleLoaderFatalFailure()) { // With a fatal failure in the module loader, we abort parsing. Index: clang/lib/Parse/ParseDecl.cpp =================================================================== --- clang/lib/Parse/ParseDecl.cpp +++ clang/lib/Parse/ParseDecl.cpp @@ -1658,7 +1658,8 @@ } void Parser::ProhibitCXX11Attributes(ParsedAttributes &Attrs, unsigned DiagID, - bool DiagnoseEmptyAttrs) { + bool DiagnoseEmptyAttrs, + bool WarnOnUnknownAttrs) { if (DiagnoseEmptyAttrs && Attrs.empty() && Attrs.Range.isValid()) { // An attribute list has been parsed, but it was empty. @@ -1685,10 +1686,11 @@ for (const ParsedAttr &AL : Attrs) { if (!AL.isCXX11Attribute() && !AL.isC2xAttribute()) continue; - if (AL.getKind() == ParsedAttr::UnknownAttribute) - Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored) - << AL << AL.getRange(); - else { + if (AL.getKind() == ParsedAttr::UnknownAttribute) { + if (WarnOnUnknownAttrs) + Diag(AL.getLoc(), diag::warn_unknown_attribute_ignored) + << AL << AL.getRange(); + } else { Diag(AL.getLoc(), DiagID) << AL; AL.setInvalid(); } Index: clang/include/clang/Parse/Parser.h =================================================================== --- clang/include/clang/Parse/Parser.h +++ clang/include/clang/Parse/Parser.h @@ -2633,8 +2633,12 @@ // Forbid C++11 and C2x attributes that appear on certain syntactic locations // which standard permits but we don't supported yet, for example, attributes // appertain to decl specifiers. + // For the most cases we don't want to warn on unknown type attributes, but + // left them to later diagnoses. However, for a few cases like module + // declarations and module import declarations, we should do it. void ProhibitCXX11Attributes(ParsedAttributes &Attrs, unsigned DiagID, - bool DiagnoseEmptyAttrs = false); + bool DiagnoseEmptyAttrs = false, + bool WarnOnUnknownAttrs = false); /// Skip C++11 and C2x attributes and return the end location of the /// last one. Index: clang/docs/ReleaseNotes.rst =================================================================== --- clang/docs/ReleaseNotes.rst +++ clang/docs/ReleaseNotes.rst @@ -117,6 +117,8 @@ `C++20 [dcl.fct.def.general]p2 <https://timsong-cpp.github.io/cppwp/n4868/dcl.fct.def#general-2.sentence-3>`_, Clang should not diagnose incomplete types in function definitions if the function body is "= delete;". This fixes Issue `Issue 52802 <https://github.com/llvm/llvm-project/issues/52802>`_. +- Unknown type attributes with a ``[[]]`` spelling are no longer diagnosed twice. + This fixes Issue `Issue 54817 <https://github.com/llvm/llvm-project/issues/54817>`_. Improvements to Clang's diagnostics ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits