Почему ключ / Zc: twoPhase-compiler не работает в MSVC? - PullRequest
0 голосов
/ 14 мая 2018

Почему переключатель компилятора /Zc:twoPhase-, следующий за переключателем /permissive-, не приводит к исчезновению ошибок компиляции в MSVC 19.13, точно так же, как они исчезают после полного удаления ключа / permissive-`со следующим кодом проблемы

#include <stdio.h>

template <unsigned int BYTES>
class CBase
{
public:
    char Arr[BYTES];

    int Fn1(void) {
        return Arr[1] ^ Arr[sizeof(Arr)-1];
    }

    int Fn2(void) {
        return Arr[2] ^ Arr[sizeof(Arr)-2];
    }
};

template <unsigned int BYTES>
class CDerived : public CBase<BYTES>
{
public:

    int FnSum(void) {
        return Fn1() + Fn2() + Arr[0];  // ERRORs: identifiers "Fn1" and "Fn2" and "Arr" are NOT found !
    }
};    

int main(void)
{
    CDerived<32> ddd;

    printf("%d\n", ddd.Fn1());  //No error here
    printf("%d\n", ddd.Fn2());  //No error here
    printf("%d\n", ddd.FnSum());

    return (int)ddd.Arr[0];   //No error here
}

Приведенный выше код компилируется в MSVC v19.10, когда переключатель /permissive- полностью удален.
Смотри: https://godbolt.org/g/Yxw89Y

ПРИМЕЧАНИЕ. Я не могу включить ссылку на пример на http://godbolt.org вместе с переключателями /permissive- /Zc:twoPhase-, поскольку последний компилятор Godbolt MSVC (v19.10) устарел и не поддерживает /Zc:twoPhase- переключатель компилятора.

Согласно этой статье и этой статье , ошибка компиляции в MSVC происходит из-за включенного поиска двухфазного имени в соответствии со стандартным режимом C ++ (включается опцией /permissive-).
Кроме того, согласно бывшей статье : « Опция /permissive- неявно задает соответствующее поведение компилятора двухфазного поиска, но его можно переопределить с помощью /Zc:twoPhase- switch ».
Однако добавление двух ключей компилятора /permissive- /Zc:twoPhase- (в таком порядке) не отменяет его и не приводит к исчезновению ошибок компиляции в MSVC v19.13.

Контекст этой проблемы см. В этой записи .

1 Ответ

0 голосов
/ 14 мая 2018

Этот код выполняет сборку с VS 2017 (обновление 15.7) версии 19.14 при использовании /permissive-, поэтому, скорее всего, это была просто ошибка компилятора в VS 2017 (обновление 15.6), которая была исправлена.Ваш исходный код не имеет ничего общего с двухфазным поиском.

Если код содержит ошибки с /permissive-, а затем строится с /permissive- /Zc:twoPhase-, то он связан с двумя фазами.В противном случае это просто из-за соответствия, обеспечиваемого переключателем /permissive-.См. Предоставление Visual C ++ возможности перехода к стандартному соответствию и Поддержка поиска по двухфазному имени предоставляется MSVC .

ОБНОВЛЕНИЕ Сборкас x86, но не с x64, что подтверждает идею о том, что это ошибка компилятора, а не проблема соответствия исходного кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...