Skip to content

Commit d5b2294

Browse files
committed
Merge remote-tracking branch 'origin/main' into clang-explain-std-layout
2 parents 5ca99e4 + 01174ff commit d5b2294

File tree

63 files changed

+1816
-668
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+1816
-668
lines changed

clang/lib/Format/TokenAnnotator.cpp

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1371,7 +1371,7 @@ class AnnotatingParser {
13711371
Tok->setType(TT_InlineASMColon);
13721372
} else if (Contexts.back().ColonIsDictLiteral || Style.isProto()) {
13731373
Tok->setType(TT_DictLiteral);
1374-
if (Prev && Style.isTextProto())
1374+
if (Style.isTextProto())
13751375
Prev->setType(TT_SelectorName);
13761376
} else if (Contexts.back().ColonIsObjCMethodExpr ||
13771377
Line.startsWith(TT_ObjCMethodSpecifier)) {
@@ -1408,7 +1408,6 @@ class AnnotatingParser {
14081408
}
14091409
} else if (Contexts.back().ContextType == Context::C11GenericSelection) {
14101410
Tok->setType(TT_GenericSelectionColon);
1411-
assert(Prev);
14121411
if (Prev->isPointerOrReference())
14131412
Prev->setFinalizedType(TT_PointerOrReference);
14141413
} else if ((CurrentToken && CurrentToken->is(tok::numeric_constant)) ||
@@ -1419,8 +1418,6 @@ class AnnotatingParser {
14191418
!Line.getFirstNonComment()->isOneOf(tok::kw_enum, tok::kw_case,
14201419
tok::kw_default) &&
14211420
!Line.startsWith(tok::kw_typedef, tok::kw_enum)) {
1422-
if (!Prev)
1423-
break;
14241421
if (Prev->isOneOf(tok::r_paren, tok::kw_noexcept) ||
14251422
Prev->ClosesRequiresClause) {
14261423
Tok->setType(TT_CtorInitializerColon);

clang/lib/Sema/SemaTypeTraits.cpp

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1725,14 +1725,15 @@ static bool EvaluateBinaryTypeTrait(Sema &Self, TypeTrait BTT,
17251725

17261726
// Build expressions that emulate the effect of declval<T>() and
17271727
// declval<U>().
1728-
if (LhsT->isObjectType() || LhsT->isFunctionType())
1729-
LhsT = Self.Context.getRValueReferenceType(LhsT);
1730-
if (RhsT->isObjectType() || RhsT->isFunctionType())
1731-
RhsT = Self.Context.getRValueReferenceType(RhsT);
1732-
OpaqueValueExpr Lhs(KeyLoc, LhsT.getNonLValueExprType(Self.Context),
1733-
Expr::getValueKindForType(LhsT));
1734-
OpaqueValueExpr Rhs(KeyLoc, RhsT.getNonLValueExprType(Self.Context),
1735-
Expr::getValueKindForType(RhsT));
1728+
auto createDeclValExpr = [&](QualType Ty) -> OpaqueValueExpr {
1729+
if (Ty->isObjectType() || Ty->isFunctionType())
1730+
Ty = Self.Context.getRValueReferenceType(Ty);
1731+
return {KeyLoc, Ty.getNonLValueExprType(Self.Context),
1732+
Expr::getValueKindForType(Ty)};
1733+
};
1734+
1735+
auto Lhs = createDeclValExpr(LhsT);
1736+
auto Rhs = createDeclValExpr(RhsT);
17361737

17371738
// Attempt the assignment in an unevaluated context within a SFINAE
17381739
// trap at translation unit scope.
@@ -1956,6 +1957,7 @@ static std::optional<TypeTrait> StdNameToTypeTrait(StringRef Name) {
19561957
TypeTrait::UTT_IsCppTriviallyRelocatable)
19571958
.Case("is_replaceable", TypeTrait::UTT_IsReplaceable)
19581959
.Case("is_trivially_copyable", TypeTrait::UTT_IsTriviallyCopyable)
1960+
.Case("is_assignable", TypeTrait::BTT_IsAssignable)
19591961
.Case("is_standard_layout", TypeTrait::UTT_IsStandardLayout)
19601962
.Default(std::nullopt);
19611963
}
@@ -2286,6 +2288,32 @@ static void DiagnoseNonTriviallyCopyableReason(Sema &SemaRef,
22862288
SemaRef.Diag(D->getLocation(), diag::note_defined_here) << D;
22872289
}
22882290

2291+
static void DiagnoseNonAssignableReason(Sema &SemaRef, SourceLocation Loc,
2292+
QualType T, QualType U) {
2293+
const CXXRecordDecl *D = T->getAsCXXRecordDecl();
2294+
2295+
auto createDeclValExpr = [&](QualType Ty) -> OpaqueValueExpr {
2296+
if (Ty->isObjectType() || Ty->isFunctionType())
2297+
Ty = SemaRef.Context.getRValueReferenceType(Ty);
2298+
return {Loc, Ty.getNonLValueExprType(SemaRef.Context),
2299+
Expr::getValueKindForType(Ty)};
2300+
};
2301+
2302+
auto LHS = createDeclValExpr(T);
2303+
auto RHS = createDeclValExpr(U);
2304+
2305+
EnterExpressionEvaluationContext Unevaluated(
2306+
SemaRef, Sema::ExpressionEvaluationContext::Unevaluated);
2307+
Sema::ContextRAII TUContext(SemaRef,
2308+
SemaRef.Context.getTranslationUnitDecl());
2309+
SemaRef.BuildBinOp(/*S=*/nullptr, Loc, BO_Assign, &LHS, &RHS);
2310+
2311+
if (!D || D->isInvalidDecl())
2312+
return;
2313+
2314+
SemaRef.Diag(D->getLocation(), diag::note_defined_here) << D;
2315+
}
2316+
22892317
static bool hasMultipleDataBaseClassesWithFields(const CXXRecordDecl *D) {
22902318
int NumBasesWithFields = 0;
22912319
for (const CXXBaseSpecifier &Base : D->bases()) {
@@ -2439,6 +2467,9 @@ void Sema::DiagnoseTypeTraitDetails(const Expr *E) {
24392467
case UTT_IsTriviallyCopyable:
24402468
DiagnoseNonTriviallyCopyableReason(*this, E->getBeginLoc(), Args[0]);
24412469
break;
2470+
case BTT_IsAssignable:
2471+
DiagnoseNonAssignableReason(*this, E->getBeginLoc(), Args[0], Args[1]);
2472+
break;
24422473
case UTT_IsStandardLayout:
24432474
DiagnoseNonStandardLayoutReason(*this, E->getBeginLoc(), Args[0]);
24442475
break;

clang/test/OpenMP/declare_mapper_messages.c

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
// RUN: %clang_cc1 -verify=omp50,expected -fopenmp -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
2-
// RUN: %clang_cc1 -verify=omp51,expected -fopenmp -ferror-limit 100 %s
3-
// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
4-
// RUN: %clang_cc1 -verify=expected,omp60 -fopenmp -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
1+
// RUN: %clang_cc1 -verify=omp50,omp5x,expected -fopenmp -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
2+
// RUN: %clang_cc1 -verify=omp51,omp5x,expected -fopenmp -ferror-limit 100 %s
3+
// RUN: %clang_cc1 -verify=expected,omp52,omp5x -fopenmp -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
4+
// RUN: %clang_cc1 -verify=expected,omp60,omp60-maybe-simd -fopenmp -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
55

6-
// RUN: %clang_cc1 -verify=omp50,expected -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
7-
// RUN: %clang_cc1 -verify=omp51-simd,expected -fopenmp-simd -ferror-limit 100 %s
8-
// RUN: %clang_cc1 -verify=expected,omp52 -fopenmp-simd -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
9-
// RUN: %clang_cc1 -verify=expected,omp60-simd -fopenmp-simd -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
6+
// RUN: %clang_cc1 -verify=omp50,omp5x,expected -fopenmp-simd -fopenmp-version=50 -ferror-limit 100 -DOMP50 %s
7+
// RUN: %clang_cc1 -verify=omp51-simd,omp5x,expected -fopenmp-simd -ferror-limit 100 %s
8+
// RUN: %clang_cc1 -verify=expected,omp52,omp5x -fopenmp-simd -fopenmp-version=52 -ferror-limit 100 -DOMP52 %s
9+
// RUN: %clang_cc1 -verify=expected,omp60-simd,omp60-maybe-simd -fopenmp-simd -fopenmp-version=60 -ferror-limit 100 -DOMP60 %s
1010

1111
int temp; // expected-note {{'temp' declared here}}
1212

@@ -16,17 +16,38 @@ struct vec { // expec
1616
double *data;
1717
};
1818

19-
#pragma omp declare mapper // expected-error {{expected '(' after 'declare mapper'}}
20-
#pragma omp declare mapper { // expected-error {{expected '(' after 'declare mapper'}}
21-
#pragma omp declare mapper( // expected-error {{expected a type}} expected-error {{expected declarator on 'omp declare mapper' directive}}
22-
#pragma omp declare mapper(# // expected-error {{expected a type}} expected-error {{expected declarator on 'omp declare mapper' directive}}
23-
#pragma omp declare mapper(struct v // expected-error {{expected declarator on 'omp declare mapper' directive}}
24-
#pragma omp declare mapper(struct vec // expected-error {{expected declarator on 'omp declare mapper' directive}}
25-
#pragma omp declare mapper(S v // expected-error {{unknown type name 'S'}}
26-
#pragma omp declare mapper(struct vec v // expected-error {{expected ')'}} expected-note {{to match this '('}}
27-
#pragma omp declare mapper(aa:struct vec v) // expected-error {{expected at least one clause on '#pragma omp declare mapper' directive}}
28-
#pragma omp declare mapper(bb:struct vec v) private(v) // expected-error {{expected at least one clause on '#pragma omp declare mapper' directive}} // expected-error {{unexpected OpenMP clause 'private' in directive '#pragma omp declare mapper'}}
29-
#pragma omp declare mapper(cc:struct vec v) map(v) ( // expected-warning {{extra tokens at the end of '#pragma omp declare mapper' are ignored}}
19+
// omp60-maybe-simd-error@+2 {{expected '(' after 'declare_mapper'}}
20+
// omp5x-error@+1 {{expected '(' after 'declare mapper'}}
21+
#pragma omp declare mapper
22+
// omp60-maybe-simd-error@+2 {{expected '(' after 'declare_mapper'}}
23+
// omp5x-error@+1 {{expected '(' after 'declare mapper'}}
24+
#pragma omp declare mapper {
25+
// expected-error@+2 {{expected a type}}
26+
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
27+
#pragma omp declare mapper(
28+
// expected-error@+2 {{expected a type}}
29+
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
30+
#pragma omp declare mapper(#
31+
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
32+
#pragma omp declare mapper(struct v
33+
// expected-error@+1 {{expected declarator on 'omp declare mapper' directive}}
34+
#pragma omp declare mapper(struct vec
35+
// expected-error@+1 {{unknown type name 'S'}}
36+
#pragma omp declare mapper(S v
37+
// expected-error@+2 {{expected ')'}}
38+
// expected-note@+1 {{to match this '('}}
39+
#pragma omp declare mapper(struct vec v
40+
// omp60-maybe-simd-error@+2 {{expected at least one clause on '#pragma omp declare_mapper' directive}}
41+
// omp5x-error@+1 {{expected at least one clause on '#pragma omp declare mapper' directive}}
42+
#pragma omp declare mapper(aa:struct vec v)
43+
// omp60-maybe-simd-error@+4 {{expected at least one clause on '#pragma omp declare_mapper' directive}}
44+
// omp60-maybe-simd-error@+3 {{unexpected OpenMP clause 'private' in directive '#pragma omp declare_mapper'}}
45+
// omp5x-error@+2 {{expected at least one clause on '#pragma omp declare mapper' directive}}
46+
// omp5x-error@+1 {{unexpected OpenMP clause 'private' in directive '#pragma omp declare mapper'}}
47+
#pragma omp declare mapper(bb:struct vec v) private(v)
48+
// omp60-maybe-simd-warning@+2 {{extra tokens at the end of '#pragma omp declare_mapper' are ignored}}
49+
// omp5x-warning@+1 {{extra tokens at the end of '#pragma omp declare mapper' are ignored}}
50+
#pragma omp declare mapper(cc:struct vec v) map(v) (
3051

3152
#pragma omp declare mapper(++: struct vec v) map(v.len) // expected-error {{illegal OpenMP user-defined mapper identifier}}
3253
#pragma omp declare mapper(id1: struct vec v) map(v.len, temp) // expected-error {{only variable 'v' is allowed in map clauses of this 'omp declare mapper' directive}}
@@ -58,7 +79,9 @@ int fun(int arg) {
5879
#pragma omp declare mapper(id: struct vec v) map(v.len) // expected-note {{previous definition is here}}
5980
#pragma omp declare mapper(id: struct vec v) map(v.len) // expected-error {{redefinition of user-defined mapper for type 'struct vec' with name 'id'}}
6081
{
61-
#pragma omp declare mapper(id: struct vec v) map(v.len) allocate(v) // expected-error {{unexpected OpenMP clause 'allocate' in directive '#pragma omp declare mapper'}}
82+
// omp60-maybe-simd-error@+2 {{unexpected OpenMP clause 'allocate' in directive '#pragma omp declare_mapper'}}
83+
// omp5x-error@+1 {{unexpected OpenMP clause 'allocate' in directive '#pragma omp declare mapper'}}
84+
#pragma omp declare mapper(id: struct vec v) map(v.len) allocate(v)
6285
struct vec vv, v1;
6386
struct vec arr[10];
6487
double d;

0 commit comments

Comments
 (0)