Commit Graph

9744 Commits

Author SHA1 Message Date
Yuanfang Chen 340eac01f7 [C++20] Implement P2113R0: Changes to the Partial Ordering of Constrained Functions
This implementation matches GCC behavior in that [[ https://eel.is/c++draft/temp.func.order#6.2.1 | temp.func.order p6.2.1 ]] is not implemented [1]. I reached out to the GCC author to confirm that some changes elsewhere to overload resolution are probably needed, but no solution has been developed sufficiently [3].

Most of the wordings are implemented straightforwardly. However,
for [[ https://eel.is/c++draft/temp.func.order#6.2.2 | temp.func.order p6.2.2 ]] "... or if the function parameters that positionally correspond between the two templates are not of the same type", the "same type" is not very clear ([2] is a bug related to this). Here is a quick example
```
template <C T, C U>        int f(T, U);
template <typename T, C U> int f(U, T);

int x = f(0, 0);
```
Is the `U` and `T` from different `f`s the "same type"? The answer is NO even though both `U` and `T` are deduced to be `int` in this case. The reason is that `U` and `T` are dependent types, according to [[ https://eel.is/c++draft/temp.over.link#3 |  temp.over.link p3 ]], they can not be the "same type".

To check if two function parameters are the "same type":
* For //function template//: compare the function parameter canonical types and return type between two function templates.
* For //class template/partial specialization//: by [[ https://eel.is/c++draft/temp.spec.partial.order#1.2 | temp.spec.partial.order p1.2 ]], compare the injected template arguments between two templates using hashing(TemplateArgument::Profile) is enough.

[1] https://gcc.gnu.org/git/gitweb.cgi?p=gcc.git;h=57b4daf8dc4ed7b669cc70638866ddb00f5b7746
[2] https://github.com/llvm/llvm-project/issues/49308
[3] https://lists.isocpp.org/core/2020/06/index.php#msg9392

Fixes https://github.com/llvm/llvm-project/issues/54039
Fixes https://github.com/llvm/llvm-project/issues/49308 (PR49964)

Reviewed By: royjacobson, #clang-language-wg, mizvekov

Differential Revision: https://reviews.llvm.org/D128750
2022-10-18 11:58:57 -07:00
Joseph Huber bb3c90d3ec [OpenMP] Make device functions have hidden visibility
In OpenMP target offloading an in other offloading languages, we
maintain a difference between device functions and kernel functions.
Kernel functions must be visible to the host and act as the entry point
to the target device. Device functions however cannot be called directly
by the host and must be called by a kernel function. Currently, we make
all definitions on the device protected by default. Because device
functions cannot be called or used by the host they should have hidden
visibility. This allows for the definitions to be better optimized via
LTO or other passes.

This patch marks every device function in the AST as having `hidden`
visibility. The kernel function is generated later at code-gen and we
set its visibility explicitly so it should not be affected. This
prevents the user from overriding the visibility, but since the user
can't do anything with these symbols anyway there is no point exporting
them right now.

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D136111
2022-10-18 08:15:39 -05:00
Volodymyr Sapsai 2662009c87 [ODRHash] Hash `ObjCMethodDecl` and diagnose discovered mismatches.
Differential Revision: https://reviews.llvm.org/D130325
2022-10-17 18:48:24 -07:00
Volodymyr Sapsai 37fdca21f7 [ODRHash] Rename `isDeclToBeProcessed` to `isSubDeclToBeProcessed`. NFC intended.
The method is used only for sub-Decls, so reflect that in the name.
2022-10-17 18:24:44 -07:00
Volodymyr Sapsai 9c79eab7fd [ODRHash] Hash `ObjCProtocolDecl` and diagnose discovered mismatches.
Differential Revision: https://reviews.llvm.org/D130324
2022-10-17 16:29:52 -07:00
Kazu Hirata 08901c8a98 [clang] Use llvm::reverse (NFC) 2022-10-15 21:54:13 -07:00
Matheus Izvekov bcd9ba2b7e
[clang] Track the templated entity in type substitution.
This is a change to how we represent type subsitution in the AST.
Instead of only storing the replaced type, we track the templated
entity we are substituting, plus an index.
We modify MLTAL to track the templated entity at each level.

Otherwise, it's much more expensive to go from the template parameter back
to the templated entity, and not possible to do in some cases, as when
we instantiate outer templates, parameters might still reference the
original entity.

This also allows us to very cheaply lookup the templated entity we saw in
the naming context and find the corresponding argument it was replaced
from, such as for implementing template specialization resugaring.

Signed-off-by: Matheus Izvekov <mizvekov@gmail.com>

Differential Revision: https://reviews.llvm.org/D131858
2022-10-15 22:08:36 +02:00
David Blaikie 037f856681 Itanium ABI: Pack non-pod members of packed types
Seems there's a narrow case - where a packed type doesn't pack its base
subobjects (only fields), but when packing a field of the derived type,
GCC does pack the resulting total object - effectively packing the base
subobject.

So ensure that this non-pod type (owing to it having a base class) that
is packed, gets packed when placed in /another/ type that is also
packed.

This is a (smallish?) ABI fix to a regression introduced by D117616 -
but that regression/ABI break hasn't been released in LLVM as-yet (it's
been reverted on the release branch from the last two LLVM releases - I
probably should've just reverted the whole patch while we hashed out
this and other issues) so this change isn't itself an ABI break, as far
as LLVM releases are concerned (for folks releasing their own copies of
LLVM from ToT/without the LLVM release branch, and didn't opt into the
clang-abi-compat 14 or below (soon to be 15 or below, I guess I should
say) then this would be an ABI break against clang from the last 9
months or so)

Differential Revision: https://reviews.llvm.org/D135916
2022-10-14 19:32:57 +00:00
Aaron Ballman 3a31970ee2 [C2x] Implement support for nullptr and nullptr_t
This introduces support for nullptr and nullptr_t in C2x mode. The
proposal accepted by WG14 is:
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n3042.htm

Note, there are quite a few incompatibilities with the C++ feature in
some of the edge cases of this feature. Therefore, there are some FIXME
comments in tests for testing behavior that might change after WG14 has
resolved national body comments (a process we've not yet started). So
this implementation might change slightly depending on the resolution
of comments. This is called out explicitly in the release notes as
well.

Differential Revision: https://reviews.llvm.org/D135099
2022-10-14 10:06:02 -04:00
Timm Bäder 5a859432f3 [clang][Interp] Implement while and do-while loops
Differential Revision: https://reviews.llvm.org/D135433
2022-10-14 14:41:05 +02:00
Timm Bäder 6fad7127cb [clang][Interp][NFC] Remove unused parameter from emitConst() 2022-10-14 14:41:05 +02:00
Aaron Ballman 19e984ef8f Properly print unnamed TagDecl objects in diagnostics
The diagnostics engine is very smart about being passed a NamedDecl to
print as part of a diagnostic; it gets the "right" form of the name,
quotes it properly, etc. However, the result of using an unnamed tag
declaration was to print '' instead of anything useful.

This patch causes us to print the same information we'd have gotten if
we had printed the type of the declaration rather than the name of it,
as that's the most relevant information we can display.

Differential Revision: https://reviews.llvm.org/D134813
2022-10-14 08:18:28 -04:00
Timm Bäder ce4d5ae9dc [clang][Interp] Implement bitwise Or operations
Analogous to the bitAnd implementation, do the same for bitwise or.

Differential Revision: https://reviews.llvm.org/D135361
2022-10-14 14:15:08 +02:00
Timm Bäder 62a58050ba [clang][Interp] Implement bitwise and operations
Differential Revision: https://reviews.llvm.org/D135012
2022-10-14 14:00:07 +02:00
Timm Bäder 11f3604695 [clang][Interp][NFC] Remove an unnecessary local variable 2022-10-14 13:33:04 +02:00
Timm Bäder 1b731bd872 [clang][Interp][NFC] Zero-initialize Function::FrameSize
It's never going to be used since it's only uninitialized if the
function is invalid, but let's zero it for readbility of
Function::dump().
2022-10-14 13:32:55 +02:00
Timm Bäder 7fbfe5518c [clang][Interp][NFC] Rename a parameter to be more descriptive 2022-10-14 13:32:31 +02:00
Timm Bäder 9b2f2d8463 [clang][Interp][NFC] Remove unused function 2022-10-14 13:32:00 +02:00
Timm Bäder 77aaf469a7 [clang][Interp] Implement ConditionalOperators
Differential Revision: https://reviews.llvm.org/D134801
2022-10-14 13:16:10 +02:00
Timm Bäder d704ba26b9 [clang][Interp] Implement div opcode
Implement an opcode for division of two integrals.

Differential Revision: https://reviews.llvm.org/D134749
2022-10-14 12:57:57 +02:00
Timm Bäder c9ad877844 [clang][Interp] Implement rem opcode
Implement an opcode to get the remainder of the divison between LHS and
RHS.

Differential Revision: https://reviews.llvm.org/D134744
2022-10-14 12:57:57 +02:00
Timm Bäder 542123465f [clang][Interp] Implement bitwise not operations
Differential Revision: https://reviews.llvm.org/D134804
2022-10-14 12:57:57 +02:00
Timm Bäder 81c5b5d80e [clang][Interp][NFC] Simplify Integral using constexpr if
Just keep one version of the function and differentiate between
std::is_signed() and unsigned using a constexpr if, instead of having
two different versions for the signed and unsigned cases.
2022-10-14 12:47:07 +02:00
Timm Bäder 699449d71e [clang][Interp][NFC] Use a SourceRange for errors
This makes the error message generated by bail() a bit more pleasant to
read.
2022-10-14 12:46:51 +02:00
Timm Bäder 4d2d426a51 [clang][Interp] Fix Pointer::toAPValue() LValuePath order 2022-10-14 12:31:24 +02:00
Timm Bäder 55c7ad31aa [clang][Interp][NFC] Pass Function* pointers around as const 2022-10-14 12:31:24 +02:00
Timm Bäder 6e83209f62 [clang][Interp] Fix copy constructors with record array members
Differential Revision: https://reviews.llvm.org/D134523
2022-10-14 11:57:26 +02:00
Timm Bäder ae27323428 [clang][Interp] Classify ArrayInitIndexExpr type
We can't just push a uint64 unconditionally here, since on 32bit arches
we later expect a different type, e.g. uint32.

This broke e.g. these builders:
https://lab.llvm.org/buildbot#builders/171/builds/21514
https://lab.llvm.org/buildbot#builders/38/builds/6643
2022-10-14 11:10:28 +02:00
Benjamin Kramer 2f357054d7 [Interp] Silence warning in release builds. NFC. 2022-10-14 10:38:32 +02:00
Timm Bäder 33b52836de [clang][Interp] Fix using default copy constructors
Implement ArrayInitLoopExprs, which are used in copy constructors to
copy arrays. Also fix problems encountered while doing that.

Differential Revision: https://reviews.llvm.org/D134361
2022-10-14 10:21:53 +02:00
Timm Bäder cb5f205828 [clang][Interp] Implement nested struct initialization
Recurse into visitInitializer() if necessary.

Differential Revision: https://reviews.llvm.org/D134175
2022-10-14 10:21:53 +02:00
Timm Bäder 0ddd13acc9 [clang][Interp] Implement This pointer passing to methods
Implement passing the this pointer to member functions and constructors.
The this pointer is passed via the stack. This changes the functions to
explicitly track whether they have a RVO pointer and a this pointer.

Differential Revision: https://reviews.llvm.org/D134699
2022-10-14 10:21:53 +02:00
Timm Bäder 1942a2538b [clang][Interp] Start implementing record types
Implement simple constructors as well as member access expressions.

Differential Revision: https://reviews.llvm.org/D134057
2022-10-14 10:21:53 +02:00
Timm Bäder 1928da1ef7 [clang][Interp] Don't run functions immediately after compiling them
This doesn't make much sense with functions that expect valid parameters
and/or a certain call stack on the caller side like This/RVO pointers.

Differential Revision: https://reviews.llvm.org/D135569
2022-10-14 10:21:53 +02:00
Timm Bäder 773b468543 [clang][Interp][NFC] Add a TODO comment
We can ignore casts where FromT and ToT are the same type. But that's a
performance optimization that I'd like to do later. For now, this code
is doing the right thing.
2022-10-14 10:21:52 +02:00
David Blaikie 9363071303 Move GCC-compatible pod-packing change to v16/old behavior available at v15 and below
Change matches D126334/e59f648d698e since this change got punted from
v15 too.
2022-10-13 21:13:19 +00:00
Sam McCall 2eaf6f973c [AST] Preserve more structure in UsingEnumDecl node.
- store NestedNameSpecifier & Loc for the qualifiers
  This information was entirely missing from the AST.
- expose the location information for qualifier/identifier/typedefs as typeloc
  This allows many traversals/astmatchers etc to handle these generically along
  with other references. The decl vs type split can help preserve typedef
  sugar when https://github.com/llvm/llvm-project/issues/57659 is resolved.
- fix the SourceRange of UsingEnumDecl to include 'using'.

Fixes https://github.com/clangd/clangd/issues/1283

Differential Revision: https://reviews.llvm.org/D134303
2022-10-12 19:54:51 +02:00
Arthur Eubanks eab5c2f94f [LLDB] Fix crash when printing a struct with a static wchar_t member
Similar to D135170.

Reviewed By: DavidSpickett

Differential Revision: https://reviews.llvm.org/D135461
2022-10-11 11:04:32 -07:00
Evgeny Shulgin ec32386404 [Clang] Support constexpr builtin fmin
Support constexpr version of __builtin_fmin and its variations.

Reviewed By: jcranmer-intel

Differential Revision: https://reviews.llvm.org/D135493
2022-10-10 16:06:23 +00:00
Evgeny Shulgin 0edff6faa2 [Clang] Support constexpr builtin fmax
Support constexpr version of __builtin_fmax and its variations.

Reviewed By: jcranmer-intel

Differential Revision: https://reviews.llvm.org/D134369
2022-10-07 20:27:17 +00:00
Aleksandr Platonov 5a42c90b77 [clang] Make variables of undeduced types to have dependent alignment
Without this patch `VarDecl::hasDependent()` checks only undeduced auto types, so can give false negatives result for other undeduced types.
This lead to crashes in sequence `!VarDecl::hasDepentent()` => `getDeclAlign()`.

It seems this problem appeared since D105380

Reviewed By: mizvekov

Differential Revision: https://reviews.llvm.org/D135362
2022-10-07 20:40:03 +08:00
David Spickett 5a9e213058 [LLDB] Fix crash when printing a struct with a static signed char member
As with static bool for whatever reason printing them on their own
worked fine but wasn't handled when you printed the whole type.

I don't see a good way to test this from clang's side so our existing
tests will have to do.

We can now print all of the struct "A", so there's no need for a separate
one for static bool testing. I've not checked the output, just that it
succeeds. This saves us having to handle different min/max between systems.

Depends on D135169

Reviewed By: aeubanks, shafik

Differential Revision: https://reviews.llvm.org/D135170
2022-10-07 09:11:15 +00:00
Bill Wendling 7404b855e5 [clang][NFC] Use enum for -fstrict-flex-arrays
Use enums for the strict flex arrays flag so that it's more readable.

Differential Revision: https://reviews.llvm.org/D135107
2022-10-06 10:45:41 -07:00
Erich Keane 6ebc3abd76 [NFC] Replace use of !isTranslationUnit && !isNamespace with !isFileContext
isFileContext is exactly equal to these two, so simplify the function.
2022-10-06 09:40:51 -07:00
David Spickett 7448f38898 [clang] Add Create method for CXXBoolLiteralExpr
Reviewed By: shafik

Differential Revision: https://reviews.llvm.org/D135256
2022-10-06 09:35:14 +00:00
Argyrios Kyrtzidis 371883f46d [clang/Sema] Fix non-deterministic order for certain kind of diagnostics
In the context of caching clang invocations it is important to emit diagnostics in deterministic order;
the same clang invocation should result in the same diagnostic output.

rdar://100336989

Differential Revision: https://reviews.llvm.org/D135118
2022-10-05 12:58:01 -07:00
Akira Hatanaka 65a961f719 [Sema][ObjC] Fix assertion failure in getCommonNonSugarTypeNode
Instead of checking that the protocols of both types are all equal,
check that the canonical decls are equal.
2022-10-05 10:38:25 -07:00
Stella Laurenzo e28b15b572 Add APFloat and MLIR type support for fp8 (e5m2).
(Re-Apply with fixes to clang MicrosoftMangle.cpp)

This is a first step towards high level representation for fp8 types
that have been built in to hardware with near term roadmaps. Like the
BFLOAT16 type, the family of fp8 types are inspired by IEEE-754 binary
floating point formats but, due to the size limits, have been tweaked in
various ways in order to maximally use the range/precision in various
scenarios. The list of variants is small/finite and bounded by real
hardware.

This patch introduces the E5M2 FP8 format as proposed by Nvidia, ARM,
and Intel in the paper: https://arxiv.org/pdf/2209.05433.pdf

As the more conformant of the two implemented datatypes, we are plumbing
it through LLVM's APFloat type and MLIR's type system first as a
template. It will be followed by the range optimized E4M3 FP8 format
described in the paper. Since that format deviates further from the
IEEE-754 norms, it may require more debate and implementation
complexity.

Given that we see two parts of the FP8 implementation space represented
by these cases, we are recommending naming of:

* `F8M<N>` : For FP8 types that can be conceived of as following the
  same rules as FP16 but with a smaller number of mantissa/exponent
  bits. Including the number of mantissa bits in the type name is enough
  to fully specify the type. This naming scheme is used to represent
  the E5M2 type described in the paper.
* `F8M<N>F` : For FP8 types such as E4M3 which only support finite
  values.

The first of these (this patch) seems fairly non-controversial. The
second is previewed here to illustrate options for extending to the
other known variant (but can be discussed in detail in the patch
which implements it).

Many conversations about these types focus on the Machine-Learning
ecosystem where they are used to represent mixed-datatype computations
at a high level. At that level (which is why we also expose them in
MLIR), it is important to retain the actual type definition so that when
lowering to actual kernels or target specific code, the correct
promotions, casts and rescalings can be done as needed. We expect that
most LLVM backends will only experience these types as opaque `I8`
values that are applicable to some instructions.

MLIR does not make it particularly easy to add new floating point types
(i.e. the FloatType hierarchy is not open). Given the need to fully
model FloatTypes and make them interop with tooling, such types will
always be "heavy-weight" and it is not expected that a highly open type
system will be particularly helpful. There are also a bounded number of
floating point types in use for current and upcoming hardware, and we
can just implement them like this (perhaps looking for some cosmetic
ways to reduce the number of places that need to change). Creating a
more generic mechanism for extending floating point types seems like it
wouldn't be worth it and we should just deal with defining them one by
one on an as-needed basis when real hardware implements a new scheme.
Hopefully, with some additional production use and complete software
stacks, hardware makers will converge on a set of such types that is not
terribly divergent at the level that the compiler cares about.

(I cleaned up some old formatting and sorted some items for this case:
If we converge on landing this in some form, I will NFC commit format
only changes as a separate commit)

Differential Revision: https://reviews.llvm.org/D133823
2022-10-04 17:18:17 -07:00
Yuanfang Chen 5d69937b9f [Clang] make canonical AutoType constraints-free
As @mizvekov suggested in D134772. This works great for D128750 when
dealing with AutoType's.

Reviewed By: mizvekov, erichkeane

Differential Revision: https://reviews.llvm.org/D135088
2022-10-04 11:56:03 -07:00
serge-sans-paille 3460a5d795 [clang] Unify Sema and CodeGen implementation of isFlexibleArrayMemberExpr
Turn it into a single Expr::isFlexibleArrayMemberLike method, as discussed in

        https://discourse.llvm.org/t/rfc-harmonize-flexible-array-members-handling

Keep different behavior with respect to macro / template substitution, and
harmonize sharp edges: ObjC interface now behave as C struct wrt. FAM and
-fstrict-flex-arrays.

This does not impact __builtin_object_size interactions with FAM.

Differential Revision: https://reviews.llvm.org/D134791
2022-10-04 20:42:36 +02:00