Skip to content

Commit

Permalink
Revert "[clang] Substitute alias templates from correct context (#74335
Browse files Browse the repository at this point in the history
…)"

It was reported in the PR that commit caused clang giving errors for
code previously considered valid.
This reverts commit 6b1aa31.
  • Loading branch information
Fznamznon committed Dec 6, 2023
1 parent 0365677 commit 565ddde
Show file tree
Hide file tree
Showing 5 changed files with 8 additions and 85 deletions.
3 changes: 0 additions & 3 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -658,9 +658,6 @@ Bug Fixes in This Version
Fixes (`#64467 <https://github.com/llvm/llvm-project/issues/64467>`_)
- Clang's ``-Wchar-subscripts`` no longer warns on chars whose values are known non-negative constants.
Fixes (`#18763 <https://github.com/llvm/llvm-project/issues/18763>`_)
- Fixed false positive error emitted when templated alias inside a class
used private members of the same class.
Fixes (`#41693 <https://github.com/llvm/llvm-project/issues/41693>`_)

Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
22 changes: 3 additions & 19 deletions clang/lib/Sema/SemaCXXScopeSpec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,33 +30,17 @@ static CXXRecordDecl *getCurrentInstantiationOf(QualType T,
return nullptr;

const Type *Ty = T->getCanonicalTypeInternal().getTypePtr();
if (isa<TemplateSpecializationType>(Ty)) {
if (auto *Record = dyn_cast<CXXRecordDecl>(CurContext)) {
if (isa<ClassTemplatePartialSpecializationDecl>(Record) ||
Record->getDescribedClassTemplate()) {
const Type *ICNT = Record->getTypeForDecl();
QualType Injected =
cast<InjectedClassNameType>(ICNT)->getInjectedSpecializationType();

if (Ty == Injected->getCanonicalTypeInternal().getTypePtr())
return Record;
}
}
}

if (const RecordType *RecordTy = dyn_cast<RecordType>(Ty)) {
CXXRecordDecl *Record = cast<CXXRecordDecl>(RecordTy->getDecl());
if (!Record->isDependentContext() ||
Record->isCurrentInstantiation(CurContext))
return Record;

return nullptr;
}

if (isa<InjectedClassNameType>(Ty))
} else if (isa<InjectedClassNameType>(Ty))
return cast<InjectedClassNameType>(Ty)->getDecl();

return nullptr;
else
return nullptr;
}

/// Compute the DeclContext that is associated with the given type.
Expand Down
13 changes: 3 additions & 10 deletions clang/lib/Sema/SemaTemplate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3990,16 +3990,9 @@ QualType Sema::CheckTemplateIdType(TemplateName Name,
if (Inst.isInvalid())
return QualType();

{
bool ForLambdaCallOperator = false;
if (const auto *Rec = dyn_cast<CXXRecordDecl>(Pattern->getDeclContext()))
ForLambdaCallOperator = Rec->isLambda();
Sema::ContextRAII SavedContext(*this, Pattern->getDeclContext(),
!ForLambdaCallOperator);
CanonType =
SubstType(Pattern->getUnderlyingType(), TemplateArgLists,
AliasTemplate->getLocation(), AliasTemplate->getDeclName());
}
CanonType = SubstType(Pattern->getUnderlyingType(),
TemplateArgLists, AliasTemplate->getLocation(),
AliasTemplate->getDeclName());
if (CanonType.isNull()) {
// If this was enable_if and we failed to find the nested type
// within enable_if in a SFINAE context, dig out the specific
Expand Down
5 changes: 2 additions & 3 deletions clang/test/CXX/temp/temp.decls/temp.alias/p3.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,11 @@

// The example given in the standard (this is rejected for other reasons anyway).
template<class T> struct A;
template<class T> using B = typename A<T>::U; // expected-error {{no type named 'U' in 'A<short>'}}
// expected-note@-1 {{in instantiation of template class 'A<short>' requested here}}
template<class T> using B = typename A<T>::U; // expected-error {{no type named 'U' in 'A<T>'}}
template<class T> struct A {
typedef B<T> U; // expected-note {{in instantiation of template type alias 'B' requested here}}
};
B<short> b; // expected-note {{in instantiation of template type alias 'B' requested here}}
B<short> b;

template<typename T> using U = int;

Expand Down
50 changes: 0 additions & 50 deletions clang/test/SemaCXX/alias-template.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -192,53 +192,3 @@ int g = sfinae_me<int>(); // expected-error{{no matching function for call to 's
namespace NullExceptionDecl {
template<int... I> auto get = []() { try { } catch(...) {}; return I; }; // expected-error{{initializer contains unexpanded parameter pack 'I'}}
}

namespace GH41693 {
struct S {
private:
template <typename> static constexpr void Impl() {}

public:
template <typename X> using U = decltype(Impl<X>());
};

using X = S::U<void>;
struct Y {
private:
static constexpr int x=0;

template <typename>
static constexpr int y=0;

template <typename>
static constexpr int foo();

public:
template <typename U>
using bar1 = decltype(foo<U>());
using bar2 = decltype(x);
template <typename U>
using bar3 = decltype(y<U>);
};


using type1 = Y::bar1<float>;
using type2 = Y::bar2;
using type3 = Y::bar3<float>;

struct theFriend{
template<class T>
using theAlias = decltype(&T::i);
};

class theC{
int i;
public:
friend struct theFriend;
};

int foo(){
(void)sizeof(theFriend::theAlias<theC>);
}

}

0 comments on commit 565ddde

Please sign in to comment.