Re: [PATCH] D13079: [clang-tidy] Code factorization and cleanup in IdentifierNamingCheck
berenm updated this revision to Diff 35818. berenm added a comment. Added comments and reformated NamingCheckIdentifer.h with clang-format. http://reviews.llvm.org/D13079 Files: clang-tidy/readability/IdentifierNamingCheck.cpp clang-tidy/readability/IdentifierNamingCheck.h test/clang-tidy/readability-identifier-naming.cpp Index: test/clang-tidy/readability-identifier-naming.cpp === --- test/clang-tidy/readability-identifier-naming.cpp +++ test/clang-tidy/readability-identifier-naming.cpp @@ -68,6 +68,8 @@ // FIXME: name, declaration contexts, forward declarations, etc, are correctly // FIXME: checked and renamed +// clang-format off + namespace FOO_NS { // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for namespace 'FOO_NS' [readability-identifier-naming] // CHECK-FIXES: {{^}}namespace foo_ns {{{$}} Index: clang-tidy/readability/IdentifierNamingCheck.h === --- clang-tidy/readability/IdentifierNamingCheck.h +++ clang-tidy/readability/IdentifierNamingCheck.h @@ -62,20 +62,32 @@ } }; -private: - std::vector NamingStyles; - bool IgnoreFailedSplit; - + /// \brief Holds an identifier name check failure, tracking the kind of the + /// identifer, its possible fixup and the starting locations of all the + /// idenfiier usages. struct NamingCheckFailure { std::string KindName; std::string Fixup; + +/// \brief Whether the failure should be fixed or not. +/// +/// ie: if the identifier was used or declared within a macro we won't offer +/// a fixup for safety reasons. bool ShouldFix; -std::vector Usages; + +/// \brief A set of all the identifier usages starting SourceLocation, in +/// their encoded form. +llvm::DenseSet RawUsageLocs; NamingCheckFailure() : ShouldFix(true) {} }; + typedef llvm::DenseMap + NamingCheckFailureMap; - llvm::DenseMap NamingCheckFailures; +private: + std::vector NamingStyles; + bool IgnoreFailedSplit; + NamingCheckFailureMap NamingCheckFailures; }; } // namespace readability Index: clang-tidy/readability/IdentifierNamingCheck.cpp === --- clang-tidy/readability/IdentifierNamingCheck.cpp +++ clang-tidy/readability/IdentifierNamingCheck.cpp @@ -21,6 +21,7 @@ namespace tidy { namespace readability { +// clang-format off #define NAMING_KEYS(m) \ m(Namespace) \ m(InlineNamespace) \ @@ -80,6 +81,7 @@ }; #undef NAMING_KEYS +// clang-format on IdentifierNamingCheck::IdentifierNamingCheck(StringRef Name, ClangTidyContext *Context) @@ -134,10 +136,10 @@ } void IdentifierNamingCheck::registerMatchers(MatchFinder *Finder) { -// FIXME: For now, only Decl and DeclRefExpr nodes are visited for checking and -// replacement. There is a lot of missing cases, such as references to a class -// name (as in 'const int CMyClass::kClassConstant = 4;'), to an enclosing -// context (namespace, class, etc). + // FIXME: For now, only Decl and DeclRefExpr nodes are visited for checking + // and replacement. There is a lot of missing cases, such as references to a + // class name (as in 'const int CMyClass::kClassConstant = 4;'), to an + // enclosing context (namespace, class, etc). Finder->addMatcher(namedDecl().bind("decl"), this); Finder->addMatcher(declRefExpr().bind("declref"), this); @@ -499,23 +501,24 @@ return SK_Invalid; } +static void addUsage(IdentifierNamingCheck::NamingCheckFailureMap &Failures, + const NamedDecl *Decl, SourceRange Range, + const SourceManager *SM) { + auto &Failure = Failures[Decl]; + if (!Failure.RawUsageLocs.insert(Range.getBegin().getRawEncoding()).second) +return; + + Failure.ShouldFix = Failure.ShouldFix && SM->isInMainFile(Range.getBegin()) && + SM->isInMainFile(Range.getEnd()) && + !Range.getBegin().isMacroID() && + !Range.getEnd().isMacroID(); +} + void IdentifierNamingCheck::check(const MatchFinder::MatchResult &Result) { if (const auto *DeclRef = Result.Nodes.getNodeAs("declref")) { -auto It = NamingCheckFailures.find(DeclRef->getDecl()); -if (It == NamingCheckFailures.end()) - return; - -NamingCheckFailure &Failure = It->second; SourceRange Range = DeclRef->getNameInfo().getSourceRange(); - -Failure.Usages.push_back(Range); -Failure.ShouldFix = Failure.ShouldFix && -Result.SourceManager->isInMainFile(Range.getBegin()) && -Result.SourceManager->isInMainFile(Range.getEnd()) && -!Range.getBegin().isMacroID() && -!Range.getEnd().isMacroID(); - -return; +return addUsage(NamingCheckFailures, DeclRef->getDecl(), Range, +Result.S
Re: [PATCH] D13079: [clang-tidy] Code factorization and cleanup in IdentifierNamingCheck
berenm marked 3 inline comments as done. berenm added a comment. In http://reviews.llvm.org/D13079#253512, @alexfh wrote: > Please tell me, if you need me to commit the patch for you after you address > the comments. Yes please, I cannot commit it myself. http://reviews.llvm.org/D13079 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D13081: [clang-tidy] Implement FixitHints for identifier references in IdentifierNamingCheck
berenm updated this revision to Diff 35819. berenm added a comment. Reworked the patches a little bit, addressing the comments and adding better handling of checks in header files with corresponding unit test cases. http://reviews.llvm.org/D13081 Files: clang-tidy/readability/IdentifierNamingCheck.cpp test/clang-tidy/Inputs/readability-identifier-naming/system/system-header.h test/clang-tidy/Inputs/readability-identifier-naming/user-header.h test/clang-tidy/readability-identifier-naming.cpp Index: test/clang-tidy/readability-identifier-naming.cpp === --- test/clang-tidy/readability-identifier-naming.cpp +++ test/clang-tidy/readability-identifier-naming.cpp @@ -62,25 +62,44 @@ // RUN: {key: readability-identifier-naming.VirtualMethodCase, value: UPPER_CASE}, \ // RUN: {key: readability-identifier-naming.VirtualMethodPrefix, value: 'v_'}, \ // RUN: {key: readability-identifier-naming.IgnoreFailedSplit, value: 0} \ -// RUN: ]}' -- -std=c++11 -fno-delayed-template-parsing - -// FIXME: There should be more test cases for checking that references to class -// FIXME: name, declaration contexts, forward declarations, etc, are correctly -// FIXME: checked and renamed +// RUN: ]}' -- -std=c++11 -fno-delayed-template-parsing \ +// RUN: -I%S/Inputs/readability-identifier-naming \ +// RUN: -isystem %S/Inputs/readability-identifier-naming/system // clang-format off +#include +#include "user-header.h" +// NO warnings or fixes expected from declarations within header files without +// the -header-filter= option + namespace FOO_NS { // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for namespace 'FOO_NS' [readability-identifier-naming] // CHECK-FIXES: {{^}}namespace foo_ns {{{$}} inline namespace InlineNamespace { // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for inline namespace 'InlineNamespace' // CHECK-FIXES: {{^}}inline namespace inline_namespace {{{$}} +SYSTEM_NS::structure g_s1; +// NO warnings or fixes expected as SYSTEM_NS and structure are declared in a header file + +USER_NS::object g_s2; +// NO warnings or fixes expected as USER_NS and object are declared in a header file + +SYSTEM_MACRO(var1); +// NO warnings or fixes expected as var1 is from macro expansion + +USER_MACRO(var2); +// NO warnings or fixes expected as var2 is declared in a macro expansion + +int global; +#define USE_IN_MACRO(m) auto use_##m = m +USE_IN_MACRO(global); +// NO warnings or fixes expected as global is used in a macro expansion + #define BLA int FOO_bar BLA; -// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for global variable 'FOO_bar' -// NO fix expected as FOO_bar is from macro expansion +// NO warnings or fixes expected as FOO_bar is from macro expansion enum my_enumeration { // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for enum 'my_enumeration' @@ -104,6 +123,9 @@ // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for class 'my_class' // CHECK-FIXES: {{^}}class CMyClass {{{$}} my_class(); +// CHECK-FIXES: {{^}}CMyClass();{{$}} +~my_class(); +// CHECK-FIXES: {{^}}~CMyClass();{{$}} const int MEMBER_one_1 = ConstExpr_variable; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: invalid case style for constant member 'MEMBER_one_1' @@ -137,15 +159,36 @@ const int my_class::classConstant = 4; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for class constant 'classConstant' -// CHECK-FIXES: {{^}}const int my_class::kClassConstant = 4;{{$}} -// FIXME: The fixup should reflect class name fixups as well: -// FIXME: {{^}}const int CMyClass::kClassConstant = 4;{{$}} +// CHECK-FIXES: {{^}}const int CMyClass::kClassConstant = 4;{{$}} int my_class::ClassMember_2 = 5; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for class member 'ClassMember_2' -// CHECK-FIXES: {{^}}int my_class::ClassMember2 = 5;{{$}} -// FIXME: The fixup should reflect class name fixups as well: -// FIXME: {{^}}int CMyClass::ClassMember2 = 5;{{$}} +// CHECK-FIXES: {{^}}int CMyClass::ClassMember2 = 5;{{$}} + +class my_derived_class : public virtual my_class {}; +// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for class 'my_derived_class' +// CHECK-FIXES: {{^}}class CMyDerivedClass : public virtual CMyClass {};{{$}} + +class CMyWellNamedClass {}; +// No warning expected as this class is well named. + +template +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: invalid case style for type template parameter 'T' +// CHECK-FIXES: {{^}}template{{$}} +class my_templated_class : CMyWellNamedClass {}; +// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: invalid case style for class 'my_templated_class' +// CHECK-FIXES: {{^}}class CMyTemplatedClass : CMyWellNamedClass {};{{$}} + +template +// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: invalid case style for type template parameter 'T' +// CHECK-FIXES: {{^}}template{{$}} +class my_other_t
Re: [PATCH] D13081: [clang-tidy] Implement FixitHints for identifier references in IdentifierNamingCheck
berenm marked 3 inline comments as done. Comment at: clang-tidy/readability/IdentifierNamingCheck.cpp:141 @@ +140,3 @@ + Finder->addMatcher(usingDecl().bind("using"), this); + Finder->addMatcher(declRefExpr().bind("declRef"), this); + Finder->addMatcher(cxxConstructorDecl().bind("classRef"), this); I wasn't sure how system headers were handled, and I thought it was a waste of time to check identifiers in them. But as you say it could be useful, I rolled back the change. From what I've seen, clang-tidy will display the warnings from incorrect declaration names in system header files when using the `-system-headers` and `-header-filter=.*` flags, but will not offer fixes for the declaration or usages in user's code. I guess editing system headers isn't going to work fine? For user headers, warnings and fixes are emitted when `-header-filter=.*` is used. Without the flag, no warnings or fixes are emitted, which is expected. http://reviews.llvm.org/D13081 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D13081: [clang-tidy] Implement FixitHints for identifier references in IdentifierNamingCheck
berenm marked an inline comment as done. berenm added a comment. I think the latest version also addresses http://reviews.llvm.org/D13079 in a better way. The check will now let clang-tidy decide whether warnings and fixes are displayed, whether it is in or from system/user header files or in main file, and will only worry about not emitting warnings and fixes if a macro is involved in the declaration or any usage. http://reviews.llvm.org/D13081 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D13081: [clang-tidy] Implement FixitHints for identifier references in IdentifierNamingCheck
berenm marked an inline comment as done. berenm added a comment. http://reviews.llvm.org/D13081 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D13090: [clang-tidy] IdentifierNamingCheck should only emit warnings when declaration or usage is outside of macros
berenm abandoned this revision. berenm added a comment. Actually I believe it's better fixed by http://reviews.llvm.org/D13081. http://reviews.llvm.org/D13090 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: Bug 23529: Add support for gcc's attribute abi_tag (needed for compatibility with gcc 5's libstdc++)
Hi, it seems moderation didn't approve the phabricator mails for D12834. (I have no intention to be subscribed to the list just to get phabricator mails through. For now I am subscribed but disabled mail delivery -.-) So the patch is available at http://reviews.llvm.org/D12834 I also added a test case which shows that substitution is not working correctly right now. regards, Stefan PS: I think contributing to llvm is way to complex. First I attatch patches in the bug tracker, and it takes ages to get a reaction - and them I'm simply told to send to the ML. Then you want me to use phabricator, and then I get no feedback again - because moderation blocked emails from an internal system, and it seems nobody is looking at phabricator directly. This is not something I look forward to go through again; my motiviation to contribute further is rather low. On Sat, 12 Sep 2015 12:36:19 -0700 David Majnemer wrote: > Would you mind sticking abi-tag.patch in phabricator: > http://llvm.org/docs/Phabricator.html ? > Your patch is big enough that it would make it a little easier for me > to review. > > On Sat, Sep 12, 2015 at 7:12 AM, Stefan Bühler via cfe-commits < > cfe-commits@lists.llvm.org> wrote: > > > Hi all, > > > > I've been working on #23529. > > > > The abi tag mangling implemented by gcc is horrible, but I think my > > patch covers most of the incompatibilities with gcc5. > > > > There might be some bugs with substitutions, although I have to > > come up with a test case for that to see what gcc does... > > > > Test cases comparing gcc and patched clang++: > > http://files.stbuehler.de/test-itanium-mangle.html > > (generated with http://files.stbuehler.de/test-itanium-mangle.sh, > > also attached) ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12834: add gcc abi_tag support
stbuehler added a comment. Just for the record: substitution doesn't work yet (it should add available tags from the substitution, but doesn't). This example shows the difference: my patch mangles `T::F()` as `N::Name(N::__test::Result)::T::F[abi:test](N::__test::Result)`, but actually shouldn't emit the abi tag. namespace N { inline namespace __test __attribute__((abi_tag("test"))) { struct Result { const char *str; }; } inline Result Name(Result p1) { struct T { Result F(Result p2) { struct S { Result F(Result p3) { static Result s3 = p3; return s3; } }; static Result s2 = S().F(p2); return s2; } }; static Result s1 = T().F(p1); return s1; } void F() { // instantiate Name() Name(Result()); } } Repository: rL LLVM http://reviews.llvm.org/D12834 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12821: Allow for C's "writing off the end" idiom in __builtin_object_size
mzolotukhin added a comment. FWIW, I'm really interested in seeing this patch in! Thanks, Michael http://reviews.llvm.org/D12821 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12839: Extend MoveConstructorInitCheck to also flag constructor arguments passed by value and can be moved assigned to fields.
flx updated this revision to Diff 35826. flx marked 7 inline comments as done. flx added a comment. I changed the check to also produce a fix that wraps the argument in std::move(). When I modified the test include -isystem %S/Inputs/Headers it broke and only produces warnings but no fixes anymore. Is there a subtle difference in how tests with includes need to be invoked? http://reviews.llvm.org/D12839 Files: clang-tidy/misc/MoveConstructorInitCheck.cpp clang-tidy/misc/MoveConstructorInitCheck.h clang-tidy/modernize/PassByValueCheck.cpp clang-tidy/modernize/ReplaceAutoPtrCheck.cpp clang-tidy/utils/CMakeLists.txt clang-tidy/utils/IncludeSorter.cpp clang-tidy/utils/IncludeSorter.h clang-tidy/utils/Matchers.h clang-tidy/utils/TypeTraits.cpp clang-tidy/utils/TypeTraits.h docs/clang-tidy/checks/misc-move-constructor-init.rst test/clang-tidy/misc-move-constructor-init.cpp Index: test/clang-tidy/misc-move-constructor-init.cpp === --- test/clang-tidy/misc-move-constructor-init.cpp +++ test/clang-tidy/misc-move-constructor-init.cpp @@ -1,4 +1,8 @@ -// RUN: %python %S/check_clang_tidy.py %s misc-move-constructor-init %t +// RUN: %python %S/check_clang_tidy.py %s misc-move-constructor-init %t -- -isystem %S/Inputs/Headers + +#include "j.h" +#include +// CHECK-FIXES: #include template struct remove_reference {typedef T type;}; template struct remove_reference {typedef T type;}; @@ -76,3 +80,66 @@ B Mem; N(N &&RHS) : Mem(move(RHS.Mem)) {} }; + +struct Movable { + Movable(Movable &&) = default; + Movable(const Movable &) = default; + Movable &operator=(const Movable &) = default; + ~Movable() {} +}; + +struct TriviallyCopyable { + TriviallyCopyable() = default; + TriviallyCopyable(TriviallyCopyable &&) = default; + TriviallyCopyable(const TriviallyCopyable &) = default; +}; + +struct Positive { + Positive(Movable M) : M_(M) {} + // CHECK-MESSAGES: [[@LINE-1]]:28: warning: value argument can be moved to avoid copy [misc-move-constructor-init] + // CHECK-FIXES: Positive(Movable M) : M_(std::move(M)) {} + Movable M_; +}; + +struct NegativeMultipleInitializerReferences { + NegativeMultipleInitializerReferences(Movable M) : M_(M), n_(M) {} + Movable M_; + Movable n_; +}; + +struct NegativeReferencedInConstructorBody { + NegativeReferencedInConstructorBody(Movable M) : M_(M) { M_ = M; } + Movable M_; +}; + +struct NegativeParamTriviallyCopyable { + NegativeParamTriviallyCopyable(TriviallyCopyable T) : T_(T) {} + NegativeParamTriviallyCopyable(int I) : I_(I) {} + + TriviallyCopyable T_; + int I_; +}; + +template struct NegativeDependentType { + NegativeDependentType(T Value) : T_(Value) {} + T T_; +}; + +struct NegativeNotPassedByValue { + NegativeNotPassedByValue(const Movable &M) : M_(M) {} + NegativeNotPassedByValue(const Movable M) : M_(M) {} + NegativeNotPassedByValue(Movable &M) : M_(M) {} + NegativeNotPassedByValue(Movable *M) : M_(*M) {} + NegativeNotPassedByValue(const Movable *M) : M_(*M) {} + Movable M_; +}; + +struct Immovable { + Immovable(const Immovable &) = default; + Immovable(Immovable &&) = delete; +}; + +struct NegativeImmovableParameter { + NegativeImmovableParameter(Immovable I) : I_(I) {} + Immovable I_; +}; Index: docs/clang-tidy/checks/misc-move-constructor-init.rst === --- docs/clang-tidy/checks/misc-move-constructor-init.rst +++ docs/clang-tidy/checks/misc-move-constructor-init.rst @@ -5,3 +5,6 @@ The check flags user-defined move constructors that have a ctor-initializer initializing a member or base class through a copy constructor instead of a move constructor. + +It also flags constructor arguments that are passed by value, have a non-deleted +move-constructor and are assigned to a class field by copy construction. Index: clang-tidy/utils/TypeTraits.h === --- clang-tidy/utils/TypeTraits.h +++ clang-tidy/utils/TypeTraits.h @@ -0,0 +1,27 @@ +//===--- TypeTraits.h - clang-tidy---*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===--===// + +#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_TYPETRAITS_H +#define LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_TYPETRAITS_H + +#include "clang/AST/ASTContext.h" +#include "clang/AST/Type.h" + +namespace clang { +namespace tidy { +namespace type_traits { + +// \brief Returns true If \c Type is expensive to copy. +bool isExpensiveToCopy(QualType Type, ASTContext &Context); + +} // type_traits +} // namespace tidy +} // namespace clang + +#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_UTILS_TYPETRAITS_H Index: clang-tidy/utils/TypeTraits.cpp
Re: [PATCH] D12793: Three new security overflow builtins with generic argument types
DavidEGrayson updated this revision to Diff 35825. DavidEGrayson added a comment. I have incorporated John McCall's feedback about variable naming. I was able to remove most of the *QTy variables, but ResultQTy is used in several places and the expression to compute it is pretty long, so I kept it. I would argue that a struct with a width and signedness does in fact define an integer type. It's not a clang type or an LLVM type though. But that's fine, I renamed those variables to be called *Info. Is there a better place to stick getIntegerWidthAndSignedness? It seems like a basic feature like this should be part of clang::Type or something. http://reviews.llvm.org/D12793 Files: docs/LanguageExtensions.rst include/clang/Basic/Builtins.def include/clang/Basic/DiagnosticSemaKinds.td lib/CodeGen/CGBuiltin.cpp lib/Sema/SemaChecking.cpp test/CodeGen/builtins-overflow-error.c test/CodeGen/builtins-overflow.c Index: test/CodeGen/builtins-overflow.c === --- test/CodeGen/builtins-overflow.c +++ test/CodeGen/builtins-overflow.c @@ -11,7 +11,159 @@ extern int IntErrorCode; extern long LongErrorCode; extern long long LongLongErrorCode; +void overflowed(void); +unsigned test_add_overflow_uint_uint_uint(unsigned x, unsigned y) { + // CHECK: @test_add_overflow_uint_uint_uint + // CHECK-NOT: ext + // CHECK: [[S:%.+]] = call { i32, i1 } @llvm.uadd.with.overflow.i32(i32 %{{.+}}, i32 %{{.+}}) + // CHECK-DAG: [[Q:%.+]] = extractvalue { i32, i1 } [[S]], 0 + // CHECK-DAG: [[C:%.+]] = extractvalue { i32, i1 } [[S]], 1 + // CHECK: store i32 [[Q]], i32* %r + // CHECK: br i1 [[C]] + unsigned r; + if (__builtin_add_overflow(x, y, &r)) +overflowed(); + return r; +} + +int test_add_overflow_int_int_int(int x, int y) { + // CHECK: @test_add_overflow_int_int_int + // CHECK-NOT: ext + // CHECK: [[S:%.+]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %{{.+}}, i32 %{{.+}}) + // CHECK-DAG: [[C:%.+]] = extractvalue { i32, i1 } [[S]], 1 + // CHECK-DAG: [[Q:%.+]] = extractvalue { i32, i1 } [[S]], 0 + // CHECK: store i32 [[Q]], i32* %r + // CHECK: br i1 [[C]] + int r; + if (__builtin_add_overflow(x, y, &r)) +overflowed(); + return r; +} + +unsigned test_sub_overflow_uint_uint_uint(unsigned x, unsigned y) { + // CHECK: @test_sub_overflow_uint_uint_uint + // CHECK-NOT: ext + // CHECK: [[S:%.+]] = call { i32, i1 } @llvm.usub.with.overflow.i32(i32 %{{.+}}, i32 %{{.+}}) + // CHECK-DAG: [[Q:%.+]] = extractvalue { i32, i1 } [[S]], 0 + // CHECK-DAG: [[C:%.+]] = extractvalue { i32, i1 } [[S]], 1 + // CHECK: store i32 [[Q]], i32* %r + // CHECK: br i1 [[C]] + unsigned r; + if (__builtin_sub_overflow(x, y, &r)) +overflowed(); + return r; +} + +int test_sub_overflow_int_int_int(int x, int y) { + // CHECK: @test_sub_overflow_int_int_int + // CHECK-NOT: ext + // CHECK: [[S:%.+]] = call { i32, i1 } @llvm.ssub.with.overflow.i32(i32 %{{.+}}, i32 %{{.+}}) + // CHECK-DAG: [[C:%.+]] = extractvalue { i32, i1 } [[S]], 1 + // CHECK-DAG: [[Q:%.+]] = extractvalue { i32, i1 } [[S]], 0 + // CHECK: store i32 [[Q]], i32* %r + // CHECK: br i1 [[C]] + int r; + if (__builtin_sub_overflow(x, y, &r)) +overflowed(); + return r; +} + +unsigned test_mul_overflow_uint_uint_uint(unsigned x, unsigned y) { + // CHECK: @test_mul_overflow_uint_uint_uint + // CHECK-NOT: ext + // CHECK: [[S:%.+]] = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 %{{.+}}, i32 %{{.+}}) + // CHECK-DAG: [[Q:%.+]] = extractvalue { i32, i1 } [[S]], 0 + // CHECK-DAG: [[C:%.+]] = extractvalue { i32, i1 } [[S]], 1 + // CHECK: store i32 [[Q]], i32* %r + // CHECK: br i1 [[C]] + unsigned r; + if (__builtin_mul_overflow(x, y, &r)) +overflowed(); + return r; +} + +int test_mul_overflow_int_int_int(int x, int y) { + // CHECK: @test_mul_overflow_int_int_int + // CHECK-NOT: ext + // CHECK: [[S:%.+]] = call { i32, i1 } @llvm.smul.with.overflow.i32(i32 %{{.+}}, i32 %{{.+}}) + // CHECK-DAG: [[C:%.+]] = extractvalue { i32, i1 } [[S]], 1 + // CHECK-DAG: [[Q:%.+]] = extractvalue { i32, i1 } [[S]], 0 + // CHECK: store i32 [[Q]], i32* %r + // CHECK: br i1 [[C]] + int r; + if (__builtin_mul_overflow(x, y, &r)) +overflowed(); + return r; +} + +int test_add_overflow_uint_int_int(unsigned x, int y) { + // CHECK: @test_add_overflow_uint_int_int + // CHECK: [[XE:%.+]] = zext i32 %{{.+}} to i33 + // CHECK: [[YE:%.+]] = sext i32 %{{.+}} to i33 + // CHECK: [[S:%.+]] = call { i33, i1 } @llvm.sadd.with.overflow.i33(i33 [[XE]], i33 [[YE]]) + // CHECK-DAG: [[Q:%.+]] = extractvalue { i33, i1 } [[S]], 0 + // CHECK-DAG: [[C1:%.+]] = extractvalue { i33, i1 } [[S]], 1 + // CHECK: [[QT:%.+]] = trunc i33 [[Q]] to i32 + // CHECK: [[QTE:%.+]] = sext i32 [[QT]] to i33 + // CHECK: [[C2:%.+]] = icmp ne i33 [[Q]], [[QTE]] + // CHECK: [[C3:%.+]] = or i1 [[C1]], [[C2]] + // CHECK: store i32 [[QT]], i32* %r + // CHECK: br i1 [[C3]] + int r; + if (__builtin_ad
Re: [PATCH] D8899: [CodeGen] Annotate signed shift lefts with NUW
sanjoy resigned from this revision. sanjoy removed a reviewer: sanjoy. sanjoy added a comment. This revision hasn't changed for a while, removing myself from reviewers so that it does not show up in my 'waiting on others' list. Feel free to re-add my as a reviewer later if needed. http://reviews.llvm.org/D8899 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: r246985 - Compute and preserve alignment more faithfully in IR-generation.
On Tue, Sep 08, 2015 at 08:06:00AM -, John McCall via cfe-commits wrote: > Author: rjmccall > Date: Tue Sep 8 03:05:57 2015 > New Revision: 246985 > > URL: http://llvm.org/viewvc/llvm-project?rev=246985&view=rev > Log: > Compute and preserve alignment more faithfully in IR-generation. This seems to introduce an access-beyond-end on the attached input. Just -c should be enough to reproduce. Joerg struct A { void operator delete(void *, void *); }; void *operator new(unsigned long, void *); struct B { static B create() { new (0) A; } }; class C { protected: template void internalConstruct(int *, Deleter) { B::create; } template C(int *p1, Deleter p2) { internalConstruct(p1, p2); } }; class D : C { public: template D(int *p1, Deleter p2) : C(p1, p2) {} }; void doDeleteLater() { D(new int, doDeleteLater); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: [PATCH] D12834: add gcc abi_tag support
majnemer added a comment. Adding John, Richard and Reid as reviewers. Repository: rL LLVM http://reviews.llvm.org/D12834 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r248696 - [OPENMP 4.1] Add 'simd' clause for 'ordered' directive.
Author: abataev Date: Mon Sep 28 01:39:35 2015 New Revision: 248696 URL: http://llvm.org/viewvc/llvm-project?rev=248696&view=rev Log: [OPENMP 4.1] Add 'simd' clause for 'ordered' directive. Parsing and sema analysis for 'simd' clause in 'ordered' directive. Description If the simd clause is specified, the ordered regions encountered by any thread will use only a single SIMD lane to execute the ordered regions in the order of the loop iterations. Restrictions An ordered construct with the simd clause is the only OpenMP construct that can appear in the simd region Modified: cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h cfe/trunk/include/clang/AST/OpenMPClause.h cfe/trunk/include/clang/AST/RecursiveASTVisitor.h cfe/trunk/include/clang/Basic/OpenMPKinds.def cfe/trunk/include/clang/Sema/Sema.h cfe/trunk/lib/AST/StmtPrinter.cpp cfe/trunk/lib/AST/StmtProfile.cpp cfe/trunk/lib/Basic/OpenMPKinds.cpp cfe/trunk/lib/CodeGen/CGStmtOpenMP.cpp cfe/trunk/lib/Parse/ParseOpenMP.cpp cfe/trunk/lib/Sema/SemaOpenMP.cpp cfe/trunk/lib/Sema/TreeTransform.h cfe/trunk/lib/Serialization/ASTReaderStmt.cpp cfe/trunk/lib/Serialization/ASTWriterStmt.cpp cfe/trunk/test/OpenMP/ordered_ast_print.cpp cfe/trunk/test/OpenMP/ordered_messages.cpp cfe/trunk/tools/libclang/CIndex.cpp Modified: cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h?rev=248696&r1=248695&r2=248696&view=diff == --- cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h (original) +++ cfe/trunk/include/clang/AST/DataRecursiveASTVisitor.h Mon Sep 28 01:39:35 2015 @@ -2540,6 +2540,11 @@ bool RecursiveASTVisitor::Visit } template +bool RecursiveASTVisitor::VisitOMPSIMDClause(OMPSIMDClause *) { + return true; +} + +template template bool RecursiveASTVisitor::VisitOMPClauseList(T *Node) { for (auto *E : Node->varlists()) { Modified: cfe/trunk/include/clang/AST/OpenMPClause.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/OpenMPClause.h?rev=248696&r1=248695&r2=248696&view=diff == --- cfe/trunk/include/clang/AST/OpenMPClause.h (original) +++ cfe/trunk/include/clang/AST/OpenMPClause.h Mon Sep 28 01:39:35 2015 @@ -2561,6 +2561,36 @@ public: } }; +/// \brief This represents 'simd' clause in the '#pragma omp ...' directive. +/// +/// \code +/// #pragma omp ordered simd +/// \endcode +/// In this example directive '#pragma omp ordered' has simple 'simd' clause. +/// +class OMPSIMDClause : public OMPClause { +public: + /// \brief Build 'simd' clause. + /// + /// \param StartLoc Starting location of the clause. + /// \param EndLoc Ending location of the clause. + /// + OMPSIMDClause(SourceLocation StartLoc, SourceLocation EndLoc) + : OMPClause(OMPC_simd, StartLoc, EndLoc) {} + + /// \brief Build an empty clause. + /// + OMPSIMDClause() : OMPClause(OMPC_simd, SourceLocation(), SourceLocation()) {} + + static bool classof(const OMPClause *T) { +return T->getClauseKind() == OMPC_simd; + } + + child_range children() { +return child_range(child_iterator(), child_iterator()); + } +}; + } // end namespace clang #endif Modified: cfe/trunk/include/clang/AST/RecursiveASTVisitor.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/RecursiveASTVisitor.h?rev=248696&r1=248695&r2=248696&view=diff == --- cfe/trunk/include/clang/AST/RecursiveASTVisitor.h (original) +++ cfe/trunk/include/clang/AST/RecursiveASTVisitor.h Mon Sep 28 01:39:35 2015 @@ -2572,6 +2572,11 @@ bool RecursiveASTVisitor::Visit } template +bool RecursiveASTVisitor::VisitOMPSIMDClause(OMPSIMDClause *) { + return true; +} + +template template bool RecursiveASTVisitor::VisitOMPClauseList(T *Node) { for (auto *E : Node->varlists()) { Modified: cfe/trunk/include/clang/Basic/OpenMPKinds.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/OpenMPKinds.def?rev=248696&r1=248695&r2=248696&view=diff == --- cfe/trunk/include/clang/Basic/OpenMPKinds.def (original) +++ cfe/trunk/include/clang/Basic/OpenMPKinds.def Mon Sep 28 01:39:35 2015 @@ -145,6 +145,7 @@ OPENMP_CLAUSE(seq_cst, OMPSeqCstClause) OPENMP_CLAUSE(depend, OMPDependClause) OPENMP_CLAUSE(device, OMPDeviceClause) OPENMP_CLAUSE(threads, OMPThreadsClause) +OPENMP_CLAUSE(simd, OMPSIMDClause) // Clauses allowed for OpenMP directive 'parallel'. OPENMP_PARALLEL_CLAUSE(if) @@ -318,6 +319,7 @@ OPENMP_TEAMS_CLAUSE(reduction) // Clauses allowed for OpenMP directive 'ordered'. // TODO More clauses for 'ordered' directive. OPENMP_ORDERED_CLAUSE(threads) +OPENMP_ORDERED_CLAUSE(simd) #