Skip to content

Commit

Permalink
Pass the found declaration to DiagnoseUseOfDecl.
Browse files Browse the repository at this point in the history
Don't pass in the resolved declaration, because that might be an
inheriting constructor declaration, which should never be used directly
and for which constraint satisfaction checking doesn't work.

Fixes #62361.
  • Loading branch information
zygoloid committed Apr 26, 2023
1 parent 9193820 commit 1e43349
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 4 deletions.
6 changes: 2 additions & 4 deletions clang/lib/Sema/SemaInit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6885,7 +6885,7 @@ PerformConstructorInitialization(Sema &S,

if (isExplicitTemporary(Entity, Kind, NumArgs)) {
// An explicitly-constructed temporary, e.g., X(1, 2).
if (S.DiagnoseUseOfDecl(Constructor, Loc))
if (S.DiagnoseUseOfDecl(Step.Function.FoundDecl, Loc))
return ExprError();

TypeSourceInfo *TSInfo = Entity.getTypeSourceInfo();
Expand All @@ -6900,8 +6900,6 @@ PerformConstructorInitialization(Sema &S,
if (auto *Shadow = dyn_cast<ConstructorUsingShadowDecl>(
Step.Function.FoundDecl.getDecl())) {
CalleeDecl = S.findInheritingConstructor(Loc, Constructor, Shadow);
if (S.DiagnoseUseOfDecl(CalleeDecl, Loc))
return ExprError();
}
S.MarkFunctionReferenced(Loc, CalleeDecl);

Expand Down Expand Up @@ -10608,7 +10606,7 @@ QualType Sema::DeduceTemplateSpecializationFromInitializer(

// Make sure we didn't select an unusable deduction guide, and mark it
// as referenced.
DiagnoseUseOfDecl(Best->Function, Kind.getLocation());
DiagnoseUseOfDecl(Best->FoundDecl, Kind.getLocation());
MarkFunctionReferenced(Kind.getLocation(), Best->Function);
break;
}
Expand Down
70 changes: 70 additions & 0 deletions clang/test/SemaTemplate/concepts-inherited-ctor.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -verify %s

namespace GH62361 {
template <typename T, typename U = void*> struct B { // expected-note 14{{candidate}}
B() // expected-note 7{{not viable}}
requires __is_same(T, int); // expected-note 7{{because '__is_same(char, int)' evaluated to false}}
};

template <typename U> struct B<void, U> : B<int, U> {
using B<int, U>::B;
};

template<typename T>
void g(B<T>); // expected-note {{cannot convert}}

void f1() {
B<void> b1;
B<void> b2{};
B<void> b3 = {};
new B<void>{};
new B<void>();
g<void>({});
B<void>{};
B<void>();
}

void f2() {
B<int> b1;
B<int> b2{};
B<int> b3 = {};
new B<int>{};
new B<int>();
g<int>({});
B<int>{};
B<int>();
}

void f3() {
B<char> b1; // expected-error {{no matching constructor}}
B<char> b2{}; // expected-error {{no matching constructor}}
B<char> b3 = {}; // expected-error {{no matching constructor}}
new B<char>{}; // expected-error {{no matching constructor}}
new B<char>(); // expected-error {{no matching constructor}}
g<char>({}); // expected-error {{no matching function}}
B<char>{}; // expected-error {{no matching constructor}}
B<char>(); // expected-error {{no matching constructor}}
}
}

namespace no_early_substitution {
template <typename T> concept X = true;

struct A {};

template <typename T> struct B {
B() requires X<T*>;
B();
};

template <typename U = int, typename V = A>
struct C : public B<V&> {
using B<V&>::B;
};

void foo() {
// OK, we only substitute T ~> V& into X<T*> in a SFINAE context,
// during satisfaction checks.
C();
}
}

2 comments on commit 1e43349

@shafik
Copy link
Collaborator

@shafik shafik commented on 1e43349 Apr 28, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a release note for this fix?

@zygoloid
Copy link
Collaborator Author

@zygoloid zygoloid commented on 1e43349 Apr 28, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a release note for this fix?

This change is fixing a trunk-only regression. (Looks like @erichkeane added a release note already in f539bffc; I wonder if we should remove it for that reason.)

That said, while investigating this I did find that a previous "NFC" change fixed a bug (the no_early_substitution test); maybe that warrants a release note.

Please sign in to comment.