第一次出错后,Clang / GCC Diagnostics不会继续

时间:2015-03-26 22:20:14

标签: c++ gcc clang diagnostics

我实际上不确定如何解释这个,但基本上当我执行这个(clang / gcc)时:

gcc -std=c++11 -Wall -fsyntax-only test.cpp

TEST.CPP:

struct tmp1
{
    tmp1() { _1 = 12; }
    int _1;
    int _2;
    bool y;
};

class tmp2
{
private:
    tmp1 in;

public:
    tmp2(const tmp1& val) : in{val}
    {
        in._1 = ""
    }
};

我得到两个“不同”的诊断:

GCC

/Desktop/test.cpp: In constructor ‘tmp2::tmp2(const tmp1&)’:
./Desktop/test.cpp:18:15: error: invalid conversion from ‘const char*’ to ‘int’ [-fpermissive]
         in._1 = ""
               ^
./Desktop/test.cpp:19:5: error: expected ‘;’ before ‘}’ token
     }
     ^

锵:

./Desktop/test.cpp:18:15: error: assigning to 'int' from incompatible type
      'const char [1]'
        in._1 = ""
              ^ ~~

所以我的问题是如何从GCC获得额外的诊断,其中说明在clang中'}'之后有一个被删除的令牌?

1 个答案:

答案 0 :(得分:1)

以何种方式更明确?当你发现“不属于那里”的东西时,编译器中的一个问题是决定你“继续”的地方。这有点像我告诉你“走到A路上,然后在大路上左转到B路,然后在第二个路口左转,走50码就到了我家”。但我不知道,大橡树被削减了,因为它对通过交通是一个危险,所以你继续前行大约一英里半,直到找到一棵不同的橡树。现在,你找不到我的房子吧?

那么,当他/她找到“错误的类型”(字符串而不是数字)时,编译器开发人员选择哪个“下一个继续”的地方?我们继续前进吗?我们用来重新回到正轨的“地标”是什么?这实际上非常困难(我写的编译器在遇到“意想不到的东西”时经常会失败。)

或者您的意思是编译器应该说“您正在尝试将字符串分配给int”?同样,这里真正的问题是你有多种方法可以将类型X与类型Y相结合 - 字符串为整数,整数为字符串,浮点数到字符串,字符串为浮点数,结构为类,类为struct,类为整数,整数到类,类到类,指向整数的指针,整数到指针。其中一些确实是独特的错误。其他人不是。

我会回过头来参考Clang这个错误的打印位置,也许我们可以研究它以确定它是否可以改进。