[PATCH] D50448: [CGObjCGNU] Rename GetSelector helper method to fix -Woverloaded-virtual warning (PR38210)
xbolva00 added a comment. Thanks, this warning is really annoying. Repository: rC Clang https://reviews.llvm.org/D50448 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46593: Allow copy elision in path concatenation
xbolva00 updated this revision to Diff 145740. Herald added a subscriber: cfe-commits. Repository: rCXX libc++ https://reviews.llvm.org/D46593 Files: include/experimental/filesystem Index: include/experimental/filesystem === --- include/experimental/filesystem +++ include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template Index: include/experimental/filesystem === --- include/experimental/filesystem +++ include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46593: Allow copy elision in path concatenation
xbolva00 updated this revision to Diff 145742. Herald added a subscriber: christof. https://reviews.llvm.org/D46593 Files: libcxx/trunk/include/experimental/filesystem Index: libcxx/trunk/include/experimental/filesystem === --- libcxx/trunk/include/experimental/filesystem +++ libcxx/trunk/include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template Index: libcxx/trunk/include/experimental/filesystem === --- libcxx/trunk/include/experimental/filesystem +++ libcxx/trunk/include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46593: Allow copy elision in path concatenation
xbolva00 updated this revision to Diff 145745. xbolva00 added a comment. Can anybody give me advice from where to generate patch? I do it from libcxx. https://reviews.llvm.org/D46593 Files: include/experimental/filesystem Index: include/experimental/filesystem === --- include/experimental/filesystem +++ include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template Index: include/experimental/filesystem === --- include/experimental/filesystem +++ include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46593: Allow copy elision in path concatenation
xbolva00 added a comment. In https://reviews.llvm.org/D46593#1091732, @smeenai wrote: > Generating the patch from libc++ is fine (and this patch looks like it has > sane paths). Thank you https://reviews.llvm.org/D46593 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46593: Allow copy elision in path concatenation
This revision was automatically updated to reflect the committed changes. Closed by commit rCXX331910: Allow copy elision in path concatenation (authored by xbolva00, committed by ). Repository: rCXX libc++ https://reviews.llvm.org/D46593 Files: include/experimental/filesystem Index: include/experimental/filesystem === --- include/experimental/filesystem +++ include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template Index: include/experimental/filesystem === --- include/experimental/filesystem +++ include/experimental/filesystem @@ -1140,7 +1140,9 @@ inline _LIBCPP_INLINE_VISIBILITY path operator/(const path& __lhs, const path& __rhs) { -return path(__lhs) /= __rhs; +path __result(__lhs); +__result /= __rhs; +return __result; } template ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46593: Allow copy elision in path concatenation
xbolva00 added a comment. Ping @jwakely Repository: rCXX libc++ https://reviews.llvm.org/D46593 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47103: Implement strip.invariant.group
xbolva00 added inline comments. Comment at: clang/include/clang/AST/DeclCXX.h:778 + bool mayBeDynamicClass() const { +return !isCompleteDefinition() || isDynamicClass(); maybeDynamicClass? https://github.com/llvm-mirror/llvm/search?utf8=%E2%9C%93&q=maybe&type= Repository: rL LLVM https://reviews.llvm.org/D47103 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47135: [analyzer][WIP] A checker for dangling string pointers in C++
xbolva00 added inline comments. Comment at: lib/StaticAnalyzer/Checkers/DanglingStringPointerChecker.cpp:29 + +class DanglingStringPointerChecker : public Checker { + CallDescription CStrFn; george.karpenkov wrote: > "string" is a bit ambiguous, if this checker is specifically for std::string > should we change the name to reflect that? Agree, maybe DanglingStdStringPointerChecker? Repository: rC Clang https://reviews.llvm.org/D47135 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47340: [ClangDiagnostics] Silence warning about fallthrough after PrintFatalError
xbolva00 created this revision. Herald added subscribers: cfe-commits, jkorous, MaskRay, ioeric, ilya-biryukov. ClangDiagnosticsEmitter.cpp:1047:57: warning: this statement may fall through [-Wimplicit-fallthrough=] Builder.PrintFatalError("Unknown modifier type: " + Modifier); ~~^~ ClangDiagnosticsEmitter.cpp:1048:5: note: here case MT_Select: { ^ Repository: rC Clang https://reviews.llvm.org/D47340 Files: utils/TableGen/ClangDiagnosticsEmitter.cpp Index: utils/TableGen/ClangDiagnosticsEmitter.cpp === --- utils/TableGen/ClangDiagnosticsEmitter.cpp +++ utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -1045,6 +1045,7 @@ switch (ModType) { case MT_Unknown: Builder.PrintFatalError("Unknown modifier type: " + Modifier); + break; case MT_Select: { SelectPiece *Select = New(MT_Select); do { Index: utils/TableGen/ClangDiagnosticsEmitter.cpp === --- utils/TableGen/ClangDiagnosticsEmitter.cpp +++ utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -1045,6 +1045,7 @@ switch (ModType) { case MT_Unknown: Builder.PrintFatalError("Unknown modifier type: " + Modifier); + break; case MT_Select: { SelectPiece *Select = New(MT_Select); do { ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46052: GNUstep Objective-C ABI version 2
xbolva00 added inline comments. Comment at: lib/CodeGen/CGObjCGNU.cpp:512 /// used to return an untyped selector (with the types field set to NULL). - llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, + virtual llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, const std::string &TypeEncoding); This causes CGObjCGNU.cpp:589:16: warning: ‘virtual llvm::Value* {anonymous}::CGObjCGNU::GetSelector(clang::CodeGen::CodeGenFunction&, const clang::ObjCMethodDecl*)’ was hidden [-Woverloaded-virtual] llvm::Value *GetSelector(CodeGenFunction &CGF, Repository: rC Clang https://reviews.llvm.org/D46052 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47340: [ClangDiagnostics] Silence warning about fallthrough after PrintFatalError
xbolva00 updated this revision to Diff 148523. xbolva00 added a comment. Add correct NORETURN attribute https://reviews.llvm.org/D47340 Files: utils/TableGen/ClangDiagnosticsEmitter.cpp Index: utils/TableGen/ClangDiagnosticsEmitter.cpp === --- utils/TableGen/ClangDiagnosticsEmitter.cpp +++ utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -633,7 +633,7 @@ return It->second.Root; } - void PrintFatalError(llvm::Twine const &Msg) const { + LLVM_ATTRIBUTE_NORETURN void PrintFatalError(llvm::Twine const &Msg) const { assert(EvaluatingRecord && "not evaluating a record?"); llvm::PrintFatalError(EvaluatingRecord->getLoc(), Msg); } Index: utils/TableGen/ClangDiagnosticsEmitter.cpp === --- utils/TableGen/ClangDiagnosticsEmitter.cpp +++ utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -633,7 +633,7 @@ return It->second.Root; } - void PrintFatalError(llvm::Twine const &Msg) const { + LLVM_ATTRIBUTE_NORETURN void PrintFatalError(llvm::Twine const &Msg) const { assert(EvaluatingRecord && "not evaluating a record?"); llvm::PrintFatalError(EvaluatingRecord->getLoc(), Msg); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47067: Update NRVO logic to support early return
xbolva00 added inline comments. Comment at: lib/Sema/Scope.cpp:128 - if (getEntity()) -return; - - if (NRVO.getInt()) -getParent()->setNoNRVO(); - else if (NRVO.getPointer()) -getParent()->addNRVOCandidate(NRVO.getPointer()); + if (getParent()) +getParent()->setNRVOCandidate(Candidate); auto * Parent = getParent(); if (Parent) Parent>setNRVOCandidate(Candidate); ? Repository: rC Clang https://reviews.llvm.org/D47067 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47340: [ClangDiagnostics] Silence warning about fallthrough after PrintFatalError
xbolva00 added a comment. Ok? https://reviews.llvm.org/D47340 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47340: [ClangDiagnostics] Silence warning about fallthrough after PrintFatalError
This revision was automatically updated to reflect the committed changes. Closed by commit rL40: [ClangDiagnostics] Silence warning about fallthrough after PrintFatalError (authored by xbolva00, committed by ). Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D47340?vs=148523&id=148708#toc Repository: rL LLVM https://reviews.llvm.org/D47340 Files: cfe/trunk/utils/TableGen/ClangDiagnosticsEmitter.cpp Index: cfe/trunk/utils/TableGen/ClangDiagnosticsEmitter.cpp === --- cfe/trunk/utils/TableGen/ClangDiagnosticsEmitter.cpp +++ cfe/trunk/utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -633,7 +633,7 @@ return It->second.Root; } - void PrintFatalError(llvm::Twine const &Msg) const { + LLVM_ATTRIBUTE_NORETURN void PrintFatalError(llvm::Twine const &Msg) const { assert(EvaluatingRecord && "not evaluating a record?"); llvm::PrintFatalError(EvaluatingRecord->getLoc(), Msg); } Index: cfe/trunk/utils/TableGen/ClangDiagnosticsEmitter.cpp === --- cfe/trunk/utils/TableGen/ClangDiagnosticsEmitter.cpp +++ cfe/trunk/utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -633,7 +633,7 @@ return It->second.Root; } - void PrintFatalError(llvm::Twine const &Msg) const { + LLVM_ATTRIBUTE_NORETURN void PrintFatalError(llvm::Twine const &Msg) const { assert(EvaluatingRecord && "not evaluating a record?"); llvm::PrintFatalError(EvaluatingRecord->getLoc(), Msg); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47340: [ClangDiagnostics] Silence warning about fallthrough after PrintFatalError
This revision was automatically updated to reflect the committed changes. Closed by commit rC40: [ClangDiagnostics] Silence warning about fallthrough after PrintFatalError (authored by xbolva00, committed by ). Repository: rL LLVM https://reviews.llvm.org/D47340 Files: utils/TableGen/ClangDiagnosticsEmitter.cpp Index: utils/TableGen/ClangDiagnosticsEmitter.cpp === --- utils/TableGen/ClangDiagnosticsEmitter.cpp +++ utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -633,7 +633,7 @@ return It->second.Root; } - void PrintFatalError(llvm::Twine const &Msg) const { + LLVM_ATTRIBUTE_NORETURN void PrintFatalError(llvm::Twine const &Msg) const { assert(EvaluatingRecord && "not evaluating a record?"); llvm::PrintFatalError(EvaluatingRecord->getLoc(), Msg); } Index: utils/TableGen/ClangDiagnosticsEmitter.cpp === --- utils/TableGen/ClangDiagnosticsEmitter.cpp +++ utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -633,7 +633,7 @@ return It->second.Root; } - void PrintFatalError(llvm::Twine const &Msg) const { + LLVM_ATTRIBUTE_NORETURN void PrintFatalError(llvm::Twine const &Msg) const { assert(EvaluatingRecord && "not evaluating a record?"); llvm::PrintFatalError(EvaluatingRecord->getLoc(), Msg); } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46052: GNUstep Objective-C ABI version 2
xbolva00 added inline comments. Comment at: lib/CodeGen/CGObjCGNU.cpp:512 /// used to return an untyped selector (with the types field set to NULL). - llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, + virtual llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, const std::string &TypeEncoding); theraven wrote: > xbolva00 wrote: > > This causes > > CGObjCGNU.cpp:589:16: warning: ‘virtual llvm::Value* > > {anonymous}::CGObjCGNU::GetSelector(clang::CodeGen::CodeGenFunction&, const > > clang::ObjCMethodDecl*)’ was hidden [-Woverloaded-virtual] > >llvm::Value *GetSelector(CodeGenFunction &CGF, > > > I can't reproduce this, and I'm not sure what the issue is. The two lines > have different overloads, so one shouldn't be hiding the other. It is a warning from GCC 7.2 Repository: rC Clang https://reviews.llvm.org/D46052 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46052: GNUstep Objective-C ABI version 2
xbolva00 added inline comments. Comment at: lib/CodeGen/CGObjCGNU.cpp:512 /// used to return an untyped selector (with the types field set to NULL). - llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, + virtual llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, const std::string &TypeEncoding); theraven wrote: > xbolva00 wrote: > > theraven wrote: > > > xbolva00 wrote: > > > > This causes > > > > CGObjCGNU.cpp:589:16: warning: ‘virtual llvm::Value* > > > > {anonymous}::CGObjCGNU::GetSelector(clang::CodeGen::CodeGenFunction&, > > > > const clang::ObjCMethodDecl*)’ was hidden [-Woverloaded-virtual] > > > >llvm::Value *GetSelector(CodeGenFunction &CGF, > > > > > > > I can't reproduce this, and I'm not sure what the issue is. The two > > > lines have different overloads, so one shouldn't be hiding the other. > > It is a warning from GCC 7.2 > Sounds like it's a spurious one. Any idea how to silence it? Not sure .. virtual llvm::Value *GetSelector(CodeGenFunction &CGF, Selector Sel, const std::string &TypeEncoding); is here but base class (CGObjCRuntime) has: virtual llvm::Value * GetSelector (CodeGenFunction &CGF, Selector Sel)=0 Repository: rC Clang https://reviews.llvm.org/D46052 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47135: [analyzer] A checker for dangling internal buffer pointers in C++
xbolva00 added inline comments. Comment at: lib/StaticAnalyzer/Checkers/DanglingInternalBufferChecker.cpp:33 +public: + DanglingInternalBufferChecker() : CStrFn("c_str") {} + string.data() support? https://reviews.llvm.org/D47135 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D45517: [analyzer] WIP: False positive refutation with Z3
xbolva00 added inline comments. Comment at: lib/StaticAnalyzer/Core/Z3ConstraintManager.cpp:1261 + + for (ConstraintRangeTy::iterator I = CR.begin(), E = CR.end(); I != E; ++I) { +SymbolRef Sym = I.getKey(); for (auto I : CR)? https://reviews.llvm.org/D45517 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51393: Provide a method for generating deterministic IDs for pointers allocated in BumpPtrAllocator
xbolva00 added inline comments. Comment at: llvm/include/llvm/Support/Allocator.h:295 +int64_t TotalSlabOffset = 0; +for (size_t Idx = 0; Idx < Slabs.size(); Idx++) { + const char *S = reinterpret_cast(Slabs[Idx]); for (size_t Idx = 0, e = Slabs.size(); Idx < e; Idx++) { https://reviews.llvm.org/D51393 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D50534: [libc++] Fix handling of negated character classes in regex
xbolva00 added subscribers: hans, xbolva00. xbolva00 added a comment. is this fixed in 7.0 release branch too? @hans Repository: rCXX libc++ https://reviews.llvm.org/D50534 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51847: Print corrent dependency path on Windows
xbolva00 created this revision. xbolva00 added a reviewer: zturner. Herald added a subscriber: cfe-commits. Before: main.o: main.c ../include/lib\test.h After: main.o: main.c ../include/lib/test.h Repository: rC Clang https://reviews.llvm.org/D51847 Files: lib/Frontend/DependencyFile.cpp Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,29 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + std::string &NativePath = llvm::sys::path::convert_to_slash(Filename); if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') { // Handle space correctly. OS << '\\'; unsigned j = i; - while (j > 0 && Filename[--j] == '\\') + while (j > 0 && NativePath[--j] == '\\') OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +} else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS << NativePath[i]; } } Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,29 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + std::string &NativePath = llvm::sys::path::convert_to_slash(Filename); if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') { // Handle space correctly. OS << '\\'; unsigned j = i; - while (j > 0 && Filename[--j] == '\\') + while (j > 0 && NativePath[--j] == '\\') OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +} else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS << NativePath[i]; } } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51847: Print corrent dependency path on Windows
xbolva00 updated this revision to Diff 164620. xbolva00 added a comment. Remove some dead code https://reviews.llvm.org/D51847 Files: lib/Frontend/DependencyFile.cpp Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,26 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + std::string &NativePath = llvm::sys::path::convert_to_slash(Filename); if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') // Handle space correctly. OS << '\\'; - unsigned j = i; - while (j > 0 && Filename[--j] == '\\') -OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS << NativePath[i]; } } Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,26 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + std::string &NativePath = llvm::sys::path::convert_to_slash(Filename); if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') // Handle space correctly. OS << '\\'; - unsigned j = i; - while (j > 0 && Filename[--j] == '\\') -OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS << NativePath[i]; } } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51847: Print correctly dependency paths on Windows
xbolva00 added a comment. In https://reviews.llvm.org/D51847#1228927, @zturner wrote: > What prints this? How do you exercise this codepath? DFGImpl::OutputDependencyFile() -> for (StringRef File : Files) https://reviews.llvm.org/D51847 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51847: Print correctly dependency paths on Windows
xbolva00 added a comment. Please see PR38877. https://reviews.llvm.org/D51847 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51847: Print correctly dependency paths on Windows
xbolva00 added a comment. In https://reviews.llvm.org/D51847#1230766, @zturner wrote: > Alright I see it. The reason I'm asking is because after your change you're > now printing `main.o: main.c ../include/lib/test.h`. But I wonder if you > should instead be printing `main.o: main.c ..\include\lib\test.h`. It seems > like paths that we show to the user should be in the native path style. Possibly, or should we follow GGC behavior here? GCC prints `main.o: main.c ../include/lib/test.h`. But conversion to native paths sounds fine for me as well. https://reviews.llvm.org/D51847 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51847: Print correctly dependency paths on Windows
xbolva00 updated this revision to Diff 165012. xbolva00 added a comment. Convert paths to platform native paths https://reviews.llvm.org/D51847 Files: lib/Frontend/DependencyFile.cpp Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,32 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + // Convert filename to platform native path + llvm::SmallString<256> NativePath; + llvm::sys::path::native(Filename.str(), NativePath); + if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') { // Handle space correctly. OS << '\\'; unsigned j = i; - while (j > 0 && Filename[--j] == '\\') + while (j > 0 && NativePath[--j] == '\\') OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +} else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS << NativePath[i]; } } Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,32 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + // Convert filename to platform native path + llvm::SmallString<256> NativePath; + llvm::sys::path::native(Filename.str(), NativePath); + if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') { // Handle space correctly. OS << '\\'; unsigned j = i; - while (j > 0 && Filename[--j] == '\\') + while (j > 0 && NativePath[--j] == '\\') OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +} else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS << NativePath[i]; } } ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D51847: Print correctly dependency paths on Windows
xbolva00 updated this revision to Diff 165052. xbolva00 added a comment. - Fixed failing test https://reviews.llvm.org/D51847 Files: lib/Frontend/DependencyFile.cpp test/Frontend/dependency-gen-escaping.c Index: test/Frontend/dependency-gen-escaping.c === --- test/Frontend/dependency-gen-escaping.c +++ test/Frontend/dependency-gen-escaping.c @@ -21,7 +21,7 @@ // Backslash followed by # or space should escape both characters, because // that's what GNU Make wants. GCC does the right thing with space, but not // #, so Clang does too. (There should be 3 backslashes before the #.) -// SEP2F: a\b\\#c\\\ d.h +// SEP2F: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h // With -fms-compatibility, Backslashes in #include are treated as path separators. // Backslashes are given in the emission for special characters, like 0x20 or 0x23. // SEP5C: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,32 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + // Convert filename to platform native path + llvm::SmallString<256> NativePath; + llvm::sys::path::native(Filename.str(), NativePath); + if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') { // Handle space correctly. OS << '\\'; unsigned j = i; - while (j > 0 && Filename[--j] == '\\') + while (j > 0 && NativePath[--j] == '\\') OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +} else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS << NativePath[i]; } } Index: test/Frontend/dependency-gen-escaping.c === --- test/Frontend/dependency-gen-escaping.c +++ test/Frontend/dependency-gen-escaping.c @@ -21,7 +21,7 @@ // Backslash followed by # or space should escape both characters, because // that's what GNU Make wants. GCC does the right thing with space, but not // #, so Clang does too. (There should be 3 backslashes before the #.) -// SEP2F: a\b\\#c\\\ d.h +// SEP2F: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h // With -fms-compatibility, Backslashes in #include are treated as path separators. // Backslashes are given in the emission for special characters, like 0x20 or 0x23. // SEP5C: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,32 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + // Convert filename to platform native path + llvm::SmallString<256> NativePath; + llvm::sys::path::native(Filename.str(), NativePath); + if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space c
[PATCH] D51847: Print correctly dependency paths on Windows
xbolva00 updated this revision to Diff 165204. xbolva00 added a comment. Adjusted regexes in two more tests https://reviews.llvm.org/D51847 Files: lib/Frontend/DependencyFile.cpp test/Frontend/dependency-gen-escaping.c test/Frontend/dependency-gen.c test/Modules/relative-dep-gen.cpp Index: test/Modules/relative-dep-gen.cpp === --- test/Modules/relative-dep-gen.cpp +++ test/Modules/relative-dep-gen.cpp @@ -30,9 +30,9 @@ #include "Inputs/relative-dep-gen-1.h" // CHECK-BUILD: mod.pcm: -// CHECK-BUILD: {{[ \t]}}Inputs/relative-dep-gen{{(-cwd)?}}.modulemap -// CHECK-BUILD: {{[ \t]}}Inputs/relative-dep-gen-1.h -// CHECK-BUILD: {{[ \t]}}Inputs/relative-dep-gen-2.h +// CHECK-BUILD: {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen{{(-cwd)?}}.modulemap +// CHECK-BUILD: {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen-1.h +// CHECK-BUILD: {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen-2.h // CHECK-USE: use.o: // CHECK-USE-DAG: {{[ \t]}}relative-dep-gen.cpp // CHECK-EXPLICIT-DAG: mod.pcm Index: test/Frontend/dependency-gen.c === --- test/Frontend/dependency-gen.c +++ test/Frontend/dependency-gen.c @@ -4,19 +4,19 @@ // RUN: echo > %t.dir/a/b/x.h // RUN: cd %t.dir // RUN: %clang -MD -MF - %s -fsyntax-only -I a/b | FileCheck -check-prefix=CHECK-ONE %s -// CHECK-ONE: {{ }}a/b{{[/\\]}}x.h +// CHECK-ONE: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // PR8974 (-include flag) // RUN: %clang -MD -MF - %s -fsyntax-only -include a/b/x.h -DINCLUDE_FLAG_TEST | FileCheck -check-prefix=CHECK-TWO %s -// CHECK-TWO: {{ }}a/b/x.h +// CHECK-TWO: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // rdar://problem/9734352 (paths involving ".") // RUN: %clang -MD -MF - %s -fsyntax-only -I ./a/b | FileCheck -check-prefix=CHECK-THREE %s -// CHECK-THREE: {{ }}a/b{{[/\\]}}x.h +// CHECK-THREE: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // RUN: %clang -MD -MF - %s -fsyntax-only -I .//./a/b/ | FileCheck -check-prefix=CHECK-FOUR %s -// CHECK-FOUR: {{ }}a/b{{[/\\]}}x.h +// CHECK-FOUR: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // RUN: %clang -MD -MF - %s -fsyntax-only -I a/b/. | FileCheck -check-prefix=CHECK-FIVE %s -// CHECK-FIVE: {{ }}a/b/.{{[/\\]}}x.h +// CHECK-FIVE: {{ }}a{{[/\\]}}b{{[/\\]}}.{{[/\\]}}x.h // RUN: cd a/b // RUN: %clang -MD -MF - %s -fsyntax-only -I ./ | FileCheck -check-prefix=CHECK-SIX %s // CHECK-SIX: {{ }}x.h Index: test/Frontend/dependency-gen-escaping.c === --- test/Frontend/dependency-gen-escaping.c +++ test/Frontend/dependency-gen-escaping.c @@ -21,7 +21,7 @@ // Backslash followed by # or space should escape both characters, because // that's what GNU Make wants. GCC does the right thing with space, but not // #, so Clang does too. (There should be 3 backslashes before the #.) -// SEP2F: a\b\\#c\\\ d.h +// SEP2F: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h // With -fms-compatibility, Backslashes in #include are treated as path separators. // Backslashes are given in the emission for special characters, like 0x20 or 0x23. // SEP5C: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,32 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + // Convert filename to platform native path + llvm::SmallString<256> NativePath; + llvm::sys::path::native(Filename.str(), NativePath); + if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') { // Handle space correctly. OS << '\\'; unsigned j = i; - while (j > 0 && Filename[--j] == '\\') + while (j > 0 && NativePath[--j] == '\\') OS << '\\'; -} else if (Filename[i] == '$') // $ is escaped by $$. +} else if (NativePath[i] == '$') // $ is escaped by $$. OS << '$'; -OS << Filename[i]; +OS
[PATCH] D51847: Print correctly dependency paths on Windows
This revision was not accepted when it landed; it landed in state "Needs Review". This revision was automatically updated to reflect the committed changes. Closed by commit rC342139: Print correctly dependency paths on Windows (authored by xbolva00, committed by ). Repository: rC Clang https://reviews.llvm.org/D51847 Files: lib/Frontend/DependencyFile.cpp test/Frontend/dependency-gen-escaping.c test/Frontend/dependency-gen.c test/Modules/relative-dep-gen.cpp Index: test/Frontend/dependency-gen-escaping.c === --- test/Frontend/dependency-gen-escaping.c +++ test/Frontend/dependency-gen-escaping.c @@ -21,7 +21,7 @@ // Backslash followed by # or space should escape both characters, because // that's what GNU Make wants. GCC does the right thing with space, but not // #, so Clang does too. (There should be 3 backslashes before the #.) -// SEP2F: a\b\\#c\\\ d.h +// SEP2F: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h // With -fms-compatibility, Backslashes in #include are treated as path separators. // Backslashes are given in the emission for special characters, like 0x20 or 0x23. // SEP5C: a{{[/\\]}}b{{[/\\]}}\#c{{/|}}\ d.h Index: test/Frontend/dependency-gen.c === --- test/Frontend/dependency-gen.c +++ test/Frontend/dependency-gen.c @@ -4,19 +4,19 @@ // RUN: echo > %t.dir/a/b/x.h // RUN: cd %t.dir // RUN: %clang -MD -MF - %s -fsyntax-only -I a/b | FileCheck -check-prefix=CHECK-ONE %s -// CHECK-ONE: {{ }}a/b{{[/\\]}}x.h +// CHECK-ONE: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // PR8974 (-include flag) // RUN: %clang -MD -MF - %s -fsyntax-only -include a/b/x.h -DINCLUDE_FLAG_TEST | FileCheck -check-prefix=CHECK-TWO %s -// CHECK-TWO: {{ }}a/b/x.h +// CHECK-TWO: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // rdar://problem/9734352 (paths involving ".") // RUN: %clang -MD -MF - %s -fsyntax-only -I ./a/b | FileCheck -check-prefix=CHECK-THREE %s -// CHECK-THREE: {{ }}a/b{{[/\\]}}x.h +// CHECK-THREE: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // RUN: %clang -MD -MF - %s -fsyntax-only -I .//./a/b/ | FileCheck -check-prefix=CHECK-FOUR %s -// CHECK-FOUR: {{ }}a/b{{[/\\]}}x.h +// CHECK-FOUR: {{ }}a{{[/\\]}}b{{[/\\]}}x.h // RUN: %clang -MD -MF - %s -fsyntax-only -I a/b/. | FileCheck -check-prefix=CHECK-FIVE %s -// CHECK-FIVE: {{ }}a/b/.{{[/\\]}}x.h +// CHECK-FIVE: {{ }}a{{[/\\]}}b{{[/\\]}}.{{[/\\]}}x.h // RUN: cd a/b // RUN: %clang -MD -MF - %s -fsyntax-only -I ./ | FileCheck -check-prefix=CHECK-SIX %s // CHECK-SIX: {{ }}x.h Index: test/Modules/relative-dep-gen.cpp === --- test/Modules/relative-dep-gen.cpp +++ test/Modules/relative-dep-gen.cpp @@ -30,9 +30,9 @@ #include "Inputs/relative-dep-gen-1.h" // CHECK-BUILD: mod.pcm: -// CHECK-BUILD: {{[ \t]}}Inputs/relative-dep-gen{{(-cwd)?}}.modulemap -// CHECK-BUILD: {{[ \t]}}Inputs/relative-dep-gen-1.h -// CHECK-BUILD: {{[ \t]}}Inputs/relative-dep-gen-2.h +// CHECK-BUILD: {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen{{(-cwd)?}}.modulemap +// CHECK-BUILD: {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen-1.h +// CHECK-BUILD: {{[ \t]}}Inputs{{[/\\]}}relative-dep-gen-2.h // CHECK-USE: use.o: // CHECK-USE-DAG: {{[ \t]}}relative-dep-gen.cpp // CHECK-EXPLICIT-DAG: mod.pcm Index: lib/Frontend/DependencyFile.cpp === --- lib/Frontend/DependencyFile.cpp +++ lib/Frontend/DependencyFile.cpp @@ -386,28 +386,32 @@ /// for Windows file-naming info. static void PrintFilename(raw_ostream &OS, StringRef Filename, DependencyOutputFormat OutputFormat) { + // Convert filename to platform native path + llvm::SmallString<256> NativePath; + llvm::sys::path::native(Filename.str(), NativePath); + if (OutputFormat == DependencyOutputFormat::NMake) { // Add quotes if needed. These are the characters listed as "special" to // NMake, that are legal in a Windows filespec, and that could cause // misinterpretation of the dependency string. -if (Filename.find_first_of(" #${}^!") != StringRef::npos) - OS << '\"' << Filename << '\"'; +if (NativePath.find_first_of(" #${}^!") != StringRef::npos) + OS << '\"' << NativePath << '\"'; else - OS << Filename; + OS << NativePath; return; } assert(OutputFormat == DependencyOutputFormat::Make); - for (unsigned i = 0, e = Filename.size(); i != e; ++i) { -if (Filename[i] == '#') // Handle '#' the broken gcc way. + for (unsigned i = 0, e = NativePath.size(); i != e; ++i) { +if (NativePath[i] == '#') // Handle '#' the broken gcc way. OS << '\\'; -else if (Filename[i] == ' ') { // Handle space correctly. +else if (NativePath[i] == ' ') { // Handle space correctly. OS << '\\'; unsigned j = i; - while (j > 0 && Filename[--j] == '\\') + while (j > 0 && NativePath[--j] == '\\')
[PATCH] D51333: Diagnose likely typos in include statements
xbolva00 added a comment. Where here, I would love to have a fixint hints for unknown functions. E.g. std::forward somewhere in code-> fixit: "try to add #include " https://reviews.llvm.org/D51333 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D45444: [clang-tidy] implement new check for const-correctness
xbolva00 added a comment. Yeah, it would be super useful if Clang can add const to all places where possible :) love this work, great! Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D45444 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D46822: [RISCV] Add driver for riscv32-unknown-elf baremetal target
This revision was automatically updated to reflect the committed changes. Closed by commit rC338385: [RISCV] Add driver for riscv32-unknown-elf baremetal target (authored by xbolva00, committed by ). Repository: rC Clang https://reviews.llvm.org/D46822 Files: lib/Driver/CMakeLists.txt lib/Driver/Driver.cpp lib/Driver/ToolChains/Gnu.cpp lib/Driver/ToolChains/RISCV.cpp lib/Driver/ToolChains/RISCV.h test/Driver/Inputs/basic_riscv32_tree/bin/riscv32-unknown-elf-ld test/Driver/Inputs/basic_riscv32_tree/lib/gcc/riscv32-unknown-elf/8.0.1/crtbegin.o test/Driver/Inputs/basic_riscv32_tree/lib/gcc/riscv32-unknown-elf/8.0.1/crtend.o test/Driver/Inputs/basic_riscv32_tree/riscv32-unknown-elf/include/c++/8.0.1/.keep test/Driver/Inputs/basic_riscv32_tree/riscv32-unknown-elf/lib/crt0.o test/Driver/riscv32-toolchain.c Index: lib/Driver/CMakeLists.txt === --- lib/Driver/CMakeLists.txt +++ lib/Driver/CMakeLists.txt @@ -57,6 +57,7 @@ ToolChains/NetBSD.cpp ToolChains/OpenBSD.cpp ToolChains/PS4CPU.cpp + ToolChains/RISCV.cpp ToolChains/Solaris.cpp ToolChains/TCE.cpp ToolChains/WebAssembly.cpp Index: lib/Driver/Driver.cpp === --- lib/Driver/Driver.cpp +++ lib/Driver/Driver.cpp @@ -37,6 +37,7 @@ #include "ToolChains/NetBSD.h" #include "ToolChains/OpenBSD.h" #include "ToolChains/PS4CPU.h" +#include "ToolChains/RISCV.h" #include "ToolChains/Solaris.h" #include "ToolChains/TCE.h" #include "ToolChains/WebAssembly.h" @@ -4399,6 +4400,10 @@ case llvm::Triple::avr: TC = llvm::make_unique(*this, Target, Args); break; + case llvm::Triple::riscv32: + case llvm::Triple::riscv64: +TC = llvm::make_unique(*this, Target, Args); +break; default: if (Target.getVendor() == llvm::Triple::Myriad) TC = llvm::make_unique(*this, Target, Index: lib/Driver/ToolChains/RISCV.h === --- lib/Driver/ToolChains/RISCV.h +++ lib/Driver/ToolChains/RISCV.h @@ -0,0 +1,57 @@ +//===--- RISCV.h - RISCV ToolChain Implementations --*- 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_LIB_DRIVER_TOOLCHAINS_RISCV_H +#define LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_RISCV_H + +#include "Gnu.h" +#include "clang/Driver/ToolChain.h" + +namespace clang { +namespace driver { +namespace toolchains { + +class LLVM_LIBRARY_VISIBILITY RISCVToolChain : public Generic_ELF { +public: + RISCVToolChain(const Driver &D, const llvm::Triple &Triple, + const llvm::opt::ArgList &Args); + + bool IsIntegratedAssemblerDefault() const override { return true; } + void + AddClangSystemIncludeArgs(const llvm::opt::ArgList &DriverArgs, +llvm::opt::ArgStringList &CC1Args) const override; + void + addLibStdCxxIncludePaths(const llvm::opt::ArgList &DriverArgs, + llvm::opt::ArgStringList &CC1Args) const override; + +protected: + Tool *buildLinker() const override; +}; + +} // end namespace toolchains + +namespace tools { +namespace RISCV { +class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool { +public: + Linker(const ToolChain &TC) : GnuTool("RISCV::Linker", "ld", TC) {} + bool hasIntegratedCPP() const override { return false; } + bool isLinkJob() const override { return true; } + void ConstructJob(Compilation &C, const JobAction &JA, +const InputInfo &Output, const InputInfoList &Inputs, +const llvm::opt::ArgList &TCArgs, +const char *LinkingOutput) const override; +}; +} // end namespace RISCV +} // end namespace tools + +} // end namespace driver +} // end namespace clang + +#endif // LLVM_CLANG_LIB_DRIVER_TOOLCHAINS_RISCV_H Index: lib/Driver/ToolChains/Gnu.cpp === --- lib/Driver/ToolChains/Gnu.cpp +++ lib/Driver/ToolChains/Gnu.cpp @@ -1877,7 +1877,8 @@ static const char *const RISCV32LibDirs[] = {"/lib", "/lib32"}; static const char *const RISCVTriples[] = {"riscv32-unknown-linux-gnu", - "riscv64-unknown-linux-gnu"}; + "riscv64-unknown-linux-gnu", + "riscv32-unknown-elf"}; static const char *const SPARCv8LibDirs[] = {"/lib32", "/lib"}; static const char *const SPARCv8Triples[] = {"sparc-linux-gnu", Index: lib/Driver/ToolChains/RISCV.cpp === --- lib/Driver/ToolChains/RISCV.cpp +++ lib/Driver/ToolChains/RISCV.cpp @@ -0,0 +
[PATCH] D46822: [RISCV] Add driver for riscv32-unknown-elf baremetal target
xbolva00 added a comment. In https://reviews.llvm.org/D46822#1183007, @efriedma wrote: > Please don't commit patches on behalf of someone else if the author hasn't > specifically requested it. There might be some issue which the author forgot > to note on the review. Oh, ok. Repository: rC Clang https://reviews.llvm.org/D46822 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D50246: [RISCV] Add support for computing sysroot for riscv32-unknown-elf
xbolva00 added a comment. Nico Webber (cfe-commits) "I'm getting this warning from the mac linker after this commit: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/libtool: warning same member name (libclangDriver.RISCV.o) in output file used for input files: obj/clang/lib/Driver/ToolChains/Arch/libclangDriver.RISCV.o and: obj/clang/lib/Driver/ToolChains/libclangDriver.RISCV.o (due to use of basename, truncation, blank padding or duplicate input files) Could we rename the file to fix that warning?" Repository: rC Clang https://reviews.llvm.org/D50246 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D50241: Fix tests for changed opt remarks format
This revision was automatically updated to reflect the committed changes. Closed by commit rC338971: Fix tests for changed opt remarks format (authored by xbolva00, committed by ). Herald added a subscriber: cfe-commits. Repository: rC Clang https://reviews.llvm.org/D50241 Files: test/CodeGen/thinlto-diagnostic-handler-remarks-with-hotness.ll test/Frontend/optimization-remark-with-hotness.c Index: test/CodeGen/thinlto-diagnostic-handler-remarks-with-hotness.ll === --- test/CodeGen/thinlto-diagnostic-handler-remarks-with-hotness.ll +++ test/CodeGen/thinlto-diagnostic-handler-remarks-with-hotness.ll @@ -19,17 +19,18 @@ ; YAML-NEXT: - Callee: tinkywinky ; YAML-NEXT: - String: ' inlined into ' ; YAML-NEXT: - Caller: main -; YAML-NEXT: - String: ' with cost=' +; YAML-NEXT: - String: ' with ' +; YAML-NEXT: - String: '(cost=' ; YAML-NEXT: - Cost:'0' -; YAML-NEXT: - String: ' (threshold=' +; YAML-NEXT: - String: ', threshold=' ; YAML-NEXT: - Threshold: '337' ; YAML-NEXT: - String: ')' ; YAML-NEXT: ... ; Next try with pass remarks to stderr ; RUN: %clang -target x86_64-scei-ps4 -O2 -x ir %t.o -fthinlto-index=%t.thinlto.bc -mllvm -pass-remarks=inline -fdiagnostics-show-hotness -o %t2.o -c 2>&1 | FileCheck %s -; CHECK: tinkywinky inlined into main with cost=0 (threshold=337) (hotness: 300) +; CHECK: tinkywinky inlined into main with (cost=0, threshold=337) (hotness: 300) target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-scei-ps4" Index: test/Frontend/optimization-remark-with-hotness.c === --- test/Frontend/optimization-remark-with-hotness.c +++ test/Frontend/optimization-remark-with-hotness.c @@ -60,13 +60,13 @@ // THRESHOLD-NOT: hotness // NO_PGO: '-fdiagnostics-show-hotness' requires profile-guided optimization information // NO_PGO: '-fdiagnostics-hotness-threshold=' requires profile-guided optimization information - // expected-remark@+1 {{foo inlined into bar with cost=always (hotness:}} + // expected-remark@+1 {{foo inlined into bar with (cost=always): always inliner (hotness:}} sum += foo(x, x - 2); } int main(int argc, const char *argv[]) { for (int i = 0; i < 30; i++) -// expected-remark@+1 {{bar not inlined into main because it should never be inlined (cost=never) (hotness:}} +// expected-remark@+1 {{bar not inlined into main because it should never be inlined (cost=never): always inliner (hotness:}} bar(argc); return sum; } Index: test/CodeGen/thinlto-diagnostic-handler-remarks-with-hotness.ll === --- test/CodeGen/thinlto-diagnostic-handler-remarks-with-hotness.ll +++ test/CodeGen/thinlto-diagnostic-handler-remarks-with-hotness.ll @@ -19,17 +19,18 @@ ; YAML-NEXT: - Callee: tinkywinky ; YAML-NEXT: - String: ' inlined into ' ; YAML-NEXT: - Caller: main -; YAML-NEXT: - String: ' with cost=' +; YAML-NEXT: - String: ' with ' +; YAML-NEXT: - String: '(cost=' ; YAML-NEXT: - Cost:'0' -; YAML-NEXT: - String: ' (threshold=' +; YAML-NEXT: - String: ', threshold=' ; YAML-NEXT: - Threshold: '337' ; YAML-NEXT: - String: ')' ; YAML-NEXT: ... ; Next try with pass remarks to stderr ; RUN: %clang -target x86_64-scei-ps4 -O2 -x ir %t.o -fthinlto-index=%t.thinlto.bc -mllvm -pass-remarks=inline -fdiagnostics-show-hotness -o %t2.o -c 2>&1 | FileCheck %s -; CHECK: tinkywinky inlined into main with cost=0 (threshold=337) (hotness: 300) +; CHECK: tinkywinky inlined into main with (cost=0, threshold=337) (hotness: 300) target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-scei-ps4" Index: test/Frontend/optimization-remark-with-hotness.c === --- test/Frontend/optimization-remark-with-hotness.c +++ test/Frontend/optimization-remark-with-hotness.c @@ -60,13 +60,13 @@ // THRESHOLD-NOT: hotness // NO_PGO: '-fdiagnostics-show-hotness' requires profile-guided optimization information // NO_PGO: '-fdiagnostics-hotness-threshold=' requires profile-guided optimization information - // expected-remark@+1 {{foo inlined into bar with cost=always (hotness:}} + // expected-remark@+1 {{foo inlined into bar with (cost=always): always inliner (hotness:}} sum += foo(x, x - 2); } int main(int argc, const char *argv[]) { for (int i = 0; i < 30; i++) -// expected-remark@+1 {{bar not inlined into main because it should never be inlined (cost=never) (hotness:}} +// expected-remark@+1 {{bar not inlined into main because it should never be inlined (cost=never): always inliner (hotness
[PATCH] D45444: [clang-tidy] implement new check for const-correctness
xbolva00 added inline comments. Comment at: clang-tidy/cppcoreguidelines/ConstCheck.cpp:28 + * For now: Only local variables are considered. Globals/namespace variables, + * paramters and class members are not analyzed. + * Parameters have a check already: readability-non-const-parameter typo paramters -> parameters Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D45444 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D45050: [clang-tidy] New checker for not null-terminated result caused by strlen or wcslen
xbolva00 added a comment. Thanks! Happy to see it is more powerful now :) https://reviews.llvm.org/D45050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D45050: [clang-tidy] New checker for not null-terminated result caused by strlen or wcslen
xbolva00 added a comment. memcpy(crypt_buf, passwd, passwd_len); <--- warning memcpy(crypt_buf + passwd_len, salt, salt_len); This is a false warning since it appends strings using memcpy. But no idea what to do and if it is possible to avoid these false warnings. https://reviews.llvm.org/D45050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D45050: [clang-tidy] New checker for not null-terminated result caused by strlen or wcslen
xbolva00 added a comment. In https://reviews.llvm.org/D45050#1116396, @Charusso wrote: > In https://reviews.llvm.org/D45050#1116361, @xbolva00 wrote: > > > memcpy(crypt_buf, passwd, passwd_len); <--- warning > > memcpy(crypt_buf + passwd_len, salt, salt_len); > > > > This is a false warning since it appends strings using memcpy. But no idea > > what to do and if it is possible to avoid these false warnings. > > > I have just tested it because of the `malloc()` function. I'm using > CodeChecker and leaved the default settings, so `IsSafeFunctionsAreAvailable > = 1`. Because of the malloc `strncpy_s()` cannot handle this case, but if the > check would ran with `IsSafeFunctionsAreAvailable = 0`, it rewrites it to > `strncpy(crypt_buf, passwd, passwd_len + 1)` which is a good transformation, > as the official `memcpy()`'s result not null-terminated. Yeah, it is a valid recommendation. https://reviews.llvm.org/D45050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D34796: upporting -f(no)-reorder-functions flag, clang side change
xbolva00 added a comment. Ping https://reviews.llvm.org/D34796 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47135: [analyzer] A checker for dangling internal buffer pointers in C++
xbolva00 accepted this revision. xbolva00 added a comment. Looks fine, awesome feature! https://reviews.llvm.org/D47135 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D45050: [clang-tidy] New checker for not null-terminated result caused by strlen or wcslen
xbolva00 added a comment. In https://reviews.llvm.org/D45050#1119973, @Charusso wrote: > In https://reviews.llvm.org/D45050#1116446, @lebedev.ri wrote: > > > I would like to see more negative tests. > > What does it do if the len/size is a constant? > > Variable that wasn't just assigned with `strlen()` return? > > > Thanks for the comment! What do you mean by negative test? To prove we have no false warnings. https://reviews.llvm.org/D45050 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47135: [analyzer] A checker for dangling internal buffer pointers in C++
xbolva00 added a comment. Ping https://reviews.llvm.org/D47135 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D47894: [clang]: Add support for "-fno-delete-null-pointer-checks"
xbolva00 added a comment. In https://reviews.llvm.org/D47894#1125653, @efriedma wrote: > The problem would come from propagating nonnull-ness from something which > isn't inherently nonnull. For example, strlen has a nonnull argument, so > `strlen(NULL)` is UB, therefore given `int z = strlen(x); if (x) {...}`, we > can remove the null check. (Not sure we actually do this transform at the > moment, but it's something we could do in the future.) This is interesting. Extra pass for such transformation? or any better place for it? Repository: rC Clang https://reviews.llvm.org/D47894 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. ping https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. In https://reviews.llvm.org/D52949#1259947, @jfb wrote: > Can you add tests with arrays? Yes :) > The error message doesn't really say what to do instead. What's wrong? What's > correct instead? What do you suggest? "division produces the incorrect number of array elements; pass the length of array as a function argument"? > In C++17 and later we should suggest using `std::size` for some cases instead. Ok, good idea. https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Any comments? Waiting for approval here to move focus on some other patches :) https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added inline comments. Comment at: lib/Sema/SemaChecking.cpp:10874 + if (Target->isSpecificBuiltinType(BuiltinType::LongDouble)) +FloatSem = &llvm::APFloat::x87DoubleExtended(); + efriedma wrote: > ASTContext::getFloatTypeSemantics. (Your explicit computation here is both > redundant and wrong.) Great tip! thanks. I overlooked it :/ https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 updated this revision to Diff 169162. xbolva00 added a comment. - Addressed comments https://reviews.llvm.org/D52835 Files: lib/Sema/SemaChecking.cpp test/Sema/ext_vector_casts.c test/Sema/impcast-integer-float.c Index: test/Sema/impcast-integer-float.c === --- test/Sema/impcast-integer-float.c +++ test/Sema/impcast-integer-float.c @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 %s -verify -Wconversion -fsyntax-only + +#define shift_plus_one(x) ((1ULL << x) + 1) + +void test(void) { +float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a2 = 1ULL << 31; +float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} + +double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b2 = 1ULL << 63; +double b3 = shift_plus_one(63); // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b4 = (1ULL << 63) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775807 to 9.223372036854775E+18}} + +long double c1 = ((__int128)1 << 127) + 1; // expected-warning {{implicit conversion from '__int128' to 'long double' changes value from -170141183460469231731687303715884105727 to -1.7014118346046923173E+38}} +long double c2 = (__int128)1 << 127; + +_Float16 d1 = (1ULL << 15) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d2 = 1ULL << 15; +_Float16 d3 = shift_plus_one(15); // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d4 = (1ULL << 15) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32767 to 3.277E+4}} + +float e = (__uint128_t)-1; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'float' changes value from 340282366920938463463374607431768211455 to +Inf}} +} Index: test/Sema/ext_vector_casts.c === --- test/Sema/ext_vector_casts.c +++ test/Sema/ext_vector_casts.c @@ -118,7 +118,7 @@ vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0x; + vf = vf + 0x; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4.2949673E+9}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd; Index: lib/Sema/SemaChecking.cpp === --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -105,6 +105,19 @@ Context.getTargetInfo()); } +// FIXME: Force the precision of the source value down so we don't print +// digits which are usually useless (we don't really care here if we +// truncate a digit by accident in edge cases). Ideally, APFloat::toString +// would automatically print the shortest representation, but it's a bit +// tricky to implement. +static void PrettyPrintFloat(const llvm::APFloat &floatValue, + const llvm::fltSemantics &floatSem, + SmallVectorImpl &prettyFloatValue) { + unsigned precision = llvm::APFloat::semanticsPrecision(floatSem); + precision = llvm::divideCeil(precision * 59, 196); + floatValue.toString(prettyFloatValue, precision); +} + /// Checks that a call expression's argument count is the desired number. /// This is useful when doing custom type-checking. Returns true on error. static bool checkArgCount(Sema &S, CallExpr *call, unsigned desiredArgCount) { @@ -10414,15 +10427,8 @@ DiagID = diag::warn_impcast_float_to_integer; } - // FIXME: Force the precision of the source value down so we don't print - // digits which are usually useless (we don't really care here if we - // truncate a digit by accident in edge cases). Ideally, APFloat::toString - // would automatically print the shortest representation, but it's a bit - // tricky to implement. SmallString<16> PrettySourceValue; - unsigned precision = llvm::APFloat::semanticsPrecision(Value.getSemantics()); - precision = (precision * 59 + 195)
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 added a comment. @Rakete plesse take a look :) https://reviews.llvm.org/D52750 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 added a comment. Thanks! But I think I need to change EvaluateForOverflow method to return bool to indicate overflowing. https://reviews.llvm.org/D52750 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added inline comments. Comment at: lib/Sema/SemaChecking.cpp:10881-10882 +S.DiagRuntimeBehavior( +E->getExprLoc(), E, +S.PDiag(diag::warn_impcast_literal_float_to_integer) +<< E->getType() << T << PrettySourceValue << PrettyTargetValue efriedma wrote: > It looks like this is reusing an existing diagnostic; what warning flag is > this controlled by? It it possible we need a separate flag for this warning? This is in LiteralConversion. https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 added a comment. In https://reviews.llvm.org/D52750#1261746, @Rakete wrote: > Nah, you don't even need to call `EvaluateForOverflow` I believe. :) Have a > look overflow evaluation is done. Well.. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { if (Result) { *Result = E->EvaluateKnownConstInt(Context); // here } and char a[2147483642 * 3]; Result->getBitWidth() reports 32. I don't know how to detect there if overflow or not :/ I have already spent some time to solve this, but still no good solution. Possibly I would abandon this patch. https://reviews.llvm.org/D52750 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. As noted, this in under LiteralConversion (-Wconversion). GCC has it too under -Wconversion, so I think it is fine as is, or? @rsmith https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. So any suggestions? https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 updated this revision to Diff 169407. xbolva00 added a comment. - check for overflow when evaluating https://reviews.llvm.org/D52750 Files: include/clang/AST/Expr.h lib/AST/ExprConstant.cpp lib/Sema/SemaExpr.cpp test/Sema/integer-overflow.c Index: test/Sema/integer-overflow.c === --- test/Sema/integer-overflow.c +++ test/Sema/integer-overflow.c @@ -172,6 +172,9 @@ // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} (void)f2(0, f0(4608 * 1024 * 1024)); } +void check_integer_overflows_in_array_size() { + int arr[4608 * 1024 * 1024]; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} +} struct s { unsigned x; Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14052,8 +14052,9 @@ // Circumvent ICE checking in C++11 to avoid evaluating the expression twice // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { -if (Result) - *Result = E->EvaluateKnownConstInt(Context); +if (Result) { + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); +} return E; } Index: lib/AST/ExprConstant.cpp === --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -10866,6 +10866,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: include/clang/AST/Expr.h === --- include/clang/AST/Expr.h +++ include/clang/AST/Expr.h @@ -631,9 +631,14 @@ /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded /// integer. This must be called on an expression that constant folds to an /// integer. - llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, -SmallVectorImpl *Diag = nullptr) const; + llvm::APSInt EvaluateKnownConstInt( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; + llvm::APSInt EvaluateKnownConstIntCheckOverflow( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; + void EvaluateForOverflow(const ASTContext &Ctx) const; /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an Index: test/Sema/integer-overflow.c === --- test/Sema/integer-overflow.c +++ test/Sema/integer-overflow.c @@ -172,6 +172,9 @@ // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} (void)f2(0, f0(4608 * 1024 * 1024)); } +void check_integer_overflows_in_array_size() { + int arr[4608 * 1024 * 1024]; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} +} struct s { unsigned x; Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14052,8 +14052,9 @@ // Circumvent ICE checking in C++11 to avoid evaluating the expression twice // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { -if (Result) - *Result = E->EvaluateKnownConstInt(Context); +if (Result) { + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); +} return E; } Index: lib/AST/ExprConstant.cpp === --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -10866,6 +10866,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: include/clang/AST/Expr.h === --- include/clang/AST/Expr.h +
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 updated this revision to Diff 169408. https://reviews.llvm.org/D52750 Files: include/clang/AST/Expr.h lib/AST/ExprConstant.cpp lib/Sema/SemaExpr.cpp test/Sema/integer-overflow.c Index: test/Sema/integer-overflow.c === --- test/Sema/integer-overflow.c +++ test/Sema/integer-overflow.c @@ -172,6 +172,9 @@ // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} (void)f2(0, f0(4608 * 1024 * 1024)); } +void check_integer_overflows_in_array_size() { + int arr[4608 * 1024 * 1024]; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} +} struct s { unsigned x; Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14053,7 +14053,8 @@ // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { if (Result) - *Result = E->EvaluateKnownConstInt(Context); + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); + return E; } Index: lib/AST/ExprConstant.cpp === --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -10866,6 +10866,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: include/clang/AST/Expr.h === --- include/clang/AST/Expr.h +++ include/clang/AST/Expr.h @@ -631,9 +631,14 @@ /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded /// integer. This must be called on an expression that constant folds to an /// integer. - llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, -SmallVectorImpl *Diag = nullptr) const; + llvm::APSInt EvaluateKnownConstInt( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; + llvm::APSInt EvaluateKnownConstIntCheckOverflow( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; + void EvaluateForOverflow(const ASTContext &Ctx) const; /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an Index: test/Sema/integer-overflow.c === --- test/Sema/integer-overflow.c +++ test/Sema/integer-overflow.c @@ -172,6 +172,9 @@ // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} (void)f2(0, f0(4608 * 1024 * 1024)); } +void check_integer_overflows_in_array_size() { + int arr[4608 * 1024 * 1024]; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} +} struct s { unsigned x; Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14053,7 +14053,8 @@ // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { if (Result) - *Result = E->EvaluateKnownConstInt(Context); + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); + return E; } Index: lib/AST/ExprConstant.cpp === --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -10866,6 +10866,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: include/clang/AST/Expr.h === --- include/clang/AST/Expr.h +++ include/clang/AST/Expr.h @@ -631,9 +631,14 @@ /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded /// integer. This must be called on an expression that constant folds to an /// integer. - llvm::APSInt EvaluateKnownConstInt(const ASTContext
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 updated this revision to Diff 169409. xbolva00 added a comment. - Undo extra newline https://reviews.llvm.org/D52750 Files: include/clang/AST/Expr.h lib/AST/ExprConstant.cpp lib/Sema/SemaExpr.cpp test/Sema/integer-overflow.c Index: test/Sema/integer-overflow.c === --- test/Sema/integer-overflow.c +++ test/Sema/integer-overflow.c @@ -172,6 +172,9 @@ // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} (void)f2(0, f0(4608 * 1024 * 1024)); } +void check_integer_overflows_in_array_size() { + int arr[4608 * 1024 * 1024]; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} +} struct s { unsigned x; Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14053,7 +14053,7 @@ // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { if (Result) - *Result = E->EvaluateKnownConstInt(Context); + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); return E; } Index: lib/AST/ExprConstant.cpp === --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -10866,6 +10866,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: include/clang/AST/Expr.h === --- include/clang/AST/Expr.h +++ include/clang/AST/Expr.h @@ -631,9 +631,14 @@ /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded /// integer. This must be called on an expression that constant folds to an /// integer. - llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, -SmallVectorImpl *Diag = nullptr) const; + llvm::APSInt EvaluateKnownConstInt( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; + llvm::APSInt EvaluateKnownConstIntCheckOverflow( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; + void EvaluateForOverflow(const ASTContext &Ctx) const; /// EvaluateAsLValue - Evaluate an expression to see if we can fold it to an Index: test/Sema/integer-overflow.c === --- test/Sema/integer-overflow.c +++ test/Sema/integer-overflow.c @@ -172,6 +172,9 @@ // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} (void)f2(0, f0(4608 * 1024 * 1024)); } +void check_integer_overflows_in_array_size() { + int arr[4608 * 1024 * 1024]; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} +} struct s { unsigned x; Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -14053,7 +14053,7 @@ // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { if (Result) - *Result = E->EvaluateKnownConstInt(Context); + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); return E; } Index: lib/AST/ExprConstant.cpp === --- lib/AST/ExprConstant.cpp +++ lib/AST/ExprConstant.cpp @@ -10866,6 +10866,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: include/clang/AST/Expr.h === --- include/clang/AST/Expr.h +++ include/clang/AST/Expr.h @@ -631,9 +631,14 @@ /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded /// integer. This must be called on an expression that constant folds to an /// integer. - llvm::
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 added a comment. In https://reviews.llvm.org/D52750#1263461, @Rakete wrote: > This doesn't produce a warning in C++11 and up. But see Richard's comment: https://reviews.llvm.org/D52750#1251759 https://reviews.llvm.org/D52750 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 added a comment. That's fine :) btw, thanks for review comments! Hopefully, this solution would be now acceptable :) https://reviews.llvm.org/D52750 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 added a comment. Thanks. ... So anything else to be done? Or it is ok? https://reviews.llvm.org/D52750 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 updated this revision to Diff 169567. xbolva00 added a comment. - New diagnostic group https://reviews.llvm.org/D52835 Files: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaChecking.cpp test/Sema/ext_vector_casts.c Index: test/Sema/ext_vector_casts.c === --- test/Sema/ext_vector_casts.c +++ test/Sema/ext_vector_casts.c @@ -118,7 +118,7 @@ vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0x; + vf = vf + 0x; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4.2949673E+9}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd; Index: lib/Sema/SemaChecking.cpp === --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -105,6 +105,19 @@ Context.getTargetInfo()); } +// FIXME: Force the precision of the source value down so we don't print +// digits which are usually useless (we don't really care here if we +// truncate a digit by accident in edge cases). Ideally, APFloat::toString +// would automatically print the shortest representation, but it's a bit +// tricky to implement. +static void PrettyPrintFloat(const llvm::APFloat &floatValue, + const llvm::fltSemantics &floatSem, + SmallVectorImpl &prettyFloatValue) { + unsigned precision = llvm::APFloat::semanticsPrecision(floatSem); + precision = llvm::divideCeil(precision * 59, 196); + floatValue.toString(prettyFloatValue, precision); +} + /// Checks that a call expression's argument count is the desired number. /// This is useful when doing custom type-checking. Returns true on error. static bool checkArgCount(Sema &S, CallExpr *call, unsigned desiredArgCount) { @@ -10414,15 +10427,8 @@ DiagID = diag::warn_impcast_float_to_integer; } - // FIXME: Force the precision of the source value down so we don't print - // digits which are usually useless (we don't really care here if we - // truncate a digit by accident in edge cases). Ideally, APFloat::toString - // would automatically print the shortest representation, but it's a bit - // tricky to implement. SmallString<16> PrettySourceValue; - unsigned precision = llvm::APFloat::semanticsPrecision(Value.getSemantics()); - precision = (precision * 59 + 195) / 196; - Value.toString(PrettySourceValue, precision); + PrettyPrintFloat(Value, Value.getSemantics(), PrettySourceValue); SmallString<16> PrettyTargetValue; if (IsBool) @@ -10855,6 +10861,32 @@ return; } + if (Source->isIntegerType() && TargetBT && TargetBT->isFloatingType()) { +llvm::APSInt IntValue; +if (E->EvaluateAsInt(IntValue, S.Context, Expr::SE_AllowSideEffects)) { + if (S.SourceMgr.isInSystemMacro(CC)) +return; + const llvm::fltSemantics &FloatSemantics = + S.Context.getFloatTypeSemantics(QualType(TargetBT, 0)); + llvm::APFloat FloatValue(FloatSemantics); + if (FloatValue.convertFromAPInt(IntValue, Source->isSignedIntegerType(), + llvm::APFloat::rmNearestTiesToEven) != + llvm::APFloat::opOK) { +SmallString<16> PrettyTargetValue; +SmallString<16> PrettySourceValue; +PrettyPrintFloat(FloatValue, FloatSemantics, PrettyTargetValue); +IntValue.toString(PrettySourceValue); + +S.DiagRuntimeBehavior( +E->getExprLoc(), E, +S.PDiag(diag::warn_impcast_precision_float_to_integer) +<< E->getType() << T << PrettySourceValue << PrettyTargetValue +<< E->getSourceRange() << clang::SourceRange(CC)); +return; + } +} + } + DiagnoseNullConversion(S, E, T, CC); S.DiscardMisalignedMemberAddress(Target, E); Index: include/clang/Basic/DiagnosticSemaKinds.td === --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -3223,6 +3223,10 @@ "implicit conversion turns floating-point number into integer: %0 to %1">, InGroup, DefaultIgnore; +def warn_impcast_precision_float_to_integer : Warning< + "implicit conversion from %0 to %1 changes value from %2 to %3">, + InGroup; + def warn_impcast_float_to_integer : Warning< "implicit conversion from %0 to %1 changes value from %2 to %3">, InGroup, DefaultIgnore; Index: include/clang/Basic/DiagnosticGroups.td === --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -51,6 +51,7 @@ def ConstantConversion : DiagGroup<"constant-
[PATCH] D51868: [libcxx] Build and test fixes for Windows
xbolva00 added a comment. Libc++ fs works on Windows now? https://reviews.llvm.org/D51868 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 updated this revision to Diff 169881. xbolva00 added a comment. - Added missing test file https://reviews.llvm.org/D52835 Files: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaChecking.cpp test/Sema/ext_vector_casts.c test/Sema/impcast-integer-float.c Index: test/Sema/impcast-integer-float.c === --- test/Sema/impcast-integer-float.c +++ test/Sema/impcast-integer-float.c @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 %s -verify -Wconversion -fsyntax-only + +#define shift_plus_one(x) ((1ULL << x) + 1) + +void test(void) { +float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a2 = 1ULL << 31; +float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} + +double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b2 = 1ULL << 63; +double b3 = shift_plus_one(63); // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b4 = (1ULL << 63) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775807 to 9.223372036854775E+18}} + +long double c1 = ((__int128)1 << 127) + 1; // expected-warning {{implicit conversion from '__int128' to 'long double' changes value from -170141183460469231731687303715884105727 to -1.7014118346046923173E+38}} +long double c2 = (__int128)1 << 127; + +_Float16 d1 = (1ULL << 15) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d2 = 1ULL << 15; +_Float16 d3 = shift_plus_one(15); // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d4 = (1ULL << 15) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32767 to 3.277E+4}} + +float e = (__uint128_t)-1; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'float' changes value from 340282366920938463463374607431768211455 to +Inf}} +} Index: test/Sema/ext_vector_casts.c === --- test/Sema/ext_vector_casts.c +++ test/Sema/ext_vector_casts.c @@ -118,7 +118,7 @@ vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0x; + vf = vf + 0x; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4.2949673E+9}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd; Index: lib/Sema/SemaChecking.cpp === --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -105,6 +105,19 @@ Context.getTargetInfo()); } +// FIXME: Force the precision of the source value down so we don't print +// digits which are usually useless (we don't really care here if we +// truncate a digit by accident in edge cases). Ideally, APFloat::toString +// would automatically print the shortest representation, but it's a bit +// tricky to implement. +static void PrettyPrintFloat(const llvm::APFloat &floatValue, + const llvm::fltSemantics &floatSem, + SmallVectorImpl &prettyFloatValue) { + unsigned precision = llvm::APFloat::semanticsPrecision(floatSem); + precision = llvm::divideCeil(precision * 59, 196); + floatValue.toString(prettyFloatValue, precision); +} + /// Checks that a call expression's argument count is the desired number. /// This is useful when doing custom type-checking. Returns true on error. static bool checkArgCount(Sema &S, CallExpr *call, unsigned desiredArgCount) { @@ -10414,15 +10427,8 @@ DiagID = diag::warn_impcast_float_to_integer; } - // FIXME: Force the precision of the source value down so we don't print - // digits which are usually useless (we don't really care here if we - // truncate a digit by accident in edge cases). Ideally, APFloat::toString - // would automatically print the shortest representation, but it's a bit - // tricky to implement. SmallString<16> PrettySourceValue; - unsigned precision = ll
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
xbolva00 added a comment. Reping :) https://reviews.llvm.org/D52750 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Is PrecisionConversion acceptable? If not, any suggestions for name? https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. Second thought, I don't think we should recommend std::size here (maybe it should be okay for clang static analyzers) uint32_t data[] = {10, 20, 30, 40}; len = sizeof(data)/sizeof(*data); // "warn" on valid code to recommend std::size? I dont agree with such behaviour. @rsmith? https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52784: [ARM][AArch64] Pass through endianness flags to the GNU assembler and linker
xbolva00 added inline comments. Comment at: lib/Driver/ToolChains/Gnu.cpp:241 + case llvm::Triple::thumbeb: +IsBigEndian = true; + case llvm::Triple::arm: Gnu.cpp:241:17: warning: this statement may fall through [-Wimplicit-fallthrough=] IsBigEndian = true; Repository: rC Clang https://reviews.llvm.org/D52784 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52750: [Diagnostics] Check for integer overflow in array size expressions
This revision was automatically updated to reflect the committed changes. Closed by commit rL344759: [Diagnostics] Check for integer overflow in array size expressions (authored by xbolva00, committed by ). Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D52750?vs=169409&id=170119#toc Repository: rL LLVM https://reviews.llvm.org/D52750 Files: cfe/trunk/include/clang/AST/Expr.h cfe/trunk/lib/AST/ExprConstant.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/Sema/integer-overflow.c Index: cfe/trunk/lib/AST/ExprConstant.cpp === --- cfe/trunk/lib/AST/ExprConstant.cpp +++ cfe/trunk/lib/AST/ExprConstant.cpp @@ -10851,6 +10851,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: cfe/trunk/lib/Sema/SemaExpr.cpp === --- cfe/trunk/lib/Sema/SemaExpr.cpp +++ cfe/trunk/lib/Sema/SemaExpr.cpp @@ -14105,7 +14105,7 @@ // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { if (Result) - *Result = E->EvaluateKnownConstInt(Context); + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); return E; } Index: cfe/trunk/include/clang/AST/Expr.h === --- cfe/trunk/include/clang/AST/Expr.h +++ cfe/trunk/include/clang/AST/Expr.h @@ -631,8 +631,13 @@ /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded /// integer. This must be called on an expression that constant folds to an /// integer. - llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, -SmallVectorImpl *Diag = nullptr) const; + llvm::APSInt EvaluateKnownConstInt( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; + + llvm::APSInt EvaluateKnownConstIntCheckOverflow( + const ASTContext &Ctx, + SmallVectorImpl *Diag = nullptr) const; void EvaluateForOverflow(const ASTContext &Ctx) const; Index: cfe/trunk/test/Sema/integer-overflow.c === --- cfe/trunk/test/Sema/integer-overflow.c +++ cfe/trunk/test/Sema/integer-overflow.c @@ -172,6 +172,9 @@ // expected-warning@+1 {{overflow in expression; result is 536870912 with type 'int'}} (void)f2(0, f0(4608 * 1024 * 1024)); } +void check_integer_overflows_in_array_size() { + int arr[4608 * 1024 * 1024]; // expected-warning {{overflow in expression; result is 536870912 with type 'int'}} +} struct s { unsigned x; Index: cfe/trunk/lib/AST/ExprConstant.cpp === --- cfe/trunk/lib/AST/ExprConstant.cpp +++ cfe/trunk/lib/AST/ExprConstant.cpp @@ -10851,6 +10851,19 @@ return EvalResult.Val.getInt(); } +APSInt Expr::EvaluateKnownConstIntCheckOverflow( +const ASTContext &Ctx, SmallVectorImpl *Diag) const { + EvalResult EvalResult; + EvalResult.Diag = Diag; + EvalInfo Info(Ctx, EvalResult, EvalInfo::EM_EvaluateForOverflow); + bool Result = ::EvaluateAsRValue(Info, this, EvalResult.Val); + (void)Result; + assert(Result && "Could not evaluate expression"); + assert(EvalResult.Val.isInt() && "Expression did not evaluate to integer"); + + return EvalResult.Val.getInt(); +} + void Expr::EvaluateForOverflow(const ASTContext &Ctx) const { bool IsConst; EvalResult EvalResult; Index: cfe/trunk/lib/Sema/SemaExpr.cpp === --- cfe/trunk/lib/Sema/SemaExpr.cpp +++ cfe/trunk/lib/Sema/SemaExpr.cpp @@ -14105,7 +14105,7 @@ // in the non-ICE case. if (!getLangOpts().CPlusPlus11 && E->isIntegerConstantExpr(Context)) { if (Result) - *Result = E->EvaluateKnownConstInt(Context); + *Result = E->EvaluateKnownConstIntCheckOverflow(Context); return E; } Index: cfe/trunk/include/clang/AST/Expr.h === --- cfe/trunk/include/clang/AST/Expr.h +++ cfe/trunk/include/clang/AST/Expr.h @@ -631,8 +631,13 @@ /// EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded /// integer. This must be called on an expression that constant folds to an /// integer. - llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx, -SmallVectorIm
[PATCH] D52784: [ARM][AArch64] Pass through endianness flags to the GNU assembler and linker
xbolva00 added inline comments. Comment at: lib/Driver/ToolChains/Gnu.cpp:241 + case llvm::Triple::thumbeb: +IsBigEndian = true; + case llvm::Triple::arm: peter.smith wrote: > xbolva00 wrote: > > Gnu.cpp:241:17: warning: this statement may fall through > > [-Wimplicit-fallthrough=] > > IsBigEndian = true; > The fall through is intentional in this case. Please mark it with LLVM_FALLTHROUGH then. Repository: rC Clang https://reviews.llvm.org/D52784 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. Ping https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Ping https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. No warning for your case. https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 updated this revision to Diff 170696. xbolva00 added a comment. - Added MTC'c case to test file https://reviews.llvm.org/D52949 Files: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExpr.cpp test/Sema/div-sizeof-ptr.c Index: test/Sema/div-sizeof-ptr.c === --- test/Sema/div-sizeof-ptr.c +++ test/Sema/div-sizeof-ptr.c @@ -0,0 +1,13 @@ +// RUN: %clang_cc1 %s -verify -Wsizeof-pointer-div -fsyntax-only + +void test(int *p, int **q) { +int a = sizeof(p) / sizeof(*p); // expected-warning {{division produces the incorrect number of array elements}} +int b = sizeof p / sizeof *p;// expected-warning {{division produces the incorrect number of array elements}} +int c = sizeof(*q) / sizeof(**q);// expected-warning {{division produces the incorrect number of array elements}} +int d = sizeof(p) / sizeof(int); // expected-warning {{division produces the incorrect number of array elements}} + +int e = sizeof(int *) / sizeof(int); +int f = sizeof(p) / sizeof(p); +int g = sizeof(*q) / sizeof(q); +int h = sizeof(p) / sizeof(char); +} Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -8723,6 +8723,39 @@ << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); } +static void DiagnoseDivisionSizeofPointer(Sema &S, Expr *LHS, Expr *RHS, + SourceLocation Loc) { + UnaryExprOrTypeTraitExpr *LUE = + dyn_cast_or_null(LHS); + UnaryExprOrTypeTraitExpr *RUE = + dyn_cast_or_null(RHS); + + if (!LUE || !RUE) +return; + if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() || + RUE->getKind() != UETT_SizeOf) +return; + + QualType LHSTy; + QualType RHSTy; + LHS = LUE->getArgumentExpr()->IgnoreParens(); + LHSTy = LHS->getType(); + + if (RUE->isArgumentType()) { +RHSTy = RUE->getArgumentType(); + } else { +RHS = RUE->getArgumentExpr()->IgnoreParens(); +RHSTy = RHS->getType(); + } + + if (!LHSTy->isPointerType() || RHSTy->isPointerType()) +return; + if (LHSTy->getPointeeType() != RHSTy) +return; + + S.Diag(Loc, diag::warn_division_sizeof_ptr) << LHS->getSourceRange(); +} + static void DiagnoseBadDivideOrRemainderValues(Sema& S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsDiv) { @@ -8753,8 +8786,10 @@ if (compType.isNull() || !compType->isArithmeticType()) return InvalidOperands(Loc, LHS, RHS); - if (IsDiv) + if (IsDiv) { DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, IsDiv); +DiagnoseDivisionSizeofPointer(*this, LHS.get(), RHS.get(), Loc); + } return compType; } @@ -16593,4 +16628,4 @@ return new (Context) ObjCAvailabilityCheckExpr(Version, AtLoc, RParen, Context.BoolTy); -} +} \ No newline at end of file Index: include/clang/Basic/DiagnosticSemaKinds.td === --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -3291,6 +3291,10 @@ InGroup; def note_reference_is_return_value : Note<"%0 returns a reference">; +def warn_division_sizeof_ptr : Warning< + "division produces the incorrect number of array elements">, + InGroup, DefaultIgnore; + def note_function_warning_silence : Note< "prefix with the address-of operator to silence this warning">; def note_function_to_function_call : Note< Index: include/clang/Basic/DiagnosticGroups.td === --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -144,6 +144,7 @@ def : DiagGroup<"discard-qual">; def DivZero : DiagGroup<"division-by-zero">; def : DiagGroup<"div-by-zero", [DivZero]>; +def DivSizeofPtr : DiagGroup<"sizeof-pointer-div">; def DocumentationHTML : DiagGroup<"documentation-html">; def DocumentationUnknownCommand : DiagGroup<"documentation-unknown-command">; @@ -789,6 +790,7 @@ SelfMove, SizeofArrayArgument, SizeofArrayDecay, +DivSizeofPtr, StringPlusInt, Trigraphs, Uninitialized, ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D53666: [Tests] Updated tests for D53342
xbolva00 created this revision. Herald added subscribers: cfe-commits, nhaehnle, jvesely. Repository: rC Clang https://reviews.llvm.org/D53666 Files: test/CodeGen/tbaa-struct.cpp test/CodeGenOpenCL/amdgpu-nullptr.cl Index: test/CodeGenOpenCL/amdgpu-nullptr.cl === --- test/CodeGenOpenCL/amdgpu-nullptr.cl +++ test/CodeGenOpenCL/amdgpu-nullptr.cl @@ -510,7 +510,7 @@ } StructTy3; // CHECK-LABEL: test_memset_private -// CHECK: call void @llvm.memset.p5i8.i64(i8 addrspace(5)* align 8 {{.*}}, i8 0, i64 40, i1 false) +// CHECK: call void @llvm.memset.p5i8.i64(i8 addrspace(5)* nonnull align 8 {{.*}}, i8 0, i64 40, i1 false) void test_memset_private(private StructTy3 *ptr) { StructTy3 S3 = {0, 0, 0, 0, 0}; *ptr = S3; Index: test/CodeGen/tbaa-struct.cpp === --- test/CodeGen/tbaa-struct.cpp +++ test/CodeGen/tbaa-struct.cpp @@ -17,7 +17,7 @@ void copy(A *a1, A *a2) { // CHECK-LABEL: _Z4copyP1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_A:![0-9]*]] *a1 = *a2; @@ -31,7 +31,7 @@ void copy2(B *b1, B *b2) { // CHECK-LABEL: _Z5copy2P1BS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 24, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 24, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS2:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_B:![0-9]*]] *b1 = *b2; @@ -49,7 +49,7 @@ void copy3(U *u1, U *u2) { // CHECK-LABEL: _Z5copy3P1US0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 12, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 12, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS3:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_U:![0-9]*]] *u1 = *u2; @@ -65,7 +65,7 @@ void copy4(C *c1, C *c2) { // CHECK-LABEL: _Z5copy4P1CS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* {{.*}}, i64 3, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull {{.*}}, i8* nonnull {{.*}}, i64 3, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS4:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_C:![0-9]*]] *c1 = *c2; @@ -80,23 +80,23 @@ void copy5(D *d1, D *d2) { // CHECK-LABEL: _Z5copy5P1DS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* {{.*}}, i64 6, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull {{.*}}, i8* nonnull {{.*}}, i64 6, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS5:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_D:![0-9]*]] *d1 = *d2; } void copy6(AA *a1, A *a2) { // CHECK-LABEL: _Z5copy6P1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS]] // CHECK-NEW-SAME: !tbaa [[TAG_char:![0-9]*]] *a1 = *a2; } void copy7(A *a1, AA *a2) { // CHECK-LABEL: _Z5copy7P1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS]] // CHECK-NEW-SAME: !tbaa [[TAG_char]] *a1 = *a2; Index: test/CodeGenOpenCL/amdgpu-nullptr.cl === --- test/CodeGenOpenCL/amdgpu-nullptr.cl +++ test/CodeGenOpenCL/amdgpu-nullptr.cl @@ -510,7 +510,7 @@ } StructTy3; // CHECK-LABEL: test_memset_private -// CHECK: call void @llvm.memset.p5i8.i64(i8 addrspace(5)* align 8 {{.*}}, i8 0, i64 40, i1 false) +// CHECK: call void @llvm.memset.p5i8.i64(i8 addrspace(5)* nonnull align 8 {{.*}}, i8 0, i64 40, i1 false) void test_memset_private(private StructTy3 *ptr) { StructTy3 S3 = {0, 0, 0, 0, 0}; *ptr = S3; Index: test/CodeGen/tbaa-struct.cpp === --- test/CodeGen/tbaa-struct.cpp +++ test/CodeGen/tbaa-struct.cpp @@ -17,7 +17,7 @@ void copy(A *a1, A *a2) { // CHECK-LABEL: _Z4copyP1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_A:![0-9]*]] *a1 = *a2; @@ -31,7 +31,7 @@ void copy2(B *b1, B *b2) { // CHECK-LABE
[PATCH] D53666: [Tests] Updated tests for D53342
xbolva00 added inline comments. Comment at: test/CodeGenOpenCL/amdgpu-nullptr.cl:513 // CHECK-LABEL: test_memset_private -// CHECK: call void @llvm.memset.p5i8.i64(i8 addrspace(5)* align 8 {{.*}}, i8 0, i64 40, i1 false) +// CHECK: call void @llvm.memset.p5i8.i64(i8 addrspace(5)* nonnull align 8 {{.*}}, i8 0, i64 40, i1 false) void test_memset_private(private StructTy3 *ptr) { efriedma wrote: > This shouldn't change. "null" pointers are potentially valid in non-zero > address-spaces. (Sorry, I should have spotted this sooner.) Thanks, I will fix this case. Repository: rC Clang https://reviews.llvm.org/D53666 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D53666: [Tests] Updated tests for D53342
xbolva00 updated this revision to Diff 170963. https://reviews.llvm.org/D53666 Files: test/CodeGen/tbaa-struct.cpp Index: test/CodeGen/tbaa-struct.cpp === --- test/CodeGen/tbaa-struct.cpp +++ test/CodeGen/tbaa-struct.cpp @@ -17,7 +17,7 @@ void copy(A *a1, A *a2) { // CHECK-LABEL: _Z4copyP1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_A:![0-9]*]] *a1 = *a2; @@ -31,7 +31,7 @@ void copy2(B *b1, B *b2) { // CHECK-LABEL: _Z5copy2P1BS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 24, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 24, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS2:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_B:![0-9]*]] *b1 = *b2; @@ -49,7 +49,7 @@ void copy3(U *u1, U *u2) { // CHECK-LABEL: _Z5copy3P1US0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 12, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 12, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS3:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_U:![0-9]*]] *u1 = *u2; @@ -65,7 +65,7 @@ void copy4(C *c1, C *c2) { // CHECK-LABEL: _Z5copy4P1CS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* {{.*}}, i64 3, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull {{.*}}, i8* nonnull {{.*}}, i64 3, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS4:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_C:![0-9]*]] *c1 = *c2; @@ -80,23 +80,23 @@ void copy5(D *d1, D *d2) { // CHECK-LABEL: _Z5copy5P1DS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* {{.*}}, i64 6, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull {{.*}}, i8* nonnull {{.*}}, i64 6, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS5:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_D:![0-9]*]] *d1 = *d2; } void copy6(AA *a1, A *a2) { // CHECK-LABEL: _Z5copy6P1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS]] // CHECK-NEW-SAME: !tbaa [[TAG_char:![0-9]*]] *a1 = *a2; } void copy7(A *a1, AA *a2) { // CHECK-LABEL: _Z5copy7P1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS]] // CHECK-NEW-SAME: !tbaa [[TAG_char]] *a1 = *a2; Index: test/CodeGen/tbaa-struct.cpp === --- test/CodeGen/tbaa-struct.cpp +++ test/CodeGen/tbaa-struct.cpp @@ -17,7 +17,7 @@ void copy(A *a1, A *a2) { // CHECK-LABEL: _Z4copyP1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_A:![0-9]*]] *a1 = *a2; @@ -31,7 +31,7 @@ void copy2(B *b1, B *b2) { // CHECK-LABEL: _Z5copy2P1BS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 24, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 24, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS2:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_B:![0-9]*]] *b1 = *b2; @@ -49,7 +49,7 @@ void copy3(U *u1, U *u2) { // CHECK-LABEL: _Z5copy3P1US0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 12, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 12, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS3:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_U:![0-9]*]] *u1 = *u2; @@ -65,7 +65,7 @@ void copy4(C *c1, C *c2) { // CHECK-LABEL: _Z5copy4P1CS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* {{.*}}, i64 3, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull {{.*}}, i8* nonnull {{.*}}, i64 3, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS4:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_C:![0-9]*]] *c1 = *c2; @@ -80,23 +80,23 @@ void copy5(D *d1, D *d2) { // CHECK-LABEL: _Z5copy5P1DS0_ -// CHECK: call void @llvm.memcpy
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. ping https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. Ping @MTC or @rsmith https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. Any ideas for better warning message? Except for the warning text, I see this patch as ready. https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D53666: [Tests] Updated tests for D53342
xbolva00 updated this revision to Diff 171906. https://reviews.llvm.org/D53666 Files: lib/CodeGen/SelectionDAG/DAGCombiner.cpp test/CodeGen/X86/combine-sdiv.ll test/CodeGen/X86/combine-srem.ll test/CodeGen/X86/combine-udiv.ll test/CodeGen/X86/combine-urem.ll Index: test/CodeGen/X86/combine-urem.ll === --- test/CodeGen/X86/combine-urem.ll +++ test/CodeGen/X86/combine-urem.ll @@ -89,69 +89,25 @@ ret <4 x i32> %1 } -; TODO fold (urem 0, x) -> 0 +; fold (urem 0, x) -> 0 define i32 @combine_urem_zero(i32 %x) { ; CHECK-LABEL: combine_urem_zero: ; CHECK: # %bb.0: ; CHECK-NEXT:xorl %eax, %eax -; CHECK-NEXT:xorl %edx, %edx -; CHECK-NEXT:divl %edi -; CHECK-NEXT:movl %edx, %eax ; CHECK-NEXT:retq %1 = urem i32 0, %x ret i32 %1 } define <4 x i32> @combine_vec_urem_zero(<4 x i32> %x) { ; SSE-LABEL: combine_vec_urem_zero: ; SSE: # %bb.0: -; SSE-NEXT:pextrd $1, %xmm0, %ecx -; SSE-NEXT:xorl %eax, %eax -; SSE-NEXT:xorl %edx, %edx -; SSE-NEXT:divl %ecx -; SSE-NEXT:movl %edx, %ecx -; SSE-NEXT:movd %xmm0, %esi -; SSE-NEXT:xorl %eax, %eax -; SSE-NEXT:xorl %edx, %edx -; SSE-NEXT:divl %esi -; SSE-NEXT:movd %edx, %xmm1 -; SSE-NEXT:pinsrd $1, %ecx, %xmm1 -; SSE-NEXT:pextrd $2, %xmm0, %ecx -; SSE-NEXT:xorl %eax, %eax -; SSE-NEXT:xorl %edx, %edx -; SSE-NEXT:divl %ecx -; SSE-NEXT:pinsrd $2, %edx, %xmm1 -; SSE-NEXT:pextrd $3, %xmm0, %ecx -; SSE-NEXT:xorl %eax, %eax -; SSE-NEXT:xorl %edx, %edx -; SSE-NEXT:divl %ecx -; SSE-NEXT:pinsrd $3, %edx, %xmm1 -; SSE-NEXT:movdqa %xmm1, %xmm0 +; SSE-NEXT:xorps %xmm0, %xmm0 ; SSE-NEXT:retq ; ; AVX-LABEL: combine_vec_urem_zero: ; AVX: # %bb.0: -; AVX-NEXT:vpextrd $1, %xmm0, %ecx -; AVX-NEXT:xorl %eax, %eax -; AVX-NEXT:xorl %edx, %edx -; AVX-NEXT:divl %ecx -; AVX-NEXT:movl %edx, %ecx -; AVX-NEXT:vmovd %xmm0, %esi -; AVX-NEXT:xorl %eax, %eax -; AVX-NEXT:xorl %edx, %edx -; AVX-NEXT:divl %esi -; AVX-NEXT:vmovd %edx, %xmm1 -; AVX-NEXT:vpinsrd $1, %ecx, %xmm1, %xmm1 -; AVX-NEXT:vpextrd $2, %xmm0, %ecx -; AVX-NEXT:xorl %eax, %eax -; AVX-NEXT:xorl %edx, %edx -; AVX-NEXT:divl %ecx -; AVX-NEXT:vpinsrd $2, %edx, %xmm1, %xmm1 -; AVX-NEXT:vpextrd $3, %xmm0, %ecx -; AVX-NEXT:xorl %eax, %eax -; AVX-NEXT:xorl %edx, %edx -; AVX-NEXT:divl %ecx -; AVX-NEXT:vpinsrd $3, %edx, %xmm1, %xmm0 +; AVX-NEXT:vxorps %xmm0, %xmm0, %xmm0 ; AVX-NEXT:retq %1 = urem <4 x i32> zeroinitializer, %x ret <4 x i32> %1 Index: test/CodeGen/X86/combine-udiv.ll === --- test/CodeGen/X86/combine-udiv.ll +++ test/CodeGen/X86/combine-udiv.ll @@ -90,124 +90,30 @@ ret <4 x i32> %1 } -; TODO fold (udiv 0, x) -> 0 +; fold (udiv 0, x) -> 0 define i32 @combine_udiv_zero(i32 %x) { ; CHECK-LABEL: combine_udiv_zero: ; CHECK: # %bb.0: ; CHECK-NEXT:xorl %eax, %eax -; CHECK-NEXT:xorl %edx, %edx -; CHECK-NEXT:divl %edi ; CHECK-NEXT:retq %1 = udiv i32 0, %x ret i32 %1 } define <4 x i32> @combine_vec_udiv_zero(<4 x i32> %x) { -; SSE2-LABEL: combine_vec_udiv_zero: -; SSE2: # %bb.0: -; SSE2-NEXT:pshufd {{.*#+}} xmm1 = xmm0[3,1,2,3] -; SSE2-NEXT:movd %xmm1, %ecx -; SSE2-NEXT:xorl %eax, %eax -; SSE2-NEXT:xorl %edx, %edx -; SSE2-NEXT:divl %ecx -; SSE2-NEXT:movd %eax, %xmm1 -; SSE2-NEXT:pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1] -; SSE2-NEXT:movd %xmm2, %ecx -; SSE2-NEXT:xorl %eax, %eax -; SSE2-NEXT:xorl %edx, %edx -; SSE2-NEXT:divl %ecx -; SSE2-NEXT:movd %eax, %xmm2 -; SSE2-NEXT:punpckldq {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1] -; SSE2-NEXT:movd %xmm0, %ecx -; SSE2-NEXT:xorl %eax, %eax -; SSE2-NEXT:xorl %edx, %edx -; SSE2-NEXT:divl %ecx -; SSE2-NEXT:movd %eax, %xmm1 -; SSE2-NEXT:pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] -; SSE2-NEXT:movd %xmm0, %ecx -; SSE2-NEXT:xorl %eax, %eax -; SSE2-NEXT:xorl %edx, %edx -; SSE2-NEXT:divl %ecx -; SSE2-NEXT:movd %eax, %xmm0 -; SSE2-NEXT:punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] -; SSE2-NEXT:punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] -; SSE2-NEXT:movdqa %xmm1, %xmm0 -; SSE2-NEXT:retq +; SSE-LABEL: combine_vec_udiv_zero: +; SSE: # %bb.0: +; SSE-NEXT:xorps %xmm0, %xmm0 +; SSE-NEXT:retq ; -; SSE41-LABEL: combine_vec_udiv_zero: -; SSE41: # %bb.0: -; SSE41-NEXT:pextrd $1, %xmm0, %ecx -; SSE41-NEXT:xorl %eax, %eax -; SSE41-NEXT:xorl %edx, %edx -; SSE41-NEXT:divl %ecx -; SSE41-NEXT:movl %eax, %ecx -; SSE41-NEXT:movd %xmm0, %esi -; SSE41-NEXT:xorl %eax, %eax -; SSE41-NEXT:xorl %edx, %edx -; SSE41-NEXT:divl %esi -; SSE41-NEXT:movd %eax, %xmm1 -; SSE41-NEXT:pinsrd $1, %ecx, %xmm1 -; SSE41-NEXT:pextrd $2, %xmm0, %
[PATCH] D53666: [Tests] Updated tests for D53342
xbolva00 updated this revision to Diff 171908. https://reviews.llvm.org/D53666 Files: test/CodeGen/tbaa-struct.cpp Index: test/CodeGen/tbaa-struct.cpp === --- test/CodeGen/tbaa-struct.cpp +++ test/CodeGen/tbaa-struct.cpp @@ -17,7 +17,7 @@ void copy(A *a1, A *a2) { // CHECK-LABEL: _Z4copyP1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_A:![0-9]*]] *a1 = *a2; @@ -31,7 +31,7 @@ void copy2(B *b1, B *b2) { // CHECK-LABEL: _Z5copy2P1BS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 24, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 24, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS2:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_B:![0-9]*]] *b1 = *b2; @@ -49,7 +49,7 @@ void copy3(U *u1, U *u2) { // CHECK-LABEL: _Z5copy3P1US0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 12, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 12, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS3:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_U:![0-9]*]] *u1 = *u2; @@ -65,7 +65,7 @@ void copy4(C *c1, C *c2) { // CHECK-LABEL: _Z5copy4P1CS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* {{.*}}, i64 3, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull {{.*}}, i8* nonnull {{.*}}, i64 3, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS4:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_C:![0-9]*]] *c1 = *c2; @@ -80,23 +80,23 @@ void copy5(D *d1, D *d2) { // CHECK-LABEL: _Z5copy5P1DS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* {{.*}}, i8* {{.*}}, i64 6, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull {{.*}}, i8* nonnull {{.*}}, i64 6, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS5:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_D:![0-9]*]] *d1 = *d2; } void copy6(AA *a1, A *a2) { // CHECK-LABEL: _Z5copy6P1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS]] // CHECK-NEW-SAME: !tbaa [[TAG_char:![0-9]*]] *a1 = *a2; } void copy7(A *a1, AA *a2) { // CHECK-LABEL: _Z5copy7P1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS]] // CHECK-NEW-SAME: !tbaa [[TAG_char]] *a1 = *a2; @@ -126,4 +126,4 @@ // CHECK-NEW-DAG: [[TYPE_C:!.*]] = !{[[TYPE_char]], i64 3, !"_ZTS1C", [[TYPE_char]], i64 0, i64 1, [[TYPE_int]], i64 1, i64 4, [[TYPE_char]], i64 1, i64 1, [[TYPE_char]], i64 2, i64 1} // CHECK-NEW-DAG: [[TAG_C]] = !{[[TYPE_C]], [[TYPE_C]], i64 0, i64 3} // CHECK-NEW-DAG: [[TYPE_D:!.*]] = !{[[TYPE_char]], i64 6, !"_ZTS1D", [[TYPE_char]], i64 0, i64 1, [[TYPE_int]], i64 4, i64 4, [[TYPE_char]], i64 4, i64 1, [[TYPE_char]], i64 5, i64 1} -// CHECK-NEW-DAG: [[TAG_D]] = !{[[TYPE_D]], [[TYPE_D]], i64 0, i64 6} +// CHECK-NEW-DAG: [[TAG_D]] = !{[[TYPE_D]], [[TYPE_D]], i64 0, i64 6} \ No newline at end of file Index: test/CodeGen/tbaa-struct.cpp === --- test/CodeGen/tbaa-struct.cpp +++ test/CodeGen/tbaa-struct.cpp @@ -17,7 +17,7 @@ void copy(A *a1, A *a2) { // CHECK-LABEL: _Z4copyP1AS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 16, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 16, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_A:![0-9]*]] *a1 = *a2; @@ -31,7 +31,7 @@ void copy2(B *b1, B *b2) { // CHECK-LABEL: _Z5copy2P1BS0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 24, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* nonnull align 4 %{{.*}}, i64 24, i1 false) // CHECK-OLD-SAME: !tbaa.struct [[TS2:!.*]] // CHECK-NEW-SAME: !tbaa [[TAG_B:![0-9]*]] *b1 = *b2; @@ -49,7 +49,7 @@ void copy3(U *u1, U *u2) { // CHECK-LABEL: _Z5copy3P1US0_ -// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 %{{.*}}, i8* align 4 %{{.*}}, i64 12, i1 false) +// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 4 %{{.*}}, i8* n
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 updated this revision to Diff 171920. xbolva00 added a reviewer: MTC. xbolva00 added a comment. - New warning text, added another test line https://reviews.llvm.org/D52949 Files: include/clang/Basic/DiagnosticGroups.td include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExpr.cpp test/Sema/div-sizeof-ptr.c Index: test/Sema/div-sizeof-ptr.c === --- test/Sema/div-sizeof-ptr.c +++ test/Sema/div-sizeof-ptr.c @@ -0,0 +1,14 @@ +// RUN: %clang_cc1 %s -verify -Wsizeof-pointer-div -fsyntax-only + +void test(int *p, int **q) { +int a1 = sizeof(p) / sizeof(*p); // expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} +int a2 = sizeof p / sizeof *p;// expected-warning {{'sizeof p' will return the size of the pointer, not the array itself}} +int a3 = sizeof(*q) / sizeof(**q);// expected-warning {{'sizeof (*q)' will return the size of the pointer, not the array itself}} +int a4 = sizeof(p) / sizeof(int); // expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} +int a5 = sizeof(p) / sizeof(p[0]);// expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} + +int b1 = sizeof(int *) / sizeof(int); +int b2 = sizeof(p) / sizeof(p); +int b3 = sizeof(*q) / sizeof(q); +int b4 = sizeof(p) / sizeof(char); +} Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -8726,6 +8726,37 @@ << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); } +static void DiagnoseDivisionSizeofPointer(Sema &S, Expr *LHS, Expr *RHS, + SourceLocation Loc) { + UnaryExprOrTypeTraitExpr *LUE = + dyn_cast_or_null(LHS); + UnaryExprOrTypeTraitExpr *RUE = + dyn_cast_or_null(RHS); + + if (!LUE || !RUE) +return; + if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() || + RUE->getKind() != UETT_SizeOf) +return; + + QualType LHSTy; + QualType RHSTy; + LHSTy = LUE->getArgumentExpr()->IgnoreParens()->getType(); + + if (RUE->isArgumentType()) { +RHSTy = RUE->getArgumentType(); + } else { +RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType(); + } + + if (!LHSTy->isPointerType() || RHSTy->isPointerType()) +return; + if (LHSTy->getPointeeType() != RHSTy) +return; + + S.Diag(Loc, diag::warn_division_sizeof_ptr) << LHS << LHS->getSourceRange(); +} + static void DiagnoseBadDivideOrRemainderValues(Sema& S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsDiv) { @@ -8756,8 +8787,10 @@ if (compType.isNull() || !compType->isArithmeticType()) return InvalidOperands(Loc, LHS, RHS); - if (IsDiv) + if (IsDiv) { DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, IsDiv); +DiagnoseDivisionSizeofPointer(*this, LHS.get(), RHS.get(), Loc); + } return compType; } @@ -16599,4 +16632,4 @@ return new (Context) ObjCAvailabilityCheckExpr(Version, AtLoc, RParen, Context.BoolTy); -} +} \ No newline at end of file Index: include/clang/Basic/DiagnosticSemaKinds.td === --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -3294,6 +3294,10 @@ InGroup; def note_reference_is_return_value : Note<"%0 returns a reference">; +def warn_division_sizeof_ptr : Warning< + "'%0' will return the size of the pointer, not the array itself">, + InGroup, DefaultIgnore; + def note_function_warning_silence : Note< "prefix with the address-of operator to silence this warning">; def note_function_to_function_call : Note< Index: include/clang/Basic/DiagnosticGroups.td === --- include/clang/Basic/DiagnosticGroups.td +++ include/clang/Basic/DiagnosticGroups.td @@ -144,6 +144,7 @@ def : DiagGroup<"discard-qual">; def DivZero : DiagGroup<"division-by-zero">; def : DiagGroup<"div-by-zero", [DivZero]>; +def DivSizeofPtr : DiagGroup<"sizeof-pointer-div">; def DocumentationHTML : DiagGroup<"documentation-html">; def DocumentationUnknownCommand : DiagGroup<"documentation-unknown-command">; @@ -789,6 +790,7 @@ SelfMove, SizeofArrayArgument, SizeofArrayDecay, +DivSizeofPtr, StringPlusInt, Trigraphs, Uninitialized, ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Ping Anything else to be done here? I would like to finish this patch to work on other things. https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D45444: [clang-tidy] implement new check for const-correctness
xbolva00 added a comment. Are you still looking at this? Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D45444 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 updated this revision to Diff 172117. xbolva00 marked 5 inline comments as done. https://reviews.llvm.org/D52949 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaExpr.cpp test/Sema/div-sizeof-ptr.cpp Index: test/Sema/div-sizeof-ptr.cpp === --- test/Sema/div-sizeof-ptr.cpp +++ test/Sema/div-sizeof-ptr.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 %s -verify -Wsizeof-pointer-div -fsyntax-only + +template +int f(Ty (&Array)[N]) { + return sizeof(Array) / sizeof(Ty); // Should not warn +} + +void test(int *p, int **q) { +int a1 = sizeof(p) / sizeof(*p); // expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} +int a2 = sizeof p / sizeof *p;// expected-warning {{'sizeof p' will return the size of the pointer, not the array itself}} +int a3 = sizeof(*q) / sizeof(**q);// expected-warning {{'sizeof (*q)' will return the size of the pointer, not the array itself}} +int a4 = sizeof(p) / sizeof(int); // expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} +int a5 = sizeof(p) / sizeof(p[0]);// expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} + +// Should not warn +int b1 = sizeof(int *) / sizeof(int); +int b2 = sizeof(p) / sizeof(p); +int b3 = sizeof(*q) / sizeof(q); +int b4 = sizeof(p) / sizeof(char); + +int arr[10]; +int b5 = sizeof(arr) / sizeof(*arr); +int b6 = sizeof(arr) / sizeof(arr[0]); +int b7 = sizeof(arr) / sizeof(int); + +int arr2[10][12]; +int b8 = sizeof(arr2) / sizeof(*arr2); +} Index: lib/Sema/SemaExpr.cpp === --- lib/Sema/SemaExpr.cpp +++ lib/Sema/SemaExpr.cpp @@ -8726,6 +8726,32 @@ << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); } +static void DiagnoseDivisionSizeofPointer(Sema &S, Expr *LHS, Expr *RHS, + SourceLocation Loc) { + const auto *LUE = dyn_cast(LHS); + const auto *RUE = dyn_cast(RHS); + if (!LUE || !RUE) +return; + if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() || + RUE->getKind() != UETT_SizeOf) +return; + + QualType LHSTy = LUE->getArgumentExpr()->IgnoreParens()->getType(); + QualType RHSTy; + + if (RUE->isArgumentType()) +RHSTy = RUE->getArgumentType(); + else +RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType(); + + if (!LHSTy->isPointerType() || RHSTy->isPointerType()) +return; + if (LHSTy->getPointeeType() != RHSTy) +return; + + S.Diag(Loc, diag::warn_division_sizeof_ptr) << LHS << LHS->getSourceRange(); +} + static void DiagnoseBadDivideOrRemainderValues(Sema& S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsDiv) { @@ -8756,8 +8782,10 @@ if (compType.isNull() || !compType->isArithmeticType()) return InvalidOperands(Loc, LHS, RHS); - if (IsDiv) + if (IsDiv) { DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, IsDiv); +DiagnoseDivisionSizeofPointer(*this, LHS.get(), RHS.get(), Loc); + } return compType; } @@ -16599,4 +16627,4 @@ return new (Context) ObjCAvailabilityCheckExpr(Version, AtLoc, RParen, Context.BoolTy); -} +} \ No newline at end of file Index: include/clang/Basic/DiagnosticSemaKinds.td === --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -3294,6 +3294,10 @@ InGroup; def note_reference_is_return_value : Note<"%0 returns a reference">; +def warn_division_sizeof_ptr : Warning< + "'%0' will return the size of the pointer, not the array itself">, + InGroup>; + def note_function_warning_silence : Note< "prefix with the address-of operator to silence this warning">; def note_function_to_function_call : Note< ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
xbolva00 added a comment. - Addressed review comments. We match the GCC behaviour here, except the case: int b1 = sizeof(int *) / sizeof(int); But I think it is ok now. Comment at: lib/Sema/SemaExpr.cpp:8729 +static void DiagnoseDivisionSizeofPointer(Sema &S, Expr *LHS, Expr *RHS, + SourceLocation Loc) { aaron.ballman wrote: > `const Expr *` if const, i have build issues with "<< LHS" https://reviews.llvm.org/D52949 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. maybe @aaron.ballman wants to take a look too https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52949: [Diagnostics] Implement -Wsizeof-pointer-div
This revision was automatically updated to reflect the committed changes. Closed by commit rL345847: [Diagnostics] Implement -Wsizeof-pointer-div (authored by xbolva00, committed by ). Herald added a subscriber: llvm-commits. Changed prior to commit: https://reviews.llvm.org/D52949?vs=172117&id=172148#toc Repository: rL LLVM https://reviews.llvm.org/D52949 Files: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/Sema/div-sizeof-ptr.cpp Index: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td === --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td @@ -3294,6 +3294,10 @@ InGroup; def note_reference_is_return_value : Note<"%0 returns a reference">; +def warn_division_sizeof_ptr : Warning< + "'%0' will return the size of the pointer, not the array itself">, + InGroup>; + def note_function_warning_silence : Note< "prefix with the address-of operator to silence this warning">; def note_function_to_function_call : Note< Index: cfe/trunk/test/Sema/div-sizeof-ptr.cpp === --- cfe/trunk/test/Sema/div-sizeof-ptr.cpp +++ cfe/trunk/test/Sema/div-sizeof-ptr.cpp @@ -0,0 +1,28 @@ +// RUN: %clang_cc1 %s -verify -Wsizeof-pointer-div -fsyntax-only + +template +int f(Ty (&Array)[N]) { + return sizeof(Array) / sizeof(Ty); // Should not warn +} + +void test(int *p, int **q) { + int a1 = sizeof(p) / sizeof(*p); // expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} + int a2 = sizeof p / sizeof *p; // expected-warning {{'sizeof p' will return the size of the pointer, not the array itself}} + int a3 = sizeof(*q) / sizeof(**q); // expected-warning {{'sizeof (*q)' will return the size of the pointer, not the array itself}} + int a4 = sizeof(p) / sizeof(int); // expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} + int a5 = sizeof(p) / sizeof(p[0]); // expected-warning {{'sizeof (p)' will return the size of the pointer, not the array itself}} + + // Should not warn + int b1 = sizeof(int *) / sizeof(int); + int b2 = sizeof(p) / sizeof(p); + int b3 = sizeof(*q) / sizeof(q); + int b4 = sizeof(p) / sizeof(char); + + int arr[10]; + int b5 = sizeof(arr) / sizeof(*arr); + int b6 = sizeof(arr) / sizeof(arr[0]); + int b7 = sizeof(arr) / sizeof(int); + + int arr2[10][12]; + int b8 = sizeof(arr2) / sizeof(*arr2); +} Index: cfe/trunk/lib/Sema/SemaExpr.cpp === --- cfe/trunk/lib/Sema/SemaExpr.cpp +++ cfe/trunk/lib/Sema/SemaExpr.cpp @@ -8726,6 +8726,32 @@ << LHS.get()->getSourceRange() << RHS.get()->getSourceRange(); } +static void DiagnoseDivisionSizeofPointer(Sema &S, Expr *LHS, Expr *RHS, + SourceLocation Loc) { + const auto *LUE = dyn_cast(LHS); + const auto *RUE = dyn_cast(RHS); + if (!LUE || !RUE) +return; + if (LUE->getKind() != UETT_SizeOf || LUE->isArgumentType() || + RUE->getKind() != UETT_SizeOf) +return; + + QualType LHSTy = LUE->getArgumentExpr()->IgnoreParens()->getType(); + QualType RHSTy; + + if (RUE->isArgumentType()) +RHSTy = RUE->getArgumentType(); + else +RHSTy = RUE->getArgumentExpr()->IgnoreParens()->getType(); + + if (!LHSTy->isPointerType() || RHSTy->isPointerType()) +return; + if (LHSTy->getPointeeType() != RHSTy) +return; + + S.Diag(Loc, diag::warn_division_sizeof_ptr) << LHS << LHS->getSourceRange(); +} + static void DiagnoseBadDivideOrRemainderValues(Sema& S, ExprResult &LHS, ExprResult &RHS, SourceLocation Loc, bool IsDiv) { @@ -8756,8 +8782,10 @@ if (compType.isNull() || !compType->isArithmeticType()) return InvalidOperands(Loc, LHS, RHS); - if (IsDiv) + if (IsDiv) { DiagnoseBadDivideOrRemainderValues(*this, LHS, RHS, Loc, IsDiv); +DiagnoseDivisionSizeofPointer(*this, LHS.get(), RHS.get(), Loc); + } return compType; } @@ -16603,4 +16631,4 @@ return new (Context) ObjCAvailabilityCheckExpr(Version, AtLoc, RParen, Context.BoolTy); -} +} \ No newline at end of file ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Since I don't think we have any false positives here, maybe it would be useful to add it to -Wall or -Wextra? https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 updated this revision to Diff 172509. https://reviews.llvm.org/D52835 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaChecking.cpp test/Sema/ext_vector_casts.c test/Sema/impcast-integer-float.c Index: test/Sema/impcast-integer-float.c === --- test/Sema/impcast-integer-float.c +++ test/Sema/impcast-integer-float.c @@ -0,0 +1,25 @@ +// RUN: %clang_cc1 %s -verify -Wfloat-precision -fsyntax-only + +#define shift_plus_one(x) ((1ULL << x) + 1) + +void test(void) { +float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a2 = 1ULL << 31; +float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} + +double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b2 = 1ULL << 63; +double b3 = shift_plus_one(63); // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b4 = (1ULL << 63) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775807 to 9.223372036854775E+18}} + +long double c1 = ((__int128)1 << 127) + 1; // expected-warning {{implicit conversion from '__int128' to 'long double' changes value from -170141183460469231731687303715884105727 to -1.7014118346046923173E+38}} +long double c2 = (__int128)1 << 127; + +_Float16 d1 = (1ULL << 15) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d2 = 1ULL << 15; +_Float16 d3 = shift_plus_one(15); // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d4 = (1ULL << 15) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32767 to 3.277E+4}} + +float e = (__uint128_t)-1; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'float' changes value from 340282366920938463463374607431768211455 to +Inf}} +} Index: test/Sema/ext_vector_casts.c === --- test/Sema/ext_vector_casts.c +++ test/Sema/ext_vector_casts.c @@ -118,7 +118,7 @@ vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0x; + vf = vf + 0x; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4.2949673E+9}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd; Index: lib/Sema/SemaChecking.cpp === --- lib/Sema/SemaChecking.cpp +++ lib/Sema/SemaChecking.cpp @@ -105,6 +105,19 @@ Context.getTargetInfo()); } +// FIXME: Force the precision of the source value down so we don't print +// digits which are usually useless (we don't really care here if we +// truncate a digit by accident in edge cases). Ideally, APFloat::toString +// would automatically print the shortest representation, but it's a bit +// tricky to implement. +static void PrettyPrintFloat(const llvm::APFloat &floatValue, + const llvm::fltSemantics &floatSem, + SmallVectorImpl &prettyFloatValue) { + unsigned precision = llvm::APFloat::semanticsPrecision(floatSem); + precision = llvm::divideCeil(precision * 59, 196); + floatValue.toString(prettyFloatValue, precision); +} + /// Checks that a call expression's argument count is the desired number. /// This is useful when doing custom type-checking. Returns true on error. static bool checkArgCount(Sema &S, CallExpr *call, unsigned desiredArgCount) { @@ -10467,15 +10480,8 @@ DiagID = diag::warn_impcast_float_to_integer; } - // FIXME: Force the precision of the source value down so we don't print - // digits which are usually useless (we don't really care here if we - // truncate a digit by accident in edge cases). Ideally, APFloat::toString - // would automatically print the shortest representation, but it's a bit - // tricky to implement. SmallString<16> PrettySourceValue; - unsigned precision = llvm::APFloat::semanticsPrecision(Value.getSemantics()); - precision = (precision * 59 + 195
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Ping :) https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. @aaron.ballman https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Since no futher comments, i think it is ok. After day or two I will commit it. https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
This revision was automatically updated to reflect the committed changes. Closed by commit rC346865: [Diagnostics] Check integer to floating point number implicit conversions (authored by xbolva00, committed by ). Changed prior to commit: https://reviews.llvm.org/D52835?vs=172509&id=174030#toc Repository: rC Clang https://reviews.llvm.org/D52835 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaChecking.cpp test/Sema/ext_vector_casts.c test/Sema/impcast-integer-float.c Index: include/clang/Basic/DiagnosticSemaKinds.td === --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -3229,6 +3229,10 @@ "implicit conversion turns floating-point number into integer: %0 to %1">, InGroup, DefaultIgnore; +def warn_impcast_precision_float_to_integer : Warning< + "implicit conversion from %0 to %1 changes value from %2 to %3">, + InGroup>; + def warn_impcast_float_to_integer : Warning< "implicit conversion from %0 to %1 changes value from %2 to %3">, InGroup, DefaultIgnore; Index: test/Sema/ext_vector_casts.c === --- test/Sema/ext_vector_casts.c +++ test/Sema/ext_vector_casts.c @@ -118,7 +118,7 @@ vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0x; + vf = vf + 0x; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4.2949673E+9}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd; Index: test/Sema/impcast-integer-float.c === --- test/Sema/impcast-integer-float.c +++ test/Sema/impcast-integer-float.c @@ -0,0 +1,50 @@ +// RUN: %clang_cc1 %s -verify -Wfloat-precision -fsyntax-only + +#define shift_plus_one(x) ((1ULL << x) + 1) + +void test(void) { +float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a2 = 1ULL << 31; +float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} + +double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b2 = 1ULL << 63; +double b3 = shift_plus_one(63); // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b4 = (1ULL << 63) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775807 to 9.223372036854775E+18}} + +long double c1 = ((__int128)1 << 127) + 1; // expected-warning {{implicit conversion from '__int128' to 'long double' changes value from -170141183460469231731687303715884105727 to -1.7014118346046923173E+38}} +long double c2 = (__int128)1 << 127; + +_Float16 d1 = (1ULL << 15) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d2 = 1ULL << 15; +_Float16 d3 = shift_plus_one(15); // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32769 to 3.277E+4}} +_Float16 d4 = (1ULL << 15) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to '_Float16' changes value from 32767 to 3.277E+4}} + +float e = (__uint128_t)-1; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'float' changes value from 340282366920938463463374607431768211455 to +Inf}} +} +// RUN: %clang_cc1 %s -verify -Wfloat-precision -fsyntax-only + +#define shift_plus_one(x) ((1ULL << x) + 1) + +void test(void) { +float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a2 = 1ULL << 31; +float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} + +double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b2
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. Ok, I will address your comments soon. Repository: rC Clang https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 updated this revision to Diff 174505. xbolva00 added a comment. Addressed comments, fixed tests https://reviews.llvm.org/D52835 Files: include/clang/Basic/DiagnosticSemaKinds.td lib/Sema/SemaChecking.cpp test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp test/Sema/ext_vector_casts.c test/Sema/impcast-integer-float.c Index: test/Sema/impcast-integer-float.c === --- test/Sema/impcast-integer-float.c +++ test/Sema/impcast-integer-float.c @@ -0,0 +1,20 @@ +// RUN: %clang_cc1 %s -verify -Wfloat-precision -triple x86_64-linux -fsyntax-only + +#define shift_plus_one(x) ((1ULL << x) + 1) + +void test(void) { +float a1 = (1ULL << 31) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a2 = 1ULL << 31; +float a3 = shift_plus_one(31); // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483649 to 2.1474836E+9}} +float a4 = (1ULL << 31) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'float' changes value from 2147483647 to 2.1474836E+9}} + +double b1 = (1ULL << 63) + 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b2 = 1ULL << 63; +double b3 = shift_plus_one(63); // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775809 to 9.223372036854775E+18}} +double b4 = (1ULL << 63) - 1; // expected-warning {{implicit conversion from 'unsigned long long' to 'double' changes value from 9223372036854775807 to 9.223372036854775E+18}} + +long double c1 = ((__int128)1 << 127) + 1; // expected-warning {{implicit conversion from '__int128' to 'long double' changes value from -170141183460469231731687303715884105727 to -1.7014118346046923173E+38}} +long double c2 = (__int128)1 << 127; + +float d = (__uint128_t)-1; // expected-warning {{implicit conversion from '__uint128_t' (aka 'unsigned __int128') to 'float' changes value from 340282366920938463463374607431768211455 to +Inf}} +} Index: test/Sema/ext_vector_casts.c === --- test/Sema/ext_vector_casts.c +++ test/Sema/ext_vector_casts.c @@ -118,7 +118,7 @@ vf = l + vf; vf = 2.0 + vf; vf = d + vf; // expected-warning {{implicit conversion loses floating-point precision}} - vf = vf + 0x; + vf = vf + 0x; // expected-warning {{implicit conversion from 'unsigned int' to 'float2' (vector of 2 'float' values) changes value from 4294967295 to 4.2949673E+9}} vf = vf + 2.1; // expected-warning {{implicit conversion loses floating-point precision}} vd = l + vd; Index: test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp === --- test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp +++ test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-cxx11-nowarn.cpp @@ -121,8 +121,10 @@ // Constants. Agg f4 = {12345678}; // OK (exactly fits in a float) + // expected-warning@+1 {{implicit conversion from 'int' to 'float' changes value from 123456789 to 1.2345679E+8}} Agg f5 = {123456789}; // expected-warning {{ cannot be narrowed }} expected-note {{silence}} + // expected-warning@+1 {{implicit conversion from 'int' to 'float' changes value from 123456789 to 1.2345679E+8}} Agg ce1 = { Convert(123456789) }; // expected-warning {{constant expression evaluates to 123456789 which cannot be narrowed to type 'float'}} expected-note {{silence}} Agg ce2 = { ConvertVar() }; // expected-warning {{non-constant-expression cannot be narrowed from type 'long long' to 'double'}} expected-note {{silence}} } Index: test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp === --- test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp +++ test/CXX/dcl.decl/dcl.init/dcl.init.list/p7-0x.cpp @@ -133,8 +133,10 @@ // Constants. Agg f7 = {12345678}; // OK (exactly fits in a float) Agg f8 = {EnumVal}; // OK + // expected-warning@+1 {{implicit conversion from 'int' to 'float' changes value from 123456789 to 1.2345679E+8}} Agg f9 = {123456789}; // expected-error {{ cannot be narrowed }} expected-note {{silence}} - + + // expected-warning@+1 {{implicit conversion from 'int' to 'float' changes value from 123456789 to 1.2345679E+8}} Agg ce1 = { Convert(123456789) }; // expected-error {{constant expression evaluates to 123456789 which cannot be narrowed to type 'float'}} expected-note {{silence}} Agg ce2 = { ConvertVar() }; // expected-error {{non-constant-expression cannot be narrowed from type 'long long' to 'double'}} expected-note {{silence}} } In
[PATCH] D52835: [Diagnostics] Check integer to floating point number implicit conversions
xbolva00 added a comment. I removed _Float16 related tests since some bots may fall with it, i dont know much about this custom type. Anyway, It is fine on linux x86 64. I will restore them. System macro - I will fix it. https://reviews.llvm.org/D52835 ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits