[clang] 0ad4f29 - [analyzer] SATest: Weaken assumption about HTML files
Author: Marco Antognini Date: 2022-06-20T09:46:07+02:00 New Revision: 0ad4f29b545d849820f0025736c9559c5c439032 URL: https://github.com/llvm/llvm-project/commit/0ad4f29b545d849820f0025736c9559c5c439032 DIFF: https://github.com/llvm/llvm-project/commit/0ad4f29b545d849820f0025736c9559c5c439032.diff LOG: [analyzer] SATest: Weaken assumption about HTML files Instead of assuming there is an HTML file for each diagnostics, consider the HTML files only when they exist, individually of each other. After generating the reference data, running python /scripts/SATest.py build --projects simbody was resulting in this error: File "/scripts/CmpRuns.py", line 250, in read_single_file assert len(d['HTMLDiagnostics_files']) == 1 KeyError: 'HTMLDiagnostics_files' Reviewed By: steakhal Differential Revision: https://reviews.llvm.org/D126197 Added: Modified: clang/utils/analyzer/CmpRuns.py Removed: diff --git a/clang/utils/analyzer/CmpRuns.py b/clang/utils/analyzer/CmpRuns.py index 7afe865d77f2b..61fd044c900fa 100644 --- a/clang/utils/analyzer/CmpRuns.py +++ b/clang/utils/analyzer/CmpRuns.py @@ -242,17 +242,20 @@ def read_single_file(self, path: str, delete_empty: bool): return # Extract the HTML reports, if they exists. -if 'HTMLDiagnostics_files' in data['diagnostics'][0]: -htmlFiles = [] -for d in data['diagnostics']: +htmlFiles = [] +for d in data['diagnostics']: +if 'HTMLDiagnostics_files' in d: # FIXME: Why is this named files, when does it have multiple # files? assert len(d['HTMLDiagnostics_files']) == 1 htmlFiles.append(d.pop('HTMLDiagnostics_files')[0]) -else: -htmlFiles = [None] * len(data['diagnostics']) +else: +htmlFiles.append(None) report = AnalysisReport(self, data.pop('files')) +# Python 3.10 offers zip(..., strict=True). The following assertion +# mimics it. +assert len(data['diagnostics']) == len(htmlFiles) diagnostics = [AnalysisDiagnostic(d, report, h) for d, h in zip(data.pop('diagnostics'), htmlFiles)] ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] e15fef4 - [analyzer] SATest: Ensure Docker image can be built
Author: Marco Antognini Date: 2022-06-20T09:43:21+02:00 New Revision: e15fef41709a226a45d321ebb9cd58260cb97b02 URL: https://github.com/llvm/llvm-project/commit/e15fef41709a226a45d321ebb9cd58260cb97b02 DIFF: https://github.com/llvm/llvm-project/commit/e15fef41709a226a45d321ebb9cd58260cb97b02.diff LOG: [analyzer] SATest: Ensure Docker image can be built Solve build issues occurring when running `docker build`. Fix the version of cmake-data to solve the following issue: The following packages have unmet dependencies: cmake : Depends: cmake-data (= 3.20.5-0kitware1) but 3.23.1-0kitware1ubuntu18.04.1 is to be installed Install libjpeg to solve this issue when installing Python requirements: The headers or library files could not be found for jpeg, a required dependency when compiling Pillow from source. Reviewed By: steakhal Differential Revision: https://reviews.llvm.org/D126196 Added: Modified: clang/utils/analyzer/Dockerfile Removed: diff --git a/clang/utils/analyzer/Dockerfile b/clang/utils/analyzer/Dockerfile index bb1dd60eeb9b8..b92bac6796501 100644 --- a/clang/utils/analyzer/Dockerfile +++ b/clang/utils/analyzer/Dockerfile @@ -18,6 +18,7 @@ RUN apt-get update && apt-get install -y \ python3=3.6.7-1~18.04 \ python3-pip=9.0.1-2.3* \ cmake=3.20.5* \ +cmake-data=3.20.5* \ ninja-build=1.8.2-1 # box2d dependencies @@ -52,6 +53,9 @@ RUN apt-get install -y \ flex=2.6.4-6 \ bison=2:3.0.4.* +RUN apt-get install -y \ +libjpeg-dev + RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1 VOLUME /analyzer ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] c894e85 - In MSVC compatibility mode, handle unqualified templated base class initialization
Author: Fred Tingaud Date: 2022-05-05T16:03:39+02:00 New Revision: c894e85fc64dd8d83b460de81080fff93c5ca334 URL: https://github.com/llvm/llvm-project/commit/c894e85fc64dd8d83b460de81080fff93c5ca334 DIFF: https://github.com/llvm/llvm-project/commit/c894e85fc64dd8d83b460de81080fff93c5ca334.diff LOG: In MSVC compatibility mode, handle unqualified templated base class initialization Before C++20, MSVC was supporting not mentioning the template argument of the base class when initializing a class inheriting a templated base class. So the following code compiled correctly: ``` template class Base { }; template class Derived : public Base { public: Derived() : Base() {} }; void test() { Derived d; } ``` See https://godbolt.org/z/Pxxe7nccx for a conformance view. This patch adds support for such construct when in MSVC compatibility mode. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D124666 Added: clang/test/SemaTemplate/ms-unqualified-base-class.cpp Modified: clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaDeclCXX.cpp Removed: diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 45540fae58538..614bacc34af51 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -5509,6 +5509,9 @@ def err_found_later_in_class : Error<"member %0 used before its declaration">; def ext_found_later_in_class : ExtWarn< "use of member %0 before its declaration is a Microsoft extension">, InGroup; +def ext_unqualified_base_class : ExtWarn< + "unqualified base initializer of class templates is a Microsoft extension">, + InGroup; def note_dependent_member_use : Note< "must qualify identifier to find this declaration in dependent base class">; def err_not_found_by_two_phase_lookup : Error<"call to function %0 that is neither " diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp index b45e8e396b31a..a16fe0b1b72a4 100644 --- a/clang/lib/Sema/SemaDeclCXX.cpp +++ b/clang/lib/Sema/SemaDeclCXX.cpp @@ -4307,6 +4307,15 @@ Sema::BuildMemInitializer(Decl *ConstructorD, } } + if (getLangOpts().MSVCCompat && !getLangOpts().CPlusPlus20) { +auto UnqualifiedBase = R.getAsSingle(); +if (UnqualifiedBase) { + Diag(IdLoc, diag::ext_unqualified_base_class) + << SourceRange(IdLoc, Init->getSourceRange().getEnd()); + BaseType = UnqualifiedBase->getInjectedClassNameSpecialization(); +} + } + // If no results were found, try to correct typos. TypoCorrection Corr; MemInitializerValidatorCCC CCC(ClassDecl); diff --git a/clang/test/SemaTemplate/ms-unqualified-base-class.cpp b/clang/test/SemaTemplate/ms-unqualified-base-class.cpp new file mode 100644 index 0..6d9a072769c63 --- /dev/null +++ b/clang/test/SemaTemplate/ms-unqualified-base-class.cpp @@ -0,0 +1,85 @@ +// RUN: %clang_cc1 -std=c++17 -fms-compatibility -fsyntax-only -verify=before,expected %s +// RUN: %clang_cc1 -std=c++17 -fms-compatibility -fdelayed-template-parsing -fsyntax-only -verify=before,expected %s +// RUN: %clang_cc1 -std=c++20 -fms-compatibility -fsyntax-only -verify=after,expected %s +// RUN: %clang_cc1 -std=c++20 -fms-compatibility -fdelayed-template-parsing -fsyntax-only -verify=after,expected %s + +template +class Base { +}; + +template +class Based {}; // Trying to trick the typo detection + +template +class Derived : public Base { +public: + // after-error@+1 {{member initializer 'Base' does not name a non-static data member or base class}} + Derived() : Base() {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} +private: + int Baze; // Trying to trick the typo detection +}; + +template struct AggregateBase { + T i; +}; + +template +struct AggregateDerived : public AggregateBase { + int i; + + // after-error@+1 {{member initializer 'AggregateBase' does not name a non-static data member or base class}} + AggregateDerived(T j) : AggregateBase{4}, i{j} {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} + int f() { +return i + AggregateBase::i; // expected-warning {{use of undeclared identifier 'AggregateBase'; unqualified lookup into dependent bases of class template 'AggregateDerived' is a Microsoft extension}} + } +}; + +template struct MultiTypesBase { +}; + +template +struct MultiTypesDerived : public MultiTypesBase { + // after-error@+1 {{member initializer 'MultiTypesBase' does not name a non-static data member or base class}} + MultiTypesDerived() : MultiTypesBase{} {} // before-warning {{unqualified base initializer of class templates is a Microsoft extension}} +}; + +template struct IntegerBase { +}; + +temp
[clang] ad47114 - In MSVC compatibility mode, friend function declarations behave as function declarations
Author: Fred Tingaud Date: 2022-05-03T11:31:50+02:00 New Revision: ad47114ad8500c78046161d492ac13a8e3e610eb URL: https://github.com/llvm/llvm-project/commit/ad47114ad8500c78046161d492ac13a8e3e610eb DIFF: https://github.com/llvm/llvm-project/commit/ad47114ad8500c78046161d492ac13a8e3e610eb.diff LOG: In MSVC compatibility mode, friend function declarations behave as function declarations Before C++20, MSVC treated any friend function declaration as a function declaration, so the following code would compile despite funGlob being declared after its first call: ``` class Glob { public: friend void funGlob(); void test() { funGlob(); } }; void funGlob() {} ``` This proposed patch mimics the MSVC behavior when in MSVC compatibility mode Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D124613 Added: clang/test/SemaCXX/ms-friend-function-decl.cpp Modified: clang/lib/Sema/SemaDecl.cpp clang/unittests/AST/ASTImporterTest.cpp Removed: diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 5890bbc7d574b..f2b87c6d2e37e 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -9632,11 +9632,15 @@ Sema::ActOnFunctionDeclarator(Scope *S, Declarator &D, DeclContext *DC, } if (isFriend) { + // In MSVC mode for older versions of the standard, friend function + // declarations behave as declarations + bool PerformFriendInjection = + getLangOpts().MSVCCompat && !getLangOpts().CPlusPlus20; if (FunctionTemplate) { -FunctionTemplate->setObjectOfFriendDecl(); +FunctionTemplate->setObjectOfFriendDecl(PerformFriendInjection); FunctionTemplate->setAccess(AS_public); } - NewFD->setObjectOfFriendDecl(); + NewFD->setObjectOfFriendDecl(PerformFriendInjection); NewFD->setAccess(AS_public); } diff --git a/clang/test/SemaCXX/ms-friend-function-decl.cpp b/clang/test/SemaCXX/ms-friend-function-decl.cpp new file mode 100644 index 0..d146305800738 --- /dev/null +++ b/clang/test/SemaCXX/ms-friend-function-decl.cpp @@ -0,0 +1,45 @@ +// RUN: %clang_cc1 -std=c++03 -fms-compatibility -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++17 -fms-compatibility -fsyntax-only -verify %s +// RUN: %clang_cc1 -std=c++20 -fms-compatibility -fsyntax-only -verify=modern %s +#if __cplusplus < 202002L +// expected-no-diagnostics +#endif + +namespace ns { + +class C { +public: + template + friend void funtemp(); + + friend void fun(); + + void test() { +::ns::fun(); // modern-error {{no member named 'fun' in namespace 'ns'}} + +// modern-error@+3 {{no member named 'funtemp' in namespace 'ns'}} +// modern-error@+2 {{expected '(' for function-style cast or type construction}} +// modern-error@+1 {{expected expression}} +::ns::funtemp(); + } +}; + +void fun() { +} + +template +void funtemp() {} + +} // namespace ns + +class Glob { +public: + friend void funGlob(); + + void test() { +funGlob(); // modern-error {{use of undeclared identifier 'funGlob'}} + } +}; + +void funGlob() { +} diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp index 856010cd4d036..2cda013a45edc 100644 --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -2658,7 +2658,10 @@ TEST_P(ImportFriendFunctions, Lookup) { getTuDecl("struct X { friend void f(); };", Lang_CXX03, "input0.cc"); auto *FromD = FirstDeclMatcher().match(FromTU, FunctionPattern); ASSERT_TRUE(FromD->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend)); - ASSERT_FALSE(FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary)); + // Before CXX20, MSVC treats friend function declarations as function + // declarations + ASSERT_EQ(FromTU->getLangOpts().MSVCCompat, +FromD->isInIdentifierNamespace(Decl::IDNS_Ordinary)); { auto FromName = FromD->getDeclName(); auto *Class = FirstDeclMatcher().match(FromTU, ClassPattern); @@ -2702,7 +2705,10 @@ TEST_P(ImportFriendFunctions, LookupWithProtoAfter) { auto *FromNormal = LastDeclMatcher().match(FromTU, FunctionPattern); ASSERT_TRUE(FromFriend->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend)); - ASSERT_FALSE(FromFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary)); + // Before CXX20, MSVC treats friend function declarations as function + // declarations + ASSERT_EQ(FromTU->getLangOpts().MSVCCompat, +FromFriend->isInIdentifierNamespace(Decl::IDNS_Ordinary)); ASSERT_FALSE(FromNormal->isInIdentifierNamespace(Decl::IDNS_OrdinaryFriend)); ASSERT_TRUE(FromNormal->isInIdentifierNamespace(Decl::IDNS_Ordinary)); @@ -2793,7 +2799,10 @@ TEST_P(ImportFriendFunctions, ImportFriendChangesLookup) { ASSERT_TRUE(FromNormalF->isInIdentifierNamespace(Decl::IDNS_Ordinary)); ASSERT_FALSE(FromNormalF->isInIde
[clang] 68ee5ec - [Analyzer] Fix assumptions about const field with member-initializer
Author: Marco Antognini Date: 2022-05-03T11:27:45+02:00 New Revision: 68ee5ec07d4a169baf287acad9ad7fa85d764a22 URL: https://github.com/llvm/llvm-project/commit/68ee5ec07d4a169baf287acad9ad7fa85d764a22 DIFF: https://github.com/llvm/llvm-project/commit/68ee5ec07d4a169baf287acad9ad7fa85d764a22.diff LOG: [Analyzer] Fix assumptions about const field with member-initializer Essentially, having a default member initializer for a constant member does not necessarily imply the member will have the given default value. Remove part of a2e053638bbf ([analyzer] Treat more const variables and fields as known contants., 2018-05-04). Fix #47878 Reviewed By: r.stahl, steakhal Differential Revision: https://reviews.llvm.org/D124621 Added: clang/test/Analysis/cxx-member-initializer-const-field.cpp Modified: clang/lib/StaticAnalyzer/Core/RegionStore.cpp Removed: diff --git a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp index 9d062ddb3e8c1..20b167c9b3b22 100644 --- a/clang/lib/StaticAnalyzer/Core/RegionStore.cpp +++ b/clang/lib/StaticAnalyzer/Core/RegionStore.cpp @@ -1983,15 +1983,9 @@ SVal RegionStoreManager::getBindingForField(RegionBindingsConstRef B, if (const Optional &V = B.getDirectBinding(R)) return *V; - // Is the field declared constant and has an in-class initializer? + // If the containing record was initialized, try to get its constant value. const FieldDecl *FD = R->getDecl(); QualType Ty = FD->getType(); - if (Ty.isConstQualified()) -if (const Expr *Init = FD->getInClassInitializer()) - if (Optional V = svalBuilder.getConstantVal(Init)) -return *V; - - // If the containing record was initialized, try to get its constant value. const MemRegion* superR = R->getSuperRegion(); if (const auto *VR = dyn_cast(superR)) { const VarDecl *VD = VR->getDecl(); diff --git a/clang/test/Analysis/cxx-member-initializer-const-field.cpp b/clang/test/Analysis/cxx-member-initializer-const-field.cpp new file mode 100644 index 0..f0abbddbc4441 --- /dev/null +++ b/clang/test/Analysis/cxx-member-initializer-const-field.cpp @@ -0,0 +1,120 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s + +// This tests false-positive issues related to PR48534. +// +// Essentially, having a default member initializer for a constant member does +// not necessarily imply the member will have the given default value. + +struct WithConstructor { + int *const ptr = nullptr; + WithConstructor(int *x) : ptr(x) {} + + static auto compliant() { +WithConstructor c(new int); +return *(c.ptr); // no warning + } + + static auto compliantWithParam(WithConstructor c) { +return *(c.ptr); // no warning + } + + static auto issue() { +WithConstructor c(nullptr); +return *(c.ptr); // expected-warning{{Dereference of null pointer (loaded from field 'ptr')}} + } +}; + +struct RegularAggregate { + int *const ptr = nullptr; + + static int compliant() { +RegularAggregate c{new int}; +return *(c.ptr); // no warning + } + + static int issue() { +RegularAggregate c; +return *(c.ptr); // expected-warning{{Dereference of null pointer (loaded from field 'ptr')}} + } +}; + +struct WithConstructorAndArithmetic { + int const i = 0; + WithConstructorAndArithmetic(int x) : i(x + 1) {} + + static int compliant(int y) { +WithConstructorAndArithmetic c(0); +return y / c.i; // no warning + } + + static int issue(int y) { +WithConstructorAndArithmetic c(-1); +return y / c.i; // expected-warning{{Division by zero}} + } +}; + +struct WithConstructorDeclarationOnly { + int const i = 0; + WithConstructorDeclarationOnly(int x); // definition not visible. + + static int compliant1(int y) { +WithConstructorDeclarationOnly c(0); +return y / c.i; // no warning + } + + static int compliant2(int y) { +WithConstructorDeclarationOnly c(-1); +return y / c.i; // no warning + } +}; + +// NonAggregateFP is not an aggregate (j is a private non-static field) and has no custom constructor. +// So we know i and j will always be 0 and 42, respectively. +// That being said, this is not implemented because it is deemed too rare to be worth the complexity. +struct NonAggregateFP { +public: + int const i = 0; + +private: + int const j = 42; + +public: + static int falsePositive1(NonAggregateFP c) { +return 10 / c.i; // FIXME: Currently, no warning. + } + + static int falsePositive2(NonAggregateFP c) { +return 10 / (c.j - 42); // FIXME: Currently, no warning. + } +}; + +struct NonAggregate { +public: + int const i = 0; + +private: + int const j = 42; + + NonAggregate(NonAggregate const &); // not provided, could set i and j to arbitrary values. + +public: + static int compliant1(NonAggregate c) { +return 10 / c.i; // no warning + } + + static int compliant2(NonAg
[clang] f346398 - [Analyzer] Minor cleanups in StreamChecker
Author: Marco Antognini Date: 2022-05-02T17:50:10+02:00 New Revision: f34639828f5a99e6d724c092cc164be0c30a9f71 URL: https://github.com/llvm/llvm-project/commit/f34639828f5a99e6d724c092cc164be0c30a9f71 DIFF: https://github.com/llvm/llvm-project/commit/f34639828f5a99e6d724c092cc164be0c30a9f71.diff LOG: [Analyzer] Minor cleanups in StreamChecker Remove unnecessary conversion to Optional<> and incorrect assumption that BindExpr can return a null state. Reviewed By: steakhal Differential Revision: https://reviews.llvm.org/D124681 Added: Modified: clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp Removed: diff --git a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp index 099e70aaf7eca..b16e1f012251d 100644 --- a/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/StreamChecker.cpp @@ -672,24 +672,19 @@ void StreamChecker::evalFreadFwrite(const FnDescription *Desc, if (!IsFread || (OldSS->ErrorState != ErrorFEof)) { ProgramStateRef StateNotFailed = State->BindExpr(CE, C.getLocationContext(), *NMembVal); -if (StateNotFailed) { - StateNotFailed = StateNotFailed->set( - StreamSym, StreamState::getOpened(Desc)); - C.addTransition(StateNotFailed); -} +StateNotFailed = +StateNotFailed->set(StreamSym, StreamState::getOpened(Desc)); +C.addTransition(StateNotFailed); } // Add transition for the failed state. - Optional RetVal = makeRetVal(C, CE).castAs(); - assert(RetVal && "Value should be NonLoc."); + NonLoc RetVal = makeRetVal(C, CE).castAs(); ProgramStateRef StateFailed = - State->BindExpr(CE, C.getLocationContext(), *RetVal); - if (!StateFailed) -return; - auto Cond = C.getSValBuilder() - .evalBinOpNN(State, BO_LT, *RetVal, *NMembVal, - C.getASTContext().IntTy) - .getAs(); + State->BindExpr(CE, C.getLocationContext(), RetVal); + auto Cond = + C.getSValBuilder() + .evalBinOpNN(State, BO_LT, RetVal, *NMembVal, C.getASTContext().IntTy) + .getAs(); if (!Cond) return; StateFailed = StateFailed->assume(*Cond, true); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] 5a47acc - [Analyzer] Fix clang::ento::taint::dumpTaint definition
Author: Marco Antognini Date: 2022-05-02T17:44:06+02:00 New Revision: 5a47accda88c24d07cc48241be0f0078e8c9dfd0 URL: https://github.com/llvm/llvm-project/commit/5a47accda88c24d07cc48241be0f0078e8c9dfd0 DIFF: https://github.com/llvm/llvm-project/commit/5a47accda88c24d07cc48241be0f0078e8c9dfd0.diff LOG: [Analyzer] Fix clang::ento::taint::dumpTaint definition Ensure the definition is in the "taint" namespace, like its declaration. Reviewed By: steakhal Differential Revision: https://reviews.llvm.org/D124462 Added: Modified: clang/lib/StaticAnalyzer/Checkers/Taint.cpp Removed: diff --git a/clang/lib/StaticAnalyzer/Checkers/Taint.cpp b/clang/lib/StaticAnalyzer/Checkers/Taint.cpp index 02a8d6abad2a1..44162094e49a8 100644 --- a/clang/lib/StaticAnalyzer/Checkers/Taint.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/Taint.cpp @@ -37,7 +37,9 @@ void taint::printTaint(ProgramStateRef State, raw_ostream &Out, const char *NL, Out << I.first << " : " << I.second << NL; } -void dumpTaint(ProgramStateRef State) { printTaint(State, llvm::errs()); } +void taint::dumpTaint(ProgramStateRef State) { + printTaint(State, llvm::errs()); +} ProgramStateRef taint::addTaint(ProgramStateRef State, const Stmt *S, const LocationContext *LCtx, ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] bf0bcb5 - [Analyzer] Remove undefined function
Author: Marco Antognini Date: 2022-04-28T11:54:40+02:00 New Revision: bf0bcb5e539b1177cb2023691a13635e8cab5d2f URL: https://github.com/llvm/llvm-project/commit/bf0bcb5e539b1177cb2023691a13635e8cab5d2f DIFF: https://github.com/llvm/llvm-project/commit/bf0bcb5e539b1177cb2023691a13635e8cab5d2f.diff LOG: [Analyzer] Remove undefined function This getLValue function was declared in 98db1f990fc2 ([Analyzer] [NFC] Parameter Regions, 2020-05-11) but was never implemented. Reviewed By: NoQ Differential Revision: https://reviews.llvm.org/D124461 Added: Modified: clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h Removed: diff --git a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h index 3204ac460ed0..cf285c1e1d55 100644 --- a/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h +++ b/clang/include/clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h @@ -306,10 +306,6 @@ class ProgramState : public llvm::FoldingSetNode { Loc getLValue(const CXXRecordDecl *BaseClass, const SubRegion *Super, bool IsVirtual) const; - /// Get the lvalue for a parameter. - Loc getLValue(const Expr *Call, unsigned Index, -const LocationContext *LC) const; - /// Get the lvalue for a variable reference. Loc getLValue(const VarDecl *D, const LocationContext *LC) const; ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] e54811f - Restore diagnostic handler after CodeGenAction::ExecuteAction
Author: Marco Antognini Date: 2021-02-15T10:33:00Z New Revision: e54811ff7e0bc99f337bcbb569311bb166187322 URL: https://github.com/llvm/llvm-project/commit/e54811ff7e0bc99f337bcbb569311bb166187322 DIFF: https://github.com/llvm/llvm-project/commit/e54811ff7e0bc99f337bcbb569311bb166187322.diff LOG: Restore diagnostic handler after CodeGenAction::ExecuteAction Fix dangling pointer to local variable and address some typos. Reviewed By: xur Differential Revision: https://reviews.llvm.org/D96487 Added: Modified: clang/lib/CodeGen/CodeGenAction.cpp llvm/include/llvm/IR/LLVMContext.h Removed: diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index 778d4df3c2e9..da352463450b 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -1115,6 +1115,14 @@ void CodeGenAction::ExecuteAction() { LLVMContext &Ctx = TheModule->getContext(); Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler, &Diagnostics); + // Restore any diagnostic handler previously set before returning from this + // function. + struct RAII { +LLVMContext &Ctx; +std::unique_ptr PrevHandler = Ctx.getDiagnosticHandler(); +~RAII() { Ctx.setDiagnosticHandler(std::move(PrevHandler)); } + } _{Ctx}; + // Set clang diagnostic handler. To do this we need to create a fake // BackendConsumer. BackendConsumer Result(BA, CI.getDiagnostics(), CI.getHeaderSearchOpts(), diff --git a/llvm/include/llvm/IR/LLVMContext.h b/llvm/include/llvm/IR/LLVMContext.h index 1195a9e5fb28..a352deda6bc8 100644 --- a/llvm/include/llvm/IR/LLVMContext.h +++ b/llvm/include/llvm/IR/LLVMContext.h @@ -190,10 +190,11 @@ class LLVMContext { DiagnosticHandler::DiagnosticHandlerTy DiagHandler, void *DiagContext = nullptr, bool RespectFilters = false); - /// setDiagnosticHandler - This method sets unique_ptr to object of DiagnosticHandler - /// to provide custom diagnostic handling. The first argument is unique_ptr of object - /// of type DiagnosticHandler or a derived of that. The third argument should be - /// set to true if the handler only expects enabled diagnostics. + /// setDiagnosticHandler - This method sets unique_ptr to object of + /// DiagnosticHandler to provide custom diagnostic handling. The first + /// argument is unique_ptr of object of type DiagnosticHandler or a derived + /// of that. The second argument should be set to true if the handler only + /// expects enabled diagnostics. /// /// Ownership of this pointer is moved to LLVMContextImpl. void setDiagnosticHandler(std::unique_ptr &&DH, @@ -211,7 +212,7 @@ class LLVMContext { /// setDiagnosticHandler. const DiagnosticHandler *getDiagHandlerPtr() const; - /// getDiagnosticHandler - transfers owenership of DiagnosticHandler unique_ptr + /// getDiagnosticHandler - transfers ownership of DiagnosticHandler unique_ptr /// to caller. std::unique_ptr getDiagnosticHandler(); ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] bbdbd02 - Address ABI issues introduced with CXCursor_CXXAddrspaceCastExpr
Author: Marco Antognini Date: 2020-10-30T14:12:01Z New Revision: bbdbd020d2c2f315ed1545b23c23ec6ff1abc022 URL: https://github.com/llvm/llvm-project/commit/bbdbd020d2c2f315ed1545b23c23ec6ff1abc022 DIFF: https://github.com/llvm/llvm-project/commit/bbdbd020d2c2f315ed1545b23c23ec6ff1abc022.diff LOG: Address ABI issues introduced with CXCursor_CXXAddrspaceCastExpr Revert values in CXCursorKind as they were before CXCursor_CXXAddrspaceCastExpr was introduced in a6a237f2046a ([OpenCL] Added addrspace_cast operator in C++ mode., 2020-05-18). Insert CXCursor_CXXAddrspaceCastExpr after the last expression in CXCursorKind using the next available value. Reviewed By: akyrtzi, svenvh Differential Revision: https://reviews.llvm.org/D90385 Added: Modified: clang/include/clang-c/Index.h Removed: diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 4838937c8da6..1c91e059c322 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -33,7 +33,7 @@ * compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable. */ #define CINDEX_VERSION_MAJOR 0 -#define CINDEX_VERSION_MINOR 60 +#define CINDEX_VERSION_MINOR 61 #define CINDEX_VERSION_ENCODE(major, minor) (((major)*1) + ((minor)*1)) @@ -2052,62 +2052,58 @@ enum CXCursorKind { */ CXCursor_CXXFunctionalCastExpr = 128, - /** OpenCL's addrspace_cast<> expression. - */ - CXCursor_CXXAddrspaceCastExpr = 129, - /** A C++ typeid expression (C++ [expr.typeid]). */ - CXCursor_CXXTypeidExpr = 130, + CXCursor_CXXTypeidExpr = 129, /** [C++ 2.13.5] C++ Boolean Literal. */ - CXCursor_CXXBoolLiteralExpr = 131, + CXCursor_CXXBoolLiteralExpr = 130, /** [C++0x 2.14.7] C++ Pointer Literal. */ - CXCursor_CXXNullPtrLiteralExpr = 132, + CXCursor_CXXNullPtrLiteralExpr = 131, /** Represents the "this" expression in C++ */ - CXCursor_CXXThisExpr = 133, + CXCursor_CXXThisExpr = 132, /** [C++ 15] C++ Throw Expression. * * This handles 'throw' and 'throw' assignment-expression. When * assignment-expression isn't present, Op will be null. */ - CXCursor_CXXThrowExpr = 134, + CXCursor_CXXThrowExpr = 133, /** A new expression for memory allocation and constructor calls, e.g: * "new CXXNewExpr(foo)". */ - CXCursor_CXXNewExpr = 135, + CXCursor_CXXNewExpr = 134, /** A delete expression for memory deallocation and destructor calls, * e.g. "delete[] pArray". */ - CXCursor_CXXDeleteExpr = 136, + CXCursor_CXXDeleteExpr = 135, /** A unary expression. (noexcept, sizeof, or other traits) */ - CXCursor_UnaryExpr = 137, + CXCursor_UnaryExpr = 136, /** An Objective-C string literal i.e. @"foo". */ - CXCursor_ObjCStringLiteral = 138, + CXCursor_ObjCStringLiteral = 137, /** An Objective-C \@encode expression. */ - CXCursor_ObjCEncodeExpr = 139, + CXCursor_ObjCEncodeExpr = 138, /** An Objective-C \@selector expression. */ - CXCursor_ObjCSelectorExpr = 140, + CXCursor_ObjCSelectorExpr = 139, /** An Objective-C \@protocol expression. */ - CXCursor_ObjCProtocolExpr = 141, + CXCursor_ObjCProtocolExpr = 140, /** An Objective-C "bridged" cast expression, which casts between * Objective-C pointers and C pointers, transferring ownership in the process. @@ -2116,7 +2112,7 @@ enum CXCursorKind { * NSString *str = (__bridge_transfer NSString *)CFCreateString(); * \endcode */ - CXCursor_ObjCBridgedCastExpr = 142, + CXCursor_ObjCBridgedCastExpr = 141, /** Represents a C++0x pack expansion that produces a sequence of * expressions. @@ -2131,7 +2127,7 @@ enum CXCursorKind { * } * \endcode */ - CXCursor_PackExpansionExpr = 143, + CXCursor_PackExpansionExpr = 142, /** Represents an expression that computes the length of a parameter * pack. @@ -2143,7 +2139,7 @@ enum CXCursorKind { * }; * \endcode */ - CXCursor_SizeOfPackExpr = 144, + CXCursor_SizeOfPackExpr = 143, /* Represents a C++ lambda expression that produces a local function * object. @@ -2157,39 +2153,43 @@ enum CXCursorKind { * } * \endcode */ - CXCursor_LambdaExpr = 145, + CXCursor_LambdaExpr = 144, /** Objective-c Boolean Literal. */ - CXCursor_ObjCBoolLiteralExpr = 146, + CXCursor_ObjCBoolLiteralExpr = 145, /** Represents the "self" expression in an Objective-C method. */ - CXCursor_ObjCSelfExpr = 147, + CXCursor_ObjCSelfExpr = 146, /** OpenMP 5.0 [2.1.5, Array Section]. */ - CXCursor_OMPArraySectionExpr = 148, + CXCursor_OMPArraySectionExpr = 147, /** Represents an @available(...) check. */ - CXCursor_ObjCAvailabilityCheckExpr = 149, + CXCursor_ObjCAvailabilityCheckExpr = 148, /** * Fixed point literal */ - CXCursor_FixedPointLiteral = 150, + CXCursor_FixedPointLiteral = 149, /** Op
[clang] a779a16 - [OpenCL] Remove unused extensions
Author: Marco Antognini Date: 2020-10-22T17:01:31+01:00 New Revision: a779a169931c0738bf43dc50fc545c1e88597e92 URL: https://github.com/llvm/llvm-project/commit/a779a169931c0738bf43dc50fc545c1e88597e92 DIFF: https://github.com/llvm/llvm-project/commit/a779a169931c0738bf43dc50fc545c1e88597e92.diff LOG: [OpenCL] Remove unused extensions Many non-language extensions are defined but also unused. This patch removes them with their tests as they do not require compiler support. The cl_khr_select_fprounding_mode extension is also removed because it has been deprecated since OpenCL 1.1 and Clang doesn't have any specific support for it. The cl_khr_context_abort extension is only referred to in "The OpenCL Specification", version 1.2 and 2.0, in Table 4.3, but no specification is provided in "The OpenCL Extension Specification" for these versions. Because it is both unused in Clang and lacks specification, this extension is removed. The following extensions are platform extensions that bring new OpenCL APIs but do not impact the kernel language nor require compiler support. They are therefore removed. - cl_khr_gl_sharing, introduced in OpenCL 1.0 - cl_khr_icd, introduced in OpenCL 1.2 - cl_khr_gl_event, introduced in OpenCL 1.1 Note: this extension adds a new API to create cl_event but it also specifies that these can only be used by clEnqueueAcquireGLObjects. Hence, they cannot be used on the device side and the extension does not impact the kernel language. - cl_khr_d3d10_sharing, introduced in OpenCL 1.1 - cl_khr_d3d11_sharing, introduced in OpenCL 1.2 - cl_khr_dx9_media_sharing, introduced in OpenCL 1.2 - cl_khr_image2d_from_buffer, introduced in OpenCL 1.2 - cl_khr_initialize_memory, introduced in OpenCL 1.2 - cl_khr_gl_depth_images, introduced in OpenCL 1.2 Note: this extension is related to cl_khr_depth_images but only the latter adds new features to the kernel language. - cl_khr_spir, introduced in OpenCL 1.2 - cl_khr_egl_event, introduced in OpenCL 1.2 Note: this extension adds a new API to create cl_event but it also specifies that these can only be used by clEnqueueAcquire* API functions. Hence, they cannot be used on the device side and the extension does not impact the kernel language. - cl_khr_egl_image, introduced in OpenCL 1.2 - cl_khr_terminate_context, introduced in OpenCL 1.2 The minimum required OpenCL version used in OpenCLExtensions.def for these extensions is not always correct. Removing these address that issue. Reviewed By: Anastasia Differential Revision: https://reviews.llvm.org/D89372 Added: Modified: clang/include/clang/Basic/OpenCLExtensions.def clang/lib/Basic/Targets/AMDGPU.h clang/lib/Basic/Targets/NVPTX.h clang/test/Misc/amdgcn.languageOptsOpenCL.cl clang/test/Misc/nvptx.languageOptsOpenCL.cl clang/test/Misc/r600.languageOptsOpenCL.cl clang/test/SemaOpenCL/extension-version.cl Removed: diff --git a/clang/include/clang/Basic/OpenCLExtensions.def b/clang/include/clang/Basic/OpenCLExtensions.def index 1ae36b32fb0a..d67cb3ff019b 100644 --- a/clang/include/clang/Basic/OpenCLExtensions.def +++ b/clang/include/clang/Basic/OpenCLExtensions.def @@ -23,6 +23,16 @@ // core - minimum OpenCL version when the extension becomes optional core // feature or core feature. ~0U indicates not a core feature or an // optional core feature. +// +// As per The OpenCL Extension Specification, Section 1.2, in this file, an +// extension is defined if and only it either: +// * affects the OpenCL language semantics or its syntax, +// * adds built-in functions to the language. +// +// For such an extension, a preprocessor #define that matches the extension +// name must be created and a #pragma is required if and only if the +// compilation flow is impacted, e.g. due to a diff erence of syntax or +// semantics in the language compared to the core standard. #ifndef OPENCLEXT_INTERNAL #ifndef OPENCLEXT @@ -34,8 +44,6 @@ // OpenCL 1.0. OPENCLEXT_INTERNAL(cl_khr_3d_image_writes, 100, 200) -// fprounding mode is special since it is not mentioned beyond 1.0 -OPENCLEXT_INTERNAL(cl_khr_select_fprounding_mode, 100, 110) OPENCLEXT_INTERNAL(cl_khr_byte_addressable_store, 100, 110) OPENCLEXT_INTERNAL(cl_khr_fp16, 100, ~0U) OPENCLEXT_INTERNAL(cl_khr_fp64, 100, 120) @@ -45,35 +53,19 @@ OPENCLEXT_INTERNAL(cl_khr_local_int32_base_atomics, 100, 110) OPENCLEXT_INTERNAL(cl_khr_local_int32_extended_atomics, 100, 110) OPENCLEXT_INTERNAL(cl_khr_int64_base_atomics, 100, ~0U) OPENCLEXT_INTERNAL(cl_khr_int64_extended_atomics, 100, ~0U) -OPENCLEXT_INTERNAL(cl_khr_gl_sharing, 100, ~0U) -OPENCLEXT_INTERNAL(cl_khr_icd, 100, ~0U) - -// OpenCL 1.1. -OPENCLEXT_INTERNAL(cl_khr_gl_event, 110, ~0U) -OPENCLEXT_INTERNAL(cl_khr_d3d10_sharing, 110, ~0U) // EMBEDDED_PROFILE OPENCLEXT_INTERNAL(cles_khr_int64, 110, ~0U) // OpenCL 1.2. -OPENCLEXT_INTERNAL
r366694 - [NFC] Relaxed regression tests for PR42665
Author: mantognini Date: Mon Jul 22 07:47:36 2019 New Revision: 366694 URL: http://llvm.org/viewvc/llvm-project?rev=366694&view=rev Log: [NFC] Relaxed regression tests for PR42665 Following up on the buildbot failures, this commits relaxes some tests: instead of checking for specific IR output, it now ensures that the underlying issue (the crash), and only that, doesn't happen. Modified: cfe/trunk/test/CodeGenCXX/PR42665.cpp Modified: cfe/trunk/test/CodeGenCXX/PR42665.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/PR42665.cpp?rev=366694&r1=366693&r2=366694&view=diff == --- cfe/trunk/test/CodeGenCXX/PR42665.cpp (original) +++ cfe/trunk/test/CodeGenCXX/PR42665.cpp Mon Jul 22 07:47:36 2019 @@ -1,7 +1,8 @@ -// RUN: %clang_cc1 -triple %itanium_abi_triple -emit-llvm -std=c++17 -O0 %s -o - | FileCheck %s -// RUN: %clang_cc1 -triple %ms_abi_triple -emit-llvm -std=c++17 -O0 %s -o - | FileCheck %s +// RUN: %clang_cc1 -std=c++17 -O0 %s -emit-llvm -o /dev/null -verify -triple %itanium_abi_triple +// RUN: %clang_cc1 -std=c++17 -O0 %s -emit-llvm -o /dev/null -verify -triple %ms_abi_triple // Minimal reproducer for PR42665. +// expected-no-diagnostics struct Foo { Foo() = default; @@ -31,31 +32,3 @@ void foobar() { d(f); // Invoke virtual destructor of Foo through d. } // p's destructor is invoked. -// Regexes are used to handle both kind of mangling. -// -// CHECK-LABEL: define linkonce_odr{{( dso_local)?}} void @{{.*deleter.*Foo.*}}(%struct.Foo* dereferenceable({{[0-9]+}}) -// CHECK-SAME: [[T:%.*]]) -// CHECK: [[T_ADDR:%.*]] = alloca %struct.Foo* -// CHECK: store %struct.Foo* [[T]], %struct.Foo** [[T_ADDR]] -// CHECK: [[R0:%.*]] = load %struct.Foo*, %struct.Foo** [[T_ADDR]] -// CHECK: [[R1:%.*]] = bitcast %struct.Foo* [[R0]] to [[TYPE:.*struct\.Foo.*]]*** -// CHECK: [[VTABLE:%.*]] = load [[TYPE]]**, [[TYPE]]*** [[R1]] -// CHECK: [[VFUN:%.*]] = getelementptr inbounds [[TYPE]]*, [[TYPE]]** [[VTABLE]], i64 0 -// CHECK: [[DTOR:%.*]] = load [[TYPE]]*, [[TYPE]]** [[VFUN]] -// CHECK: call {{(void|i8\*)}} [[DTOR]](%struct.Foo* [[R0]] -// -// CHECK-LABEL: define{{( dso_local)?}} void @{{.*foobar.*}}() -// CHECK: [[P:%.*]] = alloca %struct.Pair -// CHECK: [[F:%.*]] = alloca %struct.Foo* -// CHECK: [[D:%.*]] = alloca [[TYPE:void \(%struct.Foo\*\)]]** -// CHECK: call void @{{.*make_pair.*}}(%struct.Pair* sret [[P]]) -// CHECK: [[FIRST:%.*]] = getelementptr inbounds %struct.Pair, %struct.Pair* [[P]], i32 0, i32 0 -// CHECK: store %struct.Foo* [[FIRST]], %struct.Foo** [[F]] -// CHECK: [[SECOND:%.*]] = getelementptr inbounds %struct.Pair, %struct.Pair* [[P]], i32 0, i32 1 -// CHECK: store void (%struct.Foo*)** [[SECOND]], [[TYPE]]*** [[D]] -// CHECK: [[R0:%.*]] = load [[TYPE]]**, [[TYPE]]*** [[D]] -// CHECK: [[R1:%.*]] = load [[TYPE]]*, [[TYPE]]** [[R0]] -// CHECK: [[R2:%.*]] = load %struct.Foo*, %struct.Foo** [[F]] -// CHECK: call void [[R1]](%struct.Foo* dereferenceable({{[0-9]+}}) [[R2]]) -// CHECK: call void @{{.*Pair.*Foo.*}}(%struct.Pair* [[P]]) - ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r366670 - [OpenCL] Improve destructor support in C++ for OpenCL
Author: mantognini Date: Mon Jul 22 02:39:13 2019 New Revision: 366670 URL: http://llvm.org/viewvc/llvm-project?rev=366670&view=rev Log: [OpenCL] Improve destructor support in C++ for OpenCL This re-applies r366422 with a fix for Bug PR42665 and a new regression test. Added: cfe/trunk/test/CodeGenCXX/PR42665.cpp cfe/trunk/test/CodeGenOpenCLCXX/addrspace-with-class.cl Removed: cfe/trunk/test/CodeGenOpenCLCXX/addrspace-ctor.cl Modified: cfe/trunk/include/clang/AST/DeclCXX.h cfe/trunk/include/clang/AST/ExprCXX.h cfe/trunk/lib/AST/DeclCXX.cpp cfe/trunk/lib/AST/ExprCXX.cpp cfe/trunk/lib/CodeGen/CGCXXABI.h cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/lib/CodeGen/CGClass.cpp cfe/trunk/lib/CodeGen/CGDecl.cpp cfe/trunk/lib/CodeGen/CGExprCXX.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.h cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/lib/Sema/SemaOverload.cpp Modified: cfe/trunk/include/clang/AST/DeclCXX.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=366670&r1=39&r2=366670&view=diff == --- cfe/trunk/include/clang/AST/DeclCXX.h (original) +++ cfe/trunk/include/clang/AST/DeclCXX.h Mon Jul 22 02:39:13 2019 @@ -2232,20 +2232,20 @@ public: overridden_method_range overridden_methods() const; - /// Returns the parent of this method declaration, which + /// Return the parent of this method declaration, which /// is the class in which this method is defined. const CXXRecordDecl *getParent() const { return cast(FunctionDecl::getParent()); } - /// Returns the parent of this method declaration, which + /// Return the parent of this method declaration, which /// is the class in which this method is defined. CXXRecordDecl *getParent() { return const_cast( cast(FunctionDecl::getParent())); } - /// Returns the type of the \c this pointer. + /// Return the type of the \c this pointer. /// /// Should only be called for instance (i.e., non-static) methods. Note /// that for the call operator of a lambda closure type, this returns the @@ -2253,9 +2253,17 @@ public: /// 'this' type. QualType getThisType() const; + /// Return the type of the object pointed by \c this. + /// + /// See getThisType() for usage restriction. + QualType getThisObjectType() const; + static QualType getThisType(const FunctionProtoType *FPT, const CXXRecordDecl *Decl); + static QualType getThisObjectType(const FunctionProtoType *FPT, +const CXXRecordDecl *Decl); + Qualifiers getMethodQualifiers() const { return getType()->getAs()->getMethodQuals(); } Modified: cfe/trunk/include/clang/AST/ExprCXX.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/ExprCXX.h?rev=366670&r1=39&r2=366670&view=diff == --- cfe/trunk/include/clang/AST/ExprCXX.h (original) +++ cfe/trunk/include/clang/AST/ExprCXX.h Mon Jul 22 02:39:13 2019 @@ -185,15 +185,20 @@ public: static CXXMemberCallExpr *CreateEmpty(const ASTContext &Ctx, unsigned NumArgs, EmptyShell Empty); - /// Retrieves the implicit object argument for the member call. + /// Retrieve the implicit object argument for the member call. /// /// For example, in "x.f(5)", this returns the sub-expression "x". Expr *getImplicitObjectArgument() const; - /// Retrieves the declaration of the called method. + /// Retrieve the type of the object argument. + /// + /// Note that this always returns a non-pointer type. + QualType getObjectType() const; + + /// Retrieve the declaration of the called method. CXXMethodDecl *getMethodDecl() const; - /// Retrieves the CXXRecordDecl for the underlying type of + /// Retrieve the CXXRecordDecl for the underlying type of /// the implicit object argument. /// /// Note that this is may not be the same declaration as that of the class Modified: cfe/trunk/lib/AST/DeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=366670&r1=39&r2=366670&view=diff == --- cfe/trunk/lib/AST/DeclCXX.cpp (original) +++ cfe/trunk/lib/AST/DeclCXX.cpp Mon Jul 22 02:39:13 2019 @@ -2253,12 +2253,23 @@ CXXMethodDecl::overridden_methods() cons return getASTContext().overridden_methods(this); } +static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT, + const CXXRecordDecl *Decl) { + QualType ClassTy = C.getTypeDeclType(Decl); + return C.getQualifiedType(ClassTy, FPT->getMethodQuals()); +} + QualType CXXMethodDecl::getThisType(const FunctionProtoType *FPT,
r366422 - [OpenCL] Improve destructor support in C++ for OpenCL
Author: mantognini Date: Thu Jul 18 03:04:18 2019 New Revision: 366422 URL: http://llvm.org/viewvc/llvm-project?rev=366422&view=rev Log: [OpenCL] Improve destructor support in C++ for OpenCL Summary: This patch does mainly three things: 1. It fixes a false positive error detection in Sema that is similar to D62156. The error happens when explicitly calling an overloaded destructor for different address spaces. 2. It selects the correct destructor when multiple overloads for address spaces are available. 3. It inserts the expected address space cast when invoking a destructor, if needed, and therefore fixes a crash due to the unmet assertion in llvm::CastInst::Create. The following is a reproducer of the three issues: struct MyType { ~MyType() {} ~MyType() __constant {} }; __constant MyType myGlobal{}; kernel void foo() { myGlobal.~MyType(); // 1 and 2. // 1. error: cannot initialize object parameter of type //'__generic MyType' with an expression of type '__constant MyType' // 2. error: no matching member function for call to '~MyType' } kernel void bar() { // 3. The implicit call to the destructor crashes due to: //Assertion `castIsValid(op, S, Ty) && "Invalid cast!"' failed. //in llvm::CastInst::Create. MyType myLocal; } The added test depends on D62413 and covers a few more things than the above reproducer. Subscribers: yaxunl, Anastasia, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64569 Added: cfe/trunk/test/CodeGenOpenCLCXX/addrspace-with-class.cl Removed: cfe/trunk/test/CodeGenOpenCLCXX/addrspace-ctor.cl Modified: cfe/trunk/include/clang/AST/DeclCXX.h cfe/trunk/lib/AST/DeclCXX.cpp cfe/trunk/lib/CodeGen/CGCXXABI.h cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/lib/CodeGen/CGClass.cpp cfe/trunk/lib/CodeGen/CGDecl.cpp cfe/trunk/lib/CodeGen/CGExprCXX.cpp cfe/trunk/lib/CodeGen/CodeGenFunction.h cfe/trunk/lib/CodeGen/ItaniumCXXABI.cpp cfe/trunk/lib/CodeGen/MicrosoftCXXABI.cpp cfe/trunk/lib/Sema/SemaDeclCXX.cpp cfe/trunk/lib/Sema/SemaOverload.cpp Modified: cfe/trunk/include/clang/AST/DeclCXX.h URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclCXX.h?rev=366422&r1=366421&r2=366422&view=diff == --- cfe/trunk/include/clang/AST/DeclCXX.h (original) +++ cfe/trunk/include/clang/AST/DeclCXX.h Thu Jul 18 03:04:18 2019 @@ -2232,20 +2232,20 @@ public: overridden_method_range overridden_methods() const; - /// Returns the parent of this method declaration, which + /// Return the parent of this method declaration, which /// is the class in which this method is defined. const CXXRecordDecl *getParent() const { return cast(FunctionDecl::getParent()); } - /// Returns the parent of this method declaration, which + /// Return the parent of this method declaration, which /// is the class in which this method is defined. CXXRecordDecl *getParent() { return const_cast( cast(FunctionDecl::getParent())); } - /// Returns the type of the \c this pointer. + /// Return the type of the \c this pointer. /// /// Should only be called for instance (i.e., non-static) methods. Note /// that for the call operator of a lambda closure type, this returns the @@ -2253,9 +2253,17 @@ public: /// 'this' type. QualType getThisType() const; + /// Return the type of the object pointed by \c this. + /// + /// See getThisType() for usage restriction. + QualType getThisObjectType() const; + static QualType getThisType(const FunctionProtoType *FPT, const CXXRecordDecl *Decl); + static QualType getThisObjectType(const FunctionProtoType *FPT, +const CXXRecordDecl *Decl); + Qualifiers getMethodQualifiers() const { return getType()->getAs()->getMethodQuals(); } Modified: cfe/trunk/lib/AST/DeclCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclCXX.cpp?rev=366422&r1=366421&r2=366422&view=diff == --- cfe/trunk/lib/AST/DeclCXX.cpp (original) +++ cfe/trunk/lib/AST/DeclCXX.cpp Thu Jul 18 03:04:18 2019 @@ -2253,12 +2253,23 @@ CXXMethodDecl::overridden_methods() cons return getASTContext().overridden_methods(this); } +static QualType getThisObjectType(ASTContext &C, const FunctionProtoType *FPT, + const CXXRecordDecl *Decl) { + QualType ClassTy = C.getTypeDeclType(Decl); + return C.getQualifiedType(ClassTy, FPT->getMethodQuals()); +} + QualType CXXMethodDecl::getThisType(const FunctionProtoType *FPT, const CXXRecordDecl *Decl) { ASTContext &C = Decl->getASTContext(); - QualType ClassTy = C.getTypeDeclType(Decl); - C
r366306 - [OpenCL][Sema] Minor refactoring and constraint checking
Author: mantognini Date: Wed Jul 17 01:52:09 2019 New Revision: 366306 URL: http://llvm.org/viewvc/llvm-project?rev=366306&view=rev Log: [OpenCL][Sema] Minor refactoring and constraint checking Summary: Simplify code a bit and add assertion to address post-landing comments from D64083. Subscribers: yaxunl, Anastasia, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64804 Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=366306&r1=366305&r2=366306&view=diff == --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Wed Jul 17 01:52:09 2019 @@ -4216,17 +4216,12 @@ Sema::PerformImplicitConversion(Expr *Fr break; case ICK_Block_Pointer_Conversion: { -QualType LHSType = Context.getCanonicalType(ToType).getUnqualifiedType(); -QualType RHSType = Context.getCanonicalType(FromType).getUnqualifiedType(); - -// Assumptions based on Sema::IsBlockPointerConversion. -assert(isa(LHSType) && "BlockPointerType expected"); -assert(isa(RHSType) && "BlockPointerType expected"); - LangAS AddrSpaceL = -LHSType->getAs()->getPointeeType().getAddressSpace(); +ToType->castAs()->getPointeeType().getAddressSpace(); LangAS AddrSpaceR = -RHSType->getAs()->getPointeeType().getAddressSpace(); + FromType->castAs()->getPointeeType().getAddressSpace(); +assert(Qualifiers::isAddressSpaceSupersetOf(AddrSpaceL, AddrSpaceR) && + "Invalid cast"); CastKind Kind = AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast; From = ImpCastExprToType(From, ToType.getUnqualifiedType(), Kind, ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
Re: r365499 - [OpenCL][Sema] Fix builtin rewriting
Hello Reid, Thanks for reporting it. I filed a bug to fix that (http://llvm.org/PR42560). However, I'm not sure I'll have time this week to look at it, especially given that we have no Windows builder around here. If you are critically blocked by this, could you check that adding '// UNSUPPORTED: system-windows' properly disables the test? And if so, feel free to commit for now. Marco From: Reid Kleckner Sent: 09 July 2019 21:47 To: Marco Antognini Cc: cfe-commits Subject: Re: r365499 - [OpenCL][Sema] Fix builtin rewriting FYI, your test seems to fail on Windows: FAIL: Clang :: CodeGenOpenCL/pipe_builtin.cl<http://pipe_builtin.cl> (4679 of 15176) TEST 'Clang :: CodeGenOpenCL/pipe_builtin.cl<http://pipe_builtin.cl>' FAILED Script: -- : 'RUN: at line 1'; c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\clang.exe -cc1 -internal-isystem c:\b\slave\clang-x64-windows-msvc\build\build\stage1\lib\clang\9.0.0\include -nostdsysteminc -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=c++ -o - C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\CodeGenOpenCL\pipe_builtin.cl<http://pipe_builtin.cl> | c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\filecheck.exe C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\CodeGenOpenCL\pipe_builtin.cl<http://pipe_builtin.cl> -- Exit Code: 2 Command Output (stdout): -- $ ":" "RUN: at line 1" $ "c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\clang.exe" "-cc1" "-internal-isystem" "c:\b\slave\clang-x64-windows-msvc\build\build\stage1\lib\clang\9.0.0\include" "-nostdsysteminc" "-emit-llvm" "-cl-ext=+cl_khr_subgroups" "-O0" "-cl-std=c++" "-o" "-" "C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\CodeGenOpenCL\pipe_builtin.cl<http://pipe_builtin.cl>" # command stderr: C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\CodeGenOpenCL\pipe_builtin.cl:9:1: error: cannot mangle this OpenCL pipe type yet void test1(read_only pipe int p, global int *ptr) { ^~~ 1 error generated. On Tue, Jul 9, 2019 at 8:04 AM Marco Antognini via cfe-commits mailto:cfe-commits@lists.llvm.org>> wrote: Author: mantognini Date: Tue Jul 9 08:04:23 2019 New Revision: 365499 URL: http://llvm.org/viewvc/llvm-project?rev=365499&view=rev Log: [OpenCL][Sema] Fix builtin rewriting This patch ensures built-in functions are rewritten using the proper parent declaration. Existing tests are modified to run in C++ mode to ensure the functionality works also with C++ for OpenCL while not increasing the testing runtime. Modified: cfe/trunk/include/clang/Basic/Builtins.def cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/CodeGenOpenCL/builtins.cl<http://builtins.cl> cfe/trunk/test/CodeGenOpenCL/pipe_builtin.cl<http://pipe_builtin.cl> cfe/trunk/test/CodeGenOpenCL/to_addr_builtin.cl<http://to_addr_builtin.cl> Modified: cfe/trunk/include/clang/Basic/Builtins.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=365499&r1=365498&r2=365499&view=diff == --- cfe/trunk/include/clang/Basic/Builtins.def (original) +++ cfe/trunk/include/clang/Basic/Builtins.def Tue Jul 9 08:04:23 2019 @@ -1478,6 +1478,7 @@ BUILTIN(__builtin_coro_begin, "v*v*", "n BUILTIN(__builtin_coro_end, "bv*Ib", "n") BUILTIN(__builtin_coro_suspend, "cIb", "n") BUILTIN(__builtin_coro_param, "bv*v*", "n") + // OpenCL v2.0 s6.13.16, s9.17.3.5 - Pipe functions. // We need the generic prototype, since the packet type could be anything. LANGBUILTIN(read_pipe, "i.", "tn", OCLC20_LANG) @@ -1513,6 +1514,8 @@ LANGBUILTIN(get_kernel_max_sub_group_siz LANGBUILTIN(get_kernel_sub_group_count_for_ndrange, "Ui.", "tn", OCLC20_LANG) // OpenCL v2.0 s6.13.9 - Address space qualifier functions. +// FIXME: Pointer parameters of OpenCL builtins should have their address space +// requirement defined. LANGBUILTIN(to_global, "v*v*", "tn", OCLC20_LANG) LANGBUILTIN(to_local, "v*v*", "tn", OCLC20_LANG) LANGBUILTIN(to_private, "v*v*", "tn", OCLC20_LANG) Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=365499&r1=365498&r2=365499&view=diff == --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) ++
r365500 - [OpenCL][Sema] Improve address space support for blocks
Author: mantognini Date: Tue Jul 9 08:04:27 2019 New Revision: 365500 URL: http://llvm.org/viewvc/llvm-project?rev=365500&view=rev Log: [OpenCL][Sema] Improve address space support for blocks Summary: This patch ensures that the following code is compiled identically with -cl-std=CL2.0 and -fblocks -cl-std=c++. kernel void test(void) { void (^const block_A)(void) = ^{ return; }; } A new test is not added because cl20-device-side-enqueue.cl will cover this once blocks are further improved for C++ for OpenCL. The changes to Sema::PerformImplicitConversion are based on the parts of Sema::CheckAssignmentConstraints on block pointer conversions. Reviewers: rjmccall, Anastasia Subscribers: yaxunl, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D64083 Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp Modified: cfe/trunk/lib/Sema/SemaExprCXX.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExprCXX.cpp?rev=365500&r1=365499&r2=365500&view=diff == --- cfe/trunk/lib/Sema/SemaExprCXX.cpp (original) +++ cfe/trunk/lib/Sema/SemaExprCXX.cpp Tue Jul 9 08:04:27 2019 @@ -4216,7 +4216,20 @@ Sema::PerformImplicitConversion(Expr *Fr break; case ICK_Block_Pointer_Conversion: { -From = ImpCastExprToType(From, ToType.getUnqualifiedType(), CK_BitCast, +QualType LHSType = Context.getCanonicalType(ToType).getUnqualifiedType(); +QualType RHSType = Context.getCanonicalType(FromType).getUnqualifiedType(); + +// Assumptions based on Sema::IsBlockPointerConversion. +assert(isa(LHSType) && "BlockPointerType expected"); +assert(isa(RHSType) && "BlockPointerType expected"); + +LangAS AddrSpaceL = +LHSType->getAs()->getPointeeType().getAddressSpace(); +LangAS AddrSpaceR = +RHSType->getAs()->getPointeeType().getAddressSpace(); +CastKind Kind = +AddrSpaceL != AddrSpaceR ? CK_AddressSpaceConversion : CK_BitCast; +From = ImpCastExprToType(From, ToType.getUnqualifiedType(), Kind, VK_RValue, /*BasePath=*/nullptr, CCK).get(); break; } ___ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r365499 - [OpenCL][Sema] Fix builtin rewriting
Author: mantognini Date: Tue Jul 9 08:04:23 2019 New Revision: 365499 URL: http://llvm.org/viewvc/llvm-project?rev=365499&view=rev Log: [OpenCL][Sema] Fix builtin rewriting This patch ensures built-in functions are rewritten using the proper parent declaration. Existing tests are modified to run in C++ mode to ensure the functionality works also with C++ for OpenCL while not increasing the testing runtime. Modified: cfe/trunk/include/clang/Basic/Builtins.def cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/CodeGenOpenCL/builtins.cl cfe/trunk/test/CodeGenOpenCL/pipe_builtin.cl cfe/trunk/test/CodeGenOpenCL/to_addr_builtin.cl Modified: cfe/trunk/include/clang/Basic/Builtins.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=365499&r1=365498&r2=365499&view=diff == --- cfe/trunk/include/clang/Basic/Builtins.def (original) +++ cfe/trunk/include/clang/Basic/Builtins.def Tue Jul 9 08:04:23 2019 @@ -1478,6 +1478,7 @@ BUILTIN(__builtin_coro_begin, "v*v*", "n BUILTIN(__builtin_coro_end, "bv*Ib", "n") BUILTIN(__builtin_coro_suspend, "cIb", "n") BUILTIN(__builtin_coro_param, "bv*v*", "n") + // OpenCL v2.0 s6.13.16, s9.17.3.5 - Pipe functions. // We need the generic prototype, since the packet type could be anything. LANGBUILTIN(read_pipe, "i.", "tn", OCLC20_LANG) @@ -1513,6 +1514,8 @@ LANGBUILTIN(get_kernel_max_sub_group_siz LANGBUILTIN(get_kernel_sub_group_count_for_ndrange, "Ui.", "tn", OCLC20_LANG) // OpenCL v2.0 s6.13.9 - Address space qualifier functions. +// FIXME: Pointer parameters of OpenCL builtins should have their address space +// requirement defined. LANGBUILTIN(to_global, "v*v*", "tn", OCLC20_LANG) LANGBUILTIN(to_local, "v*v*", "tn", OCLC20_LANG) LANGBUILTIN(to_private, "v*v*", "tn", OCLC20_LANG) Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=365499&r1=365498&r2=365499&view=diff == --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jul 9 08:04:23 2019 @@ -5360,7 +5360,7 @@ static bool checkArgsForPlaceholders(Sem /// FunctionDecl is returned. /// TODO: Handle pointer return types. static FunctionDecl *rewriteBuiltinFunctionDecl(Sema *Sema, ASTContext &Context, -const FunctionDecl *FDecl, +FunctionDecl *FDecl, MultiExprArg ArgExprs) { QualType DeclType = FDecl->getType(); @@ -5408,7 +5408,7 @@ static FunctionDecl *rewriteBuiltinFunct FunctionProtoType::ExtProtoInfo EPI; QualType OverloadTy = Context.getFunctionType(FT->getReturnType(), OverloadParams, EPI); - DeclContext *Parent = Context.getTranslationUnitDecl(); + DeclContext *Parent = FDecl->getParent(); FunctionDecl *OverloadDecl = FunctionDecl::Create(Context, Parent, FDecl->getLocation(), FDecl->getLocation(), Modified: cfe/trunk/test/CodeGenOpenCL/builtins.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/builtins.cl?rev=365499&r1=365498&r2=365499&view=diff == --- cfe/trunk/test/CodeGenOpenCL/builtins.cl (original) +++ cfe/trunk/test/CodeGenOpenCL/builtins.cl Tue Jul 9 08:04:23 2019 @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 %s -finclude-default-header -cl-std=CL2.0 -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s +// RUN: %clang_cc1 %s -finclude-default-header -cl-std=c++ -fblocks -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s void testBranchingOnEnqueueKernel(queue_t default_queue, unsigned flags, ndrange_t ndrange) { // Ensure `enqueue_kernel` can be branched upon. Modified: cfe/trunk/test/CodeGenOpenCL/pipe_builtin.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/pipe_builtin.cl?rev=365499&r1=365498&r2=365499&view=diff == --- cfe/trunk/test/CodeGenOpenCL/pipe_builtin.cl (original) +++ cfe/trunk/test/CodeGenOpenCL/pipe_builtin.cl Tue Jul 9 08:04:23 2019 @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=CL2.0 -o - %s | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -cl-ext=+cl_khr_subgroups -O0 -cl-std=c++ -o - %s | FileCheck %s // CHECK-DAG: %opencl.pipe_ro_t = type opaque // CHECK-DAG: %opencl.pipe_wo_t = type opaque Modified: cfe/trunk/test/CodeGenOpenCL/to_addr_builtin.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/to_addr_builtin.cl?rev=365499&r1=365498&r2=365499&view=d
r348139 - [OpenCL][Sema] Improving formatting
Author: mantognini Date: Mon Dec 3 06:03:49 2018 New Revision: 348139 URL: http://llvm.org/viewvc/llvm-project?rev=348139&view=rev Log: [OpenCL][Sema] Improving formatting Reformat comment added in r348120 following review https://reviews.llvm.org/D55136. Modified: cfe/trunk/lib/Sema/SemaExpr.cpp Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=348139&r1=348138&r2=348139&view=diff == --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Dec 3 06:03:49 2018 @@ -5567,9 +5567,8 @@ Sema::BuildResolvedCallExpr(Expr *Fn, Na Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) { // Extract the return type from the (builtin) function pointer type. // FIXME Several builtins still have setType in -// Sema::CheckBuiltinFunctionCall. One should review their -// definitions in Builtins.def to ensure they are correct before -// removing setType calls. +// Sema::CheckBuiltinFunctionCall. One should review their definitions in +// Builtins.def to ensure they are correct before removing setType calls. QualType FnPtrTy = Context.getPointerType(FDecl->getType()); Result = ImpCastExprToType(Fn, FnPtrTy, CK_BuiltinFnToFnPtr).get(); ResultTy = FDecl->getCallResultType(); ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r348120 - [OpenCL][Sema] Improve BuildResolvedCallExpr handling of builtins
Author: mantognini Date: Mon Dec 3 02:58:56 2018 New Revision: 348120 URL: http://llvm.org/viewvc/llvm-project?rev=348120&view=rev Log: [OpenCL][Sema] Improve BuildResolvedCallExpr handling of builtins Summary: This is a follow-up on https://reviews.llvm.org/D52879, addressing a few issues. This: - adds a FIXME for later improvement for specific builtins: I previously have only checked OpenCL ones and ensured tests cover those. - fixed the CallExpr type. Reviewers: riccibruno Reviewed By: riccibruno Subscribers: yaxunl, Anastasia, kristina, svenvh, cfe-commits Differential Revision: https://reviews.llvm.org/D55136 Modified: cfe/trunk/lib/Sema/SemaExpr.cpp Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=348120&r1=348119&r2=348120&view=diff == --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Mon Dec 3 02:58:56 2018 @@ -5562,17 +5562,20 @@ Sema::BuildResolvedCallExpr(Expr *Fn, Na // We special-case function promotion here because we only allow promoting // builtin functions to function pointers in the callee of a call. ExprResult Result; - QualType ReturnTy; + QualType ResultTy; if (BuiltinID && Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) { // Extract the return type from the (builtin) function pointer type. -auto FnPtrTy = Context.getPointerType(FDecl->getType()); +// FIXME Several builtins still have setType in +// Sema::CheckBuiltinFunctionCall. One should review their +// definitions in Builtins.def to ensure they are correct before +// removing setType calls. +QualType FnPtrTy = Context.getPointerType(FDecl->getType()); Result = ImpCastExprToType(Fn, FnPtrTy, CK_BuiltinFnToFnPtr).get(); -auto FnTy = FnPtrTy->getPointeeType()->castAs(); -ReturnTy = FnTy->getReturnType(); +ResultTy = FDecl->getCallResultType(); } else { Result = CallExprUnaryConversions(Fn); -ReturnTy = Context.BoolTy; +ResultTy = Context.BoolTy; } if (Result.isInvalid()) return ExprError(); @@ -5584,10 +5587,10 @@ Sema::BuildResolvedCallExpr(Expr *Fn, Na if (Config) TheCall = new (Context) CUDAKernelCallExpr(Context, Fn, cast(Config), - Args, ReturnTy, VK_RValue, RParenLoc); + Args, ResultTy, VK_RValue, RParenLoc); else TheCall = new (Context) -CallExpr(Context, Fn, Args, ReturnTy, VK_RValue, RParenLoc); +CallExpr(Context, Fn, Args, ResultTy, VK_RValue, RParenLoc); if (!getLangOpts().CPlusPlus) { // C cannot always handle TypoExpr nodes in builtin calls and direct ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r347658 - Derive builtin return type from its definition
Author: mantognini Date: Tue Nov 27 06:54:58 2018 New Revision: 347658 URL: http://llvm.org/viewvc/llvm-project?rev=347658&view=rev Log: Derive builtin return type from its definition Summary: Prior to this patch, OpenCL code such as the following would attempt to create a BranchInst with a non-bool argument: if (enqueue_kernel(get_default_queue(), 0, nd, ^(void){})) /* ... */ This patch is a follow up on a similar issue with pipe builtin operations. See commit r280800 and https://bugs.llvm.org/show_bug.cgi?id=30219. This change, while being conservative on non-builtin functions, should set the type of expressions invoking builtins to the proper type, instead of defaulting to `bool` and requiring manual overrides in Sema::CheckBuiltinFunctionCall. In addition to tests for enqueue_kernel, the tests are extended to check other OpenCL builtins. Reviewers: Anastasia, spatel, rsmith Reviewed By: Anastasia Subscribers: kristina, cfe-commits, svenvh Differential Revision: https://reviews.llvm.org/D52879 Added: cfe/trunk/test/CodeGenOpenCL/builtins.cl Modified: cfe/trunk/lib/Sema/SemaChecking.cpp cfe/trunk/lib/Sema/SemaExpr.cpp cfe/trunk/test/CodeGenOpenCL/pipe_builtin.cl Modified: cfe/trunk/lib/Sema/SemaChecking.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=347658&r1=347657&r2=347658&view=diff == --- cfe/trunk/lib/Sema/SemaChecking.cpp (original) +++ cfe/trunk/lib/Sema/SemaChecking.cpp Tue Nov 27 06:54:58 2018 @@ -1308,7 +1308,6 @@ Sema::CheckBuiltinFunctionCall(FunctionD // check for the argument. if (SemaBuiltinRWPipe(*this, TheCall)) return ExprError(); -TheCall->setType(Context.IntTy); break; case Builtin::BIreserve_read_pipe: case Builtin::BIreserve_write_pipe: @@ -1340,7 +1339,6 @@ Sema::CheckBuiltinFunctionCall(FunctionD case Builtin::BIget_pipe_max_packets: if (SemaBuiltinPipePackets(*this, TheCall)) return ExprError(); -TheCall->setType(Context.UnsignedIntTy); break; case Builtin::BIto_global: case Builtin::BIto_local: Modified: cfe/trunk/lib/Sema/SemaExpr.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=347658&r1=347657&r2=347658&view=diff == --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Nov 27 06:54:58 2018 @@ -5547,12 +5547,17 @@ Sema::BuildResolvedCallExpr(Expr *Fn, Na // We special-case function promotion here because we only allow promoting // builtin functions to function pointers in the callee of a call. ExprResult Result; + QualType ReturnTy; if (BuiltinID && Fn->getType()->isSpecificBuiltinType(BuiltinType::BuiltinFn)) { -Result = ImpCastExprToType(Fn, Context.getPointerType(FDecl->getType()), - CK_BuiltinFnToFnPtr).get(); +// Extract the return type from the (builtin) function pointer type. +auto FnPtrTy = Context.getPointerType(FDecl->getType()); +Result = ImpCastExprToType(Fn, FnPtrTy, CK_BuiltinFnToFnPtr).get(); +auto FnTy = FnPtrTy->getPointeeType()->castAs(); +ReturnTy = FnTy->getReturnType(); } else { Result = CallExprUnaryConversions(Fn); +ReturnTy = Context.BoolTy; } if (Result.isInvalid()) return ExprError(); @@ -5562,13 +5567,12 @@ Sema::BuildResolvedCallExpr(Expr *Fn, Na // of arguments and function on error. CallExpr *TheCall; if (Config) -TheCall = new (Context) CUDAKernelCallExpr(Context, Fn, - cast(Config), Args, - Context.BoolTy, VK_RValue, - RParenLoc); +TheCall = +new (Context) CUDAKernelCallExpr(Context, Fn, cast(Config), + Args, ReturnTy, VK_RValue, RParenLoc); else -TheCall = new (Context) CallExpr(Context, Fn, Args, Context.BoolTy, - VK_RValue, RParenLoc); +TheCall = new (Context) +CallExpr(Context, Fn, Args, ReturnTy, VK_RValue, RParenLoc); if (!getLangOpts().CPlusPlus) { // C cannot always handle TypoExpr nodes in builtin calls and direct Added: cfe/trunk/test/CodeGenOpenCL/builtins.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenOpenCL/builtins.cl?rev=347658&view=auto == --- cfe/trunk/test/CodeGenOpenCL/builtins.cl (added) +++ cfe/trunk/test/CodeGenOpenCL/builtins.cl Tue Nov 27 06:54:58 2018 @@ -0,0 +1,83 @@ +// RUN: %clang_cc1 %s -finclude-default-header -cl-std=CL2.0 -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s + +void testBranchingOnEnqueueKernel(queue_t default_queue, unsigned flags, ndrange_t ndrange) { +// Ensure `enqueue_kernel`
r344891 - [OpenCL] Fix definitions of __builtin_(add|sub|mul)_overflow
Author: mantognini Date: Mon Oct 22 03:41:07 2018 New Revision: 344891 URL: http://llvm.org/viewvc/llvm-project?rev=344891&view=rev Log: [OpenCL] Fix definitions of __builtin_(add|sub|mul)_overflow Ensure __builtin_(add|sub|mul)_overflow return bool instead of void as per specification (LanguageExtensions). Differential Revision: https://reviews.llvm.org/D52875 Modified: cfe/trunk/include/clang/Basic/Builtins.def Modified: cfe/trunk/include/clang/Basic/Builtins.def URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Builtins.def?rev=344891&r1=344890&r2=344891&view=diff == --- cfe/trunk/include/clang/Basic/Builtins.def (original) +++ cfe/trunk/include/clang/Basic/Builtins.def Mon Oct 22 03:41:07 2018 @@ -1398,9 +1398,9 @@ BUILTIN(__builtin_subcl, "ULiULiCULiCULi BUILTIN(__builtin_subcll, "ULLiULLiCULLiCULLiCULLi*", "n") // Checked Arithmetic Builtins for Security. -BUILTIN(__builtin_add_overflow, "v.", "nt") -BUILTIN(__builtin_sub_overflow, "v.", "nt") -BUILTIN(__builtin_mul_overflow, "v.", "nt") +BUILTIN(__builtin_add_overflow, "b.", "nt") +BUILTIN(__builtin_sub_overflow, "b.", "nt") +BUILTIN(__builtin_mul_overflow, "b.", "nt") BUILTIN(__builtin_uadd_overflow, "bUiCUiCUi*", "n") BUILTIN(__builtin_uaddl_overflow, "bULiCULiCULi*", "n") BUILTIN(__builtin_uaddll_overflow, "bULLiCULLiCULLi*", "n") ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
r344778 - [OpenCL] Remove unwanted signedness conversion from tests
Author: mantognini Date: Fri Oct 19 02:01:37 2018 New Revision: 344778 URL: http://llvm.org/viewvc/llvm-project?rev=344778&view=rev Log: [OpenCL] Remove unwanted signedness conversion from tests The get_kernel_* functions used in cl20-device-side-enqueue.cl all return unsigned integers. This patch avoids undesired implicit conversions on the returned values. Differential Revision: https://reviews.llvm.org/D52873 Modified: cfe/trunk/test/SemaOpenCL/cl20-device-side-enqueue.cl Modified: cfe/trunk/test/SemaOpenCL/cl20-device-side-enqueue.cl URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaOpenCL/cl20-device-side-enqueue.cl?rev=344778&r1=344777&r2=344778&view=diff == --- cfe/trunk/test/SemaOpenCL/cl20-device-side-enqueue.cl (original) +++ cfe/trunk/test/SemaOpenCL/cl20-device-side-enqueue.cl Fri Oct 19 02:01:37 2018 @@ -212,7 +212,7 @@ kernel void work_group_size_tests() { #pragma OPENCL EXTENSION cl_khr_subgroups : enable -kernel void foo(global int *buf) +kernel void foo(global unsigned int *buf) { ndrange_t n; buf[0] = get_kernel_max_sub_group_size_for_ndrange(n, ^(){}); @@ -220,7 +220,7 @@ kernel void foo(global int *buf) buf[0] = get_kernel_max_sub_group_size_for_ndrange(n, 1); // expected-error{{illegal call to 'get_kernel_max_sub_group_size_for_ndrange', expected block argument type}} } -kernel void bar(global int *buf) +kernel void bar(global unsigned int *buf) { __private ndrange_t n; buf[0] = get_kernel_sub_group_count_for_ndrange(n, ^(){}); @@ -230,13 +230,13 @@ kernel void bar(global int *buf) #pragma OPENCL EXTENSION cl_khr_subgroups : disable -kernel void foo1(global int *buf) +kernel void foo1(global unsigned int *buf) { ndrange_t n; buf[0] = get_kernel_max_sub_group_size_for_ndrange(n, ^(){}); // expected-error {{use of declaration 'get_kernel_max_sub_group_size_for_ndrange' requires cl_khr_subgroups extension to be enabled}} } -kernel void bar1(global int *buf) +kernel void bar1(global unsigned int *buf) { ndrange_t n; buf[0] = get_kernel_sub_group_count_for_ndrange(n, ^(){}); // expected-error {{use of declaration 'get_kernel_sub_group_count_for_ndrange' requires cl_khr_subgroups extension to be enabled}} ___ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits