Skip to content

[c++11] clang allows questionable CTAD for template base of derived class with default argument #97532

Closed as duplicate of#95732
@Rush10233

Description

@Rush10233

The following code is accepted by clang but rejected by GCC,MSVC and ICC with the option of -std=c++11:

template<typename,typename=int> struct Base { };

struct Derived : Base<void> { };

template<template<typename> class TT>
void func (TT<void>) { }

int main () {
  func (Derived { });
}

https://timsong-cpp.github.io/cppwp/std11/temp.deduct.call#4 says that "If P is a class and P has the form simple-template-id, then the transformed A can be a derived class of the deduced A." So the class Derived passed in line 9 can be deduced to its base type.

But the parameter requested by func is a template class with 1 argument, while class Base has 2(including 1 with default value), which seems incompatible.

It's interesting that gcc accepts that code under -std=c++20, but other compilers don't. It seems that more standard docs need to be consulted.

https://godbolt.org/z/G7fenEsYY

Metadata

Metadata

Assignees

No one assigned

    Labels

    accepts-invalidclang:frontendLanguage frontend issues, e.g. anything involving "Sema"duplicateResolved as duplicate

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions