mirror of
https://github.com/opnsense/src.git
synced 2026-06-09 08:43:19 -04:00
Vendor import of clang release_38 branch r260756:
https://llvm.org/svn/llvm-project/cfe/branches/release_38@260756
This commit is contained in:
parent
c2f1760e15
commit
d4aec3a22f
32 changed files with 3732 additions and 1139 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -1,6 +1,6 @@
|
|||
=====================================
|
||||
Clang 3.8 (In-Progress) Release Notes
|
||||
=====================================
|
||||
=======================
|
||||
Clang 3.8 Release Notes
|
||||
=======================
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
|
@ -8,12 +8,6 @@ Clang 3.8 (In-Progress) Release Notes
|
|||
|
||||
Written by the `LLVM Team <http://llvm.org/>`_
|
||||
|
||||
.. warning::
|
||||
|
||||
These are in-progress notes for the upcoming Clang 3.8 release. You may
|
||||
prefer the `Clang 3.7 Release Notes
|
||||
<http://llvm.org/releases/3.7.0/tools/clang/docs/ReleaseNotes.html>`_.
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
|
|
@ -31,11 +25,6 @@ the latest release, please check out the main please see the `Clang Web
|
|||
Site <http://clang.llvm.org>`_ or the `LLVM Web
|
||||
Site <http://llvm.org>`_.
|
||||
|
||||
Note that if you are reading this file from a Subversion checkout or the
|
||||
main Clang web page, this document applies to the *next* release, not
|
||||
the current one. To see the release notes for a specific release, please
|
||||
see the `releases page <http://llvm.org/releases/>`_.
|
||||
|
||||
What's New in Clang 3.8?
|
||||
========================
|
||||
|
||||
|
|
@ -93,8 +82,41 @@ Clang's support for building native Windows programs ...
|
|||
C Language Changes in Clang
|
||||
---------------------------
|
||||
|
||||
Better support for ``__builtin_object_size``
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Clang 3.8 has expanded support for the ``__builtin_object_size`` intrinsic.
|
||||
Specifically, ``__builtin_object_size`` will now fail less often when you're
|
||||
trying to get the size of a subobject. Additionally, the ``pass_object_size``
|
||||
attribute was added, which allows ``__builtin_object_size`` to successfully
|
||||
report the size of function parameters, without requiring that the function be
|
||||
inlined.
|
||||
|
||||
|
||||
``overloadable`` attribute relaxations
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Previously, functions marked ``overloadable`` in C would strictly use C++'s
|
||||
type conversion rules, so the following code would not compile:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
void foo(char *bar, char *baz) __attribute__((overloadable));
|
||||
void foo(char *bar) __attribute__((overloadable));
|
||||
|
||||
void callFoo() {
|
||||
int a;
|
||||
foo(&a);
|
||||
}
|
||||
|
||||
Now, Clang is able to selectively use C's type conversion rules during overload
|
||||
resolution in C, which allows the above example to compile (albeit potentially
|
||||
with a warning about an implicit conversion from ``int*`` to ``char*``).
|
||||
|
||||
|
||||
...
|
||||
|
||||
|
||||
C11 Feature Support
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
|
@ -127,7 +149,9 @@ These are major API changes that have happened since the 3.7 release of
|
|||
Clang. If upgrading an external codebase that uses Clang as a library,
|
||||
this section should help get you past the largest hurdles of upgrading.
|
||||
|
||||
- ...
|
||||
* With this release, the autoconf build system is deprecated. It will be removed
|
||||
in the 3.9 release. Please migrate to using CMake. For more information see:
|
||||
`Building LLVM with CMake <http://llvm.org/docs/CMake.html>`_
|
||||
|
||||
AST Matchers
|
||||
------------
|
||||
|
|
@ -182,7 +206,26 @@ libclang
|
|||
Static Analyzer
|
||||
---------------
|
||||
|
||||
...
|
||||
The scan-build and scan-view tools will now be installed with clang. Use these
|
||||
tools to run the static analyzer on projects and view the produced results.
|
||||
|
||||
Static analysis of C++ lambdas has been greatly improved, including
|
||||
interprocedural analysis of lambda applications.
|
||||
|
||||
Several new checks were added:
|
||||
|
||||
- The analyzer now checks for misuse of ``vfork()``.
|
||||
- The analyzer can now detect excessively-padded structs. This check can be
|
||||
enabled by passing the following command to scan-build:
|
||||
``-enable-checker optin.performance.Padding``.
|
||||
- The checks to detect misuse of ``_Nonnull`` type qualifiers as well as checks
|
||||
to detect misuse of Objective-C generics were added.
|
||||
- The analyzer now has opt in checks to detect localization errors in Coca
|
||||
applications. The checks warn about uses of non-localized ``NSStrings``
|
||||
passed to UI methods expecting localized strings and on ``NSLocalizedString``
|
||||
macros that are missing the comment argument. These can be enabled by passing
|
||||
the following command to scan-build:
|
||||
``-enable-checker optin.osx.cocoa.localizability``.
|
||||
|
||||
Core Analysis Improvements
|
||||
==========================
|
||||
|
|
|
|||
|
|
@ -168,6 +168,38 @@ UndefinedBehaviorSanitizer supports ``src`` and ``fun`` entity types in
|
|||
:doc:`SanitizerSpecialCaseList`, that can be used to suppress error reports
|
||||
in the specified source files or functions.
|
||||
|
||||
Runtime suppressions
|
||||
--------------------
|
||||
|
||||
Sometimes you can suppress UBSan error reports for specific files, functions,
|
||||
or libraries without recompiling the code. You need to pass a path to
|
||||
suppression file in a ``UBSAN_OPTIONS`` environment variable.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
UBSAN_OPTIONS=suppressions=MyUBSan.supp
|
||||
|
||||
You need to specify a :ref:`check <ubsan-checks>` you are suppressing and the
|
||||
bug location. For example:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
signed-integer-overflow:file-with-known-overflow.cpp
|
||||
alignment:function_doing_unaligned_access
|
||||
vptr:shared_object_with_vptr_failures.so
|
||||
|
||||
There are several limitations:
|
||||
|
||||
* Sometimes your binary must have enough debug info and/or symbol table, so
|
||||
that the runtime could figure out source file or function name to match
|
||||
against the suppression.
|
||||
* It is only possible to suppress recoverable checks. For the example above,
|
||||
you can additionally pass
|
||||
``-fsanitize-recover=signed-integer-overflow,alignment,vptr``, although
|
||||
most of UBSan checks are recoverable by default.
|
||||
* Check groups (like ``undefined``) can't be used in suppressions file, only
|
||||
fine-grained checks are supported.
|
||||
|
||||
Supported Platforms
|
||||
===================
|
||||
|
||||
|
|
|
|||
|
|
@ -2036,6 +2036,8 @@ Execute ``clang-cl /?`` to see a list of supported options:
|
|||
CL.EXE COMPATIBILITY OPTIONS:
|
||||
/? Display available options
|
||||
/arch:<value> Set architecture for code generation
|
||||
/Brepro- Emit an object file which cannot be reproduced over time
|
||||
/Brepro Emit an object file which can be reproduced over time
|
||||
/C Don't discard comments when preprocessing
|
||||
/c Compile only
|
||||
/D <macro[=value]> Define macro
|
||||
|
|
@ -2079,8 +2081,6 @@ Execute ``clang-cl /?`` to see a list of supported options:
|
|||
/Oi Enable use of builtin functions
|
||||
/Os Optimize for size
|
||||
/Ot Optimize for speed
|
||||
/Oy- Disable frame pointer omission
|
||||
/Oy Enable frame pointer omission
|
||||
/O<value> Optimization level
|
||||
/o <file or directory> Set output file or directory (ends in / or \)
|
||||
/P Preprocess to file
|
||||
|
|
@ -2105,7 +2105,7 @@ Execute ``clang-cl /?`` to see a list of supported options:
|
|||
/W2 Enable -Wall
|
||||
/W3 Enable -Wall
|
||||
/W4 Enable -Wall and -Wextra
|
||||
/Wall Enable -Wall
|
||||
/Wall Enable -Wall and -Wextra
|
||||
/WX- Do not treat warnings as errors
|
||||
/WX Treat warnings as errors
|
||||
/w Disable all warnings
|
||||
|
|
@ -2133,8 +2133,10 @@ Execute ``clang-cl /?`` to see a list of supported options:
|
|||
-fms-compatibility-version=<value>
|
||||
Dot-separated value representing the Microsoft compiler version
|
||||
number to report in _MSC_VER (0 = don't define it (default))
|
||||
-fmsc-version=<value> Microsoft compiler version number to report in _MSC_VER (0 = don't
|
||||
define it (default))
|
||||
-fms-compatibility Enable full Microsoft Visual C++ compatibility
|
||||
-fms-extensions Accept some non-standard constructs supported by the Microsoft compiler
|
||||
-fmsc-version=<value> Microsoft compiler version number to report in _MSC_VER
|
||||
(0 = don't define it (default))
|
||||
-fno-sanitize-coverage=<value>
|
||||
Disable specified features of coverage instrumentation for Sanitizers
|
||||
-fno-sanitize-recover=<value>
|
||||
|
|
|
|||
|
|
@ -2229,7 +2229,8 @@ public:
|
|||
bool CheckPointerConversion(Expr *From, QualType ToType,
|
||||
CastKind &Kind,
|
||||
CXXCastPath& BasePath,
|
||||
bool IgnoreBaseAccess);
|
||||
bool IgnoreBaseAccess,
|
||||
bool Diagnose = true);
|
||||
bool IsMemberPointerConversion(Expr *From, QualType FromType, QualType ToType,
|
||||
bool InOverloadResolution,
|
||||
QualType &ConvertedType);
|
||||
|
|
@ -5388,7 +5389,8 @@ public:
|
|||
unsigned AmbigiousBaseConvID,
|
||||
SourceLocation Loc, SourceRange Range,
|
||||
DeclarationName Name,
|
||||
CXXCastPath *BasePath);
|
||||
CXXCastPath *BasePath,
|
||||
bool IgnoreAccess = false);
|
||||
|
||||
std::string getAmbiguousPathsDisplayString(CXXBasePaths &Paths);
|
||||
|
||||
|
|
@ -7514,14 +7516,15 @@ public:
|
|||
ObjCMethodDecl *&ClassMethod,
|
||||
ObjCMethodDecl *&InstanceMethod,
|
||||
TypedefNameDecl *&TDNDecl,
|
||||
bool CfToNs);
|
||||
|
||||
bool CfToNs, bool Diagnose = true);
|
||||
|
||||
bool CheckObjCBridgeRelatedConversions(SourceLocation Loc,
|
||||
QualType DestType, QualType SrcType,
|
||||
Expr *&SrcExpr);
|
||||
|
||||
bool ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&SrcExpr);
|
||||
|
||||
Expr *&SrcExpr, bool Diagnose = true);
|
||||
|
||||
bool ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&SrcExpr,
|
||||
bool Diagnose = true);
|
||||
|
||||
bool checkInitMethod(ObjCMethodDecl *method, QualType receiverTypeIfCall);
|
||||
|
||||
/// \brief Check whether the given new method is a valid override of the
|
||||
|
|
@ -8613,6 +8616,7 @@ public:
|
|||
ARCConversionResult CheckObjCARCConversion(SourceRange castRange,
|
||||
QualType castType, Expr *&op,
|
||||
CheckedConversionKind CCK,
|
||||
bool Diagnose = true,
|
||||
bool DiagnoseCFAudited = false,
|
||||
BinaryOperatorKind Opc = BO_PtrMemD
|
||||
);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -6151,6 +6151,12 @@ public:
|
|||
Builder.defineMacro("__s390x__");
|
||||
Builder.defineMacro("__zarch__");
|
||||
Builder.defineMacro("__LONG_DOUBLE_128__");
|
||||
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
|
||||
Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
|
||||
|
||||
if (HasTransactionalExecution)
|
||||
Builder.defineMacro("__HTM__");
|
||||
if (Opts.ZVector)
|
||||
|
|
|
|||
|
|
@ -104,23 +104,15 @@ public:
|
|||
};
|
||||
|
||||
}
|
||||
|
||||
// Present a minimal LLVM-like casting interface.
|
||||
template <class U> inline U cast(CodeGen::Address addr) {
|
||||
return U::castImpl(addr);
|
||||
}
|
||||
template <class U> inline bool isa(CodeGen::Address addr) {
|
||||
return U::isaImpl(addr);
|
||||
}
|
||||
|
||||
namespace llvm {
|
||||
// Present a minimal LLVM-like casting interface.
|
||||
template <class U> inline U cast(clang::CodeGen::Address addr) {
|
||||
return U::castImpl(addr);
|
||||
}
|
||||
template <class U> inline bool isa(clang::CodeGen::Address addr) {
|
||||
return U::isaImpl(addr);
|
||||
}
|
||||
}
|
||||
|
||||
namespace clang {
|
||||
// Make our custom isa and cast available in namespace clang, to mirror
|
||||
// what we do for LLVM's versions in Basic/LLVM.h.
|
||||
using llvm::isa;
|
||||
using llvm::cast;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -483,7 +483,7 @@ llvm::Value *CGOpenMPRuntime::getThreadID(CodeGenFunction &CGF,
|
|||
if (ThreadID != nullptr)
|
||||
return ThreadID;
|
||||
}
|
||||
if (auto OMPRegionInfo =
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
if (OMPRegionInfo->getThreadIDVariable()) {
|
||||
// Check if this an outlined function with thread id passed as argument.
|
||||
|
|
@ -1356,7 +1356,7 @@ void CGOpenMPRuntime::emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
// return the address of that temp.
|
||||
Address CGOpenMPRuntime::emitThreadIDAddress(CodeGenFunction &CGF,
|
||||
SourceLocation Loc) {
|
||||
if (auto OMPRegionInfo =
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo))
|
||||
if (OMPRegionInfo->getThreadIDVariable())
|
||||
return OMPRegionInfo->getThreadIDVariableLValue(CGF).getAddress();
|
||||
|
|
@ -1717,15 +1717,10 @@ void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
}
|
||||
// Build call __kmpc_cancel_barrier(loc, thread_id) or __kmpc_barrier(loc,
|
||||
// thread_id);
|
||||
auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo);
|
||||
// Do not emit barrier call in the single directive emitted in some rare cases
|
||||
// for sections directives.
|
||||
if (OMPRegionInfo && OMPRegionInfo->getDirectiveKind() == OMPD_single)
|
||||
return;
|
||||
llvm::Value *Args[] = {emitUpdateLocation(CGF, Loc, Flags),
|
||||
getThreadID(CGF, Loc)};
|
||||
if (OMPRegionInfo) {
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
if (!ForceSimpleCall && OMPRegionInfo->hasCancel()) {
|
||||
auto *Result = CGF.EmitRuntimeCall(
|
||||
createRuntimeFunction(OMPRTL__kmpc_cancel_barrier), Args);
|
||||
|
|
@ -3649,8 +3644,6 @@ void CGOpenMPRuntime::emitCancellationPointCall(
|
|||
// global_tid, kmp_int32 cncl_kind);
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
if (OMPRegionInfo->getDirectiveKind() == OMPD_single)
|
||||
return;
|
||||
if (OMPRegionInfo->hasCancel()) {
|
||||
llvm::Value *Args[] = {
|
||||
emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc),
|
||||
|
|
@ -3687,8 +3680,6 @@ void CGOpenMPRuntime::emitCancelCall(CodeGenFunction &CGF, SourceLocation Loc,
|
|||
// kmp_int32 cncl_kind);
|
||||
if (auto *OMPRegionInfo =
|
||||
dyn_cast_or_null<CGOpenMPRegionInfo>(CGF.CapturedStmtInfo)) {
|
||||
if (OMPRegionInfo->getDirectiveKind() == OMPD_single)
|
||||
return;
|
||||
auto &&ThenGen = [this, Loc, CancelRegion,
|
||||
OMPRegionInfo](CodeGenFunction &CGF) {
|
||||
llvm::Value *Args[] = {
|
||||
|
|
|
|||
|
|
@ -1657,50 +1657,51 @@ OpenMPDirectiveKind
|
|||
CodeGenFunction::EmitSections(const OMPExecutableDirective &S) {
|
||||
auto *Stmt = cast<CapturedStmt>(S.getAssociatedStmt())->getCapturedStmt();
|
||||
auto *CS = dyn_cast<CompoundStmt>(Stmt);
|
||||
if (CS && CS->size() > 1) {
|
||||
bool HasLastprivates = false;
|
||||
auto &&CodeGen = [&S, CS, &HasLastprivates](CodeGenFunction &CGF) {
|
||||
auto &C = CGF.CGM.getContext();
|
||||
auto KmpInt32Ty = C.getIntTypeForBitwidth(/*DestWidth=*/32, /*Signed=*/1);
|
||||
// Emit helper vars inits.
|
||||
LValue LB = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.lb.",
|
||||
CGF.Builder.getInt32(0));
|
||||
auto *GlobalUBVal = CGF.Builder.getInt32(CS->size() - 1);
|
||||
LValue UB =
|
||||
createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.ub.", GlobalUBVal);
|
||||
LValue ST = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.st.",
|
||||
CGF.Builder.getInt32(1));
|
||||
LValue IL = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.il.",
|
||||
CGF.Builder.getInt32(0));
|
||||
// Loop counter.
|
||||
LValue IV = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.iv.");
|
||||
OpaqueValueExpr IVRefExpr(S.getLocStart(), KmpInt32Ty, VK_LValue);
|
||||
CodeGenFunction::OpaqueValueMapping OpaqueIV(CGF, &IVRefExpr, IV);
|
||||
OpaqueValueExpr UBRefExpr(S.getLocStart(), KmpInt32Ty, VK_LValue);
|
||||
CodeGenFunction::OpaqueValueMapping OpaqueUB(CGF, &UBRefExpr, UB);
|
||||
// Generate condition for loop.
|
||||
BinaryOperator Cond(&IVRefExpr, &UBRefExpr, BO_LE, C.BoolTy, VK_RValue,
|
||||
OK_Ordinary, S.getLocStart(),
|
||||
/*fpContractable=*/false);
|
||||
// Increment for loop counter.
|
||||
UnaryOperator Inc(&IVRefExpr, UO_PreInc, KmpInt32Ty, VK_RValue,
|
||||
OK_Ordinary, S.getLocStart());
|
||||
auto BodyGen = [CS, &S, &IV](CodeGenFunction &CGF) {
|
||||
// Iterate through all sections and emit a switch construct:
|
||||
// switch (IV) {
|
||||
// case 0:
|
||||
// <SectionStmt[0]>;
|
||||
// break;
|
||||
// ...
|
||||
// case <NumSection> - 1:
|
||||
// <SectionStmt[<NumSection> - 1]>;
|
||||
// break;
|
||||
// }
|
||||
// .omp.sections.exit:
|
||||
auto *ExitBB = CGF.createBasicBlock(".omp.sections.exit");
|
||||
auto *SwitchStmt = CGF.Builder.CreateSwitch(
|
||||
CGF.EmitLoadOfLValue(IV, S.getLocStart()).getScalarVal(), ExitBB,
|
||||
CS->size());
|
||||
bool HasLastprivates = false;
|
||||
auto &&CodeGen = [&S, Stmt, CS, &HasLastprivates](CodeGenFunction &CGF) {
|
||||
auto &C = CGF.CGM.getContext();
|
||||
auto KmpInt32Ty = C.getIntTypeForBitwidth(/*DestWidth=*/32, /*Signed=*/1);
|
||||
// Emit helper vars inits.
|
||||
LValue LB = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.lb.",
|
||||
CGF.Builder.getInt32(0));
|
||||
auto *GlobalUBVal = CS != nullptr ? CGF.Builder.getInt32(CS->size() - 1)
|
||||
: CGF.Builder.getInt32(0);
|
||||
LValue UB =
|
||||
createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.ub.", GlobalUBVal);
|
||||
LValue ST = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.st.",
|
||||
CGF.Builder.getInt32(1));
|
||||
LValue IL = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.il.",
|
||||
CGF.Builder.getInt32(0));
|
||||
// Loop counter.
|
||||
LValue IV = createSectionLVal(CGF, KmpInt32Ty, ".omp.sections.iv.");
|
||||
OpaqueValueExpr IVRefExpr(S.getLocStart(), KmpInt32Ty, VK_LValue);
|
||||
CodeGenFunction::OpaqueValueMapping OpaqueIV(CGF, &IVRefExpr, IV);
|
||||
OpaqueValueExpr UBRefExpr(S.getLocStart(), KmpInt32Ty, VK_LValue);
|
||||
CodeGenFunction::OpaqueValueMapping OpaqueUB(CGF, &UBRefExpr, UB);
|
||||
// Generate condition for loop.
|
||||
BinaryOperator Cond(&IVRefExpr, &UBRefExpr, BO_LE, C.BoolTy, VK_RValue,
|
||||
OK_Ordinary, S.getLocStart(),
|
||||
/*fpContractable=*/false);
|
||||
// Increment for loop counter.
|
||||
UnaryOperator Inc(&IVRefExpr, UO_PreInc, KmpInt32Ty, VK_RValue, OK_Ordinary,
|
||||
S.getLocStart());
|
||||
auto BodyGen = [Stmt, CS, &S, &IV](CodeGenFunction &CGF) {
|
||||
// Iterate through all sections and emit a switch construct:
|
||||
// switch (IV) {
|
||||
// case 0:
|
||||
// <SectionStmt[0]>;
|
||||
// break;
|
||||
// ...
|
||||
// case <NumSection> - 1:
|
||||
// <SectionStmt[<NumSection> - 1]>;
|
||||
// break;
|
||||
// }
|
||||
// .omp.sections.exit:
|
||||
auto *ExitBB = CGF.createBasicBlock(".omp.sections.exit");
|
||||
auto *SwitchStmt = CGF.Builder.CreateSwitch(
|
||||
CGF.EmitLoadOfLValue(IV, S.getLocStart()).getScalarVal(), ExitBB,
|
||||
CS == nullptr ? 1 : CS->size());
|
||||
if (CS) {
|
||||
unsigned CaseNumber = 0;
|
||||
for (auto *SubStmt : CS->children()) {
|
||||
auto CaseBB = CGF.createBasicBlock(".omp.sections.case");
|
||||
|
|
@ -1710,99 +1711,72 @@ CodeGenFunction::EmitSections(const OMPExecutableDirective &S) {
|
|||
CGF.EmitBranch(ExitBB);
|
||||
++CaseNumber;
|
||||
}
|
||||
CGF.EmitBlock(ExitBB, /*IsFinished=*/true);
|
||||
};
|
||||
|
||||
CodeGenFunction::OMPPrivateScope LoopScope(CGF);
|
||||
if (CGF.EmitOMPFirstprivateClause(S, LoopScope)) {
|
||||
// Emit implicit barrier to synchronize threads and avoid data races on
|
||||
// initialization of firstprivate variables.
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_unknown, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
} else {
|
||||
auto CaseBB = CGF.createBasicBlock(".omp.sections.case");
|
||||
CGF.EmitBlock(CaseBB);
|
||||
SwitchStmt->addCase(CGF.Builder.getInt32(0), CaseBB);
|
||||
CGF.EmitStmt(Stmt);
|
||||
CGF.EmitBranch(ExitBB);
|
||||
}
|
||||
CGF.EmitOMPPrivateClause(S, LoopScope);
|
||||
HasLastprivates = CGF.EmitOMPLastprivateClauseInit(S, LoopScope);
|
||||
CGF.EmitOMPReductionClauseInit(S, LoopScope);
|
||||
(void)LoopScope.Privatize();
|
||||
|
||||
// Emit static non-chunked loop.
|
||||
CGF.CGM.getOpenMPRuntime().emitForStaticInit(
|
||||
CGF, S.getLocStart(), OMPC_SCHEDULE_static, /*IVSize=*/32,
|
||||
/*IVSigned=*/true, /*Ordered=*/false, IL.getAddress(),
|
||||
LB.getAddress(), UB.getAddress(), ST.getAddress());
|
||||
// UB = min(UB, GlobalUB);
|
||||
auto *UBVal = CGF.EmitLoadOfScalar(UB, S.getLocStart());
|
||||
auto *MinUBGlobalUB = CGF.Builder.CreateSelect(
|
||||
CGF.Builder.CreateICmpSLT(UBVal, GlobalUBVal), UBVal, GlobalUBVal);
|
||||
CGF.EmitStoreOfScalar(MinUBGlobalUB, UB);
|
||||
// IV = LB;
|
||||
CGF.EmitStoreOfScalar(CGF.EmitLoadOfScalar(LB, S.getLocStart()), IV);
|
||||
// while (idx <= UB) { BODY; ++idx; }
|
||||
CGF.EmitOMPInnerLoop(S, /*RequiresCleanup=*/false, &Cond, &Inc, BodyGen,
|
||||
[](CodeGenFunction &) {});
|
||||
// Tell the runtime we are done.
|
||||
CGF.CGM.getOpenMPRuntime().emitForStaticFinish(CGF, S.getLocStart());
|
||||
CGF.EmitOMPReductionClauseFinal(S);
|
||||
|
||||
// Emit final copy of the lastprivate variables if IsLastIter != 0.
|
||||
if (HasLastprivates)
|
||||
CGF.EmitOMPLastprivateClauseFinal(
|
||||
S, CGF.Builder.CreateIsNotNull(
|
||||
CGF.EmitLoadOfScalar(IL, S.getLocStart())));
|
||||
CGF.EmitBlock(ExitBB, /*IsFinished=*/true);
|
||||
};
|
||||
|
||||
bool HasCancel = false;
|
||||
if (auto *OSD = dyn_cast<OMPSectionsDirective>(&S))
|
||||
HasCancel = OSD->hasCancel();
|
||||
else if (auto *OPSD = dyn_cast<OMPParallelSectionsDirective>(&S))
|
||||
HasCancel = OPSD->hasCancel();
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_sections, CodeGen,
|
||||
HasCancel);
|
||||
// Emit barrier for lastprivates only if 'sections' directive has 'nowait'
|
||||
// clause. Otherwise the barrier will be generated by the codegen for the
|
||||
// directive.
|
||||
if (HasLastprivates && S.getSingleClause<OMPNowaitClause>()) {
|
||||
CodeGenFunction::OMPPrivateScope LoopScope(CGF);
|
||||
if (CGF.EmitOMPFirstprivateClause(S, LoopScope)) {
|
||||
// Emit implicit barrier to synchronize threads and avoid data races on
|
||||
// initialization of firstprivate variables.
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(),
|
||||
OMPD_unknown);
|
||||
CGF.CGM.getOpenMPRuntime().emitBarrierCall(
|
||||
CGF, S.getLocStart(), OMPD_unknown, /*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
}
|
||||
return OMPD_sections;
|
||||
}
|
||||
// If only one section is found - no need to generate loop, emit as a single
|
||||
// region.
|
||||
bool HasFirstprivates;
|
||||
// No need to generate reductions for sections with single section region, we
|
||||
// can use original shared variables for all operations.
|
||||
bool HasReductions = S.hasClausesOfKind<OMPReductionClause>();
|
||||
// No need to generate lastprivates for sections with single section region,
|
||||
// we can use original shared variable for all calculations with barrier at
|
||||
// the end of the sections.
|
||||
bool HasLastprivates = S.hasClausesOfKind<OMPLastprivateClause>();
|
||||
auto &&CodeGen = [Stmt, &S, &HasFirstprivates](CodeGenFunction &CGF) {
|
||||
CodeGenFunction::OMPPrivateScope SingleScope(CGF);
|
||||
HasFirstprivates = CGF.EmitOMPFirstprivateClause(S, SingleScope);
|
||||
CGF.EmitOMPPrivateClause(S, SingleScope);
|
||||
(void)SingleScope.Privatize();
|
||||
CGF.EmitOMPPrivateClause(S, LoopScope);
|
||||
HasLastprivates = CGF.EmitOMPLastprivateClauseInit(S, LoopScope);
|
||||
CGF.EmitOMPReductionClauseInit(S, LoopScope);
|
||||
(void)LoopScope.Privatize();
|
||||
|
||||
CGF.EmitStmt(Stmt);
|
||||
// Emit static non-chunked loop.
|
||||
CGF.CGM.getOpenMPRuntime().emitForStaticInit(
|
||||
CGF, S.getLocStart(), OMPC_SCHEDULE_static, /*IVSize=*/32,
|
||||
/*IVSigned=*/true, /*Ordered=*/false, IL.getAddress(), LB.getAddress(),
|
||||
UB.getAddress(), ST.getAddress());
|
||||
// UB = min(UB, GlobalUB);
|
||||
auto *UBVal = CGF.EmitLoadOfScalar(UB, S.getLocStart());
|
||||
auto *MinUBGlobalUB = CGF.Builder.CreateSelect(
|
||||
CGF.Builder.CreateICmpSLT(UBVal, GlobalUBVal), UBVal, GlobalUBVal);
|
||||
CGF.EmitStoreOfScalar(MinUBGlobalUB, UB);
|
||||
// IV = LB;
|
||||
CGF.EmitStoreOfScalar(CGF.EmitLoadOfScalar(LB, S.getLocStart()), IV);
|
||||
// while (idx <= UB) { BODY; ++idx; }
|
||||
CGF.EmitOMPInnerLoop(S, /*RequiresCleanup=*/false, &Cond, &Inc, BodyGen,
|
||||
[](CodeGenFunction &) {});
|
||||
// Tell the runtime we are done.
|
||||
CGF.CGM.getOpenMPRuntime().emitForStaticFinish(CGF, S.getLocStart());
|
||||
CGF.EmitOMPReductionClauseFinal(S);
|
||||
|
||||
// Emit final copy of the lastprivate variables if IsLastIter != 0.
|
||||
if (HasLastprivates)
|
||||
CGF.EmitOMPLastprivateClauseFinal(
|
||||
S, CGF.Builder.CreateIsNotNull(
|
||||
CGF.EmitLoadOfScalar(IL, S.getLocStart())));
|
||||
};
|
||||
CGM.getOpenMPRuntime().emitSingleRegion(*this, CodeGen, S.getLocStart(),
|
||||
llvm::None, llvm::None, llvm::None,
|
||||
llvm::None);
|
||||
// Emit barrier for firstprivates, lastprivates or reductions only if
|
||||
// 'sections' directive has 'nowait' clause. Otherwise the barrier will be
|
||||
// generated by the codegen for the directive.
|
||||
if ((HasFirstprivates || HasLastprivates || HasReductions) &&
|
||||
S.getSingleClause<OMPNowaitClause>()) {
|
||||
|
||||
bool HasCancel = false;
|
||||
if (auto *OSD = dyn_cast<OMPSectionsDirective>(&S))
|
||||
HasCancel = OSD->hasCancel();
|
||||
else if (auto *OPSD = dyn_cast<OMPParallelSectionsDirective>(&S))
|
||||
HasCancel = OPSD->hasCancel();
|
||||
CGM.getOpenMPRuntime().emitInlinedDirective(*this, OMPD_sections, CodeGen,
|
||||
HasCancel);
|
||||
// Emit barrier for lastprivates only if 'sections' directive has 'nowait'
|
||||
// clause. Otherwise the barrier will be generated by the codegen for the
|
||||
// directive.
|
||||
if (HasLastprivates && S.getSingleClause<OMPNowaitClause>()) {
|
||||
// Emit implicit barrier to synchronize threads and avoid data races on
|
||||
// initialization of firstprivate variables.
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(), OMPD_unknown,
|
||||
/*EmitChecks=*/false,
|
||||
/*ForceSimpleCall=*/true);
|
||||
CGM.getOpenMPRuntime().emitBarrierCall(*this, S.getLocStart(),
|
||||
OMPD_unknown);
|
||||
}
|
||||
return OMPD_single;
|
||||
return OMPD_sections;
|
||||
}
|
||||
|
||||
void CodeGenFunction::EmitOMPSectionsDirective(const OMPSectionsDirective &S) {
|
||||
|
|
|
|||
|
|
@ -3233,6 +3233,8 @@ ToolChain::CXXStdlibType NetBSD::GetCXXStdlibType(const ArgList &Args) const {
|
|||
case llvm::Triple::ppc:
|
||||
case llvm::Triple::ppc64:
|
||||
case llvm::Triple::ppc64le:
|
||||
case llvm::Triple::sparc:
|
||||
case llvm::Triple::sparcv9:
|
||||
case llvm::Triple::x86:
|
||||
case llvm::Triple::x86_64:
|
||||
return ToolChain::CST_Libcxx;
|
||||
|
|
|
|||
|
|
@ -8317,6 +8317,8 @@ void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
|
|||
case llvm::Triple::ppc:
|
||||
case llvm::Triple::ppc64:
|
||||
case llvm::Triple::ppc64le:
|
||||
case llvm::Triple::sparc:
|
||||
case llvm::Triple::sparcv9:
|
||||
case llvm::Triple::x86:
|
||||
case llvm::Triple::x86_64:
|
||||
useLibgcc = false;
|
||||
|
|
|
|||
|
|
@ -1742,13 +1742,18 @@ void Sema::BuildBasePathArray(const CXXBasePaths &Paths,
|
|||
/// otherwise. Loc is the location where this routine should point to
|
||||
/// if there is an error, and Range is the source range to highlight
|
||||
/// if there is an error.
|
||||
///
|
||||
/// If either InaccessibleBaseID or AmbigiousBaseConvID are 0, then the
|
||||
/// diagnostic for the respective type of error will be suppressed, but the
|
||||
/// check for ill-formed code will still be performed.
|
||||
bool
|
||||
Sema::CheckDerivedToBaseConversion(QualType Derived, QualType Base,
|
||||
unsigned InaccessibleBaseID,
|
||||
unsigned AmbigiousBaseConvID,
|
||||
SourceLocation Loc, SourceRange Range,
|
||||
DeclarationName Name,
|
||||
CXXCastPath *BasePath) {
|
||||
CXXCastPath *BasePath,
|
||||
bool IgnoreAccess) {
|
||||
// First, determine whether the path from Derived to Base is
|
||||
// ambiguous. This is slightly more expensive than checking whether
|
||||
// the Derived to Base conversion exists, because here we need to
|
||||
|
|
@ -1761,7 +1766,7 @@ Sema::CheckDerivedToBaseConversion(QualType Derived, QualType Base,
|
|||
(void)DerivationOkay;
|
||||
|
||||
if (!Paths.isAmbiguous(Context.getCanonicalType(Base).getUnqualifiedType())) {
|
||||
if (InaccessibleBaseID) {
|
||||
if (!IgnoreAccess) {
|
||||
// Check that the base class can be accessed.
|
||||
switch (CheckBaseClassAccess(Loc, Base, Derived, Paths.front(),
|
||||
InaccessibleBaseID)) {
|
||||
|
|
@ -1810,12 +1815,10 @@ Sema::CheckDerivedToBaseConversion(QualType Derived, QualType Base,
|
|||
SourceLocation Loc, SourceRange Range,
|
||||
CXXCastPath *BasePath,
|
||||
bool IgnoreAccess) {
|
||||
return CheckDerivedToBaseConversion(Derived, Base,
|
||||
IgnoreAccess ? 0
|
||||
: diag::err_upcast_to_inaccessible_base,
|
||||
diag::err_ambiguous_derived_to_base_conv,
|
||||
Loc, Range, DeclarationName(),
|
||||
BasePath);
|
||||
return CheckDerivedToBaseConversion(
|
||||
Derived, Base, diag::err_upcast_to_inaccessible_base,
|
||||
diag::err_ambiguous_derived_to_base_conv, Loc, Range, DeclarationName(),
|
||||
BasePath, IgnoreAccess);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3748,6 +3748,128 @@ bool Sema::CheckVecStepExpr(Expr *E) {
|
|||
return CheckUnaryExprOrTypeTraitOperand(E, UETT_VecStep);
|
||||
}
|
||||
|
||||
static void captureVariablyModifiedType(ASTContext &Context, QualType T,
|
||||
CapturingScopeInfo *CSI) {
|
||||
assert(T->isVariablyModifiedType());
|
||||
assert(CSI != nullptr);
|
||||
|
||||
// We're going to walk down into the type and look for VLA expressions.
|
||||
do {
|
||||
const Type *Ty = T.getTypePtr();
|
||||
switch (Ty->getTypeClass()) {
|
||||
#define TYPE(Class, Base)
|
||||
#define ABSTRACT_TYPE(Class, Base)
|
||||
#define NON_CANONICAL_TYPE(Class, Base)
|
||||
#define DEPENDENT_TYPE(Class, Base) case Type::Class:
|
||||
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
|
||||
#include "clang/AST/TypeNodes.def"
|
||||
T = QualType();
|
||||
break;
|
||||
// These types are never variably-modified.
|
||||
case Type::Builtin:
|
||||
case Type::Complex:
|
||||
case Type::Vector:
|
||||
case Type::ExtVector:
|
||||
case Type::Record:
|
||||
case Type::Enum:
|
||||
case Type::Elaborated:
|
||||
case Type::TemplateSpecialization:
|
||||
case Type::ObjCObject:
|
||||
case Type::ObjCInterface:
|
||||
case Type::ObjCObjectPointer:
|
||||
case Type::Pipe:
|
||||
llvm_unreachable("type class is never variably-modified!");
|
||||
case Type::Adjusted:
|
||||
T = cast<AdjustedType>(Ty)->getOriginalType();
|
||||
break;
|
||||
case Type::Decayed:
|
||||
T = cast<DecayedType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::Pointer:
|
||||
T = cast<PointerType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::BlockPointer:
|
||||
T = cast<BlockPointerType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::LValueReference:
|
||||
case Type::RValueReference:
|
||||
T = cast<ReferenceType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::MemberPointer:
|
||||
T = cast<MemberPointerType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::ConstantArray:
|
||||
case Type::IncompleteArray:
|
||||
// Losing element qualification here is fine.
|
||||
T = cast<ArrayType>(Ty)->getElementType();
|
||||
break;
|
||||
case Type::VariableArray: {
|
||||
// Losing element qualification here is fine.
|
||||
const VariableArrayType *VAT = cast<VariableArrayType>(Ty);
|
||||
|
||||
// Unknown size indication requires no size computation.
|
||||
// Otherwise, evaluate and record it.
|
||||
if (auto Size = VAT->getSizeExpr()) {
|
||||
if (!CSI->isVLATypeCaptured(VAT)) {
|
||||
RecordDecl *CapRecord = nullptr;
|
||||
if (auto LSI = dyn_cast<LambdaScopeInfo>(CSI)) {
|
||||
CapRecord = LSI->Lambda;
|
||||
} else if (auto CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
|
||||
CapRecord = CRSI->TheRecordDecl;
|
||||
}
|
||||
if (CapRecord) {
|
||||
auto ExprLoc = Size->getExprLoc();
|
||||
auto SizeType = Context.getSizeType();
|
||||
// Build the non-static data member.
|
||||
auto Field =
|
||||
FieldDecl::Create(Context, CapRecord, ExprLoc, ExprLoc,
|
||||
/*Id*/ nullptr, SizeType, /*TInfo*/ nullptr,
|
||||
/*BW*/ nullptr, /*Mutable*/ false,
|
||||
/*InitStyle*/ ICIS_NoInit);
|
||||
Field->setImplicit(true);
|
||||
Field->setAccess(AS_private);
|
||||
Field->setCapturedVLAType(VAT);
|
||||
CapRecord->addDecl(Field);
|
||||
|
||||
CSI->addVLATypeCapture(ExprLoc, SizeType);
|
||||
}
|
||||
}
|
||||
}
|
||||
T = VAT->getElementType();
|
||||
break;
|
||||
}
|
||||
case Type::FunctionProto:
|
||||
case Type::FunctionNoProto:
|
||||
T = cast<FunctionType>(Ty)->getReturnType();
|
||||
break;
|
||||
case Type::Paren:
|
||||
case Type::TypeOf:
|
||||
case Type::UnaryTransform:
|
||||
case Type::Attributed:
|
||||
case Type::SubstTemplateTypeParm:
|
||||
case Type::PackExpansion:
|
||||
// Keep walking after single level desugaring.
|
||||
T = T.getSingleStepDesugaredType(Context);
|
||||
break;
|
||||
case Type::Typedef:
|
||||
T = cast<TypedefType>(Ty)->desugar();
|
||||
break;
|
||||
case Type::Decltype:
|
||||
T = cast<DecltypeType>(Ty)->desugar();
|
||||
break;
|
||||
case Type::Auto:
|
||||
T = cast<AutoType>(Ty)->getDeducedType();
|
||||
break;
|
||||
case Type::TypeOfExpr:
|
||||
T = cast<TypeOfExprType>(Ty)->getUnderlyingExpr()->getType();
|
||||
break;
|
||||
case Type::Atomic:
|
||||
T = cast<AtomicType>(Ty)->getValueType();
|
||||
break;
|
||||
}
|
||||
} while (!T.isNull() && T->isVariablyModifiedType());
|
||||
}
|
||||
|
||||
/// \brief Build a sizeof or alignof expression given a type operand.
|
||||
ExprResult
|
||||
Sema::CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
|
||||
|
|
@ -3763,6 +3885,20 @@ Sema::CreateUnaryExprOrTypeTraitExpr(TypeSourceInfo *TInfo,
|
|||
CheckUnaryExprOrTypeTraitOperand(T, OpLoc, R, ExprKind))
|
||||
return ExprError();
|
||||
|
||||
if (T->isVariablyModifiedType() && FunctionScopes.size() > 1) {
|
||||
if (auto *TT = T->getAs<TypedefType>()) {
|
||||
if (auto *CSI = dyn_cast<CapturingScopeInfo>(FunctionScopes.back())) {
|
||||
DeclContext *DC = nullptr;
|
||||
if (auto LSI = dyn_cast<LambdaScopeInfo>(CSI))
|
||||
DC = LSI->CallOperator;
|
||||
else if (auto CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI))
|
||||
DC = CRSI->TheCapturedDecl;
|
||||
if (DC && TT->getDecl()->getDeclContext() != DC)
|
||||
captureVariablyModifiedType(Context, T, CSI);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// C99 6.5.3.4p4: the type (an unsigned integer type) is size_t.
|
||||
return new (Context) UnaryExprOrTypeTraitExpr(
|
||||
ExprKind, TInfo, Context.getSizeType(), OpLoc, R.getEnd());
|
||||
|
|
@ -7354,11 +7490,14 @@ Sema::CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &CallerRHS,
|
|||
LHSType->isBlockPointerType()) &&
|
||||
RHS.get()->isNullPointerConstant(Context,
|
||||
Expr::NPC_ValueDependentIsNull)) {
|
||||
CastKind Kind;
|
||||
CXXCastPath Path;
|
||||
CheckPointerConversion(RHS.get(), LHSType, Kind, Path, false);
|
||||
if (ConvertRHS)
|
||||
RHS = ImpCastExprToType(RHS.get(), LHSType, Kind, VK_RValue, &Path);
|
||||
if (Diagnose || ConvertRHS) {
|
||||
CastKind Kind;
|
||||
CXXCastPath Path;
|
||||
CheckPointerConversion(RHS.get(), LHSType, Kind, Path,
|
||||
/*IgnoreBaseAccess=*/false, Diagnose);
|
||||
if (ConvertRHS)
|
||||
RHS = ImpCastExprToType(RHS.get(), LHSType, Kind, VK_RValue, &Path);
|
||||
}
|
||||
return Compatible;
|
||||
}
|
||||
|
||||
|
|
@ -7376,8 +7515,8 @@ Sema::CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &CallerRHS,
|
|||
}
|
||||
|
||||
Expr *PRE = RHS.get()->IgnoreParenCasts();
|
||||
if (ObjCProtocolExpr *OPE = dyn_cast<ObjCProtocolExpr>(PRE)) {
|
||||
ObjCProtocolDecl *PDecl = OPE->getProtocol();
|
||||
if (Diagnose && isa<ObjCProtocolExpr>(PRE)) {
|
||||
ObjCProtocolDecl *PDecl = cast<ObjCProtocolExpr>(PRE)->getProtocol();
|
||||
if (PDecl && !PDecl->hasDefinition()) {
|
||||
Diag(PRE->getExprLoc(), diag::warn_atprotocol_protocol) << PDecl->getName();
|
||||
Diag(PDecl->getLocation(), diag::note_entity_declared_at) << PDecl;
|
||||
|
|
@ -7399,11 +7538,11 @@ Sema::CheckSingleAssignmentConstraints(QualType LHSType, ExprResult &CallerRHS,
|
|||
Expr *E = RHS.get();
|
||||
if (getLangOpts().ObjCAutoRefCount)
|
||||
CheckObjCARCConversion(SourceRange(), Ty, E, CCK_ImplicitConversion,
|
||||
DiagnoseCFAudited);
|
||||
Diagnose, DiagnoseCFAudited);
|
||||
if (getLangOpts().ObjC1 &&
|
||||
(CheckObjCBridgeRelatedConversions(E->getLocStart(),
|
||||
LHSType, E->getType(), E) ||
|
||||
ConversionToObjCStringLiteralCheck(LHSType, E))) {
|
||||
(CheckObjCBridgeRelatedConversions(E->getLocStart(), LHSType,
|
||||
E->getType(), E, Diagnose) ||
|
||||
ConversionToObjCStringLiteralCheck(LHSType, E, Diagnose))) {
|
||||
RHS = E;
|
||||
return Compatible;
|
||||
}
|
||||
|
|
@ -8961,8 +9100,9 @@ QualType Sema::CheckCompareOperands(ExprResult &LHS, ExprResult &RHS,
|
|||
else {
|
||||
Expr *E = RHS.get();
|
||||
if (getLangOpts().ObjCAutoRefCount)
|
||||
CheckObjCARCConversion(SourceRange(), LHSType, E, CCK_ImplicitConversion, false,
|
||||
Opc);
|
||||
CheckObjCARCConversion(SourceRange(), LHSType, E,
|
||||
CCK_ImplicitConversion, /*Diagnose=*/true,
|
||||
/*DiagnoseCFAudited=*/false, Opc);
|
||||
RHS = ImpCastExprToType(E, LHSType,
|
||||
LPT ? CK_BitCast :CK_CPointerToObjCPointerCast);
|
||||
}
|
||||
|
|
@ -11830,8 +11970,8 @@ ExprResult Sema::ActOnGNUNullExpr(SourceLocation TokenLoc) {
|
|||
return new (Context) GNUNullExpr(Ty, TokenLoc);
|
||||
}
|
||||
|
||||
bool
|
||||
Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&Exp) {
|
||||
bool Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&Exp,
|
||||
bool Diagnose) {
|
||||
if (!getLangOpts().ObjC1)
|
||||
return false;
|
||||
|
||||
|
|
@ -11857,8 +11997,9 @@ Sema::ConversionToObjCStringLiteralCheck(QualType DstType, Expr *&Exp) {
|
|||
StringLiteral *SL = dyn_cast<StringLiteral>(SrcExpr);
|
||||
if (!SL || !SL->isAscii())
|
||||
return false;
|
||||
Diag(SL->getLocStart(), diag::err_missing_atsign_prefix)
|
||||
<< FixItHint::CreateInsertion(SL->getLocStart(), "@");
|
||||
if (Diagnose)
|
||||
Diag(SL->getLocStart(), diag::err_missing_atsign_prefix)
|
||||
<< FixItHint::CreateInsertion(SL->getLocStart(), "@");
|
||||
Exp = BuildObjCStringLiteral(SL->getLocStart(), SL).get();
|
||||
return true;
|
||||
}
|
||||
|
|
@ -13139,120 +13280,7 @@ bool Sema::tryCaptureVariable(
|
|||
QualType QTy = Var->getType();
|
||||
if (ParmVarDecl *PVD = dyn_cast_or_null<ParmVarDecl>(Var))
|
||||
QTy = PVD->getOriginalType();
|
||||
do {
|
||||
const Type *Ty = QTy.getTypePtr();
|
||||
switch (Ty->getTypeClass()) {
|
||||
#define TYPE(Class, Base)
|
||||
#define ABSTRACT_TYPE(Class, Base)
|
||||
#define NON_CANONICAL_TYPE(Class, Base)
|
||||
#define DEPENDENT_TYPE(Class, Base) case Type::Class:
|
||||
#define NON_CANONICAL_UNLESS_DEPENDENT_TYPE(Class, Base)
|
||||
#include "clang/AST/TypeNodes.def"
|
||||
QTy = QualType();
|
||||
break;
|
||||
// These types are never variably-modified.
|
||||
case Type::Builtin:
|
||||
case Type::Complex:
|
||||
case Type::Vector:
|
||||
case Type::ExtVector:
|
||||
case Type::Record:
|
||||
case Type::Enum:
|
||||
case Type::Elaborated:
|
||||
case Type::TemplateSpecialization:
|
||||
case Type::ObjCObject:
|
||||
case Type::ObjCInterface:
|
||||
case Type::ObjCObjectPointer:
|
||||
case Type::Pipe:
|
||||
llvm_unreachable("type class is never variably-modified!");
|
||||
case Type::Adjusted:
|
||||
QTy = cast<AdjustedType>(Ty)->getOriginalType();
|
||||
break;
|
||||
case Type::Decayed:
|
||||
QTy = cast<DecayedType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::Pointer:
|
||||
QTy = cast<PointerType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::BlockPointer:
|
||||
QTy = cast<BlockPointerType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::LValueReference:
|
||||
case Type::RValueReference:
|
||||
QTy = cast<ReferenceType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::MemberPointer:
|
||||
QTy = cast<MemberPointerType>(Ty)->getPointeeType();
|
||||
break;
|
||||
case Type::ConstantArray:
|
||||
case Type::IncompleteArray:
|
||||
// Losing element qualification here is fine.
|
||||
QTy = cast<ArrayType>(Ty)->getElementType();
|
||||
break;
|
||||
case Type::VariableArray: {
|
||||
// Losing element qualification here is fine.
|
||||
const VariableArrayType *VAT = cast<VariableArrayType>(Ty);
|
||||
|
||||
// Unknown size indication requires no size computation.
|
||||
// Otherwise, evaluate and record it.
|
||||
if (auto Size = VAT->getSizeExpr()) {
|
||||
if (!CSI->isVLATypeCaptured(VAT)) {
|
||||
RecordDecl *CapRecord = nullptr;
|
||||
if (auto LSI = dyn_cast<LambdaScopeInfo>(CSI)) {
|
||||
CapRecord = LSI->Lambda;
|
||||
} else if (auto CRSI = dyn_cast<CapturedRegionScopeInfo>(CSI)) {
|
||||
CapRecord = CRSI->TheRecordDecl;
|
||||
}
|
||||
if (CapRecord) {
|
||||
auto ExprLoc = Size->getExprLoc();
|
||||
auto SizeType = Context.getSizeType();
|
||||
// Build the non-static data member.
|
||||
auto Field = FieldDecl::Create(
|
||||
Context, CapRecord, ExprLoc, ExprLoc,
|
||||
/*Id*/ nullptr, SizeType, /*TInfo*/ nullptr,
|
||||
/*BW*/ nullptr, /*Mutable*/ false,
|
||||
/*InitStyle*/ ICIS_NoInit);
|
||||
Field->setImplicit(true);
|
||||
Field->setAccess(AS_private);
|
||||
Field->setCapturedVLAType(VAT);
|
||||
CapRecord->addDecl(Field);
|
||||
|
||||
CSI->addVLATypeCapture(ExprLoc, SizeType);
|
||||
}
|
||||
}
|
||||
}
|
||||
QTy = VAT->getElementType();
|
||||
break;
|
||||
}
|
||||
case Type::FunctionProto:
|
||||
case Type::FunctionNoProto:
|
||||
QTy = cast<FunctionType>(Ty)->getReturnType();
|
||||
break;
|
||||
case Type::Paren:
|
||||
case Type::TypeOf:
|
||||
case Type::UnaryTransform:
|
||||
case Type::Attributed:
|
||||
case Type::SubstTemplateTypeParm:
|
||||
case Type::PackExpansion:
|
||||
// Keep walking after single level desugaring.
|
||||
QTy = QTy.getSingleStepDesugaredType(getASTContext());
|
||||
break;
|
||||
case Type::Typedef:
|
||||
QTy = cast<TypedefType>(Ty)->desugar();
|
||||
break;
|
||||
case Type::Decltype:
|
||||
QTy = cast<DecltypeType>(Ty)->desugar();
|
||||
break;
|
||||
case Type::Auto:
|
||||
QTy = cast<AutoType>(Ty)->getDeducedType();
|
||||
break;
|
||||
case Type::TypeOfExpr:
|
||||
QTy = cast<TypeOfExprType>(Ty)->getUnderlyingExpr()->getType();
|
||||
break;
|
||||
case Type::Atomic:
|
||||
QTy = cast<AtomicType>(Ty)->getValueType();
|
||||
break;
|
||||
}
|
||||
} while (!QTy.isNull() && QTy->isVariablyModifiedType());
|
||||
captureVariablyModifiedType(Context, QTy, CSI);
|
||||
}
|
||||
|
||||
if (getLangOpts().OpenMP) {
|
||||
|
|
|
|||
|
|
@ -3816,7 +3816,7 @@ bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc,
|
|||
ObjCMethodDecl *&ClassMethod,
|
||||
ObjCMethodDecl *&InstanceMethod,
|
||||
TypedefNameDecl *&TDNDecl,
|
||||
bool CfToNs) {
|
||||
bool CfToNs, bool Diagnose) {
|
||||
QualType T = CfToNs ? SrcType : DestType;
|
||||
ObjCBridgeRelatedAttr *ObjCBAttr = ObjCBridgeRelatedAttrFromType(T, TDNDecl);
|
||||
if (!ObjCBAttr)
|
||||
|
|
@ -3832,20 +3832,24 @@ bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc,
|
|||
LookupResult R(*this, DeclarationName(RCId), SourceLocation(),
|
||||
Sema::LookupOrdinaryName);
|
||||
if (!LookupName(R, TUScope)) {
|
||||
Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId
|
||||
<< SrcType << DestType;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
if (Diagnose) {
|
||||
Diag(Loc, diag::err_objc_bridged_related_invalid_class) << RCId
|
||||
<< SrcType << DestType;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
Target = R.getFoundDecl();
|
||||
if (Target && isa<ObjCInterfaceDecl>(Target))
|
||||
RelatedClass = cast<ObjCInterfaceDecl>(Target);
|
||||
else {
|
||||
Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId
|
||||
<< SrcType << DestType;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
if (Target)
|
||||
Diag(Target->getLocStart(), diag::note_declared_at);
|
||||
if (Diagnose) {
|
||||
Diag(Loc, diag::err_objc_bridged_related_invalid_class_name) << RCId
|
||||
<< SrcType << DestType;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
if (Target)
|
||||
Diag(Target->getLocStart(), diag::note_declared_at);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
@ -3854,9 +3858,11 @@ bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc,
|
|||
Selector Sel = Context.Selectors.getUnarySelector(CMId);
|
||||
ClassMethod = RelatedClass->lookupMethod(Sel, false);
|
||||
if (!ClassMethod) {
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << Sel << false;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
if (Diagnose) {
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << Sel << false;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -3866,9 +3872,11 @@ bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc,
|
|||
Selector Sel = Context.Selectors.getNullarySelector(IMId);
|
||||
InstanceMethod = RelatedClass->lookupMethod(Sel, true);
|
||||
if (!InstanceMethod) {
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << Sel << true;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
if (Diagnose) {
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << Sel << true;
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
@ -3878,7 +3886,7 @@ bool Sema::checkObjCBridgeRelatedComponents(SourceLocation Loc,
|
|||
bool
|
||||
Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,
|
||||
QualType DestType, QualType SrcType,
|
||||
Expr *&SrcExpr) {
|
||||
Expr *&SrcExpr, bool Diagnose) {
|
||||
ARCConversionTypeClass rhsExprACTC = classifyTypeForARCConversion(SrcType);
|
||||
ARCConversionTypeClass lhsExprACTC = classifyTypeForARCConversion(DestType);
|
||||
bool CfToNs = (rhsExprACTC == ACTC_coreFoundation && lhsExprACTC == ACTC_retainable);
|
||||
|
|
@ -3891,27 +3899,29 @@ Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,
|
|||
ObjCMethodDecl *InstanceMethod = nullptr;
|
||||
TypedefNameDecl *TDNDecl = nullptr;
|
||||
if (!checkObjCBridgeRelatedComponents(Loc, DestType, SrcType, RelatedClass,
|
||||
ClassMethod, InstanceMethod, TDNDecl, CfToNs))
|
||||
ClassMethod, InstanceMethod, TDNDecl,
|
||||
CfToNs, Diagnose))
|
||||
return false;
|
||||
|
||||
if (CfToNs) {
|
||||
// Implicit conversion from CF to ObjC object is needed.
|
||||
if (ClassMethod) {
|
||||
std::string ExpressionString = "[";
|
||||
ExpressionString += RelatedClass->getNameAsString();
|
||||
ExpressionString += " ";
|
||||
ExpressionString += ClassMethod->getSelector().getAsString();
|
||||
SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());
|
||||
// Provide a fixit: [RelatedClass ClassMethod SrcExpr]
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << ClassMethod->getSelector() << false
|
||||
<< FixItHint::CreateInsertion(SrcExpr->getLocStart(), ExpressionString)
|
||||
<< FixItHint::CreateInsertion(SrcExprEndLoc, "]");
|
||||
Diag(RelatedClass->getLocStart(), diag::note_declared_at);
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
if (Diagnose) {
|
||||
std::string ExpressionString = "[";
|
||||
ExpressionString += RelatedClass->getNameAsString();
|
||||
ExpressionString += " ";
|
||||
ExpressionString += ClassMethod->getSelector().getAsString();
|
||||
SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());
|
||||
// Provide a fixit: [RelatedClass ClassMethod SrcExpr]
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << ClassMethod->getSelector() << false
|
||||
<< FixItHint::CreateInsertion(SrcExpr->getLocStart(), ExpressionString)
|
||||
<< FixItHint::CreateInsertion(SrcExprEndLoc, "]");
|
||||
Diag(RelatedClass->getLocStart(), diag::note_declared_at);
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
}
|
||||
|
||||
QualType receiverType =
|
||||
Context.getObjCInterfaceType(RelatedClass);
|
||||
QualType receiverType = Context.getObjCInterfaceType(RelatedClass);
|
||||
// Argument.
|
||||
Expr *args[] = { SrcExpr };
|
||||
ExprResult msg = BuildClassMessageImplicit(receiverType, false,
|
||||
|
|
@ -3925,30 +3935,34 @@ Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,
|
|||
else {
|
||||
// Implicit conversion from ObjC type to CF object is needed.
|
||||
if (InstanceMethod) {
|
||||
std::string ExpressionString;
|
||||
SourceLocation SrcExprEndLoc = getLocForEndOfToken(SrcExpr->getLocEnd());
|
||||
if (InstanceMethod->isPropertyAccessor())
|
||||
if (const ObjCPropertyDecl *PDecl = InstanceMethod->findPropertyDecl()) {
|
||||
// fixit: ObjectExpr.propertyname when it is aproperty accessor.
|
||||
ExpressionString = ".";
|
||||
ExpressionString += PDecl->getNameAsString();
|
||||
if (Diagnose) {
|
||||
std::string ExpressionString;
|
||||
SourceLocation SrcExprEndLoc =
|
||||
getLocForEndOfToken(SrcExpr->getLocEnd());
|
||||
if (InstanceMethod->isPropertyAccessor())
|
||||
if (const ObjCPropertyDecl *PDecl =
|
||||
InstanceMethod->findPropertyDecl()) {
|
||||
// fixit: ObjectExpr.propertyname when it is aproperty accessor.
|
||||
ExpressionString = ".";
|
||||
ExpressionString += PDecl->getNameAsString();
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << InstanceMethod->getSelector() << true
|
||||
<< FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
|
||||
}
|
||||
if (ExpressionString.empty()) {
|
||||
// Provide a fixit: [ObjectExpr InstanceMethod]
|
||||
ExpressionString = " ";
|
||||
ExpressionString += InstanceMethod->getSelector().getAsString();
|
||||
ExpressionString += "]";
|
||||
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << InstanceMethod->getSelector() << true
|
||||
<< FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
|
||||
<< SrcType << DestType << InstanceMethod->getSelector() << true
|
||||
<< FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")
|
||||
<< FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
|
||||
}
|
||||
if (ExpressionString.empty()) {
|
||||
// Provide a fixit: [ObjectExpr InstanceMethod]
|
||||
ExpressionString = " ";
|
||||
ExpressionString += InstanceMethod->getSelector().getAsString();
|
||||
ExpressionString += "]";
|
||||
|
||||
Diag(Loc, diag::err_objc_bridged_related_known_method)
|
||||
<< SrcType << DestType << InstanceMethod->getSelector() << true
|
||||
<< FixItHint::CreateInsertion(SrcExpr->getLocStart(), "[")
|
||||
<< FixItHint::CreateInsertion(SrcExprEndLoc, ExpressionString);
|
||||
Diag(RelatedClass->getLocStart(), diag::note_declared_at);
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
}
|
||||
Diag(RelatedClass->getLocStart(), diag::note_declared_at);
|
||||
Diag(TDNDecl->getLocStart(), diag::note_declared_at);
|
||||
|
||||
ExprResult msg =
|
||||
BuildInstanceMessageImplicit(SrcExpr, SrcType,
|
||||
|
|
@ -3965,6 +3979,7 @@ Sema::CheckObjCBridgeRelatedConversions(SourceLocation Loc,
|
|||
Sema::ARCConversionResult
|
||||
Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,
|
||||
Expr *&castExpr, CheckedConversionKind CCK,
|
||||
bool Diagnose,
|
||||
bool DiagnoseCFAudited,
|
||||
BinaryOperatorKind Opc) {
|
||||
QualType castExprType = castExpr->getType();
|
||||
|
|
@ -3980,9 +3995,9 @@ Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,
|
|||
if (exprACTC == castACTC) {
|
||||
// check for viablity and report error if casting an rvalue to a
|
||||
// life-time qualifier.
|
||||
if ((castACTC == ACTC_retainable) &&
|
||||
if (Diagnose && castACTC == ACTC_retainable &&
|
||||
(CCK == CCK_CStyleCast || CCK == CCK_OtherCast) &&
|
||||
(castType != castExprType)) {
|
||||
castType != castExprType) {
|
||||
const Type *DT = castType.getTypePtr();
|
||||
QualType QDT = castType;
|
||||
// We desugar some types but not others. We ignore those
|
||||
|
|
@ -4051,19 +4066,20 @@ Sema::CheckObjCARCConversion(SourceRange castRange, QualType castType,
|
|||
// to 'NSString *'. Let caller issue a normal mismatched diagnostic with
|
||||
// suitable fix-it.
|
||||
if (castACTC == ACTC_retainable && exprACTC == ACTC_none &&
|
||||
ConversionToObjCStringLiteralCheck(castType, castExpr))
|
||||
ConversionToObjCStringLiteralCheck(castType, castExpr, Diagnose))
|
||||
return ACR_okay;
|
||||
|
||||
// Do not issue "bridge cast" diagnostic when implicit casting
|
||||
// a retainable object to a CF type parameter belonging to an audited
|
||||
// CF API function. Let caller issue a normal type mismatched diagnostic
|
||||
// instead.
|
||||
if (!DiagnoseCFAudited || exprACTC != ACTC_retainable ||
|
||||
castACTC != ACTC_coreFoundation)
|
||||
if (Diagnose &&
|
||||
(!DiagnoseCFAudited || exprACTC != ACTC_retainable ||
|
||||
castACTC != ACTC_coreFoundation))
|
||||
if (!(exprACTC == ACTC_voidPtr && castACTC == ACTC_retainable &&
|
||||
(Opc == BO_NE || Opc == BO_EQ)))
|
||||
diagnoseObjCARCConversion(*this, castRange, castType, castACTC,
|
||||
castExpr, castExpr, exprACTC, CCK);
|
||||
diagnoseObjCARCConversion(*this, castRange, castType, castACTC, castExpr,
|
||||
castExpr, exprACTC, CCK);
|
||||
return ACR_okay;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2687,15 +2687,16 @@ bool Sema::FunctionParamTypesAreEqual(const FunctionProtoType *OldType,
|
|||
bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
|
||||
CastKind &Kind,
|
||||
CXXCastPath& BasePath,
|
||||
bool IgnoreBaseAccess) {
|
||||
bool IgnoreBaseAccess,
|
||||
bool Diagnose) {
|
||||
QualType FromType = From->getType();
|
||||
bool IsCStyleOrFunctionalCast = IgnoreBaseAccess;
|
||||
|
||||
Kind = CK_BitCast;
|
||||
|
||||
if (!IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() &&
|
||||
if (Diagnose && !IsCStyleOrFunctionalCast && !FromType->isAnyPointerType() &&
|
||||
From->isNullPointerConstant(Context, Expr::NPC_ValueDependentIsNotNull) ==
|
||||
Expr::NPCK_ZeroExpression) {
|
||||
Expr::NPCK_ZeroExpression) {
|
||||
if (Context.hasSameUnqualifiedType(From->getType(), Context.BoolTy))
|
||||
DiagRuntimeBehavior(From->getExprLoc(), From,
|
||||
PDiag(diag::warn_impcast_bool_to_null_pointer)
|
||||
|
|
@ -2713,18 +2714,24 @@ bool Sema::CheckPointerConversion(Expr *From, QualType ToType,
|
|||
!Context.hasSameUnqualifiedType(FromPointeeType, ToPointeeType)) {
|
||||
// We must have a derived-to-base conversion. Check an
|
||||
// ambiguous or inaccessible conversion.
|
||||
if (CheckDerivedToBaseConversion(FromPointeeType, ToPointeeType,
|
||||
From->getExprLoc(),
|
||||
From->getSourceRange(), &BasePath,
|
||||
IgnoreBaseAccess))
|
||||
unsigned InaccessibleID = 0;
|
||||
unsigned AmbigiousID = 0;
|
||||
if (Diagnose) {
|
||||
InaccessibleID = diag::err_upcast_to_inaccessible_base;
|
||||
AmbigiousID = diag::err_ambiguous_derived_to_base_conv;
|
||||
}
|
||||
if (CheckDerivedToBaseConversion(
|
||||
FromPointeeType, ToPointeeType, InaccessibleID, AmbigiousID,
|
||||
From->getExprLoc(), From->getSourceRange(), DeclarationName(),
|
||||
&BasePath, IgnoreBaseAccess))
|
||||
return true;
|
||||
|
||||
// The conversion was successful.
|
||||
Kind = CK_DerivedToBase;
|
||||
}
|
||||
|
||||
if (!IsCStyleOrFunctionalCast && FromPointeeType->isFunctionType() &&
|
||||
ToPointeeType->isVoidType()) {
|
||||
if (Diagnose && !IsCStyleOrFunctionalCast &&
|
||||
FromPointeeType->isFunctionType() && ToPointeeType->isVoidType()) {
|
||||
assert(getLangOpts().MSVCCompat &&
|
||||
"this should only be possible with MSVCCompat!");
|
||||
Diag(From->getExprLoc(), diag::ext_ms_impcast_fn_obj)
|
||||
|
|
|
|||
|
|
@ -10,10 +10,23 @@ void *use = &used;
|
|||
// CHECK: @cvar = global
|
||||
extern "C" auto cvar = []{};
|
||||
|
||||
// CHECK-LABEL: define i32 @_Z9ARBSizeOfi(i32
|
||||
int ARBSizeOf(int n) {
|
||||
typedef double (T)[8][n];
|
||||
using TT = double [8][n];
|
||||
return [&]() -> int {
|
||||
typedef double(T1)[8][n];
|
||||
using TT1 = double[8][n];
|
||||
return sizeof(T) + sizeof(T1) + sizeof(TT) + sizeof(TT1);
|
||||
}();
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ9ARBSizeOfiENK3$_0clEv"
|
||||
|
||||
int a() { return []{ return 1; }(); }
|
||||
// CHECK-LABEL: define i32 @_Z1av
|
||||
// CHECK: call i32 @"_ZZ1avENK3$_0clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1avENK3$_0clEv"
|
||||
// CHECK: call i32 @"_ZZ1avENK3$_1clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1avENK3$_1clEv"
|
||||
// CHECK: ret i32 1
|
||||
|
||||
int b(int x) { return [x]{return x;}(); }
|
||||
|
|
@ -21,8 +34,8 @@ int b(int x) { return [x]{return x;}(); }
|
|||
// CHECK: store i32
|
||||
// CHECK: load i32, i32*
|
||||
// CHECK: store i32
|
||||
// CHECK: call i32 @"_ZZ1biENK3$_1clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1biENK3$_1clEv"
|
||||
// CHECK: call i32 @"_ZZ1biENK3$_2clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1biENK3$_2clEv"
|
||||
// CHECK: load i32, i32*
|
||||
// CHECK: ret i32
|
||||
|
||||
|
|
@ -30,8 +43,8 @@ int c(int x) { return [&x]{return x;}(); }
|
|||
// CHECK-LABEL: define i32 @_Z1ci
|
||||
// CHECK: store i32
|
||||
// CHECK: store i32*
|
||||
// CHECK: call i32 @"_ZZ1ciENK3$_2clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1ciENK3$_2clEv"
|
||||
// CHECK: call i32 @"_ZZ1ciENK3$_3clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1ciENK3$_3clEv"
|
||||
// CHECK: load i32*, i32**
|
||||
// CHECK: load i32, i32*
|
||||
// CHECK: ret i32
|
||||
|
|
@ -43,8 +56,8 @@ int d(int x) { D y[10]; [x,y] { return y[x].x; }(); }
|
|||
// CHECK: call void @_ZN1DC1Ev
|
||||
// CHECK: icmp ult i64 %{{.*}}, 10
|
||||
// CHECK: call void @_ZN1DC1ERKS_
|
||||
// CHECK: call i32 @"_ZZ1diENK3$_3clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_3clEv"
|
||||
// CHECK: call i32 @"_ZZ1diENK3$_4clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1diENK3$_4clEv"
|
||||
// CHECK: load i32, i32*
|
||||
// CHECK: load i32, i32*
|
||||
// CHECK: ret i32
|
||||
|
|
@ -54,18 +67,18 @@ int e(E a, E b, bool cond) { [a,b,cond](){ return (cond ? a : b).x; }(); }
|
|||
// CHECK-LABEL: define i32 @_Z1e1ES_b
|
||||
// CHECK: call void @_ZN1EC1ERKS_
|
||||
// CHECK: invoke void @_ZN1EC1ERKS_
|
||||
// CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_4clEv"
|
||||
// CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
|
||||
// CHECK: call void @"_ZZ1e1ES_bEN3$_4D1Ev"
|
||||
// CHECK: invoke i32 @"_ZZ1e1ES_bENK3$_5clEv"
|
||||
// CHECK: call void @"_ZZ1e1ES_bEN3$_5D1Ev"
|
||||
// CHECK: call void @"_ZZ1e1ES_bEN3$_5D1Ev"
|
||||
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1e1ES_bENK3$_4clEv"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1e1ES_bENK3$_5clEv"
|
||||
// CHECK: trunc i8
|
||||
// CHECK: load i32, i32*
|
||||
// CHECK: ret i32
|
||||
|
||||
void f() {
|
||||
// CHECK-LABEL: define void @_Z1fv()
|
||||
// CHECK: @"_ZZ1fvENK3$_5cvPFiiiEEv"
|
||||
// CHECK: @"_ZZ1fvENK3$_6cvPFiiiEEv"
|
||||
// CHECK-NEXT: store i32 (i32, i32)*
|
||||
// CHECK-NEXT: ret void
|
||||
int (*fp)(int, int) = [](int x, int y){ return x + y; };
|
||||
|
|
@ -74,7 +87,7 @@ void f() {
|
|||
static int k;
|
||||
int g() {
|
||||
int &r = k;
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_6clEv"(
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1gvENK3$_7clEv"(
|
||||
// CHECK-NOT: }
|
||||
// CHECK: load i32, i32* @_ZL1k,
|
||||
return [] { return r; } ();
|
||||
|
|
@ -91,7 +104,7 @@ void staticarrayref(){
|
|||
}();
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define internal i32* @"_ZZ11PR22071_funvENK3$_8clEv"
|
||||
// CHECK-LABEL: define internal i32* @"_ZZ11PR22071_funvENK3$_9clEv"
|
||||
// CHECK: ret i32* @PR22071_var
|
||||
int PR22071_var;
|
||||
int *PR22071_fun() {
|
||||
|
|
@ -99,19 +112,19 @@ int *PR22071_fun() {
|
|||
return [&] { return &y; }();
|
||||
}
|
||||
|
||||
// CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_4D2Ev"
|
||||
// CHECK-LABEL: define internal void @"_ZZ1e1ES_bEN3$_5D2Ev"
|
||||
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_58__invokeEii"
|
||||
// CHECK-LABEL: define internal i32 @"_ZZ1fvEN3$_68__invokeEii"
|
||||
// CHECK: store i32
|
||||
// CHECK-NEXT: store i32
|
||||
// CHECK-NEXT: load i32, i32*
|
||||
// CHECK-NEXT: load i32, i32*
|
||||
// CHECK-NEXT: call i32 @"_ZZ1fvENK3$_5clEii"
|
||||
// CHECK-NEXT: call i32 @"_ZZ1fvENK3$_6clEii"
|
||||
// CHECK-NEXT: ret i32
|
||||
|
||||
// CHECK-LABEL: define internal void @"_ZZ1hvEN3$_98__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} {
|
||||
// CHECK-LABEL: define internal void @"_ZZ1hvEN4$_108__invokeEv"(%struct.A* noalias sret %agg.result) {{.*}} {
|
||||
// CHECK-NOT: =
|
||||
// CHECK: call void @"_ZZ1hvENK3$_9clEv"(%struct.A* sret %agg.result,
|
||||
// CHECK: call void @"_ZZ1hvENK4$_10clEv"(%struct.A* sret %agg.result,
|
||||
// CHECK-NEXT: ret void
|
||||
struct A { ~A(); };
|
||||
void h() {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
// RUN: %clang_cc1 -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm -O0 -cl-std=CL2.0 -o - %s | FileCheck %s
|
||||
|
||||
// CHECK: %opencl.pipe_t = type opaque
|
||||
typedef unsigned char __attribute__((ext_vector_type(3))) uchar3;
|
||||
|
|
|
|||
|
|
@ -86,12 +86,18 @@
|
|||
// RUN: %clang -no-canonical-prefixes -target arm--netbsd6.0.0-eabi -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-ARM-6 %s
|
||||
// RUN: %clang -no-canonical-prefixes -target sparc--netbsd -static \
|
||||
// RUN: %clang -no-canonical-prefixes -target sparc--netbsd7.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC %s
|
||||
// RUN: %clang -no-canonical-prefixes -target sparc64--netbsd -static \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC-7 %s
|
||||
// RUN: %clang -no-canonical-prefixes -target sparc--netbsd6.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC64 %s
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC-6 %s
|
||||
// RUN: %clang -no-canonical-prefixes -target sparc64--netbsd7.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC64-7 %s
|
||||
// RUN: %clang -no-canonical-prefixes -target sparc64--netbsd6.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC64-6 %s
|
||||
// RUN: %clang -no-canonical-prefixes -target powerpc--netbsd -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-POWERPC %s
|
||||
|
|
@ -302,22 +308,37 @@
|
|||
// S-ARM-6: "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-ARM-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd"
|
||||
// S-SPARC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC: "-m" "elf32_sparc"
|
||||
// S-SPARC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc"
|
||||
// S-SPARC: "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
// S-SPARC-6: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd6.0.0"
|
||||
// S-SPARC-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC-6: "-m" "elf32_sparc"
|
||||
// S-SPARC-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc"
|
||||
// S-SPARC-6: "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC64: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd"
|
||||
// S-SPARC64: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC64: "-m" "elf64_sparc"
|
||||
// S-SPARC64: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc"
|
||||
// S-SPARC64: "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
// S-SPARC-7: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd7.0.0"
|
||||
// S-SPARC-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC-7: "-m" "elf32_sparc"
|
||||
// S-SPARC-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc"
|
||||
// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC64-6: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd6.0.0"
|
||||
// S-SPARC64-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC64-6: "-m" "elf64_sparc"
|
||||
// S-SPARC64-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc"
|
||||
// S-SPARC64-6: "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC64-7: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd7.0.0"
|
||||
// S-SPARC64-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC64-7: "-m" "elf64_sparc"
|
||||
// S-SPARC64-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc"
|
||||
// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-POWERPC: clang{{.*}}" "-cc1" "-triple" "powerpc--netbsd"
|
||||
// S-POWERPC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
|
|
|
|||
|
|
@ -22,9 +22,21 @@
|
|||
// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=SPARC %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd6.0.0 \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=SPARC-6 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd7.0.0 \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=SPARC-7 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=SPARC64 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd6.0.0 \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=SPARC64-6 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd7.0.0 \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=SPARC64-7 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target powerpc--netbsd \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=POWERPC %s
|
||||
|
|
@ -56,9 +68,21 @@
|
|||
// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd6.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC-6 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc--netbsd7.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC-7 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC64 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd6.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC64-6 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target sparc64--netbsd7.0.0 -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-SPARC64-7 %s
|
||||
// RUN: %clangxx -no-canonical-prefixes -target powerpc--netbsd -static \
|
||||
// RUN: --sysroot=%S/Inputs/basic_netbsd_tree %s -### 2>&1 \
|
||||
// RUN: | FileCheck -check-prefix=S-POWERPC %s
|
||||
|
|
@ -116,17 +140,47 @@
|
|||
// SPARC: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"
|
||||
// SPARC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// SPARC: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// SPARC: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed"
|
||||
// SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// SPARC: "-lm" "-lc"
|
||||
// SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// SPARC-7: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd7.0.0"
|
||||
// SPARC-7: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"
|
||||
// SPARC-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// SPARC-7: "-lm" "-lc"
|
||||
// SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// SPARC-6: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd6.0.0"
|
||||
// SPARC-6: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"
|
||||
// SPARC-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// SPARC-6: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed"
|
||||
// SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// SPARC64: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd"
|
||||
// SPARC64: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"
|
||||
// SPARC64: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// SPARC64: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed"
|
||||
// SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// SPARC64: "-lm" "-lc"
|
||||
// SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// SPARC64-7: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd7.0.0"
|
||||
// SPARC64-7: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"
|
||||
// SPARC64-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// SPARC64-7: "-lm" "-lc"
|
||||
// SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// SPARC64-6: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd6.0.0"
|
||||
// SPARC64-6: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"
|
||||
// SPARC64-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// SPARC64-6: "-lm" "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed"
|
||||
// SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// POWERPC: clang{{.*}}" "-cc1" "-triple" "powerpc--netbsd"
|
||||
// POWERPC: ld{{.*}}" "--eh-frame-hdr" "-dynamic-linker" "/libexec/ld.elf_so"
|
||||
// POWERPC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
|
|
@ -191,17 +245,47 @@
|
|||
// S-SPARC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// S-SPARC: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// S-SPARC: "-lm" "-lc"
|
||||
// S-SPARC: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC-7: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd7.0.0"
|
||||
// S-SPARC-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// S-SPARC-7: "-lm" "-lc"
|
||||
// S-SPARC-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC-6: clang{{.*}}" "-cc1" "-triple" "sparc--netbsd6.0.0"
|
||||
// S-SPARC-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}sparc{{/|\\\\}}crti.o"
|
||||
// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// S-SPARC-6: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC64: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd"
|
||||
// S-SPARC64: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC64: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// S-SPARC64: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// S-SPARC64: "-lm" "-lc"
|
||||
// S-SPARC64: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC64-7: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd7.0.0"
|
||||
// S-SPARC64-7: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC64-7: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lc++"
|
||||
// S-SPARC64-7: "-lm" "-lc"
|
||||
// S-SPARC64-7: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-SPARC64-6: clang{{.*}}" "-cc1" "-triple" "sparc64--netbsd6.0.0"
|
||||
// S-SPARC64-6: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-SPARC64-6: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o" "{{.*}}/usr/lib{{/|\\\\}}crti.o"
|
||||
// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtbegin.o" "{{.*}}.o" "-lstdc++"
|
||||
// S-SPARC64-6: "-lm" "-lc" "-lgcc_eh" "-lc" "-lgcc"
|
||||
// S-SPARC64-6: "{{.*}}/usr/lib{{/|\\\\}}crtend.o" "{{.*}}/usr/lib{{/|\\\\}}crtn.o"
|
||||
|
||||
// S-POWERPC: clang{{.*}}" "-cc1" "-triple" "powerpc--netbsd"
|
||||
// S-POWERPC: ld{{.*}}" "--eh-frame-hdr" "-Bstatic"
|
||||
// S-POWERPC: "-o" "a.out" "{{.*}}/usr/lib{{/|\\\\}}crt0.o"
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
// RUN: not %clang_cc1 -fsyntax-only -fcolor-diagnostics %s 2>&1 | FileCheck %s
|
||||
// RUN: not %clang_cc1 -fsyntax-only -fcolor-diagnostics -fdiagnostics-show-template-tree %s 2>&1 | FileCheck %s -check-prefix=TREE
|
||||
// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics %s 2>&1 | FileCheck %s
|
||||
// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics -fdiagnostics-show-template-tree %s 2>&1 | FileCheck %s -check-prefix=TREE
|
||||
// REQUIRES: ansi-escape-sequences
|
||||
template<typename> struct foo {};
|
||||
void func(foo<int>);
|
||||
|
|
@ -82,5 +82,23 @@ namespace default_args {
|
|||
// CHECK: no viable conversion from 'A<[2 * ...], (default) [[CYAN]]2[[RESET]][[BOLD]]>' to 'A<[2 * ...], [[CYAN]]0[[RESET]][[BOLD]]>'
|
||||
A<0, 2, 0> N2 = M;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace MixedDeclarationIntegerArgument {
|
||||
template<typename T, T n = 5> class A{};
|
||||
int x;
|
||||
int y[5];
|
||||
A<int> a1 = A<int&, x>();
|
||||
// CHECK: no viable conversion from 'A<[[CYAN]]int &[[RESET]][[BOLD]], [[CYAN]]x[[RESET]][[BOLD]]>' to 'A<[[CYAN]]int[[RESET]][[BOLD]], (default) [[CYAN]]5[[RESET]][[BOLD]]>'
|
||||
// TREE: no viable conversion
|
||||
// TREE: A<
|
||||
// TREE: {{\[}}[[CYAN]]int &[[RESET]][[BOLD]] != [[CYAN]]int[[RESET]][[BOLD]]],
|
||||
// TREE: {{\[}}[[CYAN]]x[[RESET]][[BOLD]] != (default) [[CYAN]]5[[RESET]][[BOLD]]]>
|
||||
|
||||
A<int**, nullptr> a2 = A<int, 3 + 1>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<[[CYAN]]int[[RESET]][[BOLD]], [[CYAN]]3 + 1[[RESET]][[BOLD]] aka [[CYAN]]4[[RESET]][[BOLD]]>' to 'A<[[CYAN]]int **[[RESET]][[BOLD]], [[CYAN]]nullptr[[RESET]][[BOLD]]>'
|
||||
// TREE: no viable conversion
|
||||
// TREE: A<
|
||||
// TREE: {{\[}}[[CYAN]]int[[RESET]][[BOLD]] != [[CYAN]]int **[[RESET]][[BOLD]]],
|
||||
// TREE: {{\[}}[[CYAN]]3 + 1[[RESET]][[BOLD]] aka [[CYAN]]4[[RESET]][[BOLD]] != [[CYAN]]nullptr[[RESET]][[BOLD]]]>
|
||||
}
|
||||
|
|
|
|||
|
|
@ -925,7 +925,7 @@ namespace DependentDefault {
|
|||
// CHECK-ELIDE-NOTREE: no known conversion from 'A<char, [...]>' to 'A<int, [...]>'
|
||||
a3 = a1;
|
||||
// CHECK-ELIDE-NOTREE: no viable overloaded '='
|
||||
// CHECK-ELIDE-NOTREE: no known conversion from 'A<[...], (default) 40>' to 'A<[...], 10>'
|
||||
// CHECK-ELIDE-NOTREE: no known conversion from 'A<[...], (default) Trait<T>::V aka 40>' to 'A<[...], 10>'
|
||||
a2 = a3;
|
||||
// CHECK-ELIDE-NOTREE: no viable overloaded '='
|
||||
// CHECK-ELIDE-NOTREE: no known conversion from 'A<int, 10>' to 'A<char, 40>'
|
||||
|
|
@ -1118,7 +1118,7 @@ int global, global2;
|
|||
constexpr int * ptr = nullptr;
|
||||
Wrapper<S<ptr>> W = MakeWrapper<S<&global>>();
|
||||
// Don't print an extra '&' for 'ptr'
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<ptr>>'
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<ptr aka nullptr>>'
|
||||
|
||||
// Handle parens correctly
|
||||
Wrapper<S<(&global2)>> W2 = MakeWrapper<S<&global>>();
|
||||
|
|
@ -1148,7 +1148,7 @@ S<&global, nullptr> s2 = S<&global, ptr>();
|
|||
S<&global, nullptr> s3 = S<&global, &global>();
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], nullptr>'
|
||||
S<&global, ptr> s4 = S<&global, &global>();
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], ptr>
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], ptr aka nullptr>
|
||||
|
||||
Wrapper<S<&global, nullptr>> W1 = MakeWrapper<S<&global, ptr>>();
|
||||
Wrapper<S<&global, static_cast<int*>(0)>> W2 = MakeWrapper<S<&global, ptr>>();
|
||||
|
|
@ -1156,7 +1156,7 @@ Wrapper<S<&global, static_cast<int*>(0)>> W2 = MakeWrapper<S<&global, ptr>>();
|
|||
Wrapper<S<&global, nullptr>> W3 = MakeWrapper<S<&global, &global>>();
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], nullptr>>'
|
||||
Wrapper<S<&global, ptr>> W4 = MakeWrapper<S<&global, &global>>();
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr>>'
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr aka nullptr>>'
|
||||
|
||||
Wrapper<S<&global2, ptr>> W5 = MakeWrapper<S<&global, nullptr>>();
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
|
||||
|
|
@ -1180,7 +1180,7 @@ Wrapper<S<&global2, nullptr>> W12 =
|
|||
Wrapper<S<&global, &global>> W13 = MakeWrapper<S<&global, ptr>>();
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], nullptr>>' to 'Wrapper<S<[...], &global>>'
|
||||
Wrapper<S<&global, ptr>> W14 = MakeWrapper<S<&global, &global>>();
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr>>'
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr aka nullptr>>'
|
||||
}
|
||||
|
||||
namespace TemplateTemplateDefault {
|
||||
|
|
@ -1271,7 +1271,160 @@ void test() {
|
|||
foo<BoolT<true>>(X);
|
||||
}
|
||||
// CHECK-ELIDE-NOTREE: no matching function for call to 'foo'
|
||||
// CHECK-ELIDE-NOTREE: candidate function [with T = BoolArgumentBitExtended::BoolT<true>] not viable: no known conversion from 'BoolT<0>' to 'BoolT<1>' for 1st argument
|
||||
// CHECK-ELIDE-NOTREE: candidate function [with T = BoolArgumentBitExtended::BoolT<true>] not viable: no known conversion from 'BoolT<false>' to 'BoolT<true>' for 1st argument
|
||||
}
|
||||
|
||||
namespace DifferentIntegralTypes {
|
||||
template<typename T, T n>
|
||||
class A{};
|
||||
void foo() {
|
||||
A<int, 1> a1 = A<long long, 1>();
|
||||
A<unsigned int, 1> a2 = A<int, 5>();
|
||||
A<bool, true> a3 = A<signed char, true>();
|
||||
}
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<long long, (long long) 1>' to 'A<int, (int) 1>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, (int) 5>' to 'A<unsigned int, (unsigned int) 1>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<signed char, (signed char) 1>' to 'A<bool, (bool) true>'
|
||||
}
|
||||
|
||||
namespace MixedDeclarationIntegerArgument {
|
||||
template<typename T, T n> class A{};
|
||||
int x;
|
||||
int y[5];
|
||||
|
||||
A<int, 5> a1 = A<int&, x>();
|
||||
A<int, 5 - 1> a2 = A<int*, &x>();
|
||||
A<int, 5 + 1> a3 = A<int*, y>();
|
||||
A<int, 0> a4 = A<int**, nullptr>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int &, x>' to 'A<int, 5>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int *, &x>' to 'A<int, 5 - 1 aka 4>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int *, y>' to 'A<int, 5 + 1 aka 6>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int **, nullptr>' to 'A<int, 0>'
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int & != int],
|
||||
// CHECK-ELIDE-TREE: [x != 5]>
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int * != int],
|
||||
// CHECK-ELIDE-TREE: [&x != 5 - 1 aka 4]>
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int * != int],
|
||||
// CHECK-ELIDE-TREE: [y != 5 + 1 aka 6]>
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int ** != int],
|
||||
// CHECK-ELIDE-TREE: [nullptr != 0]>
|
||||
|
||||
A<int&, x> a5 = A<int, 3>();
|
||||
A<int*, &x> a6 = A<int, 3 - 1>();
|
||||
A<int*, y> a7 = A<int, 3 + 1>();
|
||||
A<int**, nullptr> a8 = A<int, 3>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3>' to 'A<int &, x>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3 - 1 aka 2>' to 'A<int *, &x>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3 + 1 aka 4>' to 'A<int *, y>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3>' to 'A<int **, nullptr>'
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int != int &],
|
||||
// CHECK-ELIDE-TREE: [3 != x]>
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int != int *],
|
||||
// CHECK-ELIDE-TREE: [3 - 1 aka 2 != &x]>
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int != int *],
|
||||
// CHECK-ELIDE-TREE: [3 + 1 aka 4 != y]>
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: A<
|
||||
// CHECK-ELIDE-TREE: [int != int **],
|
||||
// CHECK-ELIDE-TREE: [3 != nullptr]>
|
||||
|
||||
template<class T, T n = x> class B{} ;
|
||||
B<int, 5> b1 = B<int&>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int &, (default) x>' to 'B<int, 5>'
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: B<
|
||||
// CHECK-ELIDE-TREE: [int & != int],
|
||||
// CHECK-ELIDE-TREE: [(default) x != 5]>
|
||||
|
||||
B<int &> b2 = B<int, 2>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int, 2>' to 'B<int &, (default) x>'
|
||||
// CHECK-ELIDE-TREE: B<
|
||||
// CHECK-ELIDE-TREE: [int != int &],
|
||||
// CHECK-ELIDE-TREE: [2 != (default) x]>
|
||||
|
||||
template<class T, T n = 11> class C {};
|
||||
C<int> c1 = C<int&, x>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'C<int &, x>' to 'C<int, (default) 11>'
|
||||
// CHECK-ELIDE-TREE: error: no viable conversion
|
||||
// CHECK-ELIDE-TREE: C<
|
||||
// CHECK-ELIDE-TREE: [int & != int],
|
||||
// CHECK-ELIDE-TREE: [x != (default) 11]>
|
||||
|
||||
C<int &, x> c2 = C<int>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'C<int, (default) 11>' to 'C<int &, x>'
|
||||
// CHECK-ELIDE-TREE: C<
|
||||
// CHECK-ELIDE-TREE: [int != int &],
|
||||
// CHECK-ELIDE-TREE: [(default) 11 != x]>
|
||||
}
|
||||
|
||||
namespace default_args {
|
||||
template <int x, int y = 1+1, int z = 2>
|
||||
class A {};
|
||||
|
||||
void foo(A<0> &M) {
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'A<[...], (default) 1 + 1 aka 2, (default) 2>' to 'A<[...], 0, 0>'
|
||||
A<0, 0, 0> N = M;
|
||||
|
||||
// CHECK-ELIDE-NOTREE: no viable conversion from 'A<[2 * ...], (default) 2>' to 'A<[2 * ...], 0>'
|
||||
A<0, 2, 0> N2 = M;
|
||||
}
|
||||
}
|
||||
|
||||
namespace DefaultNonTypeArgWithDependentType {
|
||||
// We used to crash diffing integer template arguments when the argument type
|
||||
// is dependent and default arguments were used.
|
||||
template <typename SizeType = int, SizeType = 0> struct A {};
|
||||
template <typename R = A<>> R bar();
|
||||
A<> &foo() { return bar(); }
|
||||
// CHECK-ELIDE-NOTREE: error: non-const lvalue reference to type 'A<[2 * ...]>' cannot bind to a temporary of type 'A<[2 * ...]>'
|
||||
// CHECK-NOELIDE-NOTREE: error: non-const lvalue reference to type 'A<int, 0>' cannot bind to a temporary of type 'A<int, 0>'
|
||||
}
|
||||
|
||||
namespace PR24587 {
|
||||
template <typename T, T v>
|
||||
struct integral_constant {};
|
||||
|
||||
auto false_ = integral_constant<bool, false> {};
|
||||
|
||||
template <typename T>
|
||||
void f(T, decltype(false_));
|
||||
|
||||
void run() {
|
||||
f(1, integral_constant<bool, true>{});
|
||||
}
|
||||
// CHECK-ELIDE-NOTREE: error: no matching function for call to 'f'
|
||||
// CHECK-ELIDE-NOTREE: note: candidate function [with T = int] not viable: no known conversion from 'integral_constant<[...], true>' to 'integral_constant<[...], false>' for 2nd argument
|
||||
}
|
||||
|
||||
namespace ZeroArgs {
|
||||
template <int N = 0> class A {};
|
||||
template <class T = A<>> class B {};
|
||||
A<1> a1 = A<>();
|
||||
A<> a2 = A<1>();
|
||||
B<> b1 = B<int>();
|
||||
B<int> b2 = B<>();
|
||||
B<> b3 = B<const A<>>();
|
||||
B<const A<>> b4 = B<>();
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<(default) 0>' to 'A<1>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<1>' to 'A<(default) 0>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int>' to 'B<(default) ZeroArgs::A<0>>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<(default) ZeroArgs::A<0>>' to 'B<int>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<const A<[...]>>' to 'B<A<[...]>>'
|
||||
// CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<A<[...]>>' to 'B<const A<[...]>>'
|
||||
}
|
||||
|
||||
// CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated.
|
||||
|
|
|
|||
|
|
@ -19,9 +19,10 @@ int main (int argc, char **argv) {
|
|||
{
|
||||
#pragma omp cancel sections
|
||||
}
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: @__kmpc_cancel
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: call i32 @__kmpc_cancel(
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t*
|
||||
#pragma omp sections
|
||||
{
|
||||
|
|
@ -125,9 +126,10 @@ for (int i = 0; i < argc; ++i) {
|
|||
// CHECK: ret i32 0
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: @__kmpc_cancel
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: call i32 @__kmpc_cancel(
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
|
|
|
|||
|
|
@ -22,9 +22,16 @@ int main (int argc, char **argv) {
|
|||
#pragma omp cancel sections
|
||||
}
|
||||
}
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: @__kmpc_cancellationpoint
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID]], i32 3)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: call void @__kmpc_barrier(%ident_t*
|
||||
#pragma omp sections
|
||||
{
|
||||
|
|
@ -126,9 +133,16 @@ for (int i = 0; i < argc; ++i) {
|
|||
// CHECK: ret i32 0
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: @__kmpc_cancellationpoint
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%ident_t* {{[^,]+}}, i32 [[GTID:%.+]], i32 3)
|
||||
// CHECK: [[CMP:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK: br i1 [[CMP]], label %[[EXIT:[^,].+]], label %[[CONTINUE:.+]]
|
||||
// CHECK: [[EXIT]]
|
||||
// CHECK: call i32 @__kmpc_cancel_barrier(%ident_t*
|
||||
// CHECK: br label
|
||||
// CHECK: [[CONTINUE]]
|
||||
// CHECK: br label
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define internal void @{{[^(]+}}(i32* {{[^,]+}}, i32* {{[^,]+}})
|
||||
|
|
|
|||
|
|
@ -78,15 +78,10 @@ int main() {
|
|||
// CHECK-LABEL: tmain
|
||||
// CHECK: call void {{.*}} @__kmpc_fork_call(
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_single(
|
||||
// CHECK-NEXT: [[BOOLRES:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK-NEXT: br i1 [[BOOLRES]], label %[[THEN:.+]], label %[[END:.+]]
|
||||
// CHECK: [[THEN]]
|
||||
// CHECK-NEXT: invoke void @{{.*}}foo{{.*}}()
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: invoke void @{{.*}}foo{{.*}}()
|
||||
// CHECK-NEXT: unwind label %[[TERM_LPAD:.+]]
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK-NEXT: br label %[[END]]
|
||||
// CHECK: [[END]]
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK-NEXT: ret
|
||||
// CHECK: [[TERM_LPAD]]
|
||||
// CHECK: call void @__clang_call_terminate(i8*
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
#ifndef HEADER
|
||||
#define HEADER
|
||||
// CHECK: [[IMPLICIT_BARRIER_SECTIONS_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 194, i32 0, i32 0, i8*
|
||||
// CHECK: [[IMPLICIT_BARRIER_SINGLE_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 322, i32 0, i32 0, i8*
|
||||
// CHECK-LABEL: foo
|
||||
void foo() {};
|
||||
// CHECK-LABEL: bar
|
||||
|
|
@ -86,17 +85,12 @@ int main() {
|
|||
// CHECK-LABEL: tmain
|
||||
// CHECK: call void {{.*}} @__kmpc_fork_call(
|
||||
// CHECK-NOT: __kmpc_global_thread_num
|
||||
// CHECK: [[RES:%.+]] = call i32 @__kmpc_single(
|
||||
// CHECK-NEXT: [[BOOLRES:%.+]] = icmp ne i32 [[RES]], 0
|
||||
// CHECK-NEXT: br i1 [[BOOLRES]], label %[[THEN:.+]], label %[[END:.+]]
|
||||
// CHECK: [[THEN]]
|
||||
// CHECK-NEXT: invoke void @{{.*}}foo{{.*}}()
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: invoke void @{{.*}}foo{{.*}}()
|
||||
// CHECK-NEXT: unwind label %[[TERM_LPAD:.+]]
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK-NEXT: br label %[[END]]
|
||||
// CHECK: [[END]]
|
||||
// CHECK-NEXT: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_SINGLE_LOC]],
|
||||
// CHECK: ret
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_SECTIONS_LOC]],
|
||||
// CHECK: ret
|
||||
// CHECK: [[TERM_LPAD]]
|
||||
// CHECK: call void @__clang_call_terminate(i8*
|
||||
// CHECK-NEXT: unreachable
|
||||
|
|
|
|||
|
|
@ -202,14 +202,18 @@ int main() {
|
|||
|
||||
// CHECK: define {{.*}}i{{[0-9]+}} @main()
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
|
||||
// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
|
||||
// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]],
|
||||
// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
|
||||
// CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}},
|
||||
// CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
|
||||
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// firstprivate t_var(t_var)
|
||||
// CHECK: [[T_VAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR]],
|
||||
// CHECK: store i{{[0-9]+}} [[T_VAR_VAL]], i{{[0-9]+}}* [[T_VAR_PRIV]],
|
||||
|
|
@ -235,15 +239,16 @@ int main() {
|
|||
// CHECK: call {{.*}} [[ST_TY_DESTR]]([[ST_TY]]* [[ST_TY_TEMP]])
|
||||
|
||||
// firstprivate isvar
|
||||
// CHEC: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR]],
|
||||
// CHEC: store i{{[0-9]+}} [[SIVAR_VAL]], i{{[0-9]+}}* [[SIVAR_PRIV]],
|
||||
// CHECK: [[SIVAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[SIVAR]],
|
||||
// CHECK: store i{{[0-9]+}} [[SIVAR_VAL]], i{{[0-9]+}}* [[SIVAR_PRIV]],
|
||||
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
|
||||
// ~(firstprivate var), ~(firstprivate s_arr)
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
|
||||
// CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
|
||||
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ volatile int g = 1212;
|
|||
// CHECK: [[S_FLOAT_TY:%.+]] = type { float }
|
||||
// CHECK [[CAP_MAIN_TY:%.+]] = type { i{{[0-9]+}}*, [2 x i{{[0-9]+}}]*, [2 x [[S_FLOAT_TY]]]*, [[S_FLOAT_TY]]*, i{{[0-9]+}}* }
|
||||
// CHECK: [[S_INT_TY:%.+]] = type { i32 }
|
||||
// CHECK-DAG: [[SINGLE_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 322, i32 0, i32 0, i8*
|
||||
// CHECK-DAG: [[SECTIONS_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 194, i32 0, i32 0, i8*
|
||||
// CHECK-DAG: [[X:@.+]] = global double 0.0
|
||||
template <typename T>
|
||||
|
|
@ -234,27 +233,29 @@ int main() {
|
|||
// CHECK: ret
|
||||
|
||||
// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
|
||||
// CHECK-NOT: alloca i{{[0-9]+}},
|
||||
// CHECK-NOT: alloca [2 x i{{[0-9]+}}],
|
||||
// CHECK-NOT: alloca [2 x [[S_FLOAT_TY]]],
|
||||
// CHECK-NOT: alloca [[S_FLOAT_TY]],
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca [2 x i{{[0-9]+}}],
|
||||
// CHECK: alloca [2 x [[S_FLOAT_TY]]],
|
||||
// CHECK: alloca [[S_FLOAT_TY]],
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
|
||||
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_REF]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
|
||||
// CHECK-DAG: getelementptr inbounds [2 x i32], [2 x i32]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
// CHECK-DAG: getelementptr inbounds [2 x [[S_FLOAT_TY]]], [2 x [[S_FLOAT_TY]]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
|
||||
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// <Skip loop body>
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
|
||||
// CHECK-NOT: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-NOT: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(
|
||||
// CHECK: ret void
|
||||
|
||||
//
|
||||
|
|
|
|||
|
|
@ -157,6 +157,11 @@ int main() {
|
|||
// CHECK: ret
|
||||
//
|
||||
// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}})
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: alloca i{{[0-9]+}},
|
||||
// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
|
||||
// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
|
||||
// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]],
|
||||
|
|
@ -165,7 +170,6 @@ int main() {
|
|||
// CHECK: [[SIVAR_PRIV:%.+]] = alloca i{{[0-9]+}},
|
||||
// CHECK-NOT: alloca [[S_FLOAT_TY]],
|
||||
// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
// CHECK-NOT: [[T_VAR_PRIV]]
|
||||
// CHECK-NOT: [[VEC_PRIV]]
|
||||
// CHECK-NOT: [[SIVAR_PRIV]]
|
||||
|
|
@ -175,9 +179,13 @@ int main() {
|
|||
// CHECK-NOT: [[T_VAR_PRIV]]
|
||||
// CHECK-NOT: [[VEC_PRIV]]
|
||||
// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
|
||||
// CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_barrier(
|
||||
// CHECK: ret void
|
||||
|
||||
// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ struct S {
|
|||
// CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }
|
||||
// CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
|
||||
// CHECK-DAG: [[ATOMIC_REDUCE_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 18, i32 0, i32 0, i8*
|
||||
// CHECK-DAG: [[SINGLE_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 322, i32 0, i32 0, i8*
|
||||
// CHECK-DAG: [[REDUCTION_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 18, i32 0, i32 0, i8*
|
||||
// CHECK-DAG: [[REDUCTION_LOCK:@.+]] = common global [8 x i32] zeroinitializer
|
||||
|
||||
|
|
@ -195,23 +194,23 @@ int main() {
|
|||
// CHECK: ret
|
||||
//
|
||||
// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
|
||||
// CHECK-NOT: alloca float,
|
||||
// CHECK-NOT: alloca [[S_FLOAT_TY]],
|
||||
// CHECK-NOT: alloca [[S_FLOAT_TY]],
|
||||
// CHECK-NOT: alloca float,
|
||||
// CHECK: alloca float,
|
||||
// CHECK: alloca [[S_FLOAT_TY]],
|
||||
// CHECK: alloca [[S_FLOAT_TY]],
|
||||
// CHECK: alloca float,
|
||||
|
||||
// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
|
||||
|
||||
// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
|
||||
// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
|
||||
// CHECK: call i32 @__kmpc_single(
|
||||
|
||||
// CHECK-NOT: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
|
||||
// CHECK-NOT: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
|
||||
|
||||
// CHECK: call void @__kmpc_end_single(
|
||||
// CHECK: call void @__kmpc_for_static_init_4(
|
||||
// CHECK: call void @__kmpc_for_static_fini(
|
||||
|
||||
// CHECK: call void @__kmpc_barrier(%{{.+}}* [[SINGLE_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
|
||||
// CHECK: call void @__kmpc_barrier(
|
||||
|
||||
// CHECK: ret void
|
||||
|
||||
|
|
|
|||
|
|
@ -1787,6 +1787,10 @@
|
|||
// RUN: -target s390x-unknown-linux \
|
||||
// RUN: | FileCheck %s -check-prefix=CHECK_SYSTEMZ_Z10
|
||||
//
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
|
||||
// CHECK_SYSTEMZ_Z10: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
|
||||
// CHECK_SYSTEMZ_Z10: #define __LONG_DOUBLE_128__ 1
|
||||
// CHECK_SYSTEMZ_Z10: #define __s390__ 1
|
||||
// CHECK_SYSTEMZ_Z10: #define __s390x__ 1
|
||||
|
|
@ -1796,6 +1800,10 @@
|
|||
// RUN: -target s390x-unknown-linux \
|
||||
// RUN: | FileCheck %s -check-prefix=CHECK_SYSTEMZ_ZEC12
|
||||
//
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __HTM__ 1
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __LONG_DOUBLE_128__ 1
|
||||
// CHECK_SYSTEMZ_ZEC12: #define __s390__ 1
|
||||
|
|
|
|||
55
test/SemaObjC/ovl-check.m
Normal file
55
test/SemaObjC/ovl-check.m
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
// RUN: %clang_cc1 -triple x86_64-apple-darwin11 -fsyntax-only -verify %s -fobjc-arc
|
||||
//
|
||||
// These tests exist as a means to help ensure that diagnostics aren't printed
|
||||
// in overload resolution in ObjC.
|
||||
|
||||
struct Type1 { int a; };
|
||||
@interface Iface1 @end
|
||||
|
||||
@interface NeverCalled
|
||||
- (void) test:(struct Type1 *)arg;
|
||||
@end
|
||||
|
||||
@interface TakesIface1
|
||||
- (void) test:(Iface1 *)arg;
|
||||
@end
|
||||
|
||||
// PR26085, rdar://problem/24111333
|
||||
void testTakesIface1(id x, Iface1 *arg) {
|
||||
// This should resolve silently to `TakesIface1`.
|
||||
[x test:arg];
|
||||
}
|
||||
|
||||
@class NSString;
|
||||
@interface NeverCalledv2
|
||||
- (void) testStr:(NSString *)arg;
|
||||
@end
|
||||
|
||||
@interface TakesVanillaConstChar
|
||||
- (void) testStr:(const void *)a;
|
||||
@end
|
||||
|
||||
// Not called out explicitly by PR26085, but related.
|
||||
void testTakesNSString(id x) {
|
||||
// Overload resolution should not emit a diagnostic about needing to add an
|
||||
// '@' before "someStringLiteral".
|
||||
[x testStr:"someStringLiteral"];
|
||||
}
|
||||
|
||||
typedef const void *CFTypeRef;
|
||||
id CreateSomething();
|
||||
|
||||
@interface NeverCalledv3
|
||||
- (void) testCFTypeRef:(struct Type1 *)arg;
|
||||
@end
|
||||
|
||||
@interface TakesCFTypeRef
|
||||
- (void) testCFTypeRef:(CFTypeRef)arg;
|
||||
@end
|
||||
|
||||
// Not called out explicitly by PR26085, but related.
|
||||
void testTakesCFTypeRef(id x) {
|
||||
// Overload resolution should occur silently, select the CFTypeRef overload,
|
||||
// and produce a single complaint. (with notes)
|
||||
[x testCFTypeRef:CreateSomething()]; // expected-error{{implicit conversion of Objective-C pointer type 'id' to C pointer type 'CFTypeRef'}} expected-note{{use __bridge}} expected-note{{use __bridge_retained}}
|
||||
}
|
||||
Loading…
Reference in a new issue